Разработка и Конфигурация · 13 мин
Что такое объектная модель в 1С и как она устроена
Объектная модель в 1С: что это такое, как устроены объекты конфигурации, свойства, методы и коллекции. Примеры работы и типичные ошибки разработчиков.
Объектная модель в 1С — это способ представления данных и логики прикладного решения в виде взаимосвязанных объектов: справочников, документов, регистров, отчётов. Каждый объект имеет свойства (реквизиты), методы (встроенные и пользовательские процедуры) и события, на которые разработчик может подписаться в коде. Понимание объектной модели — базовый навык для любого, кто пишет или дорабатывает конфигурации на встроенном языке 1С.
Модель в 1С не совпадает с классическим ООП из Java или C#: здесь нет наследования классов в привычном смысле, а типы объектов жёстко заданы платформой. Зато платформа сама предоставляет готовую инфраструктуру — хранение в базе данных, интерфейс, права доступа, механизмы проведения документов. Разработчик описывает структуру объектов в конфигураторе, а платформа автоматически создаёт таблицы, формы и поведение.
Практическая польза понимания объектной модели проста: вы точно знаете, чем отличается СправочникОбъект от СправочникСсылка, почему нельзя записать документ через ссылку напрямую и как правильно обходить коллекции. Без этого кода будут появляться ошибки «Поле объекта не обнаружено» и неочевидные проблемы с производительностью.
Из чего состоит объектная модель 1С
Объектная модель строится вокруг прикладных объектов конфигурации. Каждый вид объекта отвечает за свою роль в учёте: справочники хранят нормативно-справочную информацию (номенклатура, контрагенты, склады), документы фиксируют факты хозяйственной деятельности (поступление, реализация, оплата), регистры накапливают итоговые данные для отчётов, перечисления задают фиксированные списки значений, а планы счетов и планы видов характеристик обслуживают бухгалтерский и аналитический учёт.
Кроме прикладных объектов, в модель входят универсальные коллекции и сервисные типы: Структура, Соответствие, Массив, СписокЗначений, ТаблицаЗначений, Запрос, МенеджерЗаписи. Они не хранятся в базе данных, но активно используются в коде для промежуточной обработки данных. Путаница между «объектами конфигурации» и «универсальными коллекциями» — частый источник ошибок у начинающих.
У каждого прикладного объекта есть предопределённый набор свойств и методов платформы плюс те реквизиты, табличные части и обработчики, которые добавил разработчик. Например, у документа всегда есть номер, дата и признак проведения, а у справочника — код и наименование. Эти стандартные реквизиты нельзя удалить, но можно настроить их длину и поведение.
Ссылка и объект: ключевое различие
Самое важное разделение в объектной модели 1С — между ссылкой и объектом. Ссылка (СправочникСсылка, ДокументСсылка) — это лёгкий идентификатор записи в базе. Через ссылку можно читать реквизиты, сравнивать элементы, передавать значение в параметры, но нельзя изменить данные. Объект (СправочникОбъект, ДокументОбъект) — это полная редактируемая копия записи в памяти, которую можно менять и записывать методом Записать().
Чтобы получить объект из ссылки, вызывают метод ПолучитьОбъект(). Обратное преобразование — свойство Ссылка у объекта. Типичная ошибка — вызывать ПолучитьОбъект() внутри цикла по тысячам ссылок: каждый вызов тянет из базы все данные объекта, включая табличные части, и производительность падает в разы. Если нужно только прочитать пару реквизитов, достаточно ссылки или запроса.
Ссылка = Справочники.Номенклатура.НайтиПоКоду("000123");
Если Не Ссылка.Пустая() Тогда
Объект = Ссылка.ПолучитьОбъект();
Объект.Наименование = "Новое наименование";
Объект.Записать();
КонецЕсли;Есть и третий тип представления — выборка из запроса. Когда нужно обработать много записей, правильнее использовать Запрос с выборкой полей: это быстрее, чем перебор объектов, и не загружает лишние данные в память. Объектный подход оправдан только тогда, когда нужно изменить данные с вызовом обработчиков событий (например, проведение документа с его логикой).
Свойства, методы и события объектов
Свойства объектов делятся на системные (номер, дата, ссылка, пометка удаления) и прикладные — реквизиты и табличные части, добавленные в конфигураторе. Доступ к ним в коде одинаковый: через точку, например ДокументОбъект.Контрагент или ДокументОбъект.Товары[0].Количество. Табличная часть — это коллекция, которую можно обходить циклом Для Каждого Строка Из Объект.Товары Цикл.
Методы бывают встроенными (Записать(), Удалить(), НайтиПоНаименованию(), Выбрать()) и определёнными разработчиком — экспортными процедурами и функциями в модуле объекта или модуле менеджера. Модуль менеджера (например, Справочники.Номенклатура.МояФункция()) подходит для логики, не привязанной к конкретному экземпляру; модуль объекта — для поведения конкретной записи.
События — это точки, в которых платформа вызывает обработчики из модулей: ПередЗаписью, ПриЗаписи, ОбработкаПроведения, ОбработкаЗаполнения, ПриКопировании. Внутри обработчика доступен параметр Отказ: установка Отказ = Истина прерывает операцию. Это штатный механизм валидации — например, запретить проведение документа с пустой табличной частью.
Менеджеры объектов и коллекции
Для доступа к объектам каждого вида существует менеджер — программная коллекция вида Справочники.Номенклатура, Документы.РеализацияТоваровУслуг, РегистрыНакопления.ОстаткиТоваров. Через менеджер вызывают методы поиска и создания: НайтиПоКоду(), НайтиПоНаименованию(), СоздатьЭлемент(), СоздатьДокумент(), ПолучитьСсылку(), Выбрать().
Метод Выбрать() возвращает выборку — последовательный курсор по записям с фильтрацией и сортировкой. Выборка легче объекта: она читает данные порциями по мере обхода. Но изменять записи через выборку нельзя — для записи всё равно потребуется ПолучитьОбъект(). Для массового чтения с произвольными условиями мощнее запрос, выборка удобна в простых сценариях вроде обхода иерархии справочника.
Три способа прочитать данные
Когда запись уже идентифицирована и нужно прочитать несколько реквизитов. Не подходит для изменения данных.
Когда нужно изменить запись с вызовом обработчиков событий. Дорого при массовой обработке — не использовать в циклах без необходимости.
Когда нужно выбрать много записей по условиям, соединениям и итогам. Самый быстрый для чтения, но не вызывает обработчики.
Объектная модель в клиент-серверном режиме
В управляемом приложении код делится на клиентский и серверный, и это напрямую влияет на объектную модель. На клиенте недоступны объектные типы (СправочникОбъект, ДокументОбъект) — там работают только ссылки и данные форм. Вся объектная логика выполняется на сервере, а данные формы передаются между клиентом и сервером в специальных типах (ДанныеФормыСтруктура, ДанныеФормыКоллекция).
Практическое следствие: обработчики в модуле формы с директивой &НаСервере могут работать с объектами, а с директивой &НаКлиенте — нет. Переход на сервер — это сетевой вызов, поэтому частые серверные вызовы из цикла на клиенте заметно тормозят интерфейс. Правильный подход — собрать данные на клиенте и одним вызовом передать их в серверную процедуру.
Пошаговый пример: создание и проведение документа программно
Разберём типовой сценарий, который показывает объектную модель в действии: программное создание документа с заполнением табличной части и проведением. Такой код используется при обменах, загрузках из файлов и автоматизации операций.
- 1Получите менеджер документа: Документы.РеализацияТоваровУслуг
- 2Вызовите СоздатьДокумент() — получите новый ДокументОбъект в памяти
- 3Заполните шапку: Дата, Контрагент, Организация и другие реквизиты
- 4Добавьте строки табличной части через Товары.Добавить() и заполните поля строки
- 5Вызовите Записать(РежимЗаписиДокумента.Проведение) внутри Попытка/Исключение
- 6Проверьте результат: документ появился в списке, проведён, движения по регистрам сформированы
Обратите внимание: документ существует в базе только после Записать(). До этого момента это объект в памяти, и его ссылка ещё не зафиксирована (хотя платформа присваивает её заранее через ПолучитьСсылкуНового() при необходимости). Если в обработчике ОбработкаПроведения возникнет отказ, транзакция откатится и записи в базе не будет.
НовыйДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДатаСеанса();
НовыйДок.Контрагент = КонтрагентСсылка;
Строка = НовыйДок.Товары.Добавить();
Строка.Номенклатура = НоменклатураСсылка;
Строка.Количество = 5;
НовыйДок.Записать(РежимЗаписиДокумента.Проведение);Типичные ошибки при работе с объектной моделью
Большинство проблем начинающих разработчиков связаны не со сложной логикой, а с непониманием базовых различий между типами. Ниже — ошибки, которые встречаются чаще всего, и их последствия.
Отдельная группа ошибок — работа с транзакциями. Метод Записать() сам открывает и завершает транзакцию, поэтому вложенные явные транзакции вокруг нескольких записей нужно проектировать аккуратно: при отказе в середине цепочки откатятся все изменения, включая уже записанные объекты. Это может быть как желаемым поведением, так и источником потери частично корректных данных при загрузках.
Как проверить результат
В списке документов стоит отметка проведения, движения видны в регистрах
Документ записан, но не проведён, или движения отсутствуют — искать отказ в ОбработкаПроведения
Время выполнения на копии базы приемлемое, нет роста потребления памяти
Обработка идёт в разы дольше ожидаемого — вероятен ПолучитьОбъект() в цикле
Сработали обработчики ПередЗаписью/ПриЗаписи, данные в базе обновлены
Данные изменились без вызова обработчиков — запись выполнена запросом в обход объектной модели
FAQ: частые вопросы об объектной модели 1С
Чем объектная модель 1С отличается от классического ООП?
В 1С нет наследования, полиморфизма и пользовательских классов в привычном виде. Типы объектов фиксированы платформой (справочник, документ, регистр и т. д.), а расширение поведения идёт через реквизиты, модули и подписки на события. Ближайший аналог «наследования» — общие модули и подписки, позволяющие переиспользовать логику для разных видов объектов.
Когда использовать запрос, а когда объектную модель?
Запрос — для чтения больших объёмов данных, соединений, группировок и итогов: он быстрее и не грузит память. Объектная модель — когда нужно изменить данные с сохранением бизнес-логики: проведение документа, запись элемента с обработчиками, сложная валидация. Смешивать подходы нормально: прочитать запросом, изменить объектно только те записи, где это действительно нужно.
Почему нельзя изменить данные через ссылку?
Ссылка — это только идентификатор записи, а не сама запись. Платформа сознательно разделяет чтение и изменение: редактируемая копия создаётся методом ПолучитьОбъект(), и только она поддерживает Записать(). Такое разделение защищает от случайных изменений и позволяет платформе контролировать транзакции и обработчики событий.
Что такое ДанныеФормы и зачем они нужны?
В управляемых формах реквизиты формы хранятся не как объекты, а в специальных типах (ДанныеФормыСтруктура, ДанныеФормыКоллекция), которые сериализуются между клиентом и сервером. Для объектной работы на сервере используют РеквизитФормыВЗначение() — получают настоящий объект, меняют его и возвращают обратно через ЗначениеВРеквизитФормы().
Как безопасно доработать типовую конфигурацию под свою логику?
Избегайте прямой правки модулей типовых объектов — это усложнит обновления. Используйте подписки на события, расширения конфигурации и дополнительные обработчики БСП, если она встроена. Свою логику выносите в отдельные общие модули, чтобы при обновлении конфликты были минимальны.
Можно ли создать свой тип объекта, которого нет в платформе?
Нет, состав видов прикладных объектов фиксирован платформой. Но для произвольных данных подходят планы видов характеристик и справочники с дополнительными реквизитами и сведениями — они позволяют моделировать новые сущности без изменения структуры конфигурации. Для временных структур в коде используют Структуру и Соответствие.
Что важно запомнить
Объектная модель 1С — это набор предопределённых платформой типов (справочники, документы, регистры) со свойствами, методами и событиями. Главное практическое правило: ссылка — для чтения и идентификации, объект — для изменения с обработчиками, запрос — для массового чтения. Объектные типы доступны только на сервере, а массовую запись всегда проверяйте на копии базы.