Почему в Конвертации данных 2.0 не выгружаются документы через регламентное задание, если ручная выгрузка работает?

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

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

Разбор ситуации: Клиентский и серверный контекст

Проанализируем механику работы 1С. Когда мы запускаем выгрузку «руками», код выполняется в клиентском контексте. Это означает, что системе доступны интерактивные функции, глобальные переменные клиента и окружение текущего пользователя Windows. Однако регламентное задание выполняется на сервере (в фоновом задании). Здесь контекст исполнения принципиально иной:

  1. Интерактивные действия недопустимы: Любая попытка вызвать Предупреждение(), Вопрос() или даже Сообщить() в некоторых случаях может привести к критической ошибке, если код не обернут в проверку контекста.
  2. Доступ к ресурсам: Серверный процесс (обычно USR1CV8) имеет свои права доступа к файловой системе и сетевым ресурсам, отличные от прав пользователя.
  3. Общие модули: Если код в правилах (ПКО, ПВД, ПР) обращается к процедурам общих модулей, у которых установлена галочка «Клиент», но отсутствует «Сервер», выполнение на сервере прервется с ошибкой «Процедура или функция не обнаружена».

Проблема выгрузки документов и план обмена

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

Рассмотрим пример кода, который часто размещают в обработчике «Перед выгрузкой данных»:


Параметры.Вставить("ТипСправочникСсылкаМойСправочник", Тип("СправочникСсылка.МойСправочник"));
МассивТиповДокументов = Новый Массив;

Для каждого МетаДокумент Из Метаданные.Документы цикл
    МассивТиповДокументов.Добавить(Тип("ДокументСсылка." + МетаДокумент.Имя));    
    МассивТиповДокументов.Добавить(Тип("ДокументОбъект." + МетаДокумент.Имя));    
КонецЦикла;

Сам по себе этот код получения типов через метаданные обычно работает и на сервере. Однако, если далее в коде используются переменные, инициализированные только в клиентской части приложения, или происходит обращение к ЭтаФорма, регламентное задание упадет.

Диагностика ошибки: Как «услышать» молчаливую отладку

Часто разработчики жалуются, что «отладка выгрузки молчит». При работе регламентных заданий мы не видим стандартных сообщений об ошибках. Проанализируем способы диагностики:

  1. Журнал регистрации: Это первый инструмент, который нужно проверить. Ищите записи с уровнем «Ошибка». Часто там фиксируется текст ошибки и номер строки в сгенерированном модуле выгрузки.
  2. Запись в лог-файл: Мы можем принудительно внедрить в обработчики правил код для записи промежуточных этапов в текстовый файл. Это поможет понять, на каком именно объекте спотыкается сервер.

Пример отладочного кода для вставки в обработчик:


ИмяФайлаЛога = "C:\Exchange_Logs\debug_log.txt";
ТекстЛога = Новый ЗаписьТекста(ИмяФайлаЛога, КодировкаТекста.UTF8, , Истина);
ТекстЛога.ЗаписатьСтроку("" + ТекущаяДата() + ": Начало обработки документа " + Объект.Ссылка);
ТекстЛога.Закрыть();

Методика устранения проблемы «Клиентского контекста»

Разберем по шагам, как привести правила в соответствие с требованиями серверного выполнения:

Шаг 1. Ревизия обработчиков

Просмотрим все обработчики событий (ПВД, ПКО, ПР) на наличие вызовов, которые могут быть недоступны на сервере. Особое внимание уделим обращению к экспортным переменным клиентских модулей.

Шаг 2. Проверка доступности общих модулей

Если в правилах используются вызовы функций типа МойОбщийМодульКлиент.ВыполнитьДействие(), убедимся, что этот модуль доступен на сервере. Если логика модуля чисто клиентская, необходимо создать серверный аналог или перенести функции в модуль с флагом «Сервер».

Шаг 3. Обработка путей к файлам

Проанализируем пути выгрузки. Если регламентное задание должно сохранять файл в папку, убедимся, что путь указан в формате UNC (например, \\ServerName\Exchange\), так как сервер 1С не видит подключенные сетевые диски пользователя (диск Z: для него не существует).

Шаг 4. Использование препроцессора

Если часть кода должна выполняться только при ручном запуске, обернем её в директивы компиляции. Однако в правилах обмена #Если Клиент Тогда может не сработать напрямую в строковом коде, поэтому лучше использовать программную проверку:


#Если Клиент Тогда
    Сообщить("Выполняется ручная выгрузка...");
#КонецЕсли

Почему справочники выгружаются, а документы — нет?

Выясним эту специфику. Справочники часто имеют более простую структуру и меньше связей. Документы же в процессе выгрузки часто тянут за собой:

Если в правилах выгрузки документов (ПВД) используется произвольный алгоритм, в котором есть обращение к ПараметрыСеанса.ТекущийПользователь, а этот параметр не инициализирован для фонового задания, выгрузка документов прервется, в то время как справочники, выгружаемые «по ссылке», пройдут успешно.

Важный итог: Основная причина сбоев при регламентной выгрузке в КД 2.0 — это попытка выполнить «клиентский» код на стороне сервера. Для решения проблемы необходимо очистить обработчики от интерактивных вызовов, проверить права доступа серверной учетной записи к папкам обмена и убедиться в доступности всех вызываемых общих модулей для контекста сервера.

← На главную