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

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

Что такое объектная модель в 1С и как она устроена

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

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

Модель в 1С не совпадает с классическим ООП из Java или C#: здесь нет наследования классов в привычном смысле, а типы объектов жёстко заданы платформой. Зато платформа сама предоставляет готовую инфраструктуру — хранение в базе данных, интерфейс, права доступа, механизмы проведения документов. Разработчик описывает структуру объектов в конфигураторе, а платформа автоматически создаёт таблицы, формы и поведение.

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

Из чего состоит объектная модель 1С

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

Кроме прикладных объектов, в модель входят универсальные коллекции и сервисные типы: Структура, Соответствие, Массив, СписокЗначений, ТаблицаЗначений, Запрос, МенеджерЗаписи. Они не хранятся в базе данных, но активно используются в коде для промежуточной обработки данных. Путаница между «объектами конфигурации» и «универсальными коллекциями» — частый источник ошибок у начинающих.

У каждого прикладного объекта есть предопределённый набор свойств и методов платформы плюс те реквизиты, табличные части и обработчики, которые добавил разработчик. Например, у документа всегда есть номер, дата и признак проведения, а у справочника — код и наименование. Эти стандартные реквизиты нельзя удалить, но можно настроить их длину и поведение.

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

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

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

bsl
Ссылка = Справочники.Номенклатура.НайтиПоКоду("000123");
Если Не Ссылка.Пустая() Тогда
    Объект = Ссылка.ПолучитьОбъект();
    Объект.Наименование = "Новое наименование";
    Объект.Записать();
КонецЕсли;

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

Свойства, методы и события объектов

Свойства объектов делятся на системные (номер, дата, ссылка, пометка удаления) и прикладные — реквизиты и табличные части, добавленные в конфигураторе. Доступ к ним в коде одинаковый: через точку, например ДокументОбъект.Контрагент или ДокументОбъект.Товары[0].Количество. Табличная часть — это коллекция, которую можно обходить циклом Для Каждого Строка Из Объект.Товары Цикл.

Методы бывают встроенными (Записать(), Удалить(), НайтиПоНаименованию(), Выбрать()) и определёнными разработчиком — экспортными процедурами и функциями в модуле объекта или модуле менеджера. Модуль менеджера (например, Справочники.Номенклатура.МояФункция()) подходит для логики, не привязанной к конкретному экземпляру; модуль объекта — для поведения конкретной записи.

События — это точки, в которых платформа вызывает обработчики из модулей: ПередЗаписью, ПриЗаписи, ОбработкаПроведения, ОбработкаЗаполнения, ПриКопировании. Внутри обработчика доступен параметр Отказ: установка Отказ = Истина прерывает операцию. Это штатный механизм валидации — например, запретить проведение документа с пустой табличной частью.

Менеджеры объектов и коллекции

Для доступа к объектам каждого вида существует менеджер — программная коллекция вида Справочники.Номенклатура, Документы.РеализацияТоваровУслуг, РегистрыНакопления.ОстаткиТоваров. Через менеджер вызывают методы поиска и создания: НайтиПоКоду(), НайтиПоНаименованию(), СоздатьЭлемент(), СоздатьДокумент(), ПолучитьСсылку(), Выбрать().

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

Три способа прочитать данные

Ссылка

Когда запись уже идентифицирована и нужно прочитать несколько реквизитов. Не подходит для изменения данных.

Объект (ПолучитьОбъект)

Когда нужно изменить запись с вызовом обработчиков событий. Дорого при массовой обработке — не использовать в циклах без необходимости.

Запрос

Когда нужно выбрать много записей по условиям, соединениям и итогам. Самый быстрый для чтения, но не вызывает обработчики.

Объектная модель в клиент-серверном режиме

В управляемом приложении код делится на клиентский и серверный, и это напрямую влияет на объектную модель. На клиенте недоступны объектные типы (СправочникОбъект, ДокументОбъект) — там работают только ссылки и данные форм. Вся объектная логика выполняется на сервере, а данные формы передаются между клиентом и сервером в специальных типах (ДанныеФормыСтруктура, ДанныеФормыКоллекция).

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

Пошаговый пример: создание и проведение документа программно

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

Порядок действий
  1. 1
    Получите менеджер документа: Документы.РеализацияТоваровУслуг
  2. 2
    Вызовите СоздатьДокумент() — получите новый ДокументОбъект в памяти
  3. 3
    Заполните шапку: Дата, Контрагент, Организация и другие реквизиты
  4. 4
    Добавьте строки табличной части через Товары.Добавить() и заполните поля строки
  5. 5
    Вызовите Записать(РежимЗаписиДокумента.Проведение) внутри Попытка/Исключение
  6. 6
    Проверьте результат: документ появился в списке, проведён, движения по регистрам сформированы

Обратите внимание: документ существует в базе только после Записать(). До этого момента это объект в памяти, и его ссылка ещё не зафиксирована (хотя платформа присваивает её заранее через ПолучитьСсылкуНового() при необходимости). Если в обработчике ОбработкаПроведения возникнет отказ, транзакция откатится и записи в базе не будет.

bsl
НовыйДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДатаСеанса();
НовыйДок.Контрагент = КонтрагентСсылка;
Строка = НовыйДок.Товары.Добавить();
Строка.Номенклатура = НоменклатураСсылка;
Строка.Количество = 5;
НовыйДок.Записать(РежимЗаписиДокумента.Проведение);

Типичные ошибки при работе с объектной моделью

Большинство проблем начинающих разработчиков связаны не со сложной логикой, а с непониманием базовых различий между типами. Ниже — ошибки, которые встречаются чаще всего, и их последствия.

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

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

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

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

Документ проведён программно
Норма

В списке документов стоит отметка проведения, движения видны в регистрах

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

Документ записан, но не проведён, или движения отсутствуют — искать отказ в ОбработкаПроведения

Массовая обработка элементов
Норма

Время выполнения на копии базы приемлемое, нет роста потребления памяти

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

Обработка идёт в разы дольше ожидаемого — вероятен ПолучитьОбъект() в цикле

Изменение элемента справочника
Норма

Сработали обработчики ПередЗаписью/ПриЗаписи, данные в базе обновлены

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

Данные изменились без вызова обработчиков — запись выполнена запросом в обход объектной модели

FAQ: частые вопросы об объектной модели 1С

Чем объектная модель 1С отличается от классического ООП?

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

Когда использовать запрос, а когда объектную модель?

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

Почему нельзя изменить данные через ссылку?

Ссылка — это только идентификатор записи, а не сама запись. Платформа сознательно разделяет чтение и изменение: редактируемая копия создаётся методом ПолучитьОбъект(), и только она поддерживает Записать(). Такое разделение защищает от случайных изменений и позволяет платформе контролировать транзакции и обработчики событий.

Что такое ДанныеФормы и зачем они нужны?

В управляемых формах реквизиты формы хранятся не как объекты, а в специальных типах (ДанныеФормыСтруктура, ДанныеФормыКоллекция), которые сериализуются между клиентом и сервером. Для объектной работы на сервере используют РеквизитФормыВЗначение() — получают настоящий объект, меняют его и возвращают обратно через ЗначениеВРеквизитФормы().

Как безопасно доработать типовую конфигурацию под свою логику?

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

Можно ли создать свой тип объекта, которого нет в платформе?

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

Итог

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

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