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