При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает задача создания сквозной нумерации строк. Однако стандартное системное поле НомерПоПорядку ведет себя специфически: оно инкрементируется для каждой выведенной строки, включая заголовки группировок. В итоге, если в отчете есть иерархия (например, Организация — Подразделение — ОС), номера «съедаются» заголовками групп, и детальные записи получают некрасивые индексы (например, первая строка данных начинается с номера 3). Разберем, как решить эту проблему, особенно в контексте сложных типовых отчетов.
Прежде всего, проанализируем, чем являются Детальные записи. С технической точки зрения — это группировка, у которой не выбрано ни одно поле группировки. Именно поэтому в функциях СКД к ним нельзя обратиться по имени «Детальные записи» в кавычках. Если мы хотим использовать функцию ВычислитьВыражение для нумерации, нам нужно четко понимать область видимости вычислений.
Рассмотрим стандартное выражение для нумерации в вычисляемом поле:
ВычислитьВыражение("НомерПоПорядку", "Группировка")
Если мы хотим, чтобы нумерация была сквозной по всему отчету, игнорируя иерархию групп, в качестве второго параметра следует использовать ключевое слово "ОбщийИтог". Это заставит систему игнорировать границы текущих группировок при подсчете индекса.
Рассмотрим пошагово наиболее гибкий метод настройки нумерации:
НомПП.НомерПоПорядку. Это самый простой вариант, но он может не сработать в сложных иерархиях.НомПП в ресурсы. В выражении напишем:
ВычислитьВыражение("НомерПоПорядку", "ОбщийИтог")
Посмотрим на более простой вариант, который часто срабатывает, если структура отчета не слишком сложная. Выясним, как добавить нумерацию непосредственно в настройках варианта:
В настройках СКД (внизу, в структуре отчета) выберем конкретную группировку самого нижнего уровня. Перейдем в Выбранные поля этой группировки и добавим туда СистемныеПоля.НомерПоПорядку. При таком подходе номер будет выводиться только в строках этой группы, не затрагивая вышестоящие итоги. Однако помните, что если одна и та же запись попадает в разные ветки иерархии, сквозная нумерация может сбиться без использования контекста "ОбщийИтог".
Если вы работаете с типовой конфигурацией (например, 1С:Бухгалтерия 3.0) и пытаетесь изменить отчет «Ведомость амортизации ОС», вы можете столкнуться с тем, что добавленные поля просто не появляются в итоговом документе. Проанализируем причину.
Типовые бухгалтерские отчеты часто строятся программно. В общем модуле БухгалтерскиеОтчетыВызовСервера (функция ПодготовитьОтчет) схема СКД может модифицироваться «на лету». Программный код может:
В таких случаях добавление поля через Расширение в саму схему (запрос) помогает только наполовину. Вам также потребуется зайти в пользовательские настройки («Изменить вариант») и вручную добавить это поле в список выбранных, так как система может «кэшировать» старый состав полей.
Разберем ситуацию, когда нумерация доходит до 999, а затем превращается в 1, 2 и так далее. Это классическая ошибка, связанная с преобразованием типов в СКД.
Выясним причину: когда число достигает 1000, система (в зависимости от региональных настроек) может добавлять неразрывный пробел в качестве разделителя разрядов (например, "1 000"). Если поле в СКД не определено как числовое, или если в ресурсах происходит неявное преобразование в строку, этот пробел мешает корректному отображению или дальнейшим вычислениям.
Как это исправить:
Число. Установите длину (например, 10) и точность (0).ЧГ=0. Это гарантирует, что число 1000 останется числом 1000 без лишних символов.Если стандартные средства СКД не позволяют добиться нужного результата (например, нужно пронумеровать строки сложным образом уже после формирования всех итогов), можно прибегнуть к постобработке Табличного документа.
Проанализируем ситуацию с отчетом «Ведомость амортизации ОС»: в нем событие ПриКомпоновкеРезультата в модуле объекта может не вызываться, так как используется программный вывод. В этом случае можно использовать расширение для процедуры, которая отвечает за вывод результата в коллекцию или таблицу. Мы можем обойти готовую таблицу циклом и проставить номера в нужную колонку:
Для Каждого ОбластьСтрока Из ТабличныйДокумент.Области Цикл
Если ОбластьСтрока.Параметры.Свойство("НомПП") Тогда
Счетчик = Счетчик + 1;
ОбластьСтрока.Параметры.НомПП = Счетчик;
КонецЕсли;
КонецЦикла;
Хотя этот метод считается «тяжелым» для производительности, он является гарантированным способом обойти любые ограничения макетов СКД в типовых решениях 1С.