Разработка и Конфигурация · 12 мин
Что является объектом в 1С: виды и различия
Разбираем, что является объектом в 1С: виды объектов конфигурации, разница между объектом и ссылкой, примеры кода и типичные ошибки разработчиков.
В платформе 1С:Предприятие слово «объект» используется в нескольких значениях, и это регулярно путает начинающих разработчиков. В одном случае объектом называют элемент конфигурации в дереве метаданных, в другом — конкретную запись в базе данных, в третьем — программный объект встроенного языка, с которым работает код. Понимание этих различий критично: от него зависит, как вы читаете и пишете данные, как устроены запросы и почему метод «Записать()» вызывается у одних сущностей и отсутствует у других.
Ключевая идея проста: в конфигураторе вы описываете структуру (тип объекта), в режиме «Предприятие» пользователь создаёт конкретные экземпляры (записи), а во встроенном языке вы оперируете программными обёртками над этими записями — ссылками и объектами. Например, «Справочник.Номенклатура» — это метаданные, «Элемент справочника "Гвоздь 100 мм"» — запись в базе, а переменная типа «СправочникОбъект.Номенклатура» — программный объект, через который эту запись можно изменить и сохранить.
Дальше разберём каждый уровень отдельно: что считается объектом конфигурации, чем ссылка отличается от объекта, какие виды объектов бывают и как правильно с ними работать в коде без лишних обращений к базе.
Три уровня понятия «объект» в 1С
Первый уровень — объекты конфигурации. Это то, что видно в дереве конфигуратора: справочники, документы, регистры сведений, регистры накопления, отчёты, обработки, планы счетов и другие сущности. Они описывают структуру будущих данных: какие реквизиты будут у номенклатуры, какие табличные части — у документа «Реализация товаров», какие измерения и ресурсы — у регистра.
Второй уровень — объекты данных. Когда пользователь в режиме «Предприятие» создаёт новый элемент справочника или проводит документ, в базе появляется конкретная запись. Записей одного типа может быть сколько угодно: один справочник «Контрагенты» — тысячи элементов. Именно эти записи хранятся в таблицах базы данных и выбираются запросами.
Третий уровень — программные объекты встроенного языка. Это типы вроде СправочникОбъект, ДокументОбъект, РегистрСведенийНаборЗаписей, через которые код читает, изменяет и записывает данные. Путаница возникает потому, что один и тот же элемент справочника может быть представлен в коде двумя разными программными типами: ссылкой и объектом.
Основные виды объектов конфигурации
Платформа делит объекты конфигурации на несколько групп по назначению. Прикладные объекты хранят данные предметной области: справочники — условно постоянную нормативную информацию (товары, контрагенты, склады), документы — факты хозяйственной деятельности (поступление, реализация, оплата), регистры — накопленные итоги и сведения в разрезе измерений.
Планы видов характеристик, планы счетов и планы видов расчёта — специализированные объекты: первый описывает произвольные виды свойств и аналитик, второй — план счетов бухгалтерского учёта, третий — виды начислений и удержаний в расчётах зарплаты. Бизнес-процессы и задачи отвечают за маршрутизацию работ между пользователями.
Отдельно стоят отчёты и обработки — они не хранят данные, а работают с ними: отчёт строит выборку и представляет результат, обработка выполняет произвольные действия, например групповое изменение реквизитов. Константы, перечисления и критерии отбора дополняют картину: константы хранят единичные значения настройки, перечисления — фиксированные списки значений, заданные на этапе разработки.
Нормативная информация: номенклатура, контрагенты, договоры
Имеет дату, номер и обычно проводится по регистрам
Данные в разрезе измерений, изменяются документами или напрямую
Только читает или модифицирует существующие записи
Ссылка и объект: главное различие
Самая частая точка непонимания — разница между типами «Ссылка» и «Объект». Ссылка (СправочникСсылка, ДокументСсылка) — это лёгкий идентификатор записи, по сути уникальный идентификатор плюс информация о типе. Через ссылку доступны только предопределённые поля, которые платформа хранит вместе с идентификатором: код, наименование, пометка удаления, дата и номер у документов.
Объект (СправочникОбъект, ДокументОбъект) — это полная программная копия записи в памяти. Только через объект можно изменить произвольные реквизиты, заполнить табличные части и вызвать метод «Записать()» или «Записать(РежимЗаписиДокумента.Проведение)». Получить объект из ссылки можно методом «ПолучитьОбъект()», обратно ссылку из объекта — через свойство «Ссылка».
Важно понимать цену операции: вызов «ПолучитьОбъект()» читает всю запись из базы, включая табличные части. Если в цикле по тысяче ссылок нужно только наименование, брать объект не нужно — это создаст тысячу лишних чтений. Для чтения реквизитов используйте запрос или обращение через точку к ссылке, а объект получайте только тогда, когда запись реально нужно изменить.
// Ссылка — только идентификатор
СсылкаНаЭлемент = Справочники.Номенклатура.НайтиПоКоду("000001");
Наименование = СсылкаНаЭлемент.Наименование; // чтение через ссылку
// Объект — для изменения
ЭлементОбъект = СсылкаНаЭлемент.ПолучитьОбъект();
ЭлементОбъект.Наименование = "Новое наименование";
ЭлементОбъект.Записать();Как работать с объектами в коде без ошибок
Типовой сценарий изменения записи выглядит так: найти ссылку, получить объект, изменить реквизиты, записать. Если запись не найдена (ссылка пустая), объект получать нельзя — будет ошибка. Поэтому перед «ПолучитьОбъект()» проверяйте результат поиска через «Пустая()».
Для создания новой записи ссылка ещё не существует, поэтому объект создаётся напрямую: «Справочники.Номенклатура.СоздатьЭлемент()» или «Документы.РеализацияТоваровУслуг.СоздатьДокумент()». После заполнения реквизитов вызывается «Записать()», и только после этого у объекта появляется ссылка.
При записи документа различайте режимы: «Записать()» сохраняет документ без проведения, а для проведения используется «Записать(РежимЗаписиДокумента.Проведение)». Проведение запускает обработку проведения и формирует движения по регистрам — это транзакционная операция, при ошибке в модуле проведения вся запись откатывается.
- 1Найдите ссылку: НайтиПоКоду, НайтиПоНаименованию или запросом
- 2Проверьте, что ссылка не пустая — метод Пустая()
- 3Получите объект: Ссылка.ПолучитьОбъект()
- 4Измените реквизиты и табличные части
- 5Вызовите Записать() и убедитесь в отсутствии исключений
Объекты и запросы: когда что использовать
Запросы и программные объекты решают разные задачи. Запрос предназначен для выборки данных: он быстро читает тысячи записей, соединяет таблицы, считает итоги и возвращает результат в виде таблицы. Но запрос не может изменить данные — в языке запросов 1С нет операторов UPDATE или INSERT.
Программный объект, наоборот, предназначен для изменения, но работает с одной записью за раз. Поэтому массовое изменение данных через цикл «ПолучитьОбъект() — Записать()» — закономерно медленное: каждая итерация читает и пишет запись целиком. Для регистров сведений и накопления вместо объектов отдельных записей используются наборы записей (РегистрСведенийНаборЗаписей), которые читают и пишут порцию данных по отбору.
Правильный паттерн массовой обработки: запросом выбрать только ссылки на нужные записи, затем в цикле получать объект и записывать. Если записей много, стоит выводить прогресс и выполнять операцию порциями, чтобы не держать длинную транзакцию и не блокировать работу пользователей.
Типичные ошибки при работе с объектами
Самая распространённая ошибка — попытка изменить реквизит через ссылку: «Ссылка.Наименование = "..."». Ссылка доступна только для чтения, присвоение вызовет ошибку исполнения. Вторая классическая проблема — обращение к реквизиту, которого нет в составе объекта: например, к табличной части у ссылки или к реквизиту документа у справочника.
Ещё одна группа ошибок связана с записью: разработчик изменил объект, но забыл вызвать «Записать()» — изменения остались только в памяти и потерялись. Обратная ситуация — лишние записи в цикле, когда «Записать()» вызывается при каждом изменении одного и того же объекта, хотя достаточно одной записи в конце.
Наконец, нельзя забывать про права и блокировки. Если у пользователя нет права на изменение объекта, запись завершится исключением. При конкурентной работе двух сеансов с одной записью сработает объектная блокировка: второй сеанс получит ошибку «Конфликт блокировок» и должен корректно её обработать, а не игнорировать.
Как проверить, что вы правильно поняли тип сущности
Быстро определить, с чем вы работаете, помогает функция «ТипЗнч()» в сочетании с «Тип()». Например, «ТипЗнч(Переменная) = Тип("СправочникСсылка.Номенклатура")» покажет, что в переменной ссылка, а не объект. В отладчике тип значения виден прямо в табло — обращайте внимание на слово «Ссылка» или «Объект» в названии типа.
Ещё один практический приём — проверить доступность метода. Если у переменной есть «Записать()» — это объект или набор записей. Если есть только чтение реквизитов и «ПолучитьОбъект()» — это ссылка. Менеджеры объектов (Справочники.Номенклатура) имеют свои методы: «НайтиПоКоду», «СоздатьЭлемент», «ПолучитьСсылку» — и не являются ни ссылкой, ни объектом.
Как проверить результат
СправочникОбъект или ДокументОбъект перед изменением
СправочникСсылка — изменить реквизиты не получится
Метод выполнен без исключений, запись видна в списке
Исключение или запись не появилась в базе
Выборка запросом, объекты только для изменяемых записей
ПолучитьОбъект() вызывается для каждой строки выборки
Частые вопросы об объектах в 1С
Чем отличается объект конфигурации от объекта данных?
Объект конфигурации — это описание структуры в конфигураторе (например, справочник «Номенклатура» с его реквизитами). Объект данных — конкретная запись, созданная по этому описанию: элемент «Гвоздь 100 мм». Один объект конфигурации порождает неограниченное число объектов данных.
Можно ли изменить запись, не получая объект?
Через встроенный язык — нет: изменение реквизитов возможно только у программного объекта, полученного методом «ПолучитьОбъект()» или созданного через «СоздатьЭлемент()» / «СоздатьДокумент()». Исключение — регистры, где данные пишутся набором записей, и служебные методы вроде «УстановитьПометкуУдаления()» у ссылки.
Почему «Ссылка.Реквизит» иногда работает, а иногда нет?
Через ссылку доступны на чтение реквизиты, которые платформа хранит в служебной таблице ссылок: код, наименование, пометка удаления, дата и номер документа, владелец и родитель. Прочие реквизиты при обращении через точку платформа дочитает из базы неявно, но это скрытое обращение к данным — в запросах такое обращение является «обращением через точку» и замедляет выборку.
Что такое менеджер объекта?
Это программный тип вроде СправочникМенеджер.Номенклатура, доступный через «Справочники.Номенклатура». Он не представляет конкретную запись, а предоставляет методы работы со всей сущностью: поиск, создание, получение ссылки, пустую ссылку.
Являются ли отчёты и обработки объектами данных?
Нет. Отчёты и обработки — объекты конфигурации, но они не хранят собственных данных в базе. Их экземпляры в коде (ОтчетОбъект, ОбработкаОбъект) существуют только в памяти на время выполнения и служат для чтения или модификации данных других объектов.
Как безопасно изменить много записей сразу?
Сначала запросом выберите ссылки на нужные записи, затем в цикле получайте объект и записывайте. Оберните тело цикла в попытку с обработкой исключений, при больших объёмах фиксируйте транзакции порциями и обязательно проверяйте результат на копии базы до запуска в рабочей.
Что важно запомнить
В 1С «объект» — трёхуровневое понятие: метаданные в конфигураторе, записи в базе и программные объекты в коде. Ссылка — лёгкий идентификатор записи только для чтения, объект — полная копия для изменения и записи. Читайте данные запросами, изменяйте через объекты, проверяйте ссылки на пустоту и всегда вызывайте Записать() после изменений.