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

Программист 1С v7.7 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

Часто при настройке обмена через «Конвертацию данных 2.0» (КД 2.0) из старых систем (например, 1С 7.7) в современные конфигурации (например, 1С:Управление торговлей) возникает ситуация: алгоритм отрабатывает, XML-файл формируется и содержит какие-то данные, но при загрузке в базу-приемник новые документы не создаются. Проанализируем по шагам, почему это происходит и как правильно настроить правила конвертации, если мы формируем данные программно и передаем их через ВходящиеДанные.

1. Проверка наличия данных перед выгрузкой

Первая и самая банальная причина — попытка выгрузки пустой таблицы значений. Если запрос не вернул результатов, цикл может не выполниться, но иногда механизмы КД всё равно пытаются инициировать выгрузку. Обязательно добавим проверку на пустоту таблицы после выполнения запроса. Если данных нет, прерываем обработку, устанавливая параметр Отказ = 1.


Если ВходящиеДанные.КоличествоСтрок() = 0 Тогда 
    Отказ = 1; 
КонецЕсли;

2. Проблема с типом объекта: почему выгружается «Строка»

Разберем ключевую проблему. В коде инициализации выгрузки используется функция:

ВыгрузитьПоПравилу(,,ВходящиеДанные,, "ВводЗадолженностиКлиентов");

Обратите внимание на первые параметры. Первый параметр — это объект-источник, который мы здесь пропускаем. В платформе 1С 7.7 пропущенный параметр часто интерпретируется системой как пустая строка "". Механизм КД пытается определить тип переданного источника, видит строку и записывает в XML-файл тип «Строка». При загрузке 1С:УТ ожидает ссылочный тип (документ), а получает примитивный строковый, из-за чего объект просто игнорируется.

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

3. Обязательные настройки ПКО при работе с Входящими Данными

Поскольку мы берем данные не из реального объекта базы данных, а из сгенерированной таблицы значений, необходимо правильно настроить параметры в самой Конвертации данных:

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

4. Правильная проверка типа объекта в обработчиках загрузки

Посмотрим на пример кода, который часто пишут в обработчике ПКО «ПослеЗагрузки» для дозаполнения реквизитов:


// ОШИБКА:
Если ИмяТипаОбъекта = "Документ" Тогда
    // Заполнение реквизитов...
КонецЕсли;

В этом коде условие никогда не выполнится. Переменная ИмяТипаОбъекта содержит не просто слово «Документ», а полное имя метаданных, например "ДокументОбъект.ВводНачальныхОстатков". Соответственно, строгое равенство возвращает ложь.

Решение: Изменим условие так, чтобы проверять только левую часть строки:


// ПРАВИЛЬНО:
Если Лев(ИмяТипаОбъекта, 8) = "Документ" Тогда
    Пользователь = Справочники.Пользователи.НайтиПоНаименованию(Пользователи.ТекущийПользователь);
    Объект.Менеджер = Пользователь;
    Объект.Ответственный = Пользователь;
    // Дальнейшее заполнение...
КонецЕсли;

5. Избыточная запись объекта (Объект.Записать)

В обработчике «После загрузки» разработчики иногда вручную вызывают Объект.Записать(). Это действие избыточно и может приводить к ошибкам или двойной записи. Стандартный алгоритм КД автоматически выполняет запись загружаемого объекта после того, как отработает обработчик «После загрузки» (если только вы явно не установили Отказ = Истина). Дублировать запись не нужно, за исключением случаев, когда вам требуется сразу провести документ (тогда используется Объект.Записать(РежимЗаписиДокумента.Проведение)).

6. Особенности передачи структуры в 1С 7.7

Передача всей таблицы значений через указатель на текущую строку (с помощью ВходящиеДанные.ПолучитьСтрокуПоНомеру(Инд)) иногда неоднозначно воспринимается внутренними парсерами 7.7 при работе с КД. Более надежным и предсказуемым паттерном считается создание отдельного объекта СписокЗначений для каждой итерации цикла.

Рассмотрим, как лучше переписать цикл передачи данных:


Для Инд = 1 По ВходящиеДанные.КоличествоСтрок() Цикл
    ВходящиеДанные.ПолучитьСтрокуПоНомеру(Инд);
    
    СтруктДанных = СоздатьОбъект("СписокЗначений");
    СтруктДанных.Установить("Контрагент", ВходящиеДанные.Контрагент);
    СтруктДанных.Установить("Сумма", ВходящиеДанные.Сумма);
    // ... заполняем остальные необходимые ключи
    
    ВыгрузитьПоПравилу( , , СтруктДанных, , "ВводЗадолженностиКлиентов");
КонецЦикла;

Применяя эти исправления: установку пустого источника, проверку строк, точное соответствие имен ПКС с флагом входящих данных и корректировку кода обработчиков, вы обеспечите стабильную генерацию и загрузку документов в базу-приемник.

← На главную