Механизм представлений: как он работает и как его расширять

08.07.25

Разработка - Механизмы типовых конфигураций

Каждый, кто работал с кадровыми отчетами в ЗУП, ERP или УХ, сталкивался с механизмом представлений – странным кодом запроса, где поля отображаются пустыми ссылками, а в названии временной таблицы есть слово «Представление». В статье разберем, что такое представления и как ими пользоваться. Больше не нужно ломать голову над тем, откуда и как правильно получать данные. Механизм представлений сделает это за вас.

Меня зовут Сергей Журавлев. Работаю в IT с 1995 года. Долгое время избегал 1С, но около 20 лет назад все же погрузился в эту экосистему. С 2007 года очень плотно занимаюсь решениями 1С:ЗУП, практически прошел все сертификации: «Профессионал», «Специалист», «Преподаватель ЦСО». Последние 10 лет углубленно работаю именно с ЗУП.

 

 

Механизм представлений впервые появился именно в ЗУП. Сейчас он распространился и присутствует в ERP, в Управлении Холдингом (УХ), возможно, уже и в других конфигурациях. Очень желательно его дальнейшее распространение. Это крайне интересная тема.

 

Описание механизма представлений

История ЗУП начиналась сразу с версии 2 (единицы не было). 1С:ЗУП 2.Х, с добавлением зарплатного контура, был относительно простым. В нем было немного регистров сведений (их даже можно было выучить наизуть) и практически не было регистров накопления. Все строилось на регистрах расчета. Весь расчет производился одним запросом. Разработчики точно знали, куда вставить подзапросы для получения рассчитываемых данных.

Но системы растут и усложняются. С выходом 1С:ЗУП 3.Х конфигурация стала гораздо сложнее. Добавились новые подсистемы. Добавилось множество новых регистров сведений, в том числе интервальные регистры сведений. Добавилось большое количество регистров накопления, создали сложный механизм расчета.

Чтобы всем этим пользоваться, не запутаться и не переписывать много раз при изменениях внутри, вендором (поставщиком) был придуман механизм представлений.

 

Суть механизма представлений
Механизм представлений – это некая API («черный ящик»). Мы что-то отправляем туда (входные данные), что-то получаем оттуда (результат на выходе).

 

 

Отправляем на вход СКД (Систему компоновки данных) с наборами данных типа «Запрос», с шаблонами в этом запросе и с параметрами самой СКД. Механизм представления это обрабатывает, разбирает по ключевым словам, преобразовывает каждый шаблон по-своему, создает запросы и помещает их в итоговый оптимизированный запрос. Дополнительно добавляет параметры в СКД, которые нужны для этих запросов.

 

Ключевые преимущества

Чем хорош этот механизм?

  1. С отчетами становится проще работать. Разработчик пишет отчеты гораздо быстрее.

  2. Нет необходимости задумываться, к какому регистру обращаться. Достаточно прописать шаблон.

  3. Запросы оптимизируются. В зависимости от того, какие данные нам нужны, запрос будет обращаться к разным регистрам сведений. То есть будет меняться сам возвращаемый запрос.

  4. Независимость от последующих изменений. Это главная причина, почему хотелось бы, чтобы он появился во всех типовых конфигурациях. Вендор любит переименовывать регистры или общие модули. Механизм представлений зашит как API: мы всегда отправляем одно и то же и всегда получаем актуальные данные, если что-то изменилось внутри. Нам не надо задумываться о том, что мы получим. Будем пользоваться тем, что хотим получить.

 

Структура шаблона представления

Разберем, как выглядит шаблон:

ВЫБРАТЬ РАЗЛИЧНЫЕ

Сотрудники.Ссылка КАК Сотрудник,

&Период КАК Период

ПОМЕСТИТЬ ВТСотрудники

ИЗ

Справочник.Сотрудники КАК Сотрудники

;

/////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ

ДАТАВРЕМЯ(1, 1, 1) КАК Период,

ЗНАЧЕНИЕ (Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,

ЗНАЧЕНИЕ (Справочник.ФизическиеЛица.ПустаяСсылка) КАК ФизическоеЛицо,

ЗНАЧЕНИЕ (Справочник.Организации.ПустаяСсылка) КАК Организация,

ЗНАЧЕНИЕ (Справочник.Должности.ПустаяСсылка) КАК Должность,

ДАТАВРЕМЯ(1, 1, 1) КАК ДатаУвольнения

ПОМЕСТИТЬ Представления_КадровыеДанныеСотрудников

ИЗ

ВТСотрудники КАК ВТСотрудники

ГДЕ

"ТолькоРазрешенные" = ИСТИНА

Это небольшая «пустышка», в которой мы что-то хотим получить, и в конечном итоге она вернет более сложный, продвинутый запрос. Далее будут представлены ключевые элементы шаблона.

Ключевые слова представлений (это самое главное). Например, «Представления_КадровыеДанныеСотрудников» – это то, на что реагирует сам механизм представлений. Он понимает, что этот кусочек кода – это шаблон, и что его надо преобразовать с помощью данного ключевого слова.

 

Виртуальная таблица источников параметров. В данном случае мы хотим получать кадровые данные для конкретных сотрудников на конкретный период времени. Для этого создаем временную таблицу и отправляем ее в шаблон. Не все шаблоны имеют такую таблицу: не всегда она нужна.

 

 

Параметры запроса шаблона. Очень интересный момент: это не параметр самого запроса. Это параметры формирования текста запроса. Тут указывается, как должен преобразоваться шаблон в итоговый запрос.

 

 

Далее рассмотрены параметры более подробно:

 

 

Например, есть ключевое слово «Представления_Периоды», у которого возможны 4 параметра. Когда эти параметры передаются дальше, они разбираются как текстовые. И если мы хотим впоследствии с ними что-то делать, то их нужно преобразовывать в нужный тип.

Получаемые поля итогового запроса. Это то, что мы хотим получить от механизма представлений. Например, для кадровых данных сотрудников: «Сотрудник», «ФизическоеЛицо», «Организация» и так далее. Этих параметров достаточно большое количество.

 

 

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

 

Оптимизация запросов

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

 

КадровыеДанныеСотрудников.

Пример применения: отчет «КадроваяИсторияСотрудников»

ВЫБРАТЬ РАЗЛИЧНЫЕ

ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КАК Организация,

ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка) КАК Должность

ИЗ

Представления_КадровыеДанныеСотрудников

ГДЕ

"ТолькоРазрешенные" = ИСТИНА

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

 

Результат применения:

ВЫБРАТЬ РАЗРЕШЕННЫЕ

***

РегистрСведений.Организация КАК Организация,

РегистрСведений.Должность КАК Должность,

***

ПОМЕСТИТЬ ПредставленияКадровыеДанныеСотрудников

ИЗ

ВТОтборовРазличныхСотрудников КАК ИзмеренияДаты

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК РегистрСведений

ПО ***

Будет возвращаться только «КадроваяИсторияСотрудниковИнтервальный КАК РегистрСведений». Оттуда будут браться только организации и должности. Другие регистры механизм представлений не затронет.

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

 

Пример шаблона:

ВЫБРАТЬ РАЗЛИЧНЫЕ

ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.ПустаяСсылка) КАК ВидЗанятости,

ЗНАЧЕНИЕ(Справочник.ГрафикиРаботыСотрудников.ПустаяСсылка) КАК ГрафикРаботы

ПОМЕСТИТЬ Представления_КадровыеДанныеСотрудников

ИЗ

ВТСотрудники КАК ВТСотрудники

ГДЕ

"ТолькоРазрешенные" = ИСТИНА

В итоге механизм представлений сформирует две временные таблицы (по кадровым данным и по виду занятости сотрудников), соединит их по сотрудникам и датам, а вернет только вид занятости и график. То есть происходит оптимизация под наши требования.

 

Результат применения

ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ

***

СведенияОВидахЗанятостиСотрудников.ВидЗанятости КАК ВидЗанятости,

СведенияОГрафикахРаботы.ГрафикРаботы КАК ГрафикРаботы

***

ПОМЕСТИТЬ ПредставленияКадровыеДанныеСотрудников

ИЗ

ВТОтборовРазличныхСотрудников КАК ТаблицаОтборов

ЛЕВОЕ СОЕДИНЕНИЕ ВТСведенияОВидахЗанятостиСотрудников КАК СведенияОВидахЗанятостиСотрудников

ПО ТаблицаОтборов.Сотрудник = СведенияОВидахЗанятостиСотрудников.Сотрудник

И ТаблицаОтборов.Период = СведенияОВидахЗанятостиСотрудников.Период

ЛЕВОЕ СОЕДИНЕНИЕ ВТСведенияОГрафикахРаботыДляКадровыхДанныхСотрудников КАК СведенияОГрафикахРаботы

ПО ТаблицаОтборов.Сотрудник = СведенияОГрафикахРаботы.Сотрудник

И ТаблицаОтборов.Период = СведенияОГрафикахРаботы.Период

 

Хитрости использования механизма

Теперь рассмотрим некоторые хитрости использования механизма, которые редко освещаются.

 

Кейс 1: Получение нескольких наборов данных из одного представления.

Например, можно получить два разных набора сотрудников в разные наборы кадровых данных. Для этого добавляем дополнительное слово через подчеркивание. Допустим:

«КадровыеДанныеСотрудников_Набор1», «КадровыеДанныеСотрудников_Набор2».

Также мы можем обращаться к каждой временной таблице (ВТСотрудники1, ВТСотрудники2): соединять с другими таблицами в отчетах и получать данные по ним в отдельности. Такой хитрый кейс случается достаточно часто.

 

КадровыеДанныеСотрудников.

Когда надо получить две таблицы по разным наборам сотрудников

ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ

ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,

ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КАК Организация,

ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка) КАК Должность,

ДАТАВРЕМЯ(1, 1, 1) КАК ДатаУвольнения

ПОМЕСТИТЬ Представления_КадровыеДанныеСотрудников_Набор1

ИЗ

ВТСотрудники1 КАК ВТСотрудники1;

/////////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ

ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,

ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КАК Организация,

ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка) КАК Должность,

ДАТАВРЕМЯ(1, 1, 1) КАК ДатаУвольнения

ПОМЕСТИТЬ Представления_КадровыеДанныеСотрудников_Набор2

ИЗ

ВТСотрудники2 КАК ВТСотрудники2;

 

Кейс 2: Предварительный отбор по организации.

Когда мы хотим получить кадровые данные, мы отправляем список сотрудников и возвращается все по ним. Но допустим, мы хотим по конкретным сотрудникам получить данные только из конкретной организации. В этом случае мы пишем в шаблоне условие: {ЛевоеЗначение} = {ПравоеЗначение}. Причем указываем, что «Организация» – это параметр СКД. В таком случае механизм преобразует это и вернет данные по конкретной организации (сотрудник, головная организация и т.д.).

 

Предварительный отбор по организации (подразделению, должности...)

ВЫБРАТЬ

&НачалоПериода КАК НачалоПериода,

&ОкончаниеПериода КАК ОкончаниеПериода

ПОМЕСТИТЬ ВТИзмеренияДатыДляНабораЗаписей;

/////////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ

ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,

ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КАК ГоловнаяОрганизация,

ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КАК Организация

ПОМЕСТИТЬ Представления_ТаблицаРегистра_КадроваяИсторияСотрудников

ИЗ

ВТИзмеренияДатыДляНабораЗаписей КАК ИзмеренияДатыДляНабораЗаписей

ГДЕ

"ТолькоРазрешенные" = ИСТИНА

И "ПараметрыПостроения_ВключатьЗаписиНаНачалоПериода" = ИСТИНА

И "ЛевоеЗначение" = "="

И "ПравоеЗначение" = &Организация;

 

Кейс 3: Управление отборами СКД.

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

Например, укажем «Организация КАК ТекущаяОрганизация». Это может работать не только с организацией, но и с подразделением, должностью и с чем угодно. В результате для систем компоновки данных в фигурных скобках организации присвоится синоним «ТекущаяОрганизация». И когда менеджер компоновки данных будет обрабатывать этот запрос, он не увидит поля «Организация» и не применит к нему отбор, который добавлен в режиме пользователя.

 

Когда не надо делать отбор по организации (подразделению, должности...)

ВЫБРАТЬ

ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КАК Организация,

ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,

ВЫРАЗИТЬ(0 КАК ЧИСЛО(5, 2)) КАК КоличествоСтавок

ПОМЕСТИТЬ Представления_СрезПоследних_КадроваяИсторияСотрудников

ИЗ

ВТИзмеренияДатыДляСрезаПоследних КАК ИзмеренияДатыДляСрезаПоследних

ГДЕ

"ТолькоРазрешенные" = ИСТИНА

И "ПсевдонимыПолейСКД" = "Организация КАК ТекущаяОрганизация";

ВЫБРАТЬ РАЗРЕШЕННЫЕ

РегистрСведений.Сотрудник КАК Сотрудник,

РегистрСведений.Организация КАК Организация,

РегистрСведений.КоличествоСтавок КАК КоличествоСтавок

ПОМЕСТИТЬ ПредставленияТаблицаРегистра_КадроваяИсторияСотрудников

{ВЫБРАТЬ

Сотрудник,

Организация КАК ТекущаяОрганизация,

КоличествоСтавок

}

ИЗ

ВТИзмеренияДатыДляТаблицыРегистра КАК ИзмеренияДаты

ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудниковИнтервальный

ПО ИзмеренияДаты.Сотрудник = РегистрСведений.Сотрудник;

 

Кейс 4. Получение регистраторов.

Допустим, мы получаем данные «Представления_ПлановыеУдержанияСотрудников». Регистраторы – достаточно сложный составной тип данных. Регистраторов много. Если мы хотим получить только конкретные регистраторы (например, «ИсполнительныйЛист» и «ПостоянноеУдержаниеВПользуТретьихЛиц»), то мы должны указать их явно через «ОБЪЕДИНИТЬ ВСЕ». Если же нужны все регистраторы, то не делаем это объединение, а пишем «НЕОПРЕДЕЛЕНО КАК Регистратор». Тогда он обработает абсолютно все типы.

 

Получение регистраторов

ВЫБРАТЬ

ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,

ЗНАЧЕНИЕ(ПланВидовРасчета.Удержания.ПустаяСсылка) КАК Удержание,

ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) КАК Контрагент,

0 КАК Значение,

0 КАК Предел,

ЗНАЧЕНИЕ(Документ.ИсполнительныйЛист.ПустаяСсылка) КАК Регистратор

ПОМЕСТИТЬ Представления_ПлановыеУдержанияСотрудников

ИЗ

ВТСотрудники КАК ВТСотрудники

ГДЕ

"ТолькоРазрешенные" = ИСТИНА

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ

NULL,

NULL,

NULL,

NULL,

NULL,

ЗНАЧЕНИЕ(Документ.ПостоянноеУдержаниеВПользуТретьихЛиц.ПустаяСсылка)

 

Интеграция в отчеты (СКД)

Как использовать механизм представлений в отчетах? Основная функция – «ЗаполнитьОбщиеИсточникиДанныхОтчета». Она лежит в общем модуле «ЗарплатаКадрыОбщиеНаборыДанных». В простом случае мы можем вызвать ее в обработчике «ПриКомпоновкеРезультата» (то есть когда пользователь нажимает «Сформировать»). Тогда функция преобразует запрос, оптимизирует его, подставит и будет формировать отчетность.

Процедура ПриКомпоновкеРезультата (ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбшиеИсточникиДанныхОтчета(ЭтотОбъект);

НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();

МакетКомпоновки = МакетКомпоновкиДанных(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);

// Создадим и инициализируем процессор компоновки.

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;

ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

// Обозначим начало вывода

ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);

КонецПроцедуры

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

#Область ОписаниеПеременных

Перем ОтчетИнициализирован;

#КонецОбласти

#Область ОбработчикиСобытий

Процедура ПриКомпоновкеРезультата (ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура ИнициализироватьОтчет() Экспорт

Если Не ОтчетИнициализирован Тогда

ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбшиеИсточникиДанныхОтчета(ЭтотОбъект);

КонецЕсли;

КонецПроцедуры

Процедура ПередЗагрузкойНастроекВКомпоновщик (Контекст, КлючСхемы, КлючВарианта, НовыеПользовательскиеНастройкиКД) Экспорт

Если КлючСхемы <> "СхемаИнициализирована" Тогда

ИнициализироватьОтчет();

КлючСхемы = "СхемаИнициализирована";

КонецЕсли;

КонецПроцедуры

#КонецОбласти

#Область Инициализация

ОтчетИнициализирован = Ложь;

#КонецОбласти

Разберем функцию подробнее. Какие у нее есть параметры?

// Обрабатывает СКД отчетов в части общих источников данных, описанных в СКД

// См. например в текстах запросов СКД

// ВЫБРАТЬ ... ИЗ Представления_КадровыеДанныеСотрудников.

//

// Параметры:

// Объект - отчет

// ДополнительныеПоляПредставлений - Структура - где ключи - имена

// представлений запросов, значения - массив с описанием дополнительных

// полей. (пример см. в отчете АнализНачисленийИУдержаний)

//

Процедура ЗаполнитьОбщиеИсточникиДанныхОтчета (

Объект,

ДополнительныеПоляПредставлений = Неопределено,

ТолькоРазрешенные = Истина

) Экспорт

Объект: туда мы отправляем отчет. Функция возьмет отчет, выдернет оттуда схему компоновки данных, возьмет наборы, переберет их все, посмотрит во всех наборах шаблоны, эти шаблоны преобразует, добавит параметры и так далее.

ДополнительныеПоляПредставлений: тут лежит структура, где ключи – это имена ключевых слов представлений, а в значениях этой структуры массив с описанием дополнительных полей. Но на самом деле, если посмотрим отчет «АнализНачисленийУдержаний», который использует этот параметр, то увидим, что это не массив. Там лежит таблица значений с данными. В этой таблице лежат еще какие-то поля, которые мы хотим получить. То есть в шаблоне прописаны поля, которые нам нужны в результате (сотрудник, организация и т.д.). Но, допустим, мы хотим еще что-то получить, чтобы потом использовать для отбора или предварительных расчетов. В таком случае в этой таблице нужно прописать, какие поля добавить, их синонимы и т.д. Как пользоваться, как формировать такую таблицу, можно посмотреть в отчете «АнализНачисленийУдержаний».

Недостатки механизма

Конечно, у механизма есть и минусы:

  1. Нужно запомнить: какие поля хотим получить, как формировать шаблоны, как они должны выглядеть, какие там могут быть параметры.

  2. Отладка механизма представлений. В конечном итоге из шаблонов должен получиться какой-то запрос. Если что-то с ним не так, его нужно отладить. В этом помогает вендор.

Формирование и отладка

На ИТС есть обработка «Представления используемые в запросах наборов данных СКД отчетов»:

 

 

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

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

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

 

Возможности расширения

Когда мы пишем отчеты, бывают постоянно повторяющиеся фрагменты кода запроса. У меня был кейс: мне постоянно нужна была иерархия подразделений для разных отчетов. Я сначала из отчета в отчет этот код копировал. И когда плотно разобрался с механизмом представлений, понял, что могу этот фрагмент кода встроить в механизм представлений.

Чтобы использовать механизм представлений для своих нужд, нужно ответить на вопросы:

  • Нужны ли параметры отчета? (Параметры, которые есть в СКД)

В моем случае они были не нужны.

  • Нужны ли параметры запроса?

Да, мне они были нужны. Я делал уровень вложенности. Указываю, что максимальный уровень 9, допустимы только разрешенные.

  • Нужна ли таблица отборов запроса?

Мне она была нужна. Нужно было по определенным подразделениям получать их иерархию.

  • Придумать ключевое слово.

«Представления_ИерархияПодразделений».

/////////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ

ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) КАК Уровень,

ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) КАК Подразделение

ПОМЕСТИТЬ Представления_ИерархияПодразделений

ИЗ

ВТВсяКадроваяИстория КАК ВТВсяКадроваяИстория

ГДЕ

"ТолькоРазрешенные" = ИСТИНА

И "Уровень" = 9

;

/////////////////////////////////////////////////////////////////////////////////////
  • Отладить запрос полностью.

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

ЗарплатаКадрыОбщиеНаборыДанныхРасширенный.ПолучитьЗапросПоПредставлению

Функция ПолучитьЗапросПоПредставлению(ТекстЗапроса, СоответствиеПараметров) Экспорт

Запрос = Неопределено;

ПозицияСловаПоместить = СтрНайти(ВРег(ТекстЗапроса), "ПОМЕСТИТЬ ");

ИмяИсточникаДанных = ЗарплатаКадрыОбщиеНаборыДанных.ПервоеСловоНачинаяСПозицииВТексте(ТекстЗапроса, ПозицияСловаПоместить + СтрДлина("ПОМЕСТИТЬ "));

МассивПодстрокИменеИсточникаДанных = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИмяИсточникаДанных, "_");

ИмяВременнойТаблицы = МассивПодстрокИменеИсточникаДанных[0];

ИмяПредставления = МассивПодстрокИменеИсточникаДанных[1];

Если МассивПодстрокИменеИсточникаДанных.Количество() > 2 Тогда

ИмяПараметра = МассивПодстрокИменеИсточникаДанных[2];

Иначе

ИмяПараметра = Неопределено;

КонецЕсли;

МассивИменВТИсточниковПараметров = ЗарплатаКадрыОбщиеНаборыДанных.МассивИменВТИсточниковПараметров(ТекстЗапроса, ИмяИсточникаДанных);

ПараметрыЗапроса = ЗарплатаКадрыОбщиеНаборыДанных.ПараметрыЗапроса(ТекстЗапроса, ИмяИсточникаДанных);

ПредставлениеТолькоРазрешенные = ЗарплатаКадрыОбщиеНаборыДанных.ПараметрЗапроса("ТолькоРазрешенные", ПараметрыЗапроса);

ТолькоРазрешенные = ВРег(ПредставлениеТолькоРазрешенные) = "ИСТИНА";

Если ВРег(ИмяПредставления) = ВРег("ШтатноеРасписание") Тогда

ПредставлениеВключатьНачисления = ЗарплатаКадрыОбщиеНаборыДанных.ПараметрЗапроса("ВключатьНачисления", ПараметрыЗапроса);

НеВключатьНачисления = ВРег(ПредставлениеВключатьНачисления) = "ЛОЖЬ";

ДатаАктуальности = ЗарплатаКадрыОбщиеНаборыДанных.ПараметрЗапроса("ДатаАктуальности", ПараметрыЗапроса);

Если МассивИменВТИсточниковПараметров.Количество() > 0 Тогда

ИмяВТИсточникДанных = МассивИменВТИсточниковПараметров[0];

Иначе

ИмяВТИсточникДанных = "";

КонецЕсли;

КоллекцияПолей = ЗарплатаКадрыОбщиеНаборыДанных.МассивПолейЗапроса(Лев(ТекстЗапроса, ПозицияСловаПоместить - 1));

Запрос = УправлениеШтатныеРасписанием.ЗапросПредставленияШтатноеРасписание(ТолькоРазрешенные, ДатаАктуальности, КоллекцияПолей, ИмяИсточникаДанных,

НЕ НеВключатьНачисления, ИмяВТИсточникДанных);

ИначеЕсли ВРег(ИмяПредставления) = ВРег("ИерархияПодразделений") Тогда

Запрос = МОЙ_ОбъектНазначенияСервер.ЗапросПредставленияИерархияПодразделений(МассивИменВТИсточниковПараметров, ПараметрыЗапроса, ТолькоРазрешенные);

КонецЕсли;

КонецФункции

Приходят параметры запросов. Например, параметр «Уровень» со значением «9». Его приходится преобразовывать из строки в числовой вид. Потом смотрим «МассивИменВТИсточниковПараметров». В данном случае там лежит вся кадровая история, а именно все подразделения.

 

 

Как выглядит функция формирования запроса:

Функция ЗапросПредставленияИерархииПодразделений (

МассивИменВТИсточниковПараметров,

ПараметрыЗапроса,

ТолькоРазрешенные) Экспорт

УровеньЗапроса = Число(ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(

ПараметрыЗапроса, "Уровень", "0"));

Если МассивИменВТИсточниковПараметров.Количество() Тогда

ИмяТабОграничений = МассивИменВТИсточниковПараметров[0];

Иначе

ИмяТабОграничений = "";

КонецЕсли;

ТекстЗапроса = ТекстЗапросаИерархииПодразделений(

УровеньЗапроса, ТолькоРазрешенные, ИмяТабОграничений);

Запрос = Новый Запрос(ТекстЗапроса);

МаксУровень = ГлубинаИерархииПодразделенийОрганизаций();

Запрос.УстановитьПараметр("МаксУровеньИерархииПодразделений", МаксУровень);

Возврат Запрос;

КонецФункции

Здесь мы видим функцию с параметрами. Мы их обрабатываем: из «МассивИменВТИсточниковПараметров» получаем имя таблицы ограничений. Из параметров запроса – уровень иерархии. Создаем новый запрос, добавляем параметр и возвращаем: самое главное – не просто текст запроса, а именно объект «Запрос». Это нужно, чтобы получить еще и параметры этого запроса и добавить их в исходную СКД. Дальше этот запрос будет вставляться в нужное место. Точно так же, как это делает сам вендор в своих представлениях. Это занимает буквально три строчки кода.

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

ВЫБРАТЬ РАЗЛИЧНЫЕ

ПодчиненностьПодразделенийОрганизаций.Подразделение КАК Подразделение,

2 - КОЛИЧЕСТВО (ПодчиненностьПодразделенийОрганизаций.ВышестоящееПодразделение) КАК Уровень

ПОМЕСТИТЬ ВТУровни

ИЗ

РегистрСведений.ПодчиненностьПодразделенийОрганизаций КАК ПодчиненностьПодразделенийОрганизаций

СГРУППИРОВАТЬ ПО

ПодчиненностьПодразделенийОрганизаций.Подразделение

;

/////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНОЕ

ПодчиненностьПодразделенийОрганизаций.Подразделение КАК Подразделение,

МАКСИМУМ (ВЫБОР

КОГДА ВТУровни.Уровень = 0

ТОГДА ВТУровни.Подразделение

ИНАЧЕ ЗНАЧЕНИЕ (Справочник.ПодразделенияОрганизаций.ПустаяСсылка)

КОНЕЦ) КАК Уровень1,

МАКСИМУМ (ВЫБОР

КОГДА ВТУровни.Уровень = 1

ТОГДА ВТУровни.Подразделение

ИНАЧЕ ЗНАЧЕНИЕ (Справочник.ПодразделенияОрганизаций.ПустаяСсылка)

КОНЕЦ) КАК Уровень2

ПОМЕСТИТЬ Представления_ИерархияПодразделений

ИЗ

РегистрСведений.ПодчиненностьПодразделенийОрганизаций КАК ПодчиненностьПодразделенийОрганизаций

ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТУровни КАК ВТУровни

ПО ПодчиненностьПодразделенийОрганизаций.ВышестоящееПодразделение = ВТУровни.Подразделение

ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТВсяКадроваяИстория КАК ВТВсяКадроваяИстория

ПО ПодчиненностьПодразделенийОрганизаций.Подразделение = ВТВсяКадроваяИстория.Подразделение

СГРУППИРОВАТЬ ПО

ПодчиненностьПодразделенийОрганизаций.Подразделение

ИНДЕКСИРОВАТЬ ПО

Подразделение

;

///////////////////////////////////////////////////

УНИЧТОЖИТЬ ВТУровни

 

*************

Статья написана по итогам доклада (видео), прочитанного на конференции INFOSTART TECH EVENT.

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Механизмы типовых конфигураций Программист Стажер 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Бесплатно (free)

В типовых решениях типа УТ, КА, ERP при вводе строк в поля ввода осуществляется поиск по первым символам. С помощью небольшой доработки (делается через расширение) можно организовать поиск по вхождению.

02.06.2025    539    lkey    0    

5

Работа с интерфейсом БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Программист 1С v8.3 1C:ERP Бесплатно (free)

В этой статье я расскажу, как в конфигурации 1С:ERP 2.5 при начале работы системы настроить открытие своих нетиповых форм (в том числе и из внешних обработок). Данную методику можно использовать как на тонком клиенте, так и на мобильном или веб-клиенте, а также в мобильном приложении.

12.05.2025    2265    PROSTO-1C    1    

15

Механизмы типовых конфигураций Программист 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

В этой статье расскажу, как можно добавлять свои отборы в типовую обработку формирования заказов по потребностям с минимальными доработками.

27.02.2025    964    PROSTO-1C    1    

6

Механизмы типовых конфигураций HighLoad оптимизация Программист 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бухгалтерский учет Бесплатно (free)

Пример популярной пользовательской настройки плана счетов. К чему это может привести, почему «всё тормозит» и как это поправить.

18.02.2025    3633    pbelousov    10    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. bulpi 217 08.07.25 21:01 Сейчас в теме
Этот механизм - просто "белый флаг", который выкинула компания 1с , признав, что конфигурации ЗУП стали слишком сложными для нормальной правки и доработки.
2. tormozit 7290 09.07.25 00:27 Сейчас в теме
Отформатируйте код в статье.
Оставьте свое сообщение