Как перенести табличную часть из внешних источников (MS SQL) в 1С через Конвертацию данных 2.1?

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

Часто при интеграции систем возникает нестандартная задача: «шапка» документа или справочника загружается из одного источника (например, плоского файла Excel), а связанная с ней табличная часть (ТЧ) находится в другой базе данных, например, в таблицах MS SQL Server. Разберем ситуацию, когда для объединения этих данных разработчик решает использовать механизм 1С:Конвертация данных 2.1 (КД 2.1) и функционал Внешних источников данных (ВИД).

Стандартная архитектура КД 2.1 изначально не предусматривает прямой визуальной настройки для внешних источников данных. Система не позволит вам просто выбрать таблицу ВИД в качестве источника в правилах. Однако встроенный язык 1С отлично справляется с этой задачей, если подойти к ней через программное формирование данных. Проанализируем по шагам, как выстроить правильную архитектуру обмена, как связать разрозненные данные по коду и как избежать популярных ошибок.

Шаг 1: Использование «Входящих данных» для формирования табличной части

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

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

  1. Инициализируем переменную ВходящиеДанные как структуру.
  2. Формируем прямой запрос к таблице внешнего источника данных средствами языка 1С.
  3. Устанавливаем параметр отбора. В нашем случае это цифровой код, который связывает шапку (например, реквизит Код основного элемента справочника) с записями в MS SQL.
  4. Выгружаем результат запроса в таблицу значений.
  5. Помещаем эту таблицу в структуру ВходящиеДанные, где ключом будет выступать имя табличной части.

Посмотрим на пример того, как это должно выглядеть в коде обработчика:


// Инициализация структуры входящих данных
ВходящиеДанные = Новый Структура;

// Формируем запрос к внешнему источнику MS SQL
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ТаблицаВИД.ПолеКоличество КАК Количество,
    |   ТаблицаВИД.ПолеЦена КАК Цена,
    |   ТаблицаВИД.ПолеНоменклатура КАК Номенклатура
    |ИЗ
    |   ВнешнийИсточникДанных.SQL_База.Таблица.ТЧ_Данные КАК ТаблицаВИД
    |ГДЕ
    |   ТаблицаВИД.КодСвязи = &КодВладельца";

// Передаем код шапки для отбора строк ТЧ
Запрос.УстановитьПараметр("КодВладельца", Источник.Код);

ТаблицаТЧ = Запрос.Выполнить().Выгрузить();

// Вставляем полученную таблицу значений в структуру
// Ключ "Товары" должен совпадать с именем ТЧ в правилах конвертации
ВходящиеДанные.Вставить("Товары", ТаблицаТЧ);

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

Шаг 2: Решение ошибки ЗаполнитьЗначенияСвойств

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

Ошибка при вызове метода контекста (ЗаполнитьЗначенияСвойств): Недопустимое значение параметра (параметр номер '2')

Выясним причину. Эта ошибка возникает глубоко в модуле стандартной обработки УниверсальныйОбменДаннымиXML. Функция встроенного языка ЗаполнитьЗначенияСвойств «падает», когда в качестве второго параметра (Источника) ей передается тип данных, не содержащий свойств (например, Неопределено, Null, примитивное число или пустая ссылка), тогда как система жестко ожидает полноценный объект 1С или Структуру.

В нашем случае данные формируются исключительно программно через произвольный запрос, а значит, физического объекта-источника в конфигурации 1С попросту не существует.

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

Шаг 3: Настройка поиска объектов без GUID (отказ от поиска по ссылке)

Проанализируем еще один важный нюанс. Поскольку данные приходят из сторонней базы MS SQL, у них нет стандартных Уникальных Идентификаторов (GUID / Ссылок) 1С. Если система попытается сопоставить объекты по ссылке, произойдет ошибка несовпадения типов. Чтобы исключить ошибки в итоговых данных после такого переноса, применяется автоматическая сверка бухгалтерских и налоговых проводок между базами.

Чтобы обмен прошел корректно, необходимо:

  1. Зайти в настройки ПКО загружаемого объекта.
  2. Полностью отключить флаг «Поиск по ссылке».
  3. Включить флаг «Продолжить поиск по полям поиска, если по ссылке не найден» (или оставить только поиск по полям).
  4. В Правилах конвертации свойств (ПКС) отметить галочкой «Поиск» те реквизиты, которые гарантированно идентифицируют строку (например, цифровой или строковый код). Желательно свести количество полей поиска к минимуму для ускорения работы. Подобный механизм сопоставления по произвольным полям вместо ссылок используется в обработке для переноса данных между похожими конфигурациями 1С.

В случае, если выгружается параметр, можно также отключить его загрузку для надежности сопоставления.

Шаг 4: Как правильно отлаживать выгрузку с произвольными алгоритмами

Многие разработчики отмечают, что при попытке отладить выгрузку с запросами к внешним источникам, точки останова попросту не срабатывают. Программа «пролетает» мимо них. Это происходит из-за того, что КД 2.1 генерирует код обработчиков "на лету" и выполняет его через метод Выполнить() в контексте Предприятия.

Рассмотрим, как настроить полноценную отладку:

  1. Откройте обработку КД 2.1 и сохраните сгенерированный модуль (используйте кнопку сохранения модуля обработки на верхней панели).
  2. Откройте Конфигуратор той базы, из которой происходит выгрузка (база-источник).
  3. Создайте новую пустую внешнюю обработку.
  4. Вставьте скопированный из КД 2.1 текст в модуль объекта этой новой обработки.
  5. Сохраните обработку на диск.
  6. Запустите базу-источник в режиме отладки (Предприятие).
  7. Откройте не стандартную обработку УниверсальныйОбменДаннымиXML, а вашу сохраненную внешнюю обработку.

При таком подходе весь сгенерированный код, включая ваши прямые запросы к MS SQL и заполнение структуры ВходящиеДанные, будет выполняться в явном виде. Точки останова будут срабатывать корректно, и вы сможете просмотреть содержимое таблицы значений, проверить типы данных колонок и найти причину несовпадений.

← На главную