При торговле одеждой, обувью или другими товарами с параметрами складской учет ведется в разрезе конкретных цветов и размеров. Однако при формировании печатных форм расходных накладных или актов клиентам часто требуется сгруппировать строки по базовому наименованию, просуммировав количество и итоговые суммы. Рассмотрим, как правильно организовать такой учет и какие механизмы 1С позволяют реализовать свёртку позиций при печати.
Прежде чем переходить к написанию программного кода свёртки, проанализируем структуру справочников. Распространенная ошибка — создание отдельных элементов в справочнике номенклатуры под каждый размер (например, «Футболка белая 46» и «Футболка белая 48»).
Методологически верное решение заключается в следующем:
Номенклатура создается один основной элемент — например, «Футболка белая».Характеристики номенклатуры.Номенклатура, а поля характеристик исключаются из вывода.Поскольку типовые формы печатных документов выводят детализированные строки с характеристиками, для агрегирования данных создается внешняя печатная форма (ВПФ) или расширение конфигурации. Разберем два основных технических способа реализации группировки.
Если алгоритм печатной формы сначала выгружает данные табличной части документа в объект ТаблицаЗначений, к нему применяется метод Свернуть(). В параметрах метода указываются колонки группировки и колонки суммирования.
Посмотрим на пример кода обработки табличной части:
// Выгружаем табличную часть "Товары" из документа
ТЗПечать = ДокументСсылка.Товары.Выгрузить();
// Сворачиваем таблицу по номенклатуре и цене, суммируя количество и сумму
ТЗПечать.Свернуть("Номенклатура, Цена", "Количество, Сумма");
// Выводим свернутую таблицу значений в макет печатной формы
Для Каждого СтрокаТЗ Из ТЗПечать Цикл
// Заполнение параметров и вывод области макета
КонецЦикла;
Если выборка данных для макета печатной формы выполняется с помощью запроса, агрегацию строк эффективнее доверить СУБД с помощью инструкции СГРУППИРОВАТЬ ПО и агрегатных функций СУММА().
Рассмотрим пример построения запроса:
ВЫБРАТЬ
ДокументТаблица.Номенклатура КАК Номенклатура,
ДокументТаблица.Цена КАК Цена,
СУММА(ДокументТаблица.Количество) КАК Количество,
СУММА(ДокументТаблица.Сумма) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК ДокументТаблица
ГДЕ
ДокументТаблица.Ссылка = &Ссылка
СГРУППИРОВАТЬ ПО
ДокументТаблица.Номенклатура,
ДокументТаблица.Цена
Проанализируем возможные учетные риски перед внедрением такой печатной формы:
Цена. Иначе рассчитываемая средняя цена станет дробной, что вызовет вопросы у покупателя.