При работе в конфигурации 1С:Управление производственным предприятием (УПП) редакции 1.3 пользователи часто сталкиваются с неочевидным поведением системы при печати документов отгрузки. Если в табличной части документа Реализация товаров и услуг содержатся две или более строки с абсолютно одинаковым товаром, единицей измерения и ценой, то при выводе на печать (например, в формы ТОРГ-12, Счет-фактура или УПД) система автоматически объединяет их в одну строку, суммируя количество и стоимость.
С точки зрения методологии бухгалтерского учета это кажется логичным — зачем загромождать печатную форму дублирующимися позициями? Однако на практике возникает масса ситуаций, когда строки схлопывать категорически нельзя:
В этой статье мы подробно разберем, почему конфигурация 1С:УПП 1.3 сворачивает строки "под капотом", и детально рассмотрим три практических способа отключения этой группировки с примерами программного кода.
Чтобы решить проблему, нам необходимо понять, в каких именно общих модулях и функциях происходит магия объединения строк. В 1С:УПП этот механизм реализован по-разному для торговых накладных и счетов-фактур.
1. Механизм группировки в ТОРГ-12 и М-15
Для печатных накладных (ТОРГ-12, М-15, Товарный сопутствующий документ) данные собираются с помощью запросов в модуле менеджера документа Реализация товаров и услуг. Например, за формирование данных отвечает экспортная функция ПолучитьТаблицуСведенийТОРГ12. Внутри этого метода написан тяжелый запрос к табличным частям документа. В самом конце этого запроса присутствует конструкция СГРУППИРОВАТЬ ПО, где перечисляются поля номенклатуры, цены, ставки НДС и единицы измерения. СУБД выполняет группировку еще на уровне выполнения запроса к базе данных, поэтому на выходе мы физически получаем свернутый результат.
2. Механизм группировки в Счет-фактуре и УПД
Для Счетов-фактур и Универсальных передаточных документов (УПД) разработчики фирмы "1С" использовали другой подход. Данные формируются через функции общего модуля УчетНДС (или УчетНДСПереопределяемый). Запрос выбирает детальные строки, но затем полученная таблица значений сворачивается программно с помощью стандартного метода платформы 1С:
ТаблицаСтрокТовары.Свернуть(КолонкиДляСвертки, "Количество, Сумма, СуммаНДС, СуммаСНДС, СуммаБезНДС");
Переменная КолонкиДляСвертки содержит список измерений (Номенклатура, Цена, Ставка НДС, ГТД, Страна происхождения). Поскольку уникальный номер строки документа (НомерСтроки) в этот список не входит, строки с одинаковыми параметрами неизбежно объединяются в одну.
Давайте рассмотрим, как мы можем вмешаться в эти алгоритмы.
---
Поскольку конфигурация УПП 1.3 является крупной ERP-системой, крайне не рекомендуется вносить изменения в типовой код напрямую, чтобы не усложнять последующие обновления. Лучший способ решить задачу — разработать внешнюю печатную форму.
Рассмотрим по шагам, как модифицировать код в скопированной внешней печатной форме для ТОРГ-12:
РеализацияТоваровУслуг во внешнюю обработку.НомерСтроки.ВЫБРАТЬ и секцию СГРУППИРОВАТЬ ПО в запросе:
// Было в типовом запросе:
|ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Цена КАК Цена,
| Товары.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| СУММА(Товары.Количество) КАК Количество,
| СУММА(Товары.Сумма) КАК Сумма
|...
|СГРУППИРОВАТЬ ПО
| Товары.Номенклатура,
| Товары.Цена,
| Товары.ЕдиницаИзмерения
// Стало после нашей доработки:
|ВЫБРАТЬ
| Товары.НомерСтроки КАК НомерСтроки, // Добавили номер строки
| Товары.Номенклатура КАК Номенклатура,
| Товары.Цена КАК Цена,
| Товары.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| СУММА(Товары.Количество) КАК Количество,
| СУММА(Товары.Сумма) КАК Сумма
|...
|СГРУППИРОВАТЬ ПО
| Товары.НомерСтроки, // Добавили номер строки в группировку
| Товары.Номенклатура,
| Товары.Цена,
| Товары.ЕдиницаИзмерения
Благодаря этому изменению СУБД определит строку с номером 1 и строку с номером 2 как абсолютно разные сущности, даже если в них указан один и тот же товар по одной цене. Группировка не произойдет, и строки выведутся раздельно.
Теперь разберем модификацию кода для внешней печатной формы Счета-фактуры / УПД. Нам нужно найти место, где таблица значений подготавливается к выводу на печать, и скорректировать программную свертку:
// Находим в скопированном коде заполнение колонок для свертки:
КолонкиДляСвертки = "Товар, ТоварНаименование, Цена, СтавкаНДС, НомерГТД, СтранаПроисхождения";
// Изменяем эту строку, добавляя НомерСтроки в список измерений:
КолонкиДляСвертки = "НомерСтроки, Товар, ТоварНаименование, Цена, СтавкаНДС, НомерГТД, СтранаПроисхождения";
// Метод Свернуть теперь сохранит строки раздельно:
ТаблицаСтрокТовары.Свернуть(КолонкиДляСвертки, "Количество, Сумма, СуммаНДС, СуммаСНДС, СуммаБезНДС");
Примечание: Если в исходной табличной части печатной формы колонка НомерСтроки отсутствует, ее необходимо предварительно выгрузить из документа или добавить программно в таблицу значений перед вызовом метода Свернуть().
---
Если ваша база данных 1С:УПП 1.3 работает под управлением современной платформы 1С:Предприятие 8.3 и режим совместимости конфигурации позволяет использовать механизм расширений, мы можем переопределить поведение функций без создания внешних файлов.
Для этого выполним следующие действия:
УчетНДС (или модуль менеджера документа РеализацияТоваровУслуг в зависимости от формы).&Вместо для переопределения целевой функции или &ИзменениеИКонтроля для точечного изменения кода.Рассмотрим пример использования механизма &Вместо для переопределения логики заполнения параметров свертки табличной части в расширении общего модуля:
&Вместо("ПодготовитьТабличнуюЧастьСчетаФактуры")
Функция Расш1_ПодготовитьТабличнуюЧастьСчетаФактуры(ДокументСсылка, СтруктураПараметров)
// Вызываем оригинальный алгоритм для получения базовой таблицы
ТаблицаДанных = ПродолжитьВызов(ДокументСсылка, СтруктураПараметров);
// Вносим изменения в логику свертки, если это необходимо,
// либо переписываем формирование таблицы без вызова метода Свернуть().
Возврат ТаблицаДанных;
КонецФункции
Преимущество расширений заключается в том, что все доработки хранятся в отдельном контейнере. При обновлении конфигурации поставщика вам не придется вручную переносить изменения в коде основной базы.
---
Если ваша база УПП 1.3 уже сильно кастомизирована, снята с поддержки или находится на замке ("Изменения разрешены"), вы можете внести правки напрямую в типовой код.
Проанализируем риски: при прямом изменении общего модуля УчетНДС вы измените логику печати счетов-фактур для абсолютно всех документов в системе. Это может затронуть не только "Реализацию товаров и услуг", но и "Авансовые отчеты", "Отражение начисления НДС" и другие документы. Поэтому при прямой правке общего модуля обязательно делайте проверку на тип обрабатываемого документа:
Если ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
// Применяем уникальную свертку с учетом номера строки
КолонкиДляСвертки = "НомерСтроки, " + КолонкиДляСвертки;
КонецЕсли;
---
Если у вас нет возможности привлечь программиста прямо сейчас, но накладную без объединения строк нужно распечатать срочно, можно воспользоваться логическими лазейками в системе:
Подводя итог, отметим: штатной "галочки" или константы в настройках параметров учета 1С:УПП для отключения свертки строк не существует. Оптимальным техническим решением является создание Внешней печатной формы с добавлением поля НомерСтроки в группировку запроса ТОРГ-12 и в параметры метода Свернуть() для Счета-фактуры.