Содержание
- Недостатки механизма
- Обработка «Представления, используемые в запросах наборов данных СКД отчетов»
- Пример использования механизма Представлений при разработке внешнего отчета
- Вывод
Такие запросы-заглушки – часть механизма представлений. Как правило, при инициализации или при компоновке таких отчетов можно встретить вызов экспортной процедуры ЗаполнитьОбщиеИсточникиДанныхОтчета из общего модуля ЗарплатаКадрыОбщиеНаборыДанных.
Как мы видим, функционал представлений заменил обращение к виртуальным таблицам на обращение к реальным объектам конфигурации. В первую очередь данных механизм упрощает разработку отчетов, основанных на данных из типовых объектов конфигурации. Например, программисту не обязательно разбираться с особенностями работы интервальных регистров, возвратными событиями и т.п. Предполагается, что механизм учтет все нюансы при составлении запросов.
Еще одним из преимуществ использования данного механизма является независимость от структуры конфигурации, что потенциально увеличивает отказоустойчивость отчетов, разработанных на основе данного механизма. С течением релизов ЗУП, в особенности релизов не длительного сопровождения, разработчики периодически меняют структуру хранения данных в каком-нибудь из регистров. Это потенциально ломает нетиповые отчеты, обращающиеся к измененным регистрам напрямую – через объекты конфигурации.
Недостатки механизма
К сожалению, данный механизм не лишен недостатков. Один из недостатков довольно субъективен – отлаживать отчеты и запросы данного отчета, в частности, не так просто, как отлаживать отчеты, составленные без использования данного механизма. На основе демонстрации подмены выше можно понять, что механизм использует все причастные справочники и регистры, хоть как-то относящиеся к полям, описанным в виртуальной таблице. Запрос вырастает многократно, и отлаживать его трудоемкий процесс, особенно в условиях высоконагруженных баз с большим количеством среднесписочной численности сотрудников (например, если отчет по кадровым данным сотрудников). Для работы с данным механизмом есть типовое решение в виде обработки «Представления используемые в запросах наборов данных СКД отчетов», которая будет рассмотрена далее. Данная обработка упрощает формирование текста запроса для схемы компоновки данных отчета, и позволяет увидеть какой запрос получится в конченом итоге.
Еще один недостаток – отсутствие документации и комментариев к процедурам замены запросов. Выполняя замену, процедура обращается к большому количеству модулей и интерфейсов. Отлаживать и искать имена для подстановки в виртуальные таблицы также трудоемко, как и отлаживать запросы. Процедуры замены могут выполнятся рекурсивно и используют большое количество различных видов интерфейсов, представленных в ЗУП. Ниже частичный список имен виртуальных таблиц (без префиксов «Представления_» или «ОбщиеЗапросы_» и т.п.):
Имя виртуальной таблицы представлений
ШтатноеРасписание |
ТекущаяКадроваяРасстановка |
ФункциональныеОпцииОрганизаций |
ФактическиеОтпускаСотрудников |
ПлановыеНачисленияСотрудников |
ПлановыеУдержанияСотрудников |
СтажиСотрудников |
СвойстваСтатейФинансирования |
БухучетЗарплатыСотрудников |
СотрудникиПодлежащиеАттестации |
РезультатыАттестацииСотрудников |
СертификатыПоСпециальностиФизическихЛиц |
СведенияОбАккредитацияхСпециалистов |
РабочиеМестаОхраныТруда |
ПоказателиКадровогоПлана |
СведенияОКандидатах |
ЛичныеДанныеКандидатов |
СтажПринятыхКандидатов |
Периоды |
ТаблицаРегистра |
СрезПоследних |
СрезПервых |
КадровыеДанныеФизическихЛиц |
КадровыеДанныеСотрудников |
РабочиеМестаСотрудников |
СотрудникиОрганизации |
ОтработанноеВремя |
КадровыеДанныеСотрудниковАнализНачисленийИУдержаний |
ПодразделенияСортировкиСотрудников |
НачисленныеДоходыНДФЛ |
ДанныеУчетаРабочегоВремениСотрудников |
ДанныеУчетаРабочегоВремениСостоянийСотрудников |
ПлановоеВремя |
Для подробной демонстрации рассмотрим примеры использования механизма в разработке внешнего отчета и во внешней обработке для подбора сотрудников с целью последующей обработки. В первую очередь, проведем анализ функциональности обработки «Представления используемые в запросах наборов данных СКД отчетов» от 1С.
Обработка «Представления, используемые в запросах наборов данных СКД отчетов»
Интерфейс обработки помогает сформировать тексты часто используемых в ЗУП запросов-представлений, и позволяет увидеть текст запроса после замены типовыми механизмами с помощью команды «Показать Настоящий запрос».
Рисунок 1. Интерфейс обработки «Представления, используемые в запросах наборов данных СКД отчетов»
Функционал позволяет сформировать запрос представлений для следующих таблиц:
— КадровыеДанныеСотрудников;
— КадровыеДанныеФизическихЛиц;
— СрезПоследних_<ИмяВозвратногоРегистраСведений>;
— ТаблицаРегистра_<ИмяВозвратногоРегистраСведений>;
— Периоды.
КадровыеДанныеСотрудников
Используя набор полей, полученных с помощью типовой функции ПоляПредставленийКадровыхДанныхСотрудников из общего модуля КадровыйУчет пользователь может собрать нужный ему набор кадровых данных.
При разработке необходимо учесть, что для использования данной таблицы представлений необходимо заранее позаботиться о наличии в запросе временной таблицы, например ВТСотрудникиПериоды, которая имеет поля Период и Сотрудник (допустимо наличие других полей). Имя данной таблицы отборов может варьироваться в зависимости от контекста исполнения запроса, но оно должно указываться в блоке ИЗ запроса-представления. Пример временной таблицы для отбора периодических сведений сотрудников:
ВЫБРАТЬ
&Период КАК Период,
Сотрудники.Ссылка КАК Сотрудник
ПОМЕСТИТЬ ВТСотрудникиПериоды
ИЗ
Справочник.Сотрудники КАК Сотрудники
В настройках формирования запроса есть две опции: «Только разрешенные» и «Формировать с периодичностью день».
«Только разрешенные» добавляет в блок ГДЕ запроса-представления формулировку "ТолькоРазрешенные" = ИСТИНА. Данное условие укажет конструкцию РАЗРЕШЕННЫЕ при формировании итогового текста запроса.
Рисунок 2. Сравнение текста запросов с использованием и без использования опции «Только разрешенные»
Галочка «Формировать с периодичность день» добавляет формулировку "ФормироватьСПериодичностьДень" = ЛОЖЬ в блок ГДЕ, и нужна для отбора в интервальных регистрах на начало дня запрашиваемых периодов. По умолчанию период для отбора приводится к концу дня. Изменения можно увидеть на рисунке 3.
Рисунок 3. Сравнение текста запросов без использования и с использованием опции «Формировать с периодичность день»
КадровыеДанныеФизическихЛиц
Таблица КадровыеДанныеФизическихЛиц представлений схожа с предыдущей рассмотренной. Набор полей для получения кадровых данных физических лиц описывается следующей функцией:
КадровыйУчет.ПоляПредставленийКадровыхДанныхФизическихЛиц();
Методы построения основного блока запроса-представления и опции блока ГДЕ совпадают с таблицей КадровыеДанныеСотрудников.
СрезПоследних_<ИмяВозвратногоРегистраСведений>
Под возвратными регистрами сведений в данном контексте понимаются периодические регистры, не помеченные на удаление разработчиками посредством префикса «Удалить». Данная таблица представлений позволяет получить запрашиваемые поля измерений, ресурсов и реквизитов периодического регистра сведений используя таблицу с отборами. Так же таблица может формировать следующие дополнительные поля:
— ПериодВозвратногоСобытия – Дата, значение ресурса ДействуетДо;
— ПеродЗаписи - Дата, период записи, непосредственно сформировавшей запись;
— ЭтоВозвратноеСобытие - Булево, Истина - если запись сформирована по окончании.
В основе данной таблицы представлений, так же используется таблица отборов, построенная с использованием обязательного поля Период и набора запрашиваемых измерений регистра. Типы измерений должны быть соблюдены. В отличие от таблицы представлений КадровыеДанныеСотрудников, другие поля в таблице отборов недопустимы. Для примера отбор по периодическому регистру сведений «Плановые начисления» можно сформировать следующим образом:
ВЫБРАТЬ
Начисления.Ссылка КАК Начисление
ПОМЕСТИТЬ ВТЗапрашиваемыеНачисления
ИЗ
ПланВидовРасчета.Начисления КАК Начисления
ГДЕ
Начисления.Ссылка В(&ЗапрашиваемыеНачисления)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
&Период КАК Период,
Сотрудники.Ссылка КАК Сотрудник
ПОМЕСТИТЬ ВТСотрудникиПериоды
ИЗ
Справочник.Сотрудники КАК Сотрудники
ГДЕ
Сотрудники.Ссылка В(&Сотрудники)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТСотрудникиПериоды.Период КАК Период,
ВТСотрудникиПериоды.Сотрудник КАК Сотрудник,
ВТЗапрашиваемыеНачисления.Начисление КАК Начисление
ПОМЕСТИТЬ ВТОтборДляСрезаПоследних
ИЗ
ВТСотрудникиПериоды КАК ВТСотрудникиПериоды
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТЗапрашиваемыеНачисления КАК ВТЗапрашиваемыеНачисления
Основной текст представления выглядит следующим образом:
ВЫБРАТЬ
ДАТАВРЕМЯ(1, 1, 1) КАК Период,
ДАТАВРЕМЯ(1, 1, 1) КАК ПериодЗаписи,
ДАТАВРЕМЯ(1, 1, 1) КАК ПериодВозвратногоСобытия,
ЛОЖЬ КАК ЭтоВозвратноеСобытие,
ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,
ЗНАЧЕНИЕ(ПланВидовРасчета.Начисления.ПустаяСсылка) КАК Начисление,
ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка) КАК ФизическоеЛицо,
ЗНАЧЕНИЕ(Документ.НазначениеПлановогоНачисления.ПустаяСсылка) КАК ДокументОснование,
ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КАК ГоловнаяОрганизация,
ИСТИНА КАК Используется,
0 КАК Размер,
ИСТИНА КАК ПересчетНеТребуется,
ИСТИНА КАК ВторичнаяЗапись
ПОМЕСТИТЬ Представления_СрезПоследних_ПлановыеНачисления
ИЗ
ВТОтборДляСрезаПоследних КАК ОтборДляСрезаПоследних
Особенность данной таблицы представлений: создаваемая таблица содержит все поля измерений, ресурсов и реквизитов. Опционально можно добавить параметры "ТолькоРазрешенные" = ИСТИНА и "ПараметрыПостроения_ФормироватьСПериодичностьДень" = ЛОЖЬ.
ТаблицаРегистра_<ИмяВозвратногоРегистраСведений>
В отличие от таблицы представлений СрезПоследних_<ИмяВозвратногоРегистраСведений>, ТаблицаРегистра позволяет получить набор данных по определенному интервалу, заданному в таблице отбора. Временная таблица отбора должна выглядеть следующим образом:
ВЫБРАТЬ
ДАТАВРЕМЯ(1, 1, 1) КАК ДатаНачала,
ДАТАВРЕМЯ(1, 1, 1) КАК ДатаОкончания,
ВТТаблицаОтборов.ИзмерениеРегистра1 КАК ИзмерениеРегистра1
ПОМЕСТИТЬ ВТОтборДляТаблицыРегистра
ИЗ
ВТТаблицаОтборов КАК ВТТаблицаОтборов
Если для поля ДатаОкончания будет указана пустая дата, то отбор будет выполнен до самой последней записи регистра сведений.
Опции построения содержат уже известные параметры «Только разрешенные» и «Формировать с периодичность день» и уникальное «Включать записи на начало периода». Данная опция добавляет конструкцию "ПараметрыПостроения_ВключатьЗаписиНаНачалоПериода" = ИСТИНА в блок ГДЕ и позволяет отобрать записи, на начало периода, заданного в таблице отборов как ДатаНачала.
Периоды
Таблица представлений, которая часто используется в типовых механизмах, позволяет получить временную таблицу с набором периодов.
Запрос-представление выглядит следующим образом:
ВЫБРАТЬ
ДАТАВРЕМЯ(1, 1, 1) КАК Период
ПОМЕСТИТЬ Представления_Периоды
ГДЕ
"НачалоИнтервала" = &НачалоПериода
И "ОкончаниеИнтервала" = &ОкончаниеПериода
И "Периодичность" = "Год"
И "ИспользоватьКонецПериода" = ИСТИНА
С помощью конструкций НачалоИнтервала и ОкончанияИнтевала блока ГДЕ задаются параметры, которые будут служить интервальным отбором при построении полного текста запроса.
Периодичность – строковая константа, которая будет определять какие периоды будут в результирующей таблице. Есть возможность указать следующие значения: Год, Квартал, Месяц, День. Например, для запроса с периодичностью – Год за интервал с 01.01.2024 00:00:00 по 31.12.2025 23:59:59 результирующая таблица будет содержать следующие периоды:
Рисунок 4. Результат выполнения запроса с периодичностью Год
Параметр ИспользоватьКонецПериода = ИСТИНА позволяет получить периоды последней секунды для указанной периодичности. Например, для вышеуказанного примера с использованием параметра ИспользоватьКонецПериода результат запроса будет выглядеть следующим образом:
Рисунок 5. Результат выполнения запроса с периодичностью Год и с использованием параметра ИспользоватьКонецПериода
Пример использования механизма Представлений при разработке внешнего отчета
Задача: Пользователю необходимо сформировать список работающих сотрудников в разрезе должностей и подразделений с информацией об оставшихся календарных днях до окончания испытательного срока со следующими условиями отбора:
— Сотрудник работает по основному виду занятости в анализируемой организации и суммарно имеет количество ставок больше или равной единице во всех организациях в целом (без учета внутренних совместительств в анализируемой организации);
— Сотрудник не находится на испытательном сроке или у него осталось 7 или меньше дней до окончания испытательного срока.
Последовательный алгоритм запроса для решения данной задачи будет выглядеть следующим образом:
1. Отбираем работающих сотрудников в анализируемой организации, используя регистр сведений «Текущие кадровые данные сотрудников»;
2. С помощью виртуальной таблицы Представления_КадровыеДанныеСотрудников механизма представлений получаем кадровые данные сотрудников, подобранных в п.1, и устанавливаем отбор на основной вид занятости;
3. Используя физические лица сотрудников подобранных ранее сотрудников отбираем сотрудников, работающих не в анализируемой организации, по регистру сведений «Текущие кадровые данные сотрудников»;
4. С помощью таблицы Представления_КадровыеДанныеСотрудников получаем информацию об количестве ставок внешних совместителей;
5. Получаем значение совокупного количества ставок методом объединения таблиц со ставками с основного места работы и с внешних совместительств, группируя по физическому лицу;
6. Выводим таблицу с кадровой информацией по основным сотрудникам, полученную в п.2, объединив её с таблицей со значениями совокупных ставок по физическим лицам;
7. Количество календарных дней до окончания испытательного срока вычисляем с помощью вкладки «Вычисляемые поля».
Вычисляемое поле на основе данных полей НаходитсяНаИспытательномСроке и ИспытательныйСрокДатаЗавершения выглядит следующим образом:
ВЫБОР
КОГДА НаходитсяНаИспытательномСроке ТОГДА
РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Период, "ДЕНЬ"),"СЕКУНДА", -1 ), ИспытательныйСрокДатаЗавершения, "ДЕНЬ")
ИНАЧЕ 0
КОНЕЦ
Создаем внешний отчет, схему компоновки данных, новый набора данных с типом – запрос. Помещаем запрос в запрос.
Рисунок 6. Схема компоновки данных внешнего отчета с подготовленным запросом
Настраиваем параметры, используемые в тексте запроса:
Рисунок 7. Настройка параметров «Период» и «Организация»
На вкладку «Вычисляемые поля» добавляем поле и устанавливаем для него выражение:
Рисунок 8. Вычисляемое поле «Количество дней до окончания испытательного срока»
Настраиваем структуру отчета, добавляем основные отборы:
Рисунок 9. Настройка основного варианта отчета
После завершения основных работ со схемой компоновки данных (далее СКД) закончены, самое время позаботится о том, чтобы типовой механизм представлений подменил запросы-заглушки в СКД. Для этого воспользуемся процедурой ЗаполнитьОбщиеИсточникиДанныхОтчета из общего модуля ЗарплатаКадрыОбщиеНаборыДанных.
Рисунок 10. Листинг процедуры инициализации отчета
Данная процедура рекурсивно проходит все наборы данных, указанных в СКД, и заменяет таблицы представлений. Внутренний код процедуры содержит обращения к таким процедурам, как ЗаполнитьОбщиеЗапросы или ЗаменитьПредставленияЗапросов. ЗаполнитьОбщиеЗапросы, например, заменяет обращения к представлениям с префиксом «ОбщиеЗапросы_» а процедура ЗаменитьПредставленияЗапросов работает с префиксом «ПРЕДСТАВЛЕНИЯ_».
При создании отчета, использующего типовую форму отчета ЗУП (Общие формы «ФормаОтчета»), используя экспортную процедуру «ОпределитьНастройкиФормы» в модуле объекта создаваемого отчета, можно указать события, которые буду вызываться из формы отчета. В данном случае, нам необходимо событие ПередЗагрузкойНастроекВКомпоновщик. Данное событие будет вызываться при открытии формы отчета.
Рисунок 11. Листинг определения события, вызываемого перед загрузкой настроек в компоновщик
В экспортную процедуру события с одноименным названием укажем процедуру инициализации отчета, которая была рассмотрена ранее (рис. 10).
Рисунок 12. Листинг процедуры события «Перед загрузкой настроек в компоновщик»
В итоге открываем отчет в режиме «Предприятие» и проверим результат.
Рисунок 13. Результат формирования отчета
Вывод
Данный механизм является удобным инструментом для универсального построения запросов на получение определенного набора данных. Для разработчиков, которые часто ведут разработку в ЗУП и хотят получить сертификат специалиста по конфигурации, этот инструмент желателен для освоения. В примерах экзаменационных билетов присутствует формулировки задач «Отчет должен быть реализован аналогично другим отчетам типовой конфигурации, с применением при необходимости генерируемых представлений («Представления_»)».
Автор: Егор В., разработчик 1С.