Как создать шахматный отчет (Pivot) в 1С: пошаговое руководство

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

Создание шахматного отчета, или как его часто называют в аналитике — Pivot-таблицы, является классической задачей при подготовке к экзамену «1С:Специалист по платформе» (в частности, задача 2.18 по бухгалтерскому учету). Такой отчет представляет собой таблицу, где одни и те же измерения (например, счета или контрагенты) располагаются одновременно и в строках, и в колонках, а на пересечении выводятся итоговые показатели. Рассмотрим подробнее, какими инструментами платформы 1С:Предприятие 8.3 можно решить эту задачу максимально эффективно.

Метод 1: Использование системы компоновки данных (СКД)

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

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

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

Метод 2: Программный вывод через табличный документ

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

Рассмотрим алгоритм реализации:

  1. Создадим макет с тремя именованными областями: Шапка (заголовок колонки), Строка (заголовок строки) и Ячейка (пересечение).
  2. Подготовим запрос, который возвращает данные в формате: Координата_X, Координата_Y, Значение.
  3. Выгрузим результат запроса в индексированную ТаблицуЗначений для быстрого поиска.

Посмотрим на пример кода, реализующего такой обход:


// Получаем макет и создаем табличный документ
Макет = ПолучитьМакет("МакетШахматки");
ТабДок = Новый ТабличныйДокумент;

// Выводим пустой угол (пересечение заголовков)
ОбластьУгол = Макет.ПолучитьОбласть("Шапка|Строка");
ТабДок.Вывести(ОбластьУгол);

// Сначала выводим все заголовки колонок (например, Счета Кредита)
Для Каждого ТекКолонка Из СписокСчетовКт Цикл
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка|Ячейка");
    ОбластьШапка.Параметры.СчетКт = ТекКолонка;
    ТабДок.Присоединить(ОбластьШапка);
КонецЦикла;

// Теперь выводим строки
Для Каждого ТекСтрока Из СписокСчетовДт Цикл
    // Выводим заголовок строки
    ОбластьЗаголовокСтроки = Макет.ПолучитьОбласть("Строка|Строка");
    ОбластьЗаголовокСтроки.Параметры.СчетДт = ТекСтрока;
    ТабДок.Вывести(ОбластьЗаголовокСтроки);
    
    // Внутри строки выводим данные для каждой колонки
    Для Каждого ТекКолонка Из СписокСчетовКт Цикл
        ОбластьДанные = Макет.ПолучитьОбласть("Строка|Ячейка");
        
        // Поиск суммы в заранее подготовленной ТЗ
        ПараметрыПоиска = Новый Структура("СчетДт, СчетКт", ТекСтрока, ТекКолонка);
        СтрокаДанных = ТаблицаРезультатов.НайтиСтроки(ПараметрыПоиска);
        
        Если СтрокаДанных.Количество() > 0 Тогда
            ОбластьДанные.Параметры.Сумма = СтрокаДанных[0].Сумма;
        Иначе
            ОбластьДанные.Параметры.Сумма = 0;
        КонецЕсли;
        
        ТабДок.Присоединить(ОбластьДанные);
    КонецЦикла;
КонецЦикла;

Специфика задачи 2.18 (Экзамен 1С:Специалист)

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

Особенности, на которые обращает внимание экзаменатор:

Сравнение методов

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

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

← На главную