В процессе сопровождения распределенных информационных баз (РИБ) или регулярной синхронизации данных между конфигурациями 1С разработчики и администраторы нередко сталкиваются с ситуацией, когда в таблицах регистрации изменений плана обмена внезапно появляется множество старых документов. Это приводит к разрастанию пакетов выгрузки, замедлению обмена и риску перезаписи актуальных данных в узлах-приемниках. Проанализируем, почему объекты попадают в регистрацию и какими способами можно выяснить источник этого события.
Для понимания сути проблемы разберем внутреннее устройство таблиц регистрации изменений 1С. В платформе таблица изменений для каждого объекта метаданных хранит только минимальный набор сведений: ссылку на узел плана обмена, ссылку на сам объект (или ключ записи) и номер сообщения, в котором изменение было отправлено. Платформа не хранит метаданные о том, какой именно сеанс, пользователь, фоновое задание или строчка кода добавили запись в таблицу изменений.
Кроме того, в платформе 1С отсутствует системный триггер или предопределенное событие вроде «ПриРегистрацииИзменения», которое позволяло бы перехватить момент физической записи в таблицу на встроенном языке. Поэтому выявление первопричины требует комплексного анализа механизмов конфигурации.
Рассмотрим типовые сценарии, из-за которых документы могут регистрироваться к обмену:
ПриЗаписи, настроенные для автоматической фиксации изменений узлов. Если пользователь или внешняя обработка перезаписали старый документ, он неизбежно попадет в план обмена.ПередЗаписью и ПриЗаписи не инициируются, дата модификации объекта не меняется, а стандартный Журнал регистрации не фиксирует никаких действий над объектом.Разберем первый и самый простой шаг расследования — проверку прямой модификации документа. Если документ попал в обмен из-за фактической записи, это отразится в системном журнале регистрации.
Если в Журнале регистрации по данному документу за указанное время записей нет, значит, документ не перезаписывался физически, а был зарегистрирован напрямую через вызов ПланыОбмена.ЗарегистрироватьИзменения() или служебные механизмы БСП.
Если прямой след объекта в Журнале регистрации отсутствует, сопоставим время появления записей в обмене с расписанием системных задач. Отфильтруем Журнал регистрации за утренние часы без отбора по конкретным данным, но с отбором по уровню важности «Ошибка, Предупреждение, Информация» и событиям выполнения регламентных заданий. Это позволит выяснить, какие регламентные процедуры выполнялись непосредственно перед массовым заполнением таблиц обмена.
Наиболее точный и низкоуровневый способ поймать источник программной регистрации объекта без внесения изменений в конфигурацию — настройка Технологического журнала 1С на стороне сервера.
В момент вызова метода ПланыОбмена.ЗарегистрироватьИзменения() платформа выполняет операцию INSERT в соответствующую таблицу СУБД. В зависимости от типа СУБД таблица изменений документа имеет имя вида _Document<N>_ChngR<N> или _NodeChangeRec<N>. Настроив сбор событий обращения к СУБД с отбором по подстроке имени таблицы, мы сможем зафиксировать полный контекст исполнения.
Посмотрим на пример конфигурационного файла logcfg.xml для сбора событий СУБД:
<config xmlns="http://v8.1c.ru/v8/tech-log">
<dump create="false"/>
<log location="C:\LOGS\PlanExchange" history="24">
<event>
<eq property="name" value="DBMSSQL"/>
<like property="sql" value="%_Document%_ChngR%"/>
</event>
<property name="all"/>
</log>
</config>
В событии ТЖ будут зафиксированы параметры Context (стек вызовов на встроенном языке с указанием модулей и номеров строк), имя пользователя (usr) и имя процесса, что позволит однозначно установить фрагмент программного кода, вызвавший добавление записей.
Если обмен построен на типовой библиотеке БСП, проанализируем правила регистрации данных (ПРД). Откроем типовую обработку «Регистрация изменений для обмена данными» и проверим настройки автоматической регистрации для подозрительного документа. Нередко причиной лавинообразной регистрации старых документов становятся некорректные выборки в обработчиках правил регистрации данных, когда при обновлении периодического регистра сведений или связанного справочника алгоритм пытается заново перерегистрировать документы за закрытые периоды.
В процессе обсуждения часто возникает вопрос о влиянии даты запрета. Важно разделять два механизма:
Используя комбинацию анализа Журнала регистрации и технологического журнала, можно гарантированно локализовать участок кода, отвечающий за неожиданную регистрацию объектов в плане обмена.