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