Часто при интеграции систем возникает нестандартная задача: «шапка» документа или справочника загружается из одного источника (например, плоского файла Excel), а связанная с ней табличная часть (ТЧ) находится в другой базе данных, например, в таблицах MS SQL Server. Разберем ситуацию, когда для объединения этих данных разработчик решает использовать механизм 1С:Конвертация данных 2.1 (КД 2.1) и функционал Внешних источников данных (ВИД).
Стандартная архитектура КД 2.1 изначально не предусматривает прямой визуальной настройки для внешних источников данных. Система не позволит вам просто выбрать таблицу ВИД в качестве источника в правилах. Однако встроенный язык 1С отлично справляется с этой задачей, если подойти к ней через программное формирование данных. Проанализируем по шагам, как выстроить правильную архитектуру обмена, как связать разрозненные данные по коду и как избежать популярных ошибок.
Поскольку мы не можем напрямую указать таблицу SQL как источник для табличной части, мы прибегнем к механизму передачи произвольных структур через ВходящиеДанные. Рассмотрим подробнее этот процесс.
Суть метода заключается в том, чтобы перед началом выгрузки объекта-владельца (шапки) самостоятельно подключиться к внешнему источнику, получить нужные строки табличной части и подложить их в правила конвертации. Для этого используем обработчик события «Перед выгрузкой» в Правиле конвертации объекта (ПКО) шапки.
ВходящиеДанные как структуру.Код основного элемента справочника) с записями в MS SQL.ВходящиеДанные, где ключом будет выступать имя табличной части.Посмотрим на пример того, как это должно выглядеть в коде обработчика:
// Инициализация структуры входящих данных
ВходящиеДанные = Новый Структура;
// Формируем запрос к внешнему источнику MS SQL
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаВИД.ПолеКоличество КАК Количество,
| ТаблицаВИД.ПолеЦена КАК Цена,
| ТаблицаВИД.ПолеНоменклатура КАК Номенклатура
|ИЗ
| ВнешнийИсточникДанных.SQL_База.Таблица.ТЧ_Данные КАК ТаблицаВИД
|ГДЕ
| ТаблицаВИД.КодСвязи = &КодВладельца";
// Передаем код шапки для отбора строк ТЧ
Запрос.УстановитьПараметр("КодВладельца", Источник.Код);
ТаблицаТЧ = Запрос.Выполнить().Выгрузить();
// Вставляем полученную таблицу значений в структуру
// Ключ "Товары" должен совпадать с именем ТЧ в правилах конвертации
ВходящиеДанные.Вставить("Товары", ТаблицаТЧ);
После написания кода перейдем к настройке Правил конвертации свойств (ПКС) для данной табличной части. Обязательно установите флаг «Получить из входящих данных». Важное правило: колонки сформированной вами таблицы значений должны в точности совпадать с именами ПКС (свойств), которые настроены внутри группы свойств (ПКГС) для этой ТЧ. Если в таблице не окажется нужной колонки или она будет иметь другой тип, произойдет ошибка выгрузки. Для автоматизации регулярного выполнения обмена по подготовленным в «Конвертации данных 2» правилам применяется программа для синхронизации баз 1С по расписанию.
Разберем типичную проблему, с которой сталкиваются разработчики при использовании данного подхода. Во время выгрузки система может выдать следующую ошибку:
Ошибка при вызове метода контекста (ЗаполнитьЗначенияСвойств): Недопустимое значение параметра (параметр номер '2')
Выясним причину. Эта ошибка возникает глубоко в модуле стандартной обработки УниверсальныйОбменДаннымиXML. Функция встроенного языка ЗаполнитьЗначенияСвойств «падает», когда в качестве второго параметра (Источника) ей передается тип данных, не содержащий свойств (например, Неопределено, Null, примитивное число или пустая ссылка), тогда как система жестко ожидает полноценный объект 1С или Структуру.
В нашем случае данные формируются исключительно программно через произвольный запрос, а значит, физического объекта-источника в конфигурации 1С попросту не существует.
Как исправить ситуацию: в настройках Правила конвертации объектов (ПКО) для вашей табличной части поле «Объект-источник» должно быть полностью очищено (оставлено пустым). Если вы оставите там указание на какой-либо тип данных из базы, обработка попытается считать его свойства по умолчанию, не найдет их и выдаст указанную ошибку. Пустой источник сигнализирует КД 2.1, что данные нужно брать исключительно из ВходящиеДанные.
Проанализируем еще один важный нюанс. Поскольку данные приходят из сторонней базы MS SQL, у них нет стандартных Уникальных Идентификаторов (GUID / Ссылок) 1С. Если система попытается сопоставить объекты по ссылке, произойдет ошибка несовпадения типов. Чтобы исключить ошибки в итоговых данных после такого переноса, применяется автоматическая сверка бухгалтерских и налоговых проводок между базами.
Чтобы обмен прошел корректно, необходимо:
В случае, если выгружается параметр, можно также отключить его загрузку для надежности сопоставления.
Многие разработчики отмечают, что при попытке отладить выгрузку с запросами к внешним источникам, точки останова попросту не срабатывают. Программа «пролетает» мимо них. Это происходит из-за того, что КД 2.1 генерирует код обработчиков "на лету" и выполняет его через метод Выполнить() в контексте Предприятия.
Рассмотрим, как настроить полноценную отладку:
УниверсальныйОбменДаннымиXML, а вашу сохраненную внешнюю обработку.При таком подходе весь сгенерированный код, включая ваши прямые запросы к MS SQL и заполнение структуры ВходящиеДанные, будет выполняться в явном виде. Точки останова будут срабатывать корректно, и вы сможете просмотреть содержимое таблицы значений, проверить типы данных колонок и найти причину несовпадений.