Как реализовать выгрузку данных «многие к одному» в плане обмена 1С

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

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

Постановка задачи и основные сложности

Основная проблема заключается в том, что стандартный механизм регистрации изменений в 1С работает пообъектно. Как только документ изменен, он попадает в таблицу регистрации и готов к выгрузке. Чтобы реализовать схему «многие к одному», нам необходимо:

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

Способ 1: Использование ПВД и принудительная перерегистрация

Рассмотрим алгоритм, который предложил автор темы. Он основан на управлении флагом Отказ в правилах выгрузки данных (ПВД). Разберем по шагам, как это работает в Конвертации данных 2.1.

В ПВД для объекта РеализацияТоваровУслуг в обработчике ПередВыгрузкой прописывается логика проверки даты. Если текущая дата еще не достигла «контрольной точки» (например, 4-го числа следующего месяца), выгрузка отменяется, а документ заново регистрируется на узле обмена.

Пример кода для вычисления условий выгрузки:


Сутки = 86400;
_НачалоДняВыгрузки = НачалоДня(ТекущаяДата());
_НачалоМесяцаВыгрузки = НачалоМесяца(ТекущаяДата());
_НачалоПредыдущегоМесяца = ДобавитьМесяц(_НачалоМесяцаВыгрузки, -1);
КоличествоДнейМесяца = День(КонецМесяца(_НачалоПредыдущегоМесяца));

// Проверяем, наступило ли 4-е число месяца, следующего за датой документа
Если Месяц(_НачалоМесяцаВыгрузки) - Месяц(Объект.Дата) >= 1 
   И _НачалоПредыдущегоМесяца <= _НачалоДняВыгрузки - (КоличествоДнейМесяца + 4) * Сутки Тогда
    // Разрешаем выгрузку
Иначе
    Отказ = Истина;
    // Регистрируем объект повторно, чтобы он не пропал из плана обмена
    ПланыОбмена.ЗарегистрироватьИзменения(Параметры.УзелДляОбмена, Объект.Ссылка);
КонецЕсли;

Важное примечание: Постоянная перерегистрация объектов через ЗарегистрироватьИзменения может создавать нагрузку на базу данных и приводить к росту таблиц регистрации. Этот метод подходит для небольших объемов данных.

Способ 2: Виртуальное ПВД с произвольным алгоритмом

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

Рассмотрим логику реализации через произвольный алгоритм:

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

Пример вызова выгрузки сводных данных:


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

Настройка ПКО для сводного документа

Поскольку в источнике у нас нет одного физического документа, который соответствует документу в приемнике, в ПКО необходимо правильно настроить поиск. Проанализируем ключевые моменты:

Обработка регистрации изменений

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

Проанализируем пример кода для очистки:


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

Пока Выборка.Следующий() Цикл
    ПланыОбмена.УдалитьРегистрациюИзменений(Параметры.УзелДляОбмена, Выборка.Ссылка);
КонецЦикла;

Рекомендации и риски

Рассмотрим важные нюансы, которые помогут избежать ошибок при эксплуатации такого обмена:

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

← На главную