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