Как использовать подписку на событие для записи данных документа в регистр сведений?

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

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

Понимание механизма подписки

Когда вы создаете подписку в конфигураторе, вы определяете три ключевых элемента:

  1. Источник: объект, событие которого мы отслеживаем (например, ДокументОбъект.ПоступлениеТоваров).
  2. Событие: момент срабатывания (например, ПередЗаписью).
  3. Обработчик: общий модуль, в котором прописана логика действий.

Важно помнить, что в обработчик подписки всегда передается параметр Источник. Это не просто ссылка на документ, а полноценный объект ДокументОбъект, содержащий все данные в оперативной памяти в момент выполнения транзакции.

Реализация записи данных в регистр сведений

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


Процедура ПриПередЗаписиДокумента(Источник, Отказ) Экспорт
    // Проверяем, что документ уже существует в базе
    Если НЕ Источник.ЭтоНовый() Тогда
        МенеджерЗаписи = РегистрыСведений.ТестовыйРегистр.СоздатьМенеджерЗаписи();
        
        // Заполняем ключевые поля
        МенеджерЗаписи.Регистратор = Источник.Ссылка;
        МенеджерЗаписи.Дата = ТекущаяДата();
        
        // Безопасное получение автора
        Если ЗначениеЗаполнено(Источник.Автор) Тогда
            МенеджерЗаписи.Автор = Источник.Автор;
        Иначе
            МенеджерЗаписи.Автор = ПараметрыСеанса.ТекущийПользователь;
        КонецЕсли;
        
        // Запись данных
        МенеджерЗаписи.Записать();
    КонецЕсли;
КонецПроцедуры

Работа с табличными частями

Одной из частых проблем является получение данных из табличных частей документа. Поскольку Источник уже содержит все данные, вам не нужно выполнять дополнительные запросы к базе данных, чтобы получить состав товаров. Обращайтесь к табличной части напрямую через коллекцию Источник.Товары.

Чтобы получить дополнительные реквизиты номенклатуры (например, категорию или ставку НДС), используйте механизм обращения через точку (разыменование ссылки). Платформа 1С самостоятельно выполнит обращение к справочнику:


Для Каждого СтрокаТовара Из Источник.Товары Цикл
    ТекущаяКатегория = СтрокаТовара.Номенклатура.КатегорияТовара;
    ТекущийНДС = СтрокаТовара.Номенклатура.СтавкаНДС;
    
    // Дальнейшая логика обработки записи
КонецЦикла;

Важные рекомендации и архитектурные советы

Рассмотрим, на что необходимо обратить внимание при проектировании подписок:

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

← На главную