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