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

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

Часто перед разработчиками встает задача оперативного реагирования на изменения данных в регистрах накопления, например, для выгрузки остатков на внешний web-сервер. В процессе реализации этого функционала возникают сложности с выбором правильного события, так как стандартная подписка на ПриЗаписи может создавать иллюзию отсутствия данных или неактуальности остатков. Давайте разберем, как правильно реализовать данный механизм, избегая ошибок.

Понимание работы события «ПриЗаписи»

Многие разработчики сталкиваются с тем, что в обработчике события ПриЗаписи регистра накопления запрос к виртуальной таблице Остатки не возвращает ожидаемых изменений. Это связано с тем, что транзакция записи еще не завершена, а виртуальные таблицы работают с данными, зафиксированными на момент начала транзакции или с учетом установленных временных границ. Чтобы получить актуальные данные, нет необходимости выполнять тяжелые запросы. Достаточно проанализировать сам объект Источник, который передается в процедуру подписки.

Способ 1: Анализ набора записей в подписке «ПриЗаписи»

Вместо того чтобы обращаться к базе данных повторно, используйте метод Источник.Выгрузить(). Это позволит вам получить точный состав движений, которые были сформированы документом. Рассмотрим пример реализации такой проверки:


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

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

Способ 2: Универсальная подписка на «ОбработкаПроведения»

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

Такой подход позволяет сделать код универсальным и устойчивым к изменениям в конфигурации:


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

Используя конструкцию Источник.Движения.Найти(), вы защищаете себя от ошибок при обращении к несуществующим таблицам движений в различных типах документов.

Способ 3: Использование планов обмена

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

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

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

Ключевые рекомендации

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

← На главную