Как получить значение второй строки в группировке СКД с помощью ВычислитьВыражение()

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Однако при неправильной настройке контекста вычисления вместо второй детальной строки отчёт возвращает значение первой строки следующей группировки. Проанализируем, почему так происходит, и разберём правильные способы решения этой задачи.

Причина нетипичного поведения функции ВычислитьВыражение()

Разберем механику работы функции. Выражение со смещением выглядит следующим образом:

ВычислитьВыражение("Период", , , "Первая(2)", "Первая(2)")

Главная причина, по которой сдвиг происходит по группировкам, а не по детальным записям, заключается в контексте расчета и значении параметра ТипРасчета:

  1. Расчет в окне «Ресурсы»: Если выражение с функцией ВычислитьВыражение() написано на вкладке ресурсов, СКД вычисляет его для итоговой (групповой) записи. В этом контексте указатели смещения ("Первая(2)", "Предыдущая", "Следующая") перемещаются по соседним веткам итогов того же уровня, а не по детальным записям внутри одной группы.
  2. Параметр «ТипРасчета»: По умолчанию или при значении параметра "Группировка" платформа выполняет вычисление относительно текущей групповой записи. Параметр "ОбщийИтог" производит расчет по всем записям, но логика смещения фиксируется относительно всего набора данных.

Способ 1. Вычисление на уровне детальных записей (Вычисляемые поля)

Если требуется вывести значение второй строки непосредственно в таблице детальных записей, перенесём выражение из ресурсов на вкладку «Вычисляемые поля».

Рассмотрим порядок действий:

  1. Перейдем на вкладку Вычисляемые поля в схеме компоновки данных.
  2. Добавим новое поле (например, ПериодВторойСтроки).
  3. В колонке Выражение пропишем вызов функции:

    ВычислитьВыражение("Период", , , "Первая(2)", "Первая(2)")

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

Способ 2. Извлечение детальной записи в шапку группировки через массив

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

Для поля ресурса зададим следующее выражение:

ПолучитьЭлемент(ВычислитьВыражениеСГруппировкойМассив("Период", "Период"), 2)

Рассмотрим, как работает эта конструкция:

  1. Функция ВычислитьВыражениеСГруппировкойМассив() собирает все значения поля Период нижестоящих детальных записей текущей группы в массив.
  2. Функция ПолучитьЭлемент(..., 2) извлекает из сформированного массива значение со вторым индексом.

Способ 3. Нумерация строк в запросе набора данных

Проанализируем альтернативный подход, который не зависит от нюансов функций языка выражений СКД. Нумерацию строк можно выполнить непосредственно в тексте запроса с помощью оконной функции.

Добавим в запрос набора данных нумерацию внутри группы:


ВЫБРАТЬ
    Т.Ссылка КАК Документ,
    Т.Номенклатура КАК Номенклатура,
    Т.Количество КАК Количество,
    ROW_NUMBER() OVER (PARTITION BY Т.Ссылка ОБРАБОТКА ПО Т.Номенклатура) КАК НомерСтроки
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК Т

После этого на вкладке «Ресурсы» вычисление значения для 2-й строки сводится к простому условию:


Максимум(Выбор Когда НомерСтроки = 2 Тогда Номенклатура Иначе Неопределено Конец)

Важные особенности и ограничения

При использовании смещений в СКД обратите внимание на следующие важные нюансы:

  1. Зависимость от сортировки: Смещение "Первая(2)" строго ориентируется на порядок строк. Если пользователь изменит сортировку отчета в настройках, без явного задания параметра сортировки внутри ВычислитьВыражение() вернется другая строка.
  2. Границы выборки: Если в группировке всего 1 детальная запись, обращение ко второй строке вернет значение NULL (или пустое значение). Учитывайте это при формировании печатных форм и вычислениях.
  3. Отборы: Поля, содержащие функцию ВычислитьВыражение(), нельзя использовать в отборах по детальным записям, иначе компоновщик данных выдаст ошибку вычисления выражения.
← На главную