Как настроить сквозную нумерацию детальных записей в СКД и избежать учета группировок

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает задача создания сквозной нумерации строк. Однако стандартное системное поле НомерПоПорядку ведет себя специфически: оно инкрементируется для каждой выведенной строки, включая заголовки группировок. В итоге, если в отчете есть иерархия (например, Организация — Подразделение — ОС), номера «съедаются» заголовками групп, и детальные записи получают некрасивые индексы (например, первая строка данных начинается с номера 3). Разберем, как решить эту проблему, особенно в контексте сложных типовых отчетов.

Понимание сущности «Детальные записи» в СКД

Прежде всего, проанализируем, чем являются Детальные записи. С технической точки зрения — это группировка, у которой не выбрано ни одно поле группировки. Именно поэтому в функциях СКД к ним нельзя обратиться по имени «Детальные записи» в кавычках. Если мы хотим использовать функцию ВычислитьВыражение для нумерации, нам нужно четко понимать область видимости вычислений.

Рассмотрим стандартное выражение для нумерации в вычисляемом поле:

ВычислитьВыражение("НомерПоПорядку", "Группировка")

Если мы хотим, чтобы нумерация была сквозной по всему отчету, игнорируя иерархию групп, в качестве второго параметра следует использовать ключевое слово "ОбщийИтог". Это заставит систему игнорировать границы текущих группировок при подсчете индекса.

Способ 1: Использование вычисляемого поля и функции ВычислитьВыражение

Рассмотрим пошагово наиболее гибкий метод настройки нумерации:

  1. Перейдем на закладку Вычисляемые поля в схеме компоновки данных.
  2. Добавим новое поле, назовем его, например, НомПП.
  3. В колонке «Выражение» укажем просто НомерПоПорядку. Это самый простой вариант, но он может не сработать в сложных иерархиях.
  4. Более надежный вариант — оставить выражение в «Вычисляемых полях» пустым, но перейти на закладку Ресурсы.
  5. Добавим наше поле НомПП в ресурсы. В выражении напишем: ВычислитьВыражение("НомерПоПорядку", "ОбщийИтог")
  6. В колонке «Рассчитывать по...» выберем только ту группировку, которая является для нас «детальной» (например, «Основное средство»). Если мы оставим это поле пустым, нумерация снова начнет применяться ко всем итогам.

Способ 2: Настройка через Системные поля в выбранных полях

Посмотрим на более простой вариант, который часто срабатывает, если структура отчета не слишком сложная. Выясним, как добавить нумерацию непосредственно в настройках варианта:

В настройках СКД (внизу, в структуре отчета) выберем конкретную группировку самого нижнего уровня. Перейдем в Выбранные поля этой группировки и добавим туда СистемныеПоля.НомерПоПорядку. При таком подходе номер будет выводиться только в строках этой группы, не затрагивая вышестоящие итоги. Однако помните, что если одна и та же запись попадает в разные ветки иерархии, сквозная нумерация может сбиться без использования контекста "ОбщийИтог".

Проблема программной модификации в типовых отчетах

Если вы работаете с типовой конфигурацией (например, 1С:Бухгалтерия 3.0) и пытаетесь изменить отчет «Ведомость амортизации ОС», вы можете столкнуться с тем, что добавленные поля просто не появляются в итоговом документе. Проанализируем причину.

Типовые бухгалтерские отчеты часто строятся программно. В общем модуле БухгалтерскиеОтчетыВызовСервера (функция ПодготовитьОтчет) схема СКД может модифицироваться «на лету». Программный код может:

В таких случаях добавление поля через Расширение в саму схему (запрос) помогает только наполовину. Вам также потребуется зайти в пользовательские настройки («Изменить вариант») и вручную добавить это поле в список выбранных, так как система может «кэшировать» старый состав полей.

Решение проблемы сброса счетчика после 999

Разберем ситуацию, когда нумерация доходит до 999, а затем превращается в 1, 2 и так далее. Это классическая ошибка, связанная с преобразованием типов в СКД.

Выясним причину: когда число достигает 1000, система (в зависимости от региональных настроек) может добавлять неразрывный пробел в качестве разделителя разрядов (например, "1 000"). Если поле в СКД не определено как числовое, или если в ресурсах происходит неявное преобразование в строку, этот пробел мешает корректному отображению или дальнейшим вычислениям.

Как это исправить:

  1. В вычисляемом поле обязательно укажите Тип значения — Число. Установите длину (например, 10) и точность (0).
  2. В настройках оформления поля (на закладке «Наборы данных» или «Вычисляемые поля») установите параметр Формат. В поле «Группировка» выберите «Нет» (чтобы убрать пробел-разделитель) или явно задайте формат ЧГ=0. Это гарантирует, что число 1000 останется числом 1000 без лишних символов.

Использование постобработки (ПриКомпоновкеРезультата)

Если стандартные средства СКД не позволяют добиться нужного результата (например, нужно пронумеровать строки сложным образом уже после формирования всех итогов), можно прибегнуть к постобработке Табличного документа.

Проанализируем ситуацию с отчетом «Ведомость амортизации ОС»: в нем событие ПриКомпоновкеРезультата в модуле объекта может не вызываться, так как используется программный вывод. В этом случае можно использовать расширение для процедуры, которая отвечает за вывод результата в коллекцию или таблицу. Мы можем обойти готовую таблицу циклом и проставить номера в нужную колонку:


Для Каждого ОбластьСтрока Из ТабличныйДокумент.Области Цикл
    Если ОбластьСтрока.Параметры.Свойство("НомПП") Тогда
        Счетчик = Счетчик + 1;
        ОбластьСтрока.Параметры.НомПП = Счетчик;
    КонецЕсли;
КонецЦикла;

Хотя этот метод считается «тяжелым» для производительности, он является гарантированным способом обойти любые ограничения макетов СКД в типовых решениях 1С.

← На главную