Как автоматически объединить одинаковые товары в заказе поставщику в 1С:УНФ?

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

В процессе работы с программой 1С:Управление нашей фирмой (УНФ) менеджеры по закупкам часто сталкиваются с ситуацией, когда один "Заказ поставщику" формируется на основании сразу нескольких "Заказов покупателей". По умолчанию система переносит позиции из каждого документа-основания построчно. Если разные покупатели заказали один и тот же товар, в итоговом документе для поставщика он будет дублироваться столько раз, сколько было исходных заказов. Это приводит к раздуванию документа, неудобству при печати и возможным ошибкам при приемке товара.

Рассмотрим подробнее, почему так происходит, и разберем несколько эффективных способов автоматического объединения (свертки) строк, начиная от штатных инструментов и заканчивая программной доработкой.

Причина разделения строк: механизм сквозного резервирования

Прежде чем приступать к объединению, проанализируем логику работы 1С:УНФ. Программа разделяет строки не случайно. В табличной части документа "Заказ поставщику" существуют скрытые или видимые реквизиты, связывающие конкретную строку с "Заказом покупателя". Это необходимо для того, чтобы при поступлении товара система автоматически понимала, под какой именно клиентский заказ пришел этот товар. Если мы просто "схлопнем" строки, эта связь может разорваться, и товар поступит на склад как свободный остаток, а не под резерв клиента.

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

Способ 1: Использование метода Свернуть() в программном коде

Если вы имеете доступ к конфигуратору или создаете расширение, самым быстрым способом программного объединения строк является использование встроенного метода платформы Свернуть. Этот метод позволяет сгруппировать таблицу по заданным колонкам и просуммировать значения в числовых колонках.

Разберем пример кода, который можно разместить в модуле объекта документа или в расширении. Нам необходимо определить список колонок для группировки (это будут те реквизиты, которые должны совпадать — например, Номенклатура, Характеристика, ЕдиницаИзмерения) и колонки, которые нужно суммировать (Количество, Всего).


// Пример свертки табличной части "Запасы"
ГруппируемыеКолонки = "Номенклатура, Характеристика, ЕдиницаИзмерения, Цена";
СуммируемыеКолонки = "Количество, Сумма, Всего, СуммаНДС";

Объект.Запасы.Свернуть(ГруппируемыеКолонки, СуммируемыеКолонки);

Важно помнить: если в табличной части заполнен реквизит ЗаказПокупателя (или аналогичный), его нельзя включать в список ГруппируемыеКолонки, иначе строки с разными заказами не объединятся. Если же вы исключите его из списка, информация о связи с заказом в таблице будет утеряна после выполнения метода.

Способ 2: Реализация через расширение (событие ПередЗаписью)

Чтобы не снимать конфигурацию с поддержки, создадим расширение и воспользуемся процедурой-обработчиком ПередЗаписью. Это позволит автоматически приводить документ в порядок каждый раз, когда менеджер нажимает кнопку "Записать" или "Провести".

Проанализируем шаги реализации:

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

&НаСервере
Процедура Расш1_ПередЗаписьюПеред(Отказ, РежимЗаписи, РежимПроведения)
    // Перед выполнением основной логики сворачиваем таблицу
    // Убедитесь, что реквизиты соответствуют вашей версии УНФ (1.6.17)
    КолонкиГруппировки = "Номенклатура, Характеристика, ЕдиницаИзмерения, Цена";
    КолонкиСумм = "Количество, Сумма, СуммаНДС, Всего";
    
    ЭтотОбъект.Запасы.Свернуть(КолонкиГруппировки, КолонкиСумм);
КонецПроцедуры

Способ 3: Штатный инструмент "Изменить" (без программирования)

Для пользователей версии 1.6.17 и выше предусмотрен полуавтоматический способ. Выясним, как это сделать вручную прямо в открытом документе:

  1. Откройте документ "Заказ поставщику".
  2. Над табличной частью "Запасы" найдите кнопку "Изменить" (она может находиться в меню "Еще").
  3. В открывшемся окне "Изменение таблицы" выберите действие "Свернуть".
  4. Укажите флажками колонки, по которым нужно произвести группировку (обязательно Номенклатура).
  5. Нажмите "Выполнить".

Этот метод хорош тем, что он не требует вмешательства в код программы и позволяет менеджеру самому решать, в какой момент нужно произвести объединение строк. Однако это придется делать вручную в каждом новом документе.

Способ 4: Использование обработки "Расчет потребностей"

Вместо того чтобы создавать "Заказ поставщику" простым вводом на основании, рассмотрим более профессиональный инструмент УНФ — "Расчет потребностей". Этот помощник специально создан для агрегации всех клиентских заказов и формирования сводных заказов поставщикам.

Посмотрим на алгоритм работы с этим инструментом:

Важный момент: Использование "Расчета потребностей" является методологически верным способом работы в 1С:УНФ, так как он сохраняет баланс между удобством документа и аналитикой остатков.

Способ 5: Внешняя печатная форма (для визуального сокращения)

Если ваша задача — исключительно уменьшить количество страниц при печати, а в самой базе 1С вы хотите видеть детальную расшифровку по заказам покупателей, лучшим решением станет внешняя печатная форма.

В коде печатной формы (в модуле обработки) перед выводом данных в макет выполняется запрос к табличной части документа. В этом запросе можно использовать ключевое слово СГРУППИРОВАТЬ ПО. Таким образом, в базе документ останется "длинным", сохраняя все связи для складского учета, а поставщик получит красивый лаконичный файл Excel или PDF, где каждая позиция встречается только один раз.

Резюме и рекомендации

Выбор метода зависит от ваших приоритетов:

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

← На главную