При работе с инструментом «Конвертация данных 2.0» (КД 2.0) разработчики часто сталкиваются с ситуацией, когда обмен данными идеально отрабатывает при ручном запуске через обработку выгрузки, но полностью или частично «ломается» при переходе на автоматический режим через регламентное задание. Особенно часто это проявляется на документах: справочники успешно мигрируют, а документы остаются зарегистрированными в плане обмена, так и не попадая в файл выгрузки. Рассмотрим детально причины этого поведения и способы исправления.
Проанализируем механику работы 1С. Когда мы запускаем выгрузку «руками», код выполняется в клиентском контексте. Это означает, что системе доступны интерактивные функции, глобальные переменные клиента и окружение текущего пользователя Windows. Однако регламентное задание выполняется на сервере (в фоновом задании). Здесь контекст исполнения принципиально иной:
Предупреждение(), Вопрос() или даже Сообщить() в некоторых случаях может привести к критической ошибке, если код не обернут в проверку контекста.USR1CV8) имеет свои права доступа к файловой системе и сетевым ресурсам, отличные от прав пользователя.Выясним причину, по которой документы «зависают» в плане обмена. В типовых механизмах выгрузка объектов происходит внутри транзакции. Если при обработке конкретного документа возникает исключение (ошибка кода в обработчике), транзакция откатывается. Поскольку регистрация изменений в плане обмена снимается только после успешного завершения транзакции, при ошибке документы так и остаются «висеть» как невыгруженные.
Рассмотрим пример кода, который часто размещают в обработчике «Перед выгрузкой данных»:
Параметры.Вставить("ТипСправочникСсылкаМойСправочник", Тип("СправочникСсылка.МойСправочник"));
МассивТиповДокументов = Новый Массив;
Для каждого МетаДокумент Из Метаданные.Документы цикл
МассивТиповДокументов.Добавить(Тип("ДокументСсылка." + МетаДокумент.Имя));
МассивТиповДокументов.Добавить(Тип("ДокументОбъект." + МетаДокумент.Имя));
КонецЦикла;
Сам по себе этот код получения типов через метаданные обычно работает и на сервере. Однако, если далее в коде используются переменные, инициализированные только в клиентской части приложения, или происходит обращение к ЭтаФорма, регламентное задание упадет.
Часто разработчики жалуются, что «отладка выгрузки молчит». При работе регламентных заданий мы не видим стандартных сообщений об ошибках. Проанализируем способы диагностики:
Пример отладочного кода для вставки в обработчик:
ИмяФайлаЛога = "C:\Exchange_Logs\debug_log.txt";
ТекстЛога = Новый ЗаписьТекста(ИмяФайлаЛога, КодировкаТекста.UTF8, , Истина);
ТекстЛога.ЗаписатьСтроку("" + ТекущаяДата() + ": Начало обработки документа " + Объект.Ссылка);
ТекстЛога.Закрыть();
Разберем по шагам, как привести правила в соответствие с требованиями серверного выполнения:
Просмотрим все обработчики событий (ПВД, ПКО, ПР) на наличие вызовов, которые могут быть недоступны на сервере. Особое внимание уделим обращению к экспортным переменным клиентских модулей.
Если в правилах используются вызовы функций типа МойОбщийМодульКлиент.ВыполнитьДействие(), убедимся, что этот модуль доступен на сервере. Если логика модуля чисто клиентская, необходимо создать серверный аналог или перенести функции в модуль с флагом «Сервер».
Проанализируем пути выгрузки. Если регламентное задание должно сохранять файл в папку, убедимся, что путь указан в формате UNC (например, \\ServerName\Exchange\), так как сервер 1С не видит подключенные сетевые диски пользователя (диск Z: для него не существует).
Если часть кода должна выполняться только при ручном запуске, обернем её в директивы компиляции. Однако в правилах обмена #Если Клиент Тогда может не сработать напрямую в строковом коде, поэтому лучше использовать программную проверку:
#Если Клиент Тогда
Сообщить("Выполняется ручная выгрузка...");
#КонецЕсли
Выясним эту специфику. Справочники часто имеют более простую структуру и меньше связей. Документы же в процессе выгрузки часто тянут за собой:
Если в правилах выгрузки документов (ПВД) используется произвольный алгоритм, в котором есть обращение к ПараметрыСеанса.ТекущийПользователь, а этот параметр не инициализирован для фонового задания, выгрузка документов прервется, в то время как справочники, выгружаемые «по ссылке», пройдут успешно.
Важный итог: Основная причина сбоев при регламентной выгрузке в КД 2.0 — это попытка выполнить «клиентский» код на стороне сервера. Для решения проблемы необходимо очистить обработчики от интерактивных вызовов, проверить права доступа серверной учетной записи к папкам обмена и убедиться в доступности всех вызываемых общих модулей для контекста сервера.