При работе с крупными конфигурациями, такими как 1С:ERP Управление предприятием, разработчики часто сталкиваются с объектами, которые кажутся «пустыми». Яркий пример — справочник Производители. В нем может не быть ни назначенных форм, ни прописанной логики в модулях. Однако перед нами часто стоит задача: выполнить определенные манипуляции именно в момент создания или записи такого элемента (например, синхронизировать данные с внешней системой или заполнить дополнительные реквизиты).
В этой статье мы подробно разберем, как технически правильно реализовать этот механизм с помощью расширений, почему подписки на события эффективнее правок в модулях и на какие нюансы платформы стоит обратить внимание. Давайте приступим к совместному разбору задачи.
Прежде всего, проанализируем ситуацию. Почему отсутствие формы у справочника Производители не является препятствием? В платформе 1С события записи данных строго разделены на два уровня:
ПослеЗаписи или ПриЗаписиНаСервере. Они срабатывают только тогда, когда пользователь нажимает кнопку «Записать и закрыть» непосредственно в интерфейсе.ПередЗаписью и ПриЗаписи, расположенные в модуле объекта. Они срабатывают всегда: и при ручном вводе, и при программном создании элемента, и при загрузке данных из внешних систем.Если формы нет, платформа генерирует так называемую автоформу. Пытаться «поймать» событие через создание своей формы — это трудоемкий и зачастую избыточный путь, если ваша цель заключается исключительно в обработке данных. Рассмотрим более элегантные способы.
Проанализируем наиболее гибкий метод — создание Подписки на событие внутри вашего расширения. Это «золотой стандарт» разработки в 1С, так как он позволяет не изменять сам объект метаданных и сохранять чистоту конфигурации.
Разберем процесс по шагам:
Подписка на событие.СправочникОбъект.Производители.ПриЗаписи (если вам нужно, чтобы ссылка на объект уже была сформирована в базе данных) или ПередЗаписью (если нужно успеть изменить данные до их фиксации).Посмотрим на пример кода такого обработчика в общем модуле:
Процедура Расш1_ПроизводителиПриЗаписи(Источник, Отказ) Экспорт
// Проверяем, не идет ли загрузка данных (обмен), чтобы не замедлять процесс
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Выполняем манипуляции с объектом
// Например, логируем создание нового производителя
Если Источник.ЭтоНовый() Тогда // В ПриЗаписи ЭтоНовый() может не сработать, лучше проверять в ПередЗаписью
ЗаписатьВЖурналРегистрации("Создан новый производитель: " + Источник.Наименование);
КонецЕсли;
КонецПроцедуры
Важный нюанс: Обработчик подписки на событие должен обязательно находиться в Общем модуле, у которого установлены свойства Сервер и Внешнее соединение.
Если по какой-то причине подписки вам не подходят, мы можем рассмотреть вариант с расширением модуля объекта. Даже если в основной конфигурации модуль объекта справочника Производители абсолютно пуст, платформа позволяет «добавить» его в расширение и дописать нужную логику.
Выясним, как это сделать правильно:
Проанализируем пример кода с использованием аннотации &После:
&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ)
// Проверяем признак нового объекта
Если ЭтоНовый() Тогда
// Здесь ваша логика при создании
Сообщить("Внимание: создается новая карточка производителя!");
КонецЕсли;
// Можно дозаполнить реквизиты, даже если их нет в форме
// Например, если вы добавили свой реквизит через расширение
// ЭтотОбъект.Расш1_ДатаРегистрации = ТекущаяДата();
КонецПроцедуры
Преимущество этого метода в том, что вам доступны все контекстные свойства ЭтотОбъект напрямую. Однако помните, что подписки на события работают чуть быстрее и считаются более правильными при масштабировании системы.
Рассмотрим ситуацию, когда вам все же необходимо вмешаться в процесс именно в момент работы пользователя с экраном. Например, если вы хотите выводить предупреждения или динамически скрывать какие-то элементы (хотя в «пустом» справочнике их нет).
В этом случае вам придется:
Как только вы назначите свою форму основной, платформа перестанет генерировать автоформу и будет использовать ваш вариант. Теперь вам доступны все стандартные события формы:
&НаСервере
Процедура ПриЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
// Данный код сработает только при интерактивной записи из этой формы
// Здесь можно выполнить проверку заполнения перед тем, как объект уйдет в базу
КонецПроцедуры
Внимание: Помните, что код в модуле формы не сработает, если элемент создается программно (например, через обработку Объект.Записать()) или при загрузке из Excel/EDI. Для бизнес-логики всегда лучше использовать методы, описанные в Решении 1 и 2.
Проанализируем специфику 1С:ERP. Справочник Производители часто задействован в механизмах 1С:Номенклатура и других сервисах классификации. Поэтому при написании кода всегда учитывайте следующее:
Истина, значит, данные записываются в процессе обмена. В такие моменты выполнение тяжелых запросов или вызов диалоговых окон недопустим.Производители поддерживает механизм «Дополнительных реквизитов и сведений». Прежде чем писать код для хранения новых данных, проверьте, нельзя ли обойтись настройкой доп. реквизитов в пользовательском режиме. Это сэкономит время на поддержку расширения.Таким образом, мы выяснили, что отсутствие видимых форм и кода в типовой конфигурации — это не ограничение, а особенность проектирования. Использование подписок на события в расширении является самым надежным и профессиональным способом решения поставленной задачи.