Как получить список документов, загруженных в 1С при синхронизации через универсальный формат?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

Синхронизация данных между типовыми конфигурациями, такими как Управление торговлей 11 и Бухгалтерия предприятия 3.0, работающими на базе Библиотеки стандартных подсистем (БСП), — это сложный процесс. Часто после завершения обмена возникает необходимость увидеть не просто статус «Успешно», а конкретный список документов, которые были созданы или обновлены в базе. В типовом функционале «из коробки» такой детальный отчет по каждому объекту зачастую отсутствует, а использование Журнала регистрации для этих целей крайне неудобно из-за огромного объема лишней информации и низкой производительности при выборке.

В этой статье мы подробно разберем, как решить задачу получения списка синхронизированных документов, проанализируем внутренние механизмы 1С и предложим варианты реализации собственного инструмента мониторинга.

Анализ стандартных механизмов хранения данных об обмене

Прежде чем переходить к разработке своего решения, давайте проанализируем, какие данные система уже собирает в процессе работы через Универсальный формат (EnterpriseData). Нам важно понимать, где фиксируются связи между объектами разных информационных баз.

Одним из ключевых объектов является регистр сведений СоответствияОбъектовИнформационныхУзлов. Рассмотрим подробнее его назначение. В этом регистре система хранит пары соответствий: ссылку на объект в текущей базе и уникальный идентификатор (GUID) этого же объекта во внешней базе. При первой загрузке документа запись в этом регистре создается автоматически.

Однако у этого метода есть существенное ограничение: регистр фиксирует только факт «знакомства» систем с объектом. Если документ будет изменен в базе-источнике и повторно загружен, дата записи в регистре соответствий может не обновиться, так как связь уже установлена. Таким образом, использовать этот регистр для получения списка документов, загруженных именно в последнем сеансе, без дополнительных доработок не получится.

Также проанализируем регистр ПубличныеИдентификаторыОбъектов. Он используется при обмене через EnterpriseData для сопоставления объектов по полям поиска. Информация в нем также может быть полезна для технического анализа, но она не дает истории загрузок.

Решение проблемы через механизм расширений

Самым эффективным и «чистым» способом получения точного списка загруженных документов является использование механизма расширений конфигурации. Нам необходимо перехватить момент окончания загрузки каждого объекта и зафиксировать этот факт в своем регистре.

Разберем по шагам, как это реализовать:

  1. Создадим в расширении новый Регистр сведений, назовем его, например, ЛогЗагрузкиОбъектов. В нем нам понадобятся следующие измерения и ресурсы:
    • Объект (Тип: ЛюбаяСсылка) — ссылка на загруженный документ или справочник.
    • ДатаЗагрузки (Тип: Дата) — дата и время совершения обмена.
    • УзелИнформационнойБазы (Тип: ПланОбменаСсылка) — источник данных.
    • ЭтоНовыйОбъект (Тип: Булево) — флаг, позволяющий отличить создание от обновления.
  2. Используем механизм перехвата событий в модуле менеджера обмена. В универсальном формате основным инструментом является МенеджерОбменаЧерезУниверсальныйФормат.

Нам нужно найти или использовать процедуру ПослеЗагрузкиОбъекта. В расширении мы можем применить аннотацию &После. Посмотрим на пример программного кода:


&После("ПослеЗагрузкиОбъекта")
Процедура ИмяПрефикс_ПослеЗагрузкиОбъекта(Объект, ДанныеXDTO, КомпонентыОбмена)
    
    // Проверяем, является ли объект документом
    Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Объект)) Тогда
        
        МенеджерЗаписи = РегистрыСведений.ЛогЗагрузкиОбъектов.СоздатьМенеджерЗаписи();
        МенеджерЗаписи.Объект = Объект.Ссылка;
        МенеджерЗаписи.ДатаЗагрузки = ТекущаяДата();
        МенеджерЗаписи.УзелИнформационнойБазы = КомпонентыОбмена.УзелИнформационнойБазы;
        
        // Определяем, был ли это новый объект
        // (Для этого можно проверить версию объекта или использовать дополнительные свойства)
        МенеджерЗаписи.ЭтоНовыйОбъект = Объект.ЭтоНовый(); 
        
        МенеджерЗаписи.Записать();
        
    КонецЕсли;
    
КонецПроцедуры

Этот метод позволяет фиксировать абсолютно все успешные загрузки в режиме реального времени. После чего построение отчета станет тривиальной задачей — достаточно будет сделать запрос к созданному регистру сведений за определенный период.

Использование XDTO-логов для глубокого анализа

Если задача стоит разово или вы не хотите вносить изменения в структуру базы, проанализируем ситуацию с XDTO-логами. В настройках синхронизации данных или через параметры запуска можно включить режим отладки обмена.

При включенной отладке система сохраняет входящие XML-файлы сообщений обмена. Выясним причину, почему это может быть полезно: в файле Message_..._...xml содержатся все данные в формате EnterpriseData. Мы можем программно или вручную разобрать этот файл, чтобы увидеть перечень всех GUID и типов объектов, которые были переданы.

Для программного разбора файла сообщения можно использовать следующий подход:

  1. Загрузить XML-файл через ЧтениеXML.
  2. Использовать ФабрикаXDTO для чтения данных.
  3. Обойти коллекцию загруженных данных и вывести их в список.

Этот способ сложнее в реализации, но он позволяет получить данные даже за прошлые периоды, если файлы обмена сохранились в каталоге обмена или во временных папках сервера.

Типовой отчет «Анализ синхронизации данных»

Не стоит забывать и о встроенных возможностях. В разделе Администрирование — Синхронизация данных — Настройки синхронизации выберите нужный узел и посмотрите меню «Отчеты». Там присутствует отчет Анализ синхронизации данных.

Рассмотрим подробнее его функционал. В основном он предназначен для отображения конфликтов и коллизий (когда объект был изменен одновременно в двух базах). Однако, если настроить варианты отчета, в некоторых релизах можно увидеть статистику по успешно принятым данным. К сожалению, детализация до конкретного документа там реализована не всегда удобно, но как быстрый способ первичного анализа этот вариант стоит рассмотреть.

Создание отчета на основе COM-соединения

Рассмотрим еще один вариант, предложенный участниками обсуждения: создание внешнего отчета с подключением к другой базе через COM-соединение. Этот метод будет полезен, если вам нужно не просто знать, что документ загрузился, а сравнить его состояние в двух базах.

Алгоритм работы такого отчета:

  1. Подключаемся к базе-источнику (например, УТ 11) через V83.COMConnector.
  2. Выбираем документы за период, которые были изменены.
  3. В текущей базе (БП 3) через регистр СоответствияОбъектовИнформационныхУзлов ищем соответствующие ссылки по идентификаторам базы-источника.
  4. Выводим результат: сопоставлен объект или нет, и когда была последняя регистрация изменений.

Этот метод не требует изменения конфигурации, но требует наличия прав доступа к обеим базам и может работать медленно на больших объемах данных.

Выводы и рекомендации

Проанализировав все доступные способы, можно сделать следующие выводы:

Выбор конкретного метода зависит от ваших технических возможностей и того, насколько часто требуется получать подобную отчетность. Внедрение собственного лога загрузки в расширении — самый надежный путь для системного контроля качества синхронизации данных.

← На главную