Как перехватить создание элемента справочника в 1С:ERP, если у него нет форм?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием IT и автоматизация бизнеса
← На главную

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

В этой статье мы подробно разберем, как технически правильно реализовать этот механизм с помощью расширений, почему подписки на события эффективнее правок в модулях и на какие нюансы платформы стоит обратить внимание. Давайте приступим к совместному разбору задачи.

Понимание архитектуры: Уровень формы vs Уровень объекта

Прежде всего, проанализируем ситуацию. Почему отсутствие формы у справочника Производители не является препятствием? В платформе 1С события записи данных строго разделены на два уровня:

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

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

Решение 1: Использование подписок на события в расширении

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

Разберем процесс по шагам:

  1. Создайте в расширении новый объект типа Подписка на событие.
  2. В поле Источник выберите СправочникОбъект.Производители.
  3. В поле Событие выберите ПриЗаписи (если вам нужно, чтобы ссылка на объект уже была сформирована в базе данных) или ПередЗаписью (если нужно успеть изменить данные до их фиксации).
  4. В качестве Обработчика укажите процедуру в общем модуле вашего расширения.

Посмотрим на пример кода такого обработчика в общем модуле:


Процедура Расш1_ПроизводителиПриЗаписи(Источник, Отказ) Экспорт
    
    // Проверяем, не идет ли загрузка данных (обмен), чтобы не замедлять процесс
    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

    // Выполняем манипуляции с объектом
    // Например, логируем создание нового производителя
    Если Источник.ЭтоНовый() Тогда // В ПриЗаписи ЭтоНовый() может не сработать, лучше проверять в ПередЗаписью
        ЗаписатьВЖурналРегистрации("Создан новый производитель: " + Источник.Наименование);
    КонецЕсли;

КонецПроцедуры

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

Решение 2: Переопределение модуля объекта через расширение

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

Выясним, как это сделать правильно:

  1. Найдите справочник в дереве метаданных, нажмите правой кнопкой мыши и выберите «Добавить в расширение».
  2. Откройте модуль объекта справочника внутри расширения.
  3. Используйте аннотации для перехвата стандартных событий.

Проанализируем пример кода с использованием аннотации &После:


&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ)
    // Проверяем признак нового объекта
    Если ЭтоНовый() Тогда
        // Здесь ваша логика при создании
        Сообщить("Внимание: создается новая карточка производителя!");
    КонецЕсли;
    
    // Можно дозаполнить реквизиты, даже если их нет в форме
    // Например, если вы добавили свой реквизит через расширение
    // ЭтотОбъект.Расш1_ДатаРегистрации = ТекущаяДата();
КонецПроцедуры

Преимущество этого метода в том, что вам доступны все контекстные свойства ЭтотОбъект напрямую. Однако помните, что подписки на события работают чуть быстрее и считаются более правильными при масштабировании системы.

Решение 3: Создание собственной формы (интерактивный сценарий)

Рассмотрим ситуацию, когда вам все же необходимо вмешаться в процесс именно в момент работы пользователя с экраном. Например, если вы хотите выводить предупреждения или динамически скрывать какие-то элементы (хотя в «пустом» справочнике их нет).

В этом случае вам придется:

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


&НаСервере
Процедура ПриЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
    // Данный код сработает только при интерактивной записи из этой формы
    // Здесь можно выполнить проверку заполнения перед тем, как объект уйдет в базу
КонецПроцедуры

Внимание: Помните, что код в модуле формы не сработает, если элемент создается программно (например, через обработку Объект.Записать()) или при загрузке из Excel/EDI. Для бизнес-логики всегда лучше использовать методы, описанные в Решении 1 и 2.

Критически важные нюансы при работе в ERP

Проанализируем специфику 1С:ERP. Справочник Производители часто задействован в механизмах 1С:Номенклатура и других сервисах классификации. Поэтому при написании кода всегда учитывайте следующее:

  1. Свойство ОбменДанными.Загрузка: Всегда проверяйте это свойство. Если оно равно Истина, значит, данные записываются в процессе обмена. В такие моменты выполнение тяжелых запросов или вызов диалоговых окон недопустим.
  2. Дополнительные реквизиты: В ERP справочник Производители поддерживает механизм «Дополнительных реквизитов и сведений». Прежде чем писать код для хранения новых данных, проверьте, нельзя ли обойтись настройкой доп. реквизитов в пользовательском режиме. Это сэкономит время на поддержку расширения.
  3. Версионирование: Если ваша задача — отслеживать, кто и когда создал производителя, достаточно включить стандартный функционал «Версионирование объектов» в разделе Администрирование, не написав ни строчки кода.

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

← На главную