Как создать внешний отчет в 1С в виде кросс-таблицы без использования программного кода

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

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

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

Способ 1: Использование структуры «Таблица» в настройках СКД

Самый правильный и быстрый способ создать кросс-отчет в 1С — это использование типа группировки Таблица на вкладке настроек схемы компоновки данных. Рассмотрим этот процесс по шагам.

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

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

Способ 2: Техника «Разворачивания» (Pivoting) прямо в тексте запроса

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

Для каждого дня недели мы создадим отдельное вычисляемое поле в запросе, используя агрегатные функции с условием. Проанализируем пример такого кода:


ВЫБРАТЬ
    Продажи.ТорговыйПредставитель КАК ТорговыйПредставитель,
    СУММА(ВЫБОР
            КОГДА ДЕНЬНЕДЕЛИ(Продажи.Период) = 1
                ТОГДА Продажи.СуммаОборота
            ИНАЧЕ 0
        КОНЕЦ) КАК Понедельник,
    СУММА(ВЫБОР
            КОГДА ДЕНЬНЕДЕЛИ(Продажи.Период) = 2
                ТОГДА Продажи.СуммаОборота
            ИНАЧЕ 0
        КОНЕЦ) КАК Вторник,
    СУММА(ВЫБОР
            КОГДА ДЕНЬНЕДЕЛИ(Продажи.Период) = 3
                ТОГДА Продажи.СуммаОборота
            ИНАЧЕ 0
        КОНЕЦ) КАК Среда
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи
СГРУППИРОВАТЬ ПО
    Продажи.ТорговыйПредставитель

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

Работа с нечисловыми данными в ячейках отчета

Часто в кросс-таблице нужно вывести не просто сумму, а, например, наименование торговой точки, которую посетил агент. Здесь возникают сложности с ресурсами, так как 1С по умолчанию предлагает суммировать только числа. Выясним, как вывести текст в ячейки таблицы.

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

Пример выражения в поле «Рассчитывать по...» для ресурса ТорговаяТочка:

СоединитьСтроки(ТорговаяТочка, "; ")

Тонкая настройка: Роли полей и сортировка

Чтобы отчет выглядел профессионально, необходимо разобраться с сортировкой дней недели. Если просто выводить названия дней, они могут выстроиться по алфавиту («Вторник», «Воскресенье», «Понедельник»...), что недопустимо.

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

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

ВЫБОР КОГДА ДеньИндекс = 1 ТОГДА "Пн" КОГДА ДеньИндекс = 2 ТОГДА "Вт" ИНАЧЕ "Прочее" КОНЕЦ

Визуальное оформление и борьба с «дырками» в данных

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

Для гарантированного вывода всех строк и колонок рекомендуется использовать ЛЕВОЕ СОЕДИНЕНИЕ. Основной таблицей (левой) должен выступать справочник Пользователи или Сотрудники, к которому мы присоединяем таблицу фактов (продаж). Это обеспечит наличие всех фамилий в левой части отчета, даже если у них нулевые показатели.

Напоследок, используйте «Условное оформление» на вкладке настроек СКД. Это позволит вам:

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

← На главную