При формировании печатных форм (например, универсального передаточного документа — УПД, счетов-фактур или накладных) в платформе 1С:Предприятие 7.7 часто возникает необходимость сгруппировать одинаковые позиции номенклатуры с одинаковой ценой. Для этого разработчики традиционно применяют стандартный метод Свернуть() объекта ТаблицаЗначений. Однако нередко возникает ситуация: код написан, метод вызывается, но таблица не сворачивается вовсе либо часть строк упорно двоится. Проанализируем причины такого поведения и разберем по шагам, как локализовать и устранить ошибку.
Синтаксис метода выглядит следующим образом:
ТаблицаЗначений.Свернуть(СписокКолонокГруппировки, СписокКолонокСуммирования);
Метод выполняет обход строк таблицы и группирует их. При этом две строки объединяются в одну только при абсолютно точном совпадении всех значений во всех колонках, перечисленных в первом параметре (колонках группировки). Если хотя бы в одной колонке значения различаются хотя бы на долю единицы, символ или тип, платформа посчитает строки разными.
Кроме того, важно помнить об особенностях платформы 1С 7.7:
Свернуть(), безвозвратно удаляются из таблицы.Свернуть() всегда принудительно сортирует итоговую таблицу значений по колонкам группировки в том порядке, в котором они переданы в строке первого параметра. Исходный порядок строк теряется.Наиболее коварная ошибка возникает при включении цены или расчетного реквизита в список колонок группировки. Посмотрим на типовой пример заполнения табличной части перед печатью:
МнЧ.Цена = ?(ДокСФ.Количество = 0, 0, ДокСФ.Цена - ДокСФ.СуммаНДС / ДокСФ.Количество);
В результате операции деления в памяти формируется число с плавающей точностью платформы: например, в одной строке цена равна 8.0500000000, а в другой — 8.0500912345. Визуально при выводе в печатную форму или в отчет с маской Ч15.2 обе строки отображаются как 8.05, но для метода Свернуть() это два совершенно разных значения. В итоге строки не объединяются.
Для исправления этой проблемы обязательно выполняем явное округление рассчитываемого числа до требуемой точности перед вызовом свертки:
МнЧ.Цена = Окр(ДокСФ.Цена - ДокСФ.СуммаНДС / ДокСФ.Количество, 2, 1);
Здесь третий параметр 1 задает режим округления 1.5 до 2 (в пользу большего модуля).
Если округление цены не решило проблему, разберем другие факторы, препятствующие объединению строк:
Единица), пустая строка "", число 0 или системное пустое значение, возвращаемое функцией ПолучитьПустоеЗначение(). Для платформы 1С 7.7 это разные объекты, поэтому строки не свернутся. Все пустые значения одной колонки должны быть приведены к строго единому виду (например, заполнены одинаковым значением "-" или приведены через проверку ПустоеЗначение()).СокрЛП() удаляет только обычные пробелы (символ с ASCII-кодом 32). Если в строковом наименовании номенклатуры или номере ГТД присутствуют неразрывные пробелы (код 160), знаки табуляции или переводы строк, строки будут выглядеть идентично, но для платформы останутся разными.ЕдиницаКод, СтранаК, СтранаН или НомерГТД, которые в разных партиях одного и того же товара могут незначительно отличаться либо содержать пробелы разной длины. Оставляйте в списке группировки только минимально необходимый набор полей."-" вместо нуля, метод Свернуть() не сможет выполнить математическое сложение сумм. Текстовое представление показателей следует формировать исключительно в момент вывода строки в печатную таблицу.Для того чтобы точно выяснить, какая именно колонка препятствует свертке, необходимо проанализировать содержимое таблицы до и после вызова метода. Рассмотрим два эффективных способа.
Самый простой способ временно прервать выполнение и открыть стандартное окно просмотра таблицы значений:
ТабЧ.Свернуть("Номенклатура,Единица,Цена,СтавкаНДС,СтранаН,СтранаК,НомерГТД", "Количество,Сумма,СуммаНДС,ВсегоСНДС");
ТабЧ.ВыбратьСтроку(, "Проверка свертки");
Возврат;
Метод ВыбратьСтроку() открывает модальное диалоговое окно со всеми колонками таблицы, что позволяет сразу увидеть несвернутые строки и сравнить значения в них.
Если стандартное окно выбора слишком мало, воспользуемся универсальным алгоритмом программной выгрузки любой таблицы значений в печатную таблицу:
ТабОтладка = СоздатьОбъект("Таблица");
ТабОтладка.ИсходнаяТаблица("ТЗ");
ТабОтладка.ВывестиСекцию("Заг|Нач");
Для К = 1 По ТабЧ.КоличествоКолонок() Цикл
ТабОтладка.ПрисоединитьСекцию("Заг|Кол");
КонецЦикла;
ТабЧ.ВыбратьСтроки();
Пока ТабЧ.ПолучитьСтроку() = 1 Цикл
ТабОтладка.ВывестиСекцию("Стр|Нач");
Для К = 1 По ТабЧ.КоличествоКолонок() Цикл
Зн = ТабЧ.ПолучитьЗначение(ТабЧ.НомерСтроки, К);
ТабОтладка.ПрисоединитьСекцию("Стр|Кол");
КонецЦикла;
КонецЦикла;
ТабОтладка.Показать("Отладка ТЗ");
Такой подход позволяет наглядно увидеть точные типы и строковые представления всех реквизитов таблицы на любом этапе работы алгоритма.