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