Как дозаполнить табличную часть документа данными из другой базы при обмене через КД 2.0

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

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

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

Постановка задачи и выбор стратегии

Представим ситуацию: в УНФ есть документ, у которого пуста одна из табличных частей. Нам нужно подтянуть эти данные из БП по расписанию. При этом важно соблюсти два условия:

  1. Если табличная часть в УНФ уже заполнена, мы ее не трогаем (сохраняем ручные правки).
  2. Если табличная часть пуста, мы ищем соответствующие данные в БП и переносим их.

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

Вариант 1. Использование механизма КоллекцияОбъектов в ПКС

Это классический способ программного формирования табличной части. Если в базе-источнике нет физической таблицы, которую можно просто отобразить на приемник, мы создаем ПКС (Правило конвертации свойства) для нужной табличной части и заполняем её в обработчике Перед выгрузкой.

Проанализируем шаги реализации:

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

Рассмотрим пример кода в обработчике Перед выгрузкой (ПКО -> ПКС ТабличнаяЧасть):


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

Запрос.УстановитьПараметр("Организация", Источник.Организация);
Запрос.УстановитьПараметр("Контрагент", Источник.Контрагент);

// Выгружаем результат запроса в КоллекцияОбъектов
// КД2 сама сопоставит колонки ТЗ с реквизитами ТЧ приемника
КоллекцияОбъектов = Запрос.Выполнить().Выгрузить();

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

Вариант 2. Настройка поиска и обновления документа в приемнике

Чтобы дозаполнить существующий документ и не создать дублей, нужно правильно настроить Поля поиска. Рассмотрим, как это сделать, чтобы КД2 нашла документ в УНФ по номеру, дате и организации.

В ПКО на закладке "Настройки поиска" укажите ключевые реквизиты. Но этого мало: по умолчанию КД2 может либо полностью заместить объект, либо вообще не трогать его, если он найден. Нам же нужно "мягкое" обновление.

Разберем алгоритм в обработчике При загрузке в базе-приемнике:


// Проверяем, существует ли объект в базе
Если НЕ Объект.ЭтоНовый() Тогда
    // Проверяем заполненность табличной части
    Если Объект.Запасы.Количество() > 0 Тогда
        // Если данные уже есть, отказываемся от загрузки этой ТЧ
        // Можно использовать флаг ТолькоСоздаватьОбъекты или программно очистить входящие данные
        Отказ = Истина; 
    КонецЕсли;
КонецЕсли;

Однако полная отмена загрузки через Отказ = Истина может предотвратить обновление и других важных реквизитов. Поэтому более точным решением будет использование флага Не замещать значение свойства, если оно заполнено непосредственно в настройках ПКС табличной части.

Вариант 3. Использование произвольного алгоритма в ПВД

Если нам нужно выгрузить данные, которых в источнике в виде документов не существует, мы используем ПВД с типом "Произвольный алгоритм". Это позволяет нам самим управлять выборкой данных.

Выясним, как передать параметры. В ПВД мы можем написать запрос, который соберет данные из БП, а затем вызвать выгрузку по правилу:


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

Вариант 4. Веб-сервисы и HTTP-запросы (Online-подход)

Если базы имеют стабильное соединение, иногда проще отказаться от классического обмена файлами в пользу Web-сервисов. Как предложили на форуме, в базе БП можно опубликовать сервис, который будет принимать параметры (ИНН, Сумма, Дата) и возвращать готовый массив данных для табличной части.

Преимущества этого метода:

Пример вызова в УНФ может выглядеть так:


Определения = Новый WSОпределения(URL_Сервиса, Логин, Пароль);
Прокси = Новый WSПрокси(Определения, "http://www.uri.com", "ServiceName", "EndpointName");
Результат = Прокси.GetDataFromBP(Объект.Контрагент.ИНН, Объект.Дата);

// Заполняем ТЧ из полученного массива
Для Каждого СтрокаДанных Из Результат Цикл
    НоваяСтрока = Объект.Запасы.Добавить();
    // Заполнение реквизитов...
КонецЦикла;

Проблема "противоположных" метаданных

Частая ошибка новичков в КД2 — попытка обратиться к метаданным приемника из базы-источника. Помните: в правилах выгрузки (база БП) вы не можете знать, пуста ли табличная часть в базе УНФ, без установки прямого соединения (COM или Web-сервис).

Для решения этой проблемы мы рекомендуем следующий подход:

  1. Выгружайте данные всегда, но передавайте их в ВходящиеДанные.
  2. В приемнике (УНФ) в обработчике Перед загрузкой проверяйте состояние объекта.
  3. Если объект в УНФ требует дозаполнения (ТЧ пуста), разрешайте загрузку.

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

← На главную