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