Разбираемся в механизме пустых запросов и динамического формирования данных в отчетах 1С

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

При анализе типовых отчетов в конфигурациях «1С:Бухгалтерия» или «1С:Зарплата и управление персоналом» программисты часто сталкиваются с необычными запросами в макетах СКД (Системы компоновки данных). Такие запросы начинаются с конструкции ВЫБРАТЬ ПЕРВЫЕ 0 и содержат множество пустых ссылок. Рассмотрим подробнее, зачем это нужно, как работает этот механизм и где на самом деле «прячутся» данные и суммы в таких отчетах.

Зачем в запросе используется конструкция ВЫБРАТЬ ПЕРВЫЕ 0

Когда мы видим в тексте запроса ВЫБРАТЬ ПЕРВЫЕ 0, это означает, что при выполнении в консоли запросов или напрямую этот код не вернет ни одной строки данных. Однако для СКД этот текст крайне важен. Проанализируем причины его использования:

  1. Декларация структуры полей: Системе компоновки данных необходимо знать, какие поля будут доступны пользователю для настройки отчета (выбор полей, группировок, отборов). Используя такой «пустой» запрос, разработчик объявляет список доступных колонок.
  2. Жесткая типизация: Чтобы отчет работал корректно, каждое поле должно иметь определенный тип (число, дата, ссылка на справочник). Конструкции вида ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КАК Организация позволяют платформе однозначно определить тип данных для колонки Организация еще на этапе проектирования отчета в конфигураторе.
  3. Оптимизация конструктора: Сложные зарплатные отчеты собирают данные из десятков таблиц. Если бы в макете СКД был прописан реальный тяжелый запрос, работа в конфигураторе с таким макетом была бы крайне медленной. «Заглушка» позволяет быстро настраивать визуальную часть отчета.

Механизм динамической подмены текста запроса

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

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

Посмотрим на пример того, как в коде может выглядеть типизация через пустые ссылки для объединения разных типов данных в одну колонку ВидРасчета:


ВЫБРАТЬ ПЕРВЫЕ 0
    ЗНАЧЕНИЕ(ПланВидовРасчета.Начисления.ПустаяСсылка) КАК ВидРасчета
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ПЕРВЫЕ 0
    ЗНАЧЕНИЕ(ПланВидовРасчета.Удержания.ПустаяСсылка)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ПЕРВЫЕ 0
    ЗНАЧЕНИЕ(Перечисление.ВидыВзаиморасчетовССотрудниками.ПустаяСсылка)

В данном случае колонка ВидРасчета получит составной тип данных, включающий и начисления, и удержания, и перечисления. Это позволяет выводить все эти сущности в одном списке в отчете.

Откуда берется Сумма в отчете

Поскольку в исходном тексте макета в поле Сумма стоит просто 0 КАК Сумма, реальные значения попадают туда только в момент выполнения. Проанализируем основные источники данных:

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

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

Как изменить отчет: разделение начислений по колонкам

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

Шаг 1. Использование структуры «Таблица» в СКД.
В настройках отчета на вкладке «Настройки» вместо обычного списка («Детальные записи») добавим объект Таблица. В Строки таблицы добавим группировку Сотрудник, а в Колонки — группировку ВидРасчета.

Шаг 2. Фильтрация видов расчета.
Если нам нужны не все виды расчета, а только конкретные, мы можем настроить отбор для группировки колонок. Например, в колонках указать группировку с условием: ВидРасчета В СПИСКЕ ("Оклад", "Премия").

Шаг 3. Использование вычисляемых полей.
Если требуется сложная логика (например, объединить несколько видов расчетов в одну колонку «Прочее»), проанализируем возможность создания Вычисляемого поля в СКД. В выражении такого поля можно написать условие:


ВЫБОР 
    КОГДА ВидРасчета.Наименование ПОДОБНО "%Оклад%" ТОГДА Сумма 
    ИНАЧЕ 0 
КОНЕЦ

Затем это вычисляемое поле добавляется в ресурсы и выводится в отчет как отдельная колонка.

Советы по отладке подобных отчетов

Если вам необходимо увидеть «реальный» запрос, который выполняется в базе данных после всех программных подстановок, выполните следующие действия:

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

← На главную