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