К статье
Практический материал

Разработка и Конфигурация · 12 мин

Что является объектом в 1С: виды и различия

Разбираем, что является объектом в 1С: виды объектов конфигурации, разница между объектом и ссылкой, примеры кода и типичные ошибки разработчиков.

В платформе 1С:Предприятие слово «объект» используется в нескольких значениях, и это регулярно путает начинающих разработчиков. В одном случае объектом называют элемент конфигурации в дереве метаданных, в другом — конкретную запись в базе данных, в третьем — программный объект встроенного языка, с которым работает код. Понимание этих различий критично: от него зависит, как вы читаете и пишете данные, как устроены запросы и почему метод «Записать()» вызывается у одних сущностей и отсутствует у других.

Ключевая идея проста: в конфигураторе вы описываете структуру (тип объекта), в режиме «Предприятие» пользователь создаёт конкретные экземпляры (записи), а во встроенном языке вы оперируете программными обёртками над этими записями — ссылками и объектами. Например, «Справочник.Номенклатура» — это метаданные, «Элемент справочника "Гвоздь 100 мм"» — запись в базе, а переменная типа «СправочникОбъект.Номенклатура» — программный объект, через который эту запись можно изменить и сохранить.

Дальше разберём каждый уровень отдельно: что считается объектом конфигурации, чем ссылка отличается от объекта, какие виды объектов бывают и как правильно с ними работать в коде без лишних обращений к базе.

Три уровня понятия «объект» в 1С

Первый уровень — объекты конфигурации. Это то, что видно в дереве конфигуратора: справочники, документы, регистры сведений, регистры накопления, отчёты, обработки, планы счетов и другие сущности. Они описывают структуру будущих данных: какие реквизиты будут у номенклатуры, какие табличные части — у документа «Реализация товаров», какие измерения и ресурсы — у регистра.

Второй уровень — объекты данных. Когда пользователь в режиме «Предприятие» создаёт новый элемент справочника или проводит документ, в базе появляется конкретная запись. Записей одного типа может быть сколько угодно: один справочник «Контрагенты» — тысячи элементов. Именно эти записи хранятся в таблицах базы данных и выбираются запросами.

Третий уровень — программные объекты встроенного языка. Это типы вроде СправочникОбъект, ДокументОбъект, РегистрСведенийНаборЗаписей, через которые код читает, изменяет и записывает данные. Путаница возникает потому, что один и тот же элемент справочника может быть представлен в коде двумя разными программными типами: ссылкой и объектом.

Основные виды объектов конфигурации

Платформа делит объекты конфигурации на несколько групп по назначению. Прикладные объекты хранят данные предметной области: справочники — условно постоянную нормативную информацию (товары, контрагенты, склады), документы — факты хозяйственной деятельности (поступление, реализация, оплата), регистры — накопленные итоги и сведения в разрезе измерений.

Планы видов характеристик, планы счетов и планы видов расчёта — специализированные объекты: первый описывает произвольные виды свойств и аналитик, второй — план счетов бухгалтерского учёта, третий — виды начислений и удержаний в расчётах зарплаты. Бизнес-процессы и задачи отвечают за маршрутизацию работ между пользователями.

Отдельно стоят отчёты и обработки — они не хранят данные, а работают с ними: отчёт строит выборку и представляет результат, обработка выполняет произвольные действия, например групповое изменение реквизитов. Константы, перечисления и критерии отбора дополняют картину: константы хранят единичные значения настройки, перечисления — фиксированные списки значений, заданные на этапе разработки.

Хранит список элементовСправочник

Нормативная информация: номенклатура, контрагенты, договоры

Фиксирует событиеДокумент

Имеет дату, номер и обычно проводится по регистрам

Хранит итоги и сведенияРегистр

Данные в разрезе измерений, изменяются документами или напрямую

Не хранит данныеОтчёт или обработка

Только читает или модифицирует существующие записи

Ссылка и объект: главное различие

Самая частая точка непонимания — разница между типами «Ссылка» и «Объект». Ссылка (СправочникСсылка, ДокументСсылка) — это лёгкий идентификатор записи, по сути уникальный идентификатор плюс информация о типе. Через ссылку доступны только предопределённые поля, которые платформа хранит вместе с идентификатором: код, наименование, пометка удаления, дата и номер у документов.

Объект (СправочникОбъект, ДокументОбъект) — это полная программная копия записи в памяти. Только через объект можно изменить произвольные реквизиты, заполнить табличные части и вызвать метод «Записать()» или «Записать(РежимЗаписиДокумента.Проведение)». Получить объект из ссылки можно методом «ПолучитьОбъект()», обратно ссылку из объекта — через свойство «Ссылка».

Важно понимать цену операции: вызов «ПолучитьОбъект()» читает всю запись из базы, включая табличные части. Если в цикле по тысяче ссылок нужно только наименование, брать объект не нужно — это создаст тысячу лишних чтений. Для чтения реквизитов используйте запрос или обращение через точку к ссылке, а объект получайте только тогда, когда запись реально нужно изменить.

bsl
// Ссылка — только идентификатор
СсылкаНаЭлемент = Справочники.Номенклатура.НайтиПоКоду("000001");
Наименование = СсылкаНаЭлемент.Наименование; // чтение через ссылку

// Объект — для изменения
ЭлементОбъект = СсылкаНаЭлемент.ПолучитьОбъект();
ЭлементОбъект.Наименование = "Новое наименование";
ЭлементОбъект.Записать();

Как работать с объектами в коде без ошибок

Типовой сценарий изменения записи выглядит так: найти ссылку, получить объект, изменить реквизиты, записать. Если запись не найдена (ссылка пустая), объект получать нельзя — будет ошибка. Поэтому перед «ПолучитьОбъект()» проверяйте результат поиска через «Пустая()».

Для создания новой записи ссылка ещё не существует, поэтому объект создаётся напрямую: «Справочники.Номенклатура.СоздатьЭлемент()» или «Документы.РеализацияТоваровУслуг.СоздатьДокумент()». После заполнения реквизитов вызывается «Записать()», и только после этого у объекта появляется ссылка.

При записи документа различайте режимы: «Записать()» сохраняет документ без проведения, а для проведения используется «Записать(РежимЗаписиДокумента.Проведение)». Проведение запускает обработку проведения и формирует движения по регистрам — это транзакционная операция, при ошибке в модуле проведения вся запись откатывается.

Порядок изменения существующей записи
  1. 1
    Найдите ссылку: НайтиПоКоду, НайтиПоНаименованию или запросом
  2. 2
    Проверьте, что ссылка не пустая — метод Пустая()
  3. 3
    Получите объект: Ссылка.ПолучитьОбъект()
  4. 4
    Измените реквизиты и табличные части
  5. 5
    Вызовите Записать() и убедитесь в отсутствии исключений

Объекты и запросы: когда что использовать

Запросы и программные объекты решают разные задачи. Запрос предназначен для выборки данных: он быстро читает тысячи записей, соединяет таблицы, считает итоги и возвращает результат в виде таблицы. Но запрос не может изменить данные — в языке запросов 1С нет операторов UPDATE или INSERT.

Программный объект, наоборот, предназначен для изменения, но работает с одной записью за раз. Поэтому массовое изменение данных через цикл «ПолучитьОбъект() — Записать()» — закономерно медленное: каждая итерация читает и пишет запись целиком. Для регистров сведений и накопления вместо объектов отдельных записей используются наборы записей (РегистрСведенийНаборЗаписей), которые читают и пишут порцию данных по отбору.

Правильный паттерн массовой обработки: запросом выбрать только ссылки на нужные записи, затем в цикле получать объект и записывать. Если записей много, стоит выводить прогресс и выполнять операцию порциями, чтобы не держать длинную транзакцию и не блокировать работу пользователей.

Типичные ошибки при работе с объектами

Самая распространённая ошибка — попытка изменить реквизит через ссылку: «Ссылка.Наименование = "..."». Ссылка доступна только для чтения, присвоение вызовет ошибку исполнения. Вторая классическая проблема — обращение к реквизиту, которого нет в составе объекта: например, к табличной части у ссылки или к реквизиту документа у справочника.

Ещё одна группа ошибок связана с записью: разработчик изменил объект, но забыл вызвать «Записать()» — изменения остались только в памяти и потерялись. Обратная ситуация — лишние записи в цикле, когда «Записать()» вызывается при каждом изменении одного и того же объекта, хотя достаточно одной записи в конце.

Наконец, нельзя забывать про права и блокировки. Если у пользователя нет права на изменение объекта, запись завершится исключением. При конкурентной работе двух сеансов с одной записью сработает объектная блокировка: второй сеанс получит ошибку «Конфликт блокировок» и должен корректно её обработать, а не игнорировать.

Типичные ошибки
01
Присвоение значения реквизиту через ссылку — ссылка доступна только для чтения, нужен ПолучитьОбъект()
02
Изменение объекта без вызова Записать() — изменения теряются при завершении кода
03
Вызов ПолучитьОбъект() в цикле ради чтения одного поля — резкое замедление, используйте запрос
04
Отсутствие проверки Пустая() перед ПолучитьОбъект() — исключение при ненайденной записи
05
Игнорирование исключений при Записать() — частично обработанные данные при сбое

Как проверить, что вы правильно поняли тип сущности

Быстро определить, с чем вы работаете, помогает функция «ТипЗнч()» в сочетании с «Тип()». Например, «ТипЗнч(Переменная) = Тип("СправочникСсылка.Номенклатура")» покажет, что в переменной ссылка, а не объект. В отладчике тип значения виден прямо в табло — обращайте внимание на слово «Ссылка» или «Объект» в названии типа.

Ещё один практический приём — проверить доступность метода. Если у переменной есть «Записать()» — это объект или набор записей. Если есть только чтение реквизитов и «ПолучитьОбъект()» — это ссылка. Менеджеры объектов (Справочники.Номенклатура) имеют свои методы: «НайтиПоКоду», «СоздатьЭлемент», «ПолучитьСсылку» — и не являются ни ссылкой, ни объектом.

Контрольные точки

Как проверить результат

Тип переменной в отладчике
Норма

СправочникОбъект или ДокументОбъект перед изменением

Тревожный признак

СправочникСсылка — изменить реквизиты не получится

Вызов Записать()
Норма

Метод выполнен без исключений, запись видна в списке

Тревожный признак

Исключение или запись не появилась в базе

Скорость обработки
Норма

Выборка запросом, объекты только для изменяемых записей

Тревожный признак

ПолучитьОбъект() вызывается для каждой строки выборки

Частые вопросы об объектах в 1С

Чем отличается объект конфигурации от объекта данных?

Объект конфигурации — это описание структуры в конфигураторе (например, справочник «Номенклатура» с его реквизитами). Объект данных — конкретная запись, созданная по этому описанию: элемент «Гвоздь 100 мм». Один объект конфигурации порождает неограниченное число объектов данных.

Можно ли изменить запись, не получая объект?

Через встроенный язык — нет: изменение реквизитов возможно только у программного объекта, полученного методом «ПолучитьОбъект()» или созданного через «СоздатьЭлемент()» / «СоздатьДокумент()». Исключение — регистры, где данные пишутся набором записей, и служебные методы вроде «УстановитьПометкуУдаления()» у ссылки.

Почему «Ссылка.Реквизит» иногда работает, а иногда нет?

Через ссылку доступны на чтение реквизиты, которые платформа хранит в служебной таблице ссылок: код, наименование, пометка удаления, дата и номер документа, владелец и родитель. Прочие реквизиты при обращении через точку платформа дочитает из базы неявно, но это скрытое обращение к данным — в запросах такое обращение является «обращением через точку» и замедляет выборку.

Что такое менеджер объекта?

Это программный тип вроде СправочникМенеджер.Номенклатура, доступный через «Справочники.Номенклатура». Он не представляет конкретную запись, а предоставляет методы работы со всей сущностью: поиск, создание, получение ссылки, пустую ссылку.

Являются ли отчёты и обработки объектами данных?

Нет. Отчёты и обработки — объекты конфигурации, но они не хранят собственных данных в базе. Их экземпляры в коде (ОтчетОбъект, ОбработкаОбъект) существуют только в памяти на время выполнения и служат для чтения или модификации данных других объектов.

Как безопасно изменить много записей сразу?

Сначала запросом выберите ссылки на нужные записи, затем в цикле получайте объект и записывайте. Оберните тело цикла в попытку с обработкой исключений, при больших объёмах фиксируйте транзакции порциями и обязательно проверяйте результат на копии базы до запуска в рабочей.

Итог

Что важно запомнить

В 1С «объект» — трёхуровневое понятие: метаданные в конфигураторе, записи в базе и программные объекты в коде. Ссылка — лёгкий идентификатор записи только для чтения, объект — полная копия для изменения и записи. Читайте данные запросами, изменяйте через объекты, проверяйте ссылки на пустоту и всегда вызывайте Записать() после изменений.