Почему не сворачивается таблица значений в 1С 7.7 и как это исправить?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При формировании печатных форм (например, универсального передаточного документа — УПД, счетов-фактур или накладных) в платформе 1С:Предприятие 7.7 часто возникает необходимость сгруппировать одинаковые позиции номенклатуры с одинаковой ценой. Для этого разработчики традиционно применяют стандартный метод Свернуть() объекта ТаблицаЗначений. Однако нередко возникает ситуация: код написан, метод вызывается, но таблица не сворачивается вовсе либо часть строк упорно двоится. Проанализируем причины такого поведения и разберем по шагам, как локализовать и устранить ошибку.

Анализ механизма работы метода Свернуть()

Синтаксис метода выглядит следующим образом:

ТаблицаЗначений.Свернуть(СписокКолонокГруппировки, СписокКолонокСуммирования);

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

Кроме того, важно помнить об особенностях платформы 1С 7.7:

  1. Все колонки, которые не вошли ни в первый, ни во второй параметр метода Свернуть(), безвозвратно удаляются из таблицы.
  2. Метод Свернуть() всегда принудительно сортирует итоговую таблицу значений по колонкам группировки в том порядке, в котором они переданы в строке первого параметра. Исходный порядок строк теряется.

Основная причина: скрытая разница в точности расчетных чисел

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


МнЧ.Цена = ?(ДокСФ.Количество = 0, 0, ДокСФ.Цена - ДокСФ.СуммаНДС / ДокСФ.Количество);

В результате операции деления в памяти формируется число с плавающей точностью платформы: например, в одной строке цена равна 8.0500000000, а в другой — 8.0500912345. Визуально при выводе в печатную форму или в отчет с маской Ч15.2 обе строки отображаются как 8.05, но для метода Свернуть() это два совершенно разных значения. В итоге строки не объединяются.

Для исправления этой проблемы обязательно выполняем явное округление рассчитываемого числа до требуемой точности перед вызовом свертки:

МнЧ.Цена = Окр(ДокСФ.Цена - ДокСФ.СуммаНДС / ДокСФ.Количество, 2, 1);

Здесь третий параметр 1 задает режим округления 1.5 до 2 (в пользу большего модуля).

Другие скрытые причины несворачивания строк

Если округление цены не решило проблему, разберем другие факторы, препятствующие объединению строк:

  1. Разнородные пустые значения. Если реквизит не заполнен, в разных строках могут оказаться разные типы данных: пустая ссылка конкретного справочника (например, пустая Единица), пустая строка "", число 0 или системное пустое значение, возвращаемое функцией ПолучитьПустоеЗначение(). Для платформы 1С 7.7 это разные объекты, поэтому строки не свернутся. Все пустые значения одной колонки должны быть приведены к строго единому виду (например, заполнены одинаковым значением "-" или приведены через проверку ПустоеЗначение()).
  2. Неразрывные пробелы и служебные символы. Стандартная функция СокрЛП() удаляет только обычные пробелы (символ с ASCII-кодом 32). Если в строковом наименовании номенклатуры или номере ГТД присутствуют неразрывные пробелы (код 160), знаки табуляции или переводы строк, строки будут выглядеть идентично, но для платформы останутся разными.
  3. Служебные и уникальные колонки в группировке. Чем больше колонок передано в первом параметре, тем ниже вероятность объединения строк. Часто в группировку ошибочно добавляют реквизиты вроде ЕдиницаКод, СтранаК, СтранаН или НомерГТД, которые в разных партиях одного и того же товара могут незначительно отличаться либо содержать пробелы разной длины. Оставляйте в списке группировки только минимально необходимый набор полей.
  4. Текстовые значения в суммируемых колонках. Если во второй параметр (суммируемые ресурсы) попадает текстовый прочерк "-" вместо нуля, метод Свернуть() не сможет выполнить математическое сложение сумм. Текстовое представление показателей следует формировать исключительно в момент вывода строки в печатную таблицу.

Способы быстрой отладки и просмотра таблицы значений

Для того чтобы точно выяснить, какая именно колонка препятствует свертке, необходимо проанализировать содержимое таблицы до и после вызова метода. Рассмотрим два эффективных способа.

Интерактивный просмотр через метод ВыбратьСтроку()

Самый простой способ временно прервать выполнение и открыть стандартное окно просмотра таблицы значений:


ТабЧ.Свернуть("Номенклатура,Единица,Цена,СтавкаНДС,СтранаН,СтранаК,НомерГТД", "Количество,Сумма,СуммаНДС,ВсегоСНДС");
ТабЧ.ВыбратьСтроку(, "Проверка свертки");
Возврат;

Метод ВыбратьСтроку() открывает модальное диалоговое окно со всеми колонками таблицы, что позволяет сразу увидеть несвернутые строки и сравнить значения в них.

Универсальный вывод таблицы значений в отчет

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


ТабОтладка = СоздатьОбъект("Таблица");
ТабОтладка.ИсходнаяТаблица("ТЗ");
ТабОтладка.ВывестиСекцию("Заг|Нач");
Для К = 1 По ТабЧ.КоличествоКолонок() Цикл
    ТабОтладка.ПрисоединитьСекцию("Заг|Кол");
КонецЦикла;

ТабЧ.ВыбратьСтроки();
Пока ТабЧ.ПолучитьСтроку() = 1 Цикл
    ТабОтладка.ВывестиСекцию("Стр|Нач");
    Для К = 1 По ТабЧ.КоличествоКолонок() Цикл
        Зн = ТабЧ.ПолучитьЗначение(ТабЧ.НомерСтроки, К);
        ТабОтладка.ПрисоединитьСекцию("Стр|Кол");
    КонецЦикла;
КонецЦикла;
ТабОтладка.Показать("Отладка ТЗ");

Такой подход позволяет наглядно увидеть точные типы и строковые представления всех реквизитов таблицы на любом этапе работы алгоритма.

← На главную