Как настроить выгрузку остатков по произвольному запросу в Конвертации данных 3.0?

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

При переносе данных между конфигурациями 1С часто возникает задача выгрузки начальных остатков. Если в исходной базе (например, 1С:Управление торговлей) нет физических документов ввода остатков, а данные необходимо собрать напрямую из регистров накопления с помощью произвольного запроса, разработка правил в Конвертации данных 3.0 (КД3) может вызвать ряд вопросов. Механизмы КД3 и БСП накладывают жесткие рамки на процесс обмена через универсальный формат EnterpriseData.

В этой статье мы подробно разберем, как спроектировать и написать правила обмена для программного формирования и выгрузки виртуальных документов остатков, обходя ограничения планов обмена БСП, и как решить сопутствующие технические проблемы.

Особенности архитектуры КД3 и планов обмена БСП

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

Если мы хотим выгружать остатки по расписанию, у нас есть два пути выполнения произвольного запроса:

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

Выясним также важную особенность версий формата EnterpriseData. В версиях формата выше 1.5 универсальный документ ввода остатков был упразднен. Теперь формат требует выгрузки узкоспециализированных документов, таких как Документ.ОстаткиСобственныхТМЦ, Документ.ОстаткиРасчетовСПокупателямиДолги и других. Соответственно, наш алгоритм должен уметь генерировать разные структуры данных под каждый конкретный тип остатков.

Реализация выгрузки через подмену объекта (на примере справочника Организации)

Рассмотрим наиболее надежный и простой в сопровождении вариант — выгрузку остатков при регистрации справочника Организации. Представим ситуацию: в базе ведется учет по 5 организациям, и нам нужно выгрузить остатки только по выбранным (тем, что зарегистрированы к обмену).

Для реализации этого сценария выполним следующие шаги в Конвертации данных 3.0:

Шаг 1. Настройка ПОД для справочника Организации

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

Шаг 2. Написание произвольного запроса и формирование структуры

Внутри обработчика мы получаем ссылку на текущую организацию, выполняем запрос к регистру накопления (например, ТоварыНаСкладах) и формируем структуру-обертку, понятную для КД3. Структура-обертка должна содержать два обязательных свойства:

Рассмотрим пример реализации кода в обработчике:


// Получаем организацию, которая сейчас выгружается
ТекущаяОрганизация = ДанныеИБ.Ссылка;

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

Запрос.УстановитьПараметр("Период", ТекущаяДата());
Запрос.УстановитьПараметр("Организация", ТекущаяОрганизация);

РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
    
    // Создаем структуру для документа формата
    ДанныеДокумента = Новый Структура;
    ДанныеДокумента.Вставить("Ссылка", НовыйУникальныйИдентификатор()); // Генерируем уникальный ключ для сопоставления
    ДанныеДокумента.Вставить("Дата", ТекущаяДата());
    ДанныеДокумента.Вставить("Организация", ТекущаяОрганизация);
    
    // Формируем табличную часть
    ТаблицаТоваров = Новый ТаблицаЗначений;
    ТаблицаТоваров.Колонки.Добавить("Номенклатура");
    ТаблицаТоваров.Колонки.Добавить("Количество");
    
    Выборка = РезультатЗапроса.Выбрать();
    Пока Выборка.Следующий() Цикл
        НоваяСтрока = ТаблицаТоваров.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
    КонецЦикла;
    
    ДанныеДокумента.Вставить("Товары", ТаблицаТоваров);
    
    // Оборачиваем данные в структуру-обертку для КД3
    ВиртуальныйОбъект = Новый Структура;
    ВиртуальныйОбъект.Вставить("Значение", ДанныеДокумента);
    ВиртуальныйОбъект.Вставить("ИмяПКО", "Документ_ОстаткиСобственныхТМЦ_Отправка");
    
    // Находим нужное ПОД для документа остатков и отправляем его в выгрузку
    ПОДДокумента = КомпонентыОбмена.ПравилаОбработкиДанных.Найти("Документ_ОстаткиСобственныхТМЦ_Стр_Отправка", "Имя");
    Если ПОДДокумента <> Неопределено Тогда
        ОбменДаннымиXDTOСервер.ВыгрузкаОбъектаВыборки(КомпонентыОбмена, ВиртуальныйОбъект, ПОДДокумента);
    КонецЕсли;
    
КонецЕсли;

Решение проблемы с регистром настроек обмена XDTO

При тестировании выгрузки вы можете столкнуться с тем, что данные не выгружаются, а в журнале регистрации фиксируются ошибки. Проанализируем ситуацию: часто в регистре сведений НастройкиОбменаДаннымиXDTO для формата конкретного документа (например, Документ.ОстаткиСобственныхТМЦ) стоит признак только на отправку, а получение отсутствует. БСП сверяет возможности обеих баз и, если принимающая база "не заявила" о готовности принимать этот объект, выгрузка блокируется на стороне источника.

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

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

// Принудительное обновление локальных настроек обмена XDTO
РегистрыСведений.НастройкиОбменаДаннымиXDTO.ОбновитьНастройки();

// Принудительное обновление настроек для конкретного узла информационной базы
РегистрыСведений.НастройкиОбменаДаннымиXDTO.ОбновитьНастройкиКорреспондента(СсылкаНаУзелПланаОбмена);

Применение этих методов позволит вам успешно организовать гибкую выгрузку остатков любого уровня сложности по произвольным запросам, используя все преимущества современной технологии Конвертации данных 3.0.

← На главную