В процессе работы с системой 1С:ERP Управление предприятием часто возникает ситуация, когда необходимо объединить два однотипных документа (например, Заказ клиента или Коммерческое предложение) в один общий. Типовая конфигурация не предусматривает специальной кнопки для выполнения этой операции, так как логика объединения может сильно отличаться в зависимости от учетной политики предприятия. В этой статье мы разберем, как решить данную задачу вручную и как подойти к разработке автоматизированной обработки.
Если задача объединения документов возникает эпизодически, мы можем воспользоваться встроенными возможностями платформы 1С по работе с табличными частями. Этот способ не требует программирования и доступен любому пользователю. Рассмотрим алгоритм действий по шагам:
Ctrl + A (выделить все).Проанализируем этот подход: система автоматически пересчитает итоги, налоги и скидки в новом документе. Однако важно помнить, что при таком способе реквизиты "шапки" (договор, склад, соглашение) во втором документе останутся прежними, и вам придется вручную проверить их соответствие данным из первого документа.
Для регулярного объединения большого количества документов целесообразно разработать внешнюю обработку. Выясним, какие ключевые операции должен выполнять программный код для корректного слияния данных. Рассмотрим пример реализации на языке 1С.
Основная идея заключается в создании нового объекта документа, заполнении его заголовка по образцу первого источника и последовательном добавлении строк из всех объединяемых документов. Разберем пример кода для документа ЗаказКлиента:
// Предположим, у нас есть ссылки на два документа: Заказ1 и Заказ2
НовыйДокумент = Документы.ЗаказКлиента.СоздатьДокумент();
// 1. Заполняем основные реквизиты из первого документа
ЗаполнитьЗначенияСвойств(НовыйДокумент, Заказ1, "Организация, Партнер, Контрагент, Склад, Валюта, Договор");
НовыйДокумент.Дата = ТекущаяДата();
// 2. Переносим строки из первого документа
Для Каждого СтрИзИсточника1 Из Заказ1.Товары Цикл
НоваяСтрока = НовыйДокумент.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрИзИсточника1);
КонецЦикла;
// 3. Добавляем строки из второго документа
Для Каждого СтрИзИсточника2 Из Заказ2.Товары Цикл
НоваяСтрока = НовыйДокумент.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрИзИсточника2);
КонецЦикла;
// 4. Выполняем свертку строк (необязательно, если нужно объединить одинаковые позиции)
НовыйДокумент.Товары.Свернуть("Номенклатура, Характеристика, СтавкаНДС", "Количество, Сумма");
НовыйДокумент.Записать();
Использование метода ЗаполнитьЗначенияСвойств() позволяет значительно ускорить написание кода, автоматически копируя данные одноименных реквизитов. Рассмотрим подробнее этап свертки: метод Свернуть() полезен в тех случаях, когда в разных заказах встречается одна и та же номенклатура, и мы хотим объединить её в одну строку с суммированием количества.
При автоматизации процесса объединения в ERP-системах мы неизбежно столкнемся с рядом ограничений, которые необходимо учесть в алгоритме работы обработки:
Заказ клиента строки могут иметь разные варианты обеспечения (резервировать, отгрузить, к обеспечению). При простом копировании строк в новый документ эти статусы могут требовать пересчета, так как резервы привязаны к конкретному регистратору.Соглашения или Графики оплаты, система может выдать ошибку при записи, если данные условия противоречат друг другу в рамках одного документа.Проанализируем ситуацию с дублями: если вы планируете после объединения пометить исходные документы на удаление, убедитесь, что на них не завязаны бизнес-процессы согласования. В противном случае история согласования будет утеряна вместе с исходными объектами.
Для удобства работы пользователя в обработке стоит предусмотреть таблицу для выбора нескольких документов. После выбора документов-оснований программа должна проверить их на совместимость: совпадение организации, валюты и контрагента. Если данные реквизиты отличаются, объединение в один документ может быть методологически неверным.
Подведем итог: создание "велосипеда" для объединения документов в 1С:ERP — задача выполнимая, но требующая внимания к деталям бизнес-логики. Мы рекомендуем использовать метод Скопировать() для создания основы нового документа, так как он сохраняет большинство настроек формы, и уже затем программно дополнять табличную часть данными из других источников.