Как в отчете СКД вывести несколько заявок на расход в виде таблицы или отдельных колонок

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

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

Метод 1: Транспонирование данных через нумерацию строк (динамические колонки)

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

Для начала нам нужно вычислить индекс оплаты. Это можно сделать двумя способами: в тексте запроса или непосредственно в настройках СКД с помощью вычисляемых выражений. Рассмотрим вариант с использованием функции ВычислитьВыражение в СКД, так как он более гибкий:

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

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

Метод 2: Использование функции СоединитьСтроки для компактного вывода

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

Для реализации этого метода выполним следующие шаги:

  1. На вкладке Ресурсы выберем поле, которое содержит информацию о заявке (например, ЗаявкаНаРасход).
  2. В поле «Выражение» используем функцию СоединитьСтроки(): СоединитьСтроки(Массив(ЗаявкаНаРасход), ", ")
  3. В настройках отчета укажем это поле для вывода в основной строке группировки.

Это позволит объединить все связанные оплаты в одну строку, что сохранит читаемость отчета при большом количестве номенклатурных позиций.

Метод 3: Использование вложенных схем компоновки данных

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

Рассмотрим алгоритм настройки:

  1. Создадим основную схему, которая выбирает только данные по заказам и товарам.
  2. Создадим вторую (вложенную) схему, которая выбирает данные только по оплатам и имеет параметр связи (например, Заказ).
  3. В настройках основной схемы добавим Вложенный отчет.
  4. Настроим связь между схемами по полю Ссылка (из основной) и Заказ (из вложенной).

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

Метод 4: Решение проблемы дублирования итогов через роли полей

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

Разберем настройки ролей:

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

Метод 5: Условное оформление и визуальное выделение

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

Посмотрим на шаги реализации:

  1. В структуре отчета создадим иерархию: Заказ -> Детальные записи (товары) -> Группировка (Оплаты).
  2. Для группировки «Оплаты» перейдем на вкладку Условное оформление.
  3. Добавим оформление: установим цвет фона (например, светло-зеленый) и определим границы.
  4. Чтобы оплаты не выглядели как пустые строки, если их нет, установим отбор в этой конкретной группировке: ЗаявкаНаРасход Заполнено.

Важный момент: Чтобы отчет не превратился в «лесенку», используйте настройку Расположение группировок. Установив значение «Отдельно и в подвалах», вы сможете добиться компактного расположения данных об оплатах сразу под итоговой строкой заказа или товара.

Резюме

Выбор конкретного метода зависит от требований к визуализации:

Применяя эти технические приемы, вы сможете создавать профессиональные отчеты в 1С без использования ручных макетов, сохраняя все преимущества системы компоновки данных.

← На главную