При настройке обмена данными между конфигурациями «1С:Управление нашей фирмой» (УНФ) и «1С:Бухгалтерия предприятия» (БП) часто возникает специфическая задача: необходимо не просто перенести документ, а дозаполнить конкретную табличную часть уже существующего в приемнике объекта. Ситуация осложняется, если в базе-источнике нет прямого аналога этого документа, а данные для заполнения нужно собирать по сложной логике, опираясь на реквизиты документа-цели (например, по Организации, Контрагенту или Договору).
В этой статье мы подробно разберем, как реализовать такой механизм в Конвертации данных 2.0 (КД 2.0), рассмотрим работу с коллекциями объектов, программное формирование данных в ПВД и альтернативные способы связи через внешние сервисы.
Представим ситуацию: в УНФ есть документ, у которого пуста одна из табличных частей. Нам нужно подтянуть эти данные из БП по расписанию. При этом важно соблюсти два условия:
Для решения мы можем использовать несколько инструментов КД2: обработчики Перед выгрузкой, механизм КоллекцияОбъектов и настройки поиска объектов в приемнике.
Это классический способ программного формирования табличной части. Если в базе-источнике нет физической таблицы, которую можно просто отобразить на приемник, мы создаем ПКС (Правило конвертации свойства) для нужной табличной части и заполняем её в обработчике Перед выгрузкой.
Проанализируем шаги реализации:
Перед выгрузкой для этого ПКС пишем код, который подготавливает данные.КоллекцияОбъектов.Рассмотрим пример кода в обработчике Перед выгрузкой (ПКО -> ПКС ТабличнаяЧасть):
// Формируем запрос к данным базы-источника (БП)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Данные.Номенклатура КАК Номенклатура,
| Данные.Количество КАК Количество,
| Данные.Цена КАК Цена
|ИЗ
| РегистрСведений.ДополнительныеДанные КАК Данные
|ГДЕ
| Данные.Организация = &Организация
| И Данные.Контрагент = &Контрагент";
Запрос.УстановитьПараметр("Организация", Источник.Организация);
Запрос.УстановитьПараметр("Контрагент", Источник.Контрагент);
// Выгружаем результат запроса в КоллекцияОбъектов
// КД2 сама сопоставит колонки ТЗ с реквизитами ТЧ приемника
КоллекцияОбъектов = Запрос.Выполнить().Выгрузить();
Важный момент: если источника как такового нет (пустой источник в ПКО), данные для параметров запроса можно передать через ВходящиеДанные из Правил выгрузки данных (ПВД).
Чтобы дозаполнить существующий документ и не создать дублей, нужно правильно настроить Поля поиска. Рассмотрим, как это сделать, чтобы КД2 нашла документ в УНФ по номеру, дате и организации.
В ПКО на закладке "Настройки поиска" укажите ключевые реквизиты. Но этого мало: по умолчанию КД2 может либо полностью заместить объект, либо вообще не трогать его, если он найден. Нам же нужно "мягкое" обновление.
Разберем алгоритм в обработчике При загрузке в базе-приемнике:
// Проверяем, существует ли объект в базе
Если НЕ Объект.ЭтоНовый() Тогда
// Проверяем заполненность табличной части
Если Объект.Запасы.Количество() > 0 Тогда
// Если данные уже есть, отказываемся от загрузки этой ТЧ
// Можно использовать флаг ТолькоСоздаватьОбъекты или программно очистить входящие данные
Отказ = Истина;
КонецЕсли;
КонецЕсли;
Однако полная отмена загрузки через Отказ = Истина может предотвратить обновление и других важных реквизитов. Поэтому более точным решением будет использование флага Не замещать значение свойства, если оно заполнено непосредственно в настройках ПКС табличной части.
Если нам нужно выгрузить данные, которых в источнике в виде документов не существует, мы используем ПВД с типом "Произвольный алгоритм". Это позволяет нам самим управлять выборкой данных.
Выясним, как передать параметры. В ПВД мы можем написать запрос, который соберет данные из БП, а затем вызвать выгрузку по правилу:
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Подготавливаем структуру для передачи данных в ПКО
СтруктураДанных = Новый Структура("Организация, Контрагент, Дата, Номер");
ЗаполнитьЗначенияСвойств(СтруктураДанных, Выборка);
// Выгружаем объект, передавая подготовленные данные
ВыгрузитьПоПравилу(,, СтруктураДанных,, "ИмяНужногоПКО");
КонецЦикла;
Если базы имеют стабильное соединение, иногда проще отказаться от классического обмена файлами в пользу Web-сервисов. Как предложили на форуме, в базе БП можно опубликовать сервис, который будет принимать параметры (ИНН, Сумма, Дата) и возвращать готовый массив данных для табличной части.
Преимущества этого метода:
Пример вызова в УНФ может выглядеть так:
Определения = Новый WSОпределения(URL_Сервиса, Логин, Пароль);
Прокси = Новый WSПрокси(Определения, "http://www.uri.com", "ServiceName", "EndpointName");
Результат = Прокси.GetDataFromBP(Объект.Контрагент.ИНН, Объект.Дата);
// Заполняем ТЧ из полученного массива
Для Каждого СтрокаДанных Из Результат Цикл
НоваяСтрока = Объект.Запасы.Добавить();
// Заполнение реквизитов...
КонецЦикла;
Частая ошибка новичков в КД2 — попытка обратиться к метаданным приемника из базы-источника. Помните: в правилах выгрузки (база БП) вы не можете знать, пуста ли табличная часть в базе УНФ, без установки прямого соединения (COM или Web-сервис).
Для решения этой проблемы мы рекомендуем следующий подход:
ВходящиеДанные.Перед загрузкой проверяйте состояние объекта.Таким образом, мы разделяем логику: источник поставляет данные, а приемник решает, стоит ли их применять к существующему документу. Это наиболее надежный и масштабируемый путь при работе с Конвертацией данных 2.0.