Как программно объединить несколько документов реализации из УТ в один документ в БП 3.0?

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

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

Методология объединения документов

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

  1. Предварительная группировка: Не пытайтесь обрабатывать документы по мере их нахождения в цикле. Сначала выгрузите все выбранные документы во временную ТаблицаЗначений.
  2. Свертка данных: Используйте метод Свернуть для того, чтобы сгруппировать записи по ключевым полям: Контрагент, Договор, Организация.
  3. Создание приемника: На основе сгруппированных данных создайте один документ в БП и заполните его табличные части всеми позициями из группы источников.

Разбор программной реализации

Рассмотрим, как выстроить логику заполнения. Главная задача — создать документ-приемник один раз для группы записей. Для этого удобно использовать структуру хранения, где мы сначала накапливаем данные, а затем записываем их в базу.

Пример цикла для формирования общего документа:


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

Оптимизация работы с COM-соединением

При работе с внешними базами через COM-соединение критически важно снижать количество вызовов. Вместо того чтобы каждый раз обращаться к методу НайтиПоНомеру, выполните запрос в базе-источнике (УТ), который соберет все необходимые данные (товары, услуги, ГТД) за один раз.

Важные рекомендации по оптимизации:

Обработка табличных частей: товары и услуги

Разделение данных на Товары и Услуги — стандартная практика для БП 3.0. При переносе из УТ важно правильно идентифицировать тип номенклатуры:


// Пример перебора товаров из COM-объекта и добавления их в БП
Для каждого Стр из ТоварыУТ Цикл
    Аналитика = Стр.АналитикаУчетаНоменклатуры;
    Услуга = (УТ.XMLСтрока(Аналитика.Номенклатура.ТипНоменклатуры) = "Услуга");
    
    Если Услуга Тогда
        // Логика заполнения ТЧ Услуги
        НоваяСтрока = НаклБух.Услуги.Добавить();
    Иначе
        // Логика заполнения ТЧ Товары
        НоваяСтрока = НаклБух.Товары.Добавить();
    КонецЕсли;
    
    // Заполнение общих реквизитов: цена, сумма, ставка НДС
    НоваяСтрока.Номенклатура = НайтиНоменклатуру(Аналитика.Номенклатура);
    НоваяСтрока.Сумма = Стр.СуммаСНДС;
    // ... дальнейшее заполнение
КонецЦикла;

Завершающий этап и запись

После того как все строки добавлены и счета учета проставлены, выполняем запись или проведение:


Попытка
    Если ПроводитьДокументы Тогда
        НаклБух.Записать(РежимЗаписиДокумента.Проведение);
    Иначе
        НаклБух.Записать(РежимЗаписиДокумента.Запись);
    КонецЕсли;
Исключение
    Сообщить("Ошибка записи документа: " + ОписаниеОшибки());
КонецПопытки;

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

← На главную