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