Синхронизация данных между конфигурациями 1С (например, между двумя базами на платформе «1С:Предприятие», такими как «Управление производственным предприятием») — это критически важный процесс. Нередко возникает ситуация, когда в ручном режиме запуск обмена проходит успешно и документы попадают в базу-приемник, а в автоматическом режиме (по регламентному заданию) данные не доходят. При этом у технического специалиста может не быть прямого доступа к FTP-серверу или каталогу обмена, чтобы физически проверить наличие выгруженного XML-файла.
В этой статье мы подробно рассмотрим, как локализовать и решить данную проблему, используя встроенные механизмы платформы 1С, возможности планов обмена, отладчик и доработку правил конвертации.
Каждый автоматический обмен строится на механизме планов обмена. Когда объект (документ или справочник) создается или изменяется, платформа фиксирует это событие. Для проверки того, «участвовал» ли документ в выгрузке, мы можем проанализировать таблицу регистрации изменений. Для обеспечения стабильности процесса автоматический регулярный обмен данными между базами 1С по расписанию настраивается поверх существующих правил конвертации.
Разберем по шагам состояния регистрации объекта:
НомерСообщения имеет значение 0 или NULL. Это указывает на то, что объект ожидает своей очереди на отправку.125).НомерСообщения изменится с 0 на конкретное число (номер отправленного пакета). Если автоматический обмен отработал, а у документа появился номер сообщения — это означает, что платформа физически выбрала этот объект и попыталась записать его в файл обмена.Для детального анализа регистрации изменений мы можем использовать консоль запросов. Напишем простой запрос к таблице регистрации изменений конкретного документа:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияИзменения.Ссылка КАК ДокументСсылка,
| РеализацияИзменения.Узел КАК УзелОбмена,
| РеализацияИзменения.НомерСообщения КАК НомерСообщения
|ИЗ
| Документ.РеализацияТоваровУслуг.Изменения КАК РеализацияИзменения
|ГДЕ
| РеализацияИзменения.Ссылка = &СсылкаНаДокумент";
Запрос.УстановитьПараметр("СсылкаНаДокумент", ПроверяемыйДокумент);
РезультатЗапроса = Запрос.Выполнить();
Проанализируем результаты выполнения такого запроса:
Отказ = Истина, либо объект перезаписывается другими процессами).НомерСообщения больше нуля (например, 45) — объект был успешно записан в файл обмена, но база-источник еще не получила квитанцию от приемника. Возможно, файл обмена застрял на FTP или приемник не может его прочитать.НомерСообщения равен 0 — автоматический обмен даже не пытался выгрузить данный документ. Возможно, регламентное задание вообще не запускалось или завершается с ошибкой до начала обработки данных.Часто для локализации проблемы разработчики временно изменяют настройки обмена, перенаправляя выгрузку из недоступного FTP-ресурса в локальную папку на сервере. Однако здесь можно столкнуться со следующей проблемой: при ручном запуске файл в папке появляется, а при автоматическом (через регламентное задание) — каталог остается пустым.
Выясним причину этой разницы в поведении систем:
D:).USR1CV8 или SYSTEM).Если у пользователя USR1CV8 отсутствуют права «Запись» и «Изменение» на целевой каталог, регламентное задание завершится ошибкой записи файла, и папка останется пустой. Чтобы исправить это, выполним следующие шаги:
1C:Enterprise Server (например, USR1CV8), и предоставим ему полные права на чтение и запись.КаталогВременныхФайлов().Если нам критически важно зайти на FTP-сервер обмена, но учетные данные утеряны или скрыты под маской в интерфейсе настроек 1С, мы можем программно перехватить пароль в режиме отладки.
Проанализируем, как это сделать:
Ctrl + Shift + F) и найдем вызовы функций работы с FTP, выполнив поиск по ключевому слову Новый FTPСоединение.ОбменДаннымиСервер) и установим точку останова на строке инициализации соединения.Ctrl + Alt + W) и добавим туда переменные, содержащие адрес сервера, имя пользователя и пароль (например, ПараметрыПодключения.Пароль или ПарольFTP).Получив эти данные, мы сможем подключиться к FTP-серверу через любой внешний клиент и отслеживать появление файлов обмена в реальном времени.
Если обмен настроен по правилам обмена (типично для конфигураций на обычных формах, таких как УПП), мы можем внедрить трассировку выгрузки конкретного объекта непосредственно в код правил через конфигурацию «Конвертация данных».
Добавим запись в стандартный Журнал регистрации источника. Для этого откроем правила конвертации объектов (ПКО) для нужного нам документа и перейдем в обработчик события «После выгрузки». Напишем следующий код:
// Проверяем, что выгружается именно наш тестовый документ
Если Источник.Ссылка = СсылкаНаПроверяемыйДокумент Тогда
ЗаписьЖурналаРегистрации(
"ОбменДанными.ДетальнаяВыгрузка",
УровеньЖурналаРегистрации.Информация,
Источник.Метаданные(),
Источник.Ссылка,
"Объект успешно обработан правилом и записан в XML-файл обмена."
);
КонецЕсли;
Этот простой метод позволит со 100% уверенностью определить, дошел ли объект до этапа сериализации в XML. Если после выполнения фонового обмена в Журнале регистрации источника появится данное событие — значит, выгрузка прошла успешно, файл был сформирован, и проблему нужно искать на этапе доставки файла или его загрузки в приемник.
Если ваша конфигурация использует современную Библиотеку стандартных подсистем (БСП), разработчики могут активировать встроенный режим отладки синхронизации без изменения кода базы данных:
Используя приведенные методы диагностики в комплексе, вы сможете быстро локализовать узкое место в цепочке обмена данными и восстановить корректную работу автоматической синхронизации. Для автоматизированной проверки фактической передачи данных можно использовать обработку для сверки выгрузки документов между базами.