Часто при настройке обмена через «Конвертацию данных 2.0» (КД 2.0) из старых систем (например, 1С 7.7) в современные конфигурации (например, 1С:Управление торговлей) возникает ситуация: алгоритм отрабатывает, XML-файл формируется и содержит какие-то данные, но при загрузке в базу-приемник новые документы не создаются. Проанализируем по шагам, почему это происходит и как правильно настроить правила конвертации, если мы формируем данные программно и передаем их через ВходящиеДанные.
Первая и самая банальная причина — попытка выгрузки пустой таблицы значений. Если запрос не вернул результатов, цикл может не выполниться, но иногда механизмы КД всё равно пытаются инициировать выгрузку. Обязательно добавим проверку на пустоту таблицы после выполнения запроса. Если данных нет, прерываем обработку, устанавливая параметр Отказ = 1.
Если ВходящиеДанные.КоличествоСтрок() = 0 Тогда
Отказ = 1;
КонецЕсли;
Разберем ключевую проблему. В коде инициализации выгрузки используется функция:
ВыгрузитьПоПравилу(,,ВходящиеДанные,, "ВводЗадолженностиКлиентов");
Обратите внимание на первые параметры. Первый параметр — это объект-источник, который мы здесь пропускаем. В платформе 1С 7.7 пропущенный параметр часто интерпретируется системой как пустая строка "". Механизм КД пытается определить тип переданного источника, видит строку и записывает в XML-файл тип «Строка». При загрузке 1С:УТ ожидает ссылочный тип (документ), а получает примитивный строковый, из-за чего объект просто игнорируется.
Решение: В Правиле Конвертации Объектов (ПКО) «ВводЗадолженностиКлиентов» в настройках обязательно укажите объект-источник как «Пусто». В этом случае КД не будет ориентироваться на тип переданного параметра, а сразу возьмет тип приемника.
Поскольку мы берем данные не из реального объекта базы данных, а из сгенерированной таблицы значений, необходимо правильно настроить параметры в самой Конвертации данных:
ВходящиеДанные должны в точности совпадать с именами этих ПКС.Посмотрим на пример кода, который часто пишут в обработчике ПКО «ПослеЗагрузки» для дозаполнения реквизитов:
// ОШИБКА:
Если ИмяТипаОбъекта = "Документ" Тогда
// Заполнение реквизитов...
КонецЕсли;
В этом коде условие никогда не выполнится. Переменная ИмяТипаОбъекта содержит не просто слово «Документ», а полное имя метаданных, например "ДокументОбъект.ВводНачальныхОстатков". Соответственно, строгое равенство возвращает ложь.
Решение: Изменим условие так, чтобы проверять только левую часть строки:
// ПРАВИЛЬНО:
Если Лев(ИмяТипаОбъекта, 8) = "Документ" Тогда
Пользователь = Справочники.Пользователи.НайтиПоНаименованию(Пользователи.ТекущийПользователь);
Объект.Менеджер = Пользователь;
Объект.Ответственный = Пользователь;
// Дальнейшее заполнение...
КонецЕсли;
В обработчике «После загрузки» разработчики иногда вручную вызывают Объект.Записать(). Это действие избыточно и может приводить к ошибкам или двойной записи. Стандартный алгоритм КД автоматически выполняет запись загружаемого объекта после того, как отработает обработчик «После загрузки» (если только вы явно не установили Отказ = Истина). Дублировать запись не нужно, за исключением случаев, когда вам требуется сразу провести документ (тогда используется Объект.Записать(РежимЗаписиДокумента.Проведение)).
Передача всей таблицы значений через указатель на текущую строку (с помощью ВходящиеДанные.ПолучитьСтрокуПоНомеру(Инд)) иногда неоднозначно воспринимается внутренними парсерами 7.7 при работе с КД. Более надежным и предсказуемым паттерном считается создание отдельного объекта СписокЗначений для каждой итерации цикла.
Рассмотрим, как лучше переписать цикл передачи данных:
Для Инд = 1 По ВходящиеДанные.КоличествоСтрок() Цикл
ВходящиеДанные.ПолучитьСтрокуПоНомеру(Инд);
СтруктДанных = СоздатьОбъект("СписокЗначений");
СтруктДанных.Установить("Контрагент", ВходящиеДанные.Контрагент);
СтруктДанных.Установить("Сумма", ВходящиеДанные.Сумма);
// ... заполняем остальные необходимые ключи
ВыгрузитьПоПравилу( , , СтруктДанных, , "ВводЗадолженностиКлиентов");
КонецЦикла;
Применяя эти исправления: установку пустого источника, проверку строк, точное соответствие имен ПКС с флагом входящих данных и корректировку кода обработчиков, вы обеспечите стабильную генерацию и загрузку документов в базу-приемник.