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

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    628    lkey    0    

5

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

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

12.05.2025    2527    PROSTO-1C    1    

16

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

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

27.02.2025    1087    PROSTO-1C    1    

6

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

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

18.02.2025    3726    pbelousov    10    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. bulpi 217 08.07.25 21:01 Сейчас в теме
Этот механизм - просто "белый флаг", который выкинула компания 1с , признав, что конфигурации ЗУП стали слишком сложными для нормальной правки и доработки.
qwinter; sys1c; zqzq; RustIG; +4 Ответить
2. tormozit 7294 09.07.25 00:27 Сейчас в теме
Отформатируйте код в статье.
23. tormozit 7294 09.07.25 14:30 Сейчас в теме
(2) Код отформатировали. Теперь еще бы воздух местами откачать
Прикрепленные файлы:
4. zup_dev 61 09.07.25 05:10 Сейчас в теме
(1) А почему белый флаг для ЗУП а не платформы?
В этом механизме просто попытка разработчиков ЗУП инкапсулировать логику запросов, что бы не копипастить те же особенности интервальных регистров в каждом запросе.

P.S. Касаемо ЗУП и возможностей платформы.
Самая простая задача, получить всех сотрудников работающих в заданном подразделении на заданную дату, типовыми средствами платформы, не имеет оптимального решения. Вот в т.ч. отсюда и вырастает вся сложность ЗУП, вместе с интервальным регистрами и т.п.
TODD22; zqzq; +2 1 Ответить
5. RustIG 1886 09.07.25 07:20 Сейчас в теме
(4)
Самая простая задача, получить всех сотрудников работающих в заданном подразделении на заданную дату, типовыми средствами платформы, не имеет оптимального решения.

Я, думаю, имеет. Если бы за решение давали "нобелевскую" премию, я бы поучаствовал.
7. zup_dev 61 09.07.25 07:53 Сейчас в теме
(5) Ну если поиск этого решения требует серьезного исследования, то оно скорее всего будет не тривиальным и не интуитивным (в целом разработчики ЗУП нашли такое решение в виде "интервальных" регистров, которые в т.ч. и делают ЗУП "слишком сложным").

Но если посмотреть на "каноническое" решение для моделирования кадровой истории - это периодический регистр сведений. И если мы будем использовать его из коробки, то мы получим примерно такой запрос:
ВЫБРАТЬ
	КадроваяИсторияСотрудниковСрезПоследних.Сотрудник КАК Сотрудник
ИЗ
	РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&ДатаСреза, ) КАК КадроваяИсторияСотрудниковСрезПоследних
ГДЕ
	КадроваяИсторияСотрудниковСрезПоследних.Подразделение = &Подразделение


И если посмотреть во что транслируется запрос среза последних,
ВЫБРАТЬ
	КадроваяИсторияСотрудников.Сотрудник КАК Сотрудник
ИЗ
	(ВЫБРАТЬ
		МАКСИМУМ(КадроваяИсторияСотрудников.Период) КАК Период,
		КадроваяИсторияСотрудников.Сотрудник КАК Сотрудник
	ИЗ
		РегистрСведений.КадроваяИсторияСотрудников КАК КадроваяИсторияСотрудников
	ГДЕ
		КадроваяИсторияСотрудников.Период <= &Период
	
	СГРУППИРОВАТЬ ПО
		КадроваяИсторияСотрудников.Сотрудник) КАК ПериодыСреза
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудников КАК КадроваяИсторияСотрудников
		ПО (ПериодыСреза.Период = КадроваяИсторияСотрудников.Период)
			И (ПериодыСреза.Сотрудник = ПериодыСреза.Сотрудник)
ГДЕ
	КадроваяИсторияСотрудников.Подразделение = &Подразделение
Показать

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

И это только один, довольно простой пример, показывающий откуда вырастает сложность ЗУП
12. RustIG 1886 09.07.25 09:54 Сейчас в теме
(7)
Ну если поиск этого решения требует серьезного исследования, то оно скорее всего будет не тривиальным и не интуитивным

на ИС много не тривиальных и не интуитивных решений. это и есть мир 1С.
14. zup_dev 61 09.07.25 10:04 Сейчас в теме
(12)
это и есть мир 1С

Ну я примерно тоже самое и хотел сказать автору первого коммента, что реализация таких сложных и не тривиальных механизмов на уровне ЗУП, это скорее не "белый флаг" ЗУП, а "белый флаг" платформы, т.к. она не дает инструментов для элегантного и интуитивного решения всех этих задач.

В свое время регистры с виртуальными таблицами были современным решением, упрощающими разработку.
Но к сожалению за следующие 20+ лет, модель данных в платформе практически не развивалась
15. Dimel 09.07.25 11:42 Сейчас в теме
(14)
В свое время регистры с виртуальными таблицами были современным решением, упрощающими разработку.
Но к сожалению за следующие 20+ лет, модель данных в платформе практически не развивалась


Ну да, сначала отказались от платформенных перерасчетов, потом от использования виртуальной таблицы База<ИмяРегистра>. (потому что не смогли решить возникающие проблемы на уровне платформы). Поэтому сейчас ЗУП одна из самых сложных программ в доработке.
А по тексту доклада, Денис Липатов все это описывал ещё лет 7 назад более подробно...
19. zup_dev 61 09.07.25 12:43 Сейчас в теме
(15)
Ну да, сначала отказались от платформенных перерасчетов, потом от использования виртуальной таблицы База<ИмяРегистра>. (потому что не смогли решить возникающие проблемы на уровне платформы).


Тут вопрос, а должны ли были решать эти проблемы в платформе?

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

Поэтому сейчас ЗУП одна из самых сложных программ в доработке.

Вы считаете что если бы расчет базы и механизм перерасчетов остались бы теми, что реализованы в платформе (пусть даже их бы как то доработали), это упростило бы доработку ЗУП?
На мой взгляд, это бы практически ни чего не упростило. А регистр расчета стал бы еще более монструозным, в т.ч. в ущерб производительности.
20. Dimel 09.07.25 13:17 Сейчас в теме
(19) Я всего лишь хотел сказать, что все больше функционала, который раньше использовал ресурсы платформы теперь реализуется через программный интерфейс и без того усложняя непростую разработку в этой конфигурации...
27. bulpi 217 09.07.25 16:16 Сейчас в теме
(7) Ну... будет медленно, сделай индекс по полю Подразделение.
Да хоть без индекса. Запрос посчитает на 1,5 секунды дольше, чем при использовании идиотских регистров ЗУП. А затраты времени на разработку и сопровождение конфигурации в СОТНИ ! раз меньше.
Горе от ума.
28. zup_dev 61 09.07.25 17:05 Сейчас в теме
(27)
ВЫБРАТЬ
    КадроваяИсторияСотрудников.Сотрудник КАК Сотрудник
ИЗ
    (ВЫБРАТЬ
        МАКСИМУМ(КадроваяИсторияСотрудников.Период) КАК Период,
        КадроваяИсторияСотрудников.Сотрудник КАК Сотрудник
    ИЗ
        РегистрСведений.КадроваяИсторияСотрудников КАК КадроваяИсторияСотрудников
    ГДЕ
        КадроваяИсторияСотрудников.Период <= &Период
    
    СГРУППИРОВАТЬ ПО
        КадроваяИсторияСотрудников.Сотрудник) КАК ПериодыСреза
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудников КАК КадроваяИсторияСотрудников
        ПО (ПериодыСреза.Период = КадроваяИсторияСотрудников.Период)
            И (ПериодыСреза.Сотрудник = КадроваяИсторияСотрудников.Сотрудник)
ГДЕ
    КадроваяИсторияСотрудников.Подразделение = &Подразделение
Показать


А вы уверены что этот запрос будет использовать индекс по подразделению, причем и на MSSQL и на Postgres?
1C вообще рекомендует не использовать соединение с вложенными запросами (хотя спорная рекомендация).
А если вынести подзапрос во временную таблицу, то это гарантированный скан получим.
А если записей в регистре сотни тысяч? Это уже не полторы секунды будет.

А затраты времени на разработку и сопровождение конфигурации в СОТНИ !

А Вы не допускаете что ЗУП покрывает потребностей кратно больше чем в Ваше решение?

чем при использовании идиотских регистров ЗУП

Ну сделайте регистры лучше, приведите метрики, напишите статью. Люди будут вам благодарны.
А так, звучит как просто грубость
44. NeLenin 14 16.07.25 10:45 Сейчас в теме
(28)
1C вообще рекомендует не использовать соединение с вложенными запросами (хотя спорная рекомендация).


По мне, так хорошая рекомендация. На моей практике MS SQL плохо распараллеливает запросы с вложенными запросами
41. triviumfan 102 14.07.25 09:51 Сейчас в теме
(7)
то видно что мы получим скан всей таблицы кадровой истории, хотя в подразделении может работать, всего несколько из десятков тысяч сотрудников.

Что за платформа и субд? Давно такого уже не видел.
21. RustIG 1886 09.07.25 14:04 Сейчас в теме
(4)
вместе с интервальным регистрами

такого понятия нет в 1С.
кто-то сказал однажды, потом пошло-поехало.
ну ладно, пусть будет, только не забывайте - что "интервальные регистры" это полумера и как все в этой жизни временно.
я не считаю, что представления ЗУП и разработка интервальных регистров - лучший или единственный вариант.
карточный домик кто-то начал выстраивать...остальные просто пользуются этими донастройками, пытаются оптимизировать настройки настроек вместо того, чтобы создать свой регистр (регистр сведений, регистр расчетов), написать обработки его заполнения, и доработать отчеты....
возможно, кто -то уже сделал, но мне не докладывали :)
я в тему ЗУП погружался давно, когда еще Пересчеты использовались, сейчас Пересчеты не используются.
мнение выражаю свое , опираюсь на свою интуицию, которой уже доверяю больше, чем многим нынешним докладчикам.
и вам желаю иметь собственное мнение и критическое мышление....
а то сейчас новички в 1с набегут, и будут потом ссылаться на "интервальные регистры" как на источник в последней инстанции... за 20 лет на ИС столько народу мигрирует....олдскул уходят, новички приходят....
24. zup_dev 61 09.07.25 15:10 Сейчас в теме
(21)
такого понятия нет в 1С.

Среди разработчиков ЗУП это вполне устоявшийся термин.

я не считаю, что представления ЗУП и разработка интервальных регистров - лучший или единственный вариант.

По "представлениям" соглашусь. У меня, например, другой взгляд на то как это должно выглядеть и в языке запросов платформы и на уровне метаданных (свои "фантазии" на эту тему я описал здесь https://infostart.ru/1c/tools/2388804/)

А по поводу интервальных регистров, иметь для записи кадровой истории не только поле Период с которого она действует, но всегда заполненную ДатаОкончания, это очень удобно для чтения и вполне естественно. Это довольно интуитивное решение, которое используется не только в 1С. То же получение "среза последних" значительно упрощается.

и вам желаю иметь собственное мнение и критическое мышление....

И про регистр расчета и про "интервальные" регистры я как раз выражаю именно свое мнение.
22. RustIG 1886 09.07.25 14:17 Сейчас в теме
(4)
Чтобы всем этим пользоваться, не запутаться и не переписывать много раз при изменениях внутри, вендором (поставщиком) был придуман механизм представлений.

Вот это вот плохая постановка задачи.
Такой незаметный переход между тем, что было, и тем , что имеем.
26. bulpi 217 09.07.25 16:02 Сейчас в теме
(4) ?????????
Я писал свою конфигурацию по расчету ЗП. "Самая простая задача" решалась элементарно. Так что платформа тут не при чем.
Вот поэтому белый флаг для ЗУП а не платформы.
39. Dragonim 144 11.07.25 10:11 Сейчас в теме
(4) Как часто в текущем ЗУП используются зарплатные механизмы самой платформы, которые так любят спрашивать на экзамене Специалист по платформе?
40. zup_dev 61 14.07.25 03:26 Сейчас в теме
(39)
,По сути из возможностей регистра расчета сейчас используется только механизм выяснений. И это очень полезная вещь.
От виртуальных таблиц ДанныеГрафика и База отказались. И это не из за того что платформа плохая или ЗУП плохой. За счёт этого появилось много полезных фич.. Например возможность указывать несколько видов времени в виде расчета, или выполнять расчет базовых начислений в документов разовых начислений (Премия и т.п.).
И по производительности то же вышел прирост.
18. booksfill 09.07.25 12:24 Сейчас в теме
(1) Это скорее, расписка в том, что конкретные разработчики ЗУП не умеют в API.
Вот просто по каждому пункту, например:

"Последовательный и интуитивно понятный дизайн" - даже рядом не стоял;

"Выбор подходящих форматов данных для обмена данными" - действительно, что может быть понятней, чем "язык" запросов - шаблонов с магическими заклинаниями.

"Оптимизация API для производительности и масштабируемости" - особенно для производительности, когда даже не понимаешь из каких объектов базы данных это все будет тащиться.

Вишенка на торте - надо сдавать отчет, а сотрудник N туда не попадает/попадает.
Тут или найти консультанта за много денег с непредсказуемым результатом и сроком, зато дорого.

Или напрячь программиста.
Последний с помощью отладчика, профайлера и какой-то матери найдет в чем дело. Часов так за 6.
При том, что в конфигурации здорового человека все тоже самое (даже если там применены извращения вроде формируемых в 20 местах виртуальных таблиц) сделает за пол-часа.

P.S. Хорошая задача для проверки реальной нужности AI. Если он сможет в ЗУП объяснить не только как работает, но и почему не работает, как ожидается - будет супер.
Spacer; user1832003; bulpi; +3 Ответить
30. dehro 12 10.07.25 07:11 Сейчас в теме
(1) Ну да, ну да. Ездить нужно на ВАЗ-2101, там на обочине можно ремонт любой сложности провести.
А то наплодили: двигатели с наддувами, коробки автомат, управляются компьютером. Белый флаг автопроизводители выкинули.
32. bulpi 217 10.07.25 12:19 Сейчас в теме
(30) В этом спиче ключевое слово "ездить". Если ВАЗ-2101 едет, а вот это вот все не едет, то да, ВАЗ лучше.
Продолжаю аналогию : Вот это вот все , что не едет, Вы привозите на СТО. Там говорят : сделать можно, за двойную стоимость покупки автомобиля. И так каждый месяц. И оно все равно плохо едет.
33. zup_dev 61 10.07.25 12:36 Сейчас в теме
(32)
ЗУП вполне себе едет. Причем в компаниях уровня от "ларька" до компаний с 50 тыс. сотрудниками и больше.
Причем в крупных он едет в том числе благодаря "идиотским" (ваши слова) интервальным регистрам (погуглите temporal tables, то же видимо "идиотские" таблицы включенные в стандарт SQL 2011 ), менеджерам расчета и т.п.

Если уж приводить аналогии с автомобилями, может прежде садится за руль, руководство по эксплуатации почитать стоило?
35. user1832003 60 11.07.25 04:44 Сейчас в теме
(33) в руководстве по эксплутации описан опыт пользоавтеля, а не инженера. Иными словами водитель - пользоавтель. Программист - инженер.

допустим тебе надо прочитать в машине почему чек горит. В машине это выглядит так
1) подключаешь любое устройство дл чтения
2) оно выводит ошибку
3) ищешь описание ошибки где угодно
4) ???
5) профит

В этом чудо костыле это выглядит так
1) устройства чтения нет. Его надо создать самому.
2) пытаешься создать, описания нигде нет, кроме как обратиться к разработчику напрямую или залезть в код
3) %потрачено куча времени%
4а) читаешь ошибку (условный отчет график работы сотрудника)
5а) ???
6а) профит
4б) ничего не получается, т.к. поиск по коду не принес желаемых результатов
5б) ???
6б) не профит

лучше б бы они вместо этого костыля сделали аналог ОбщегоНазначения.ЗначенияСвойствОбъекта, когда колонки собираются динамически. По факту сейчас есть 2 процедуры с деревом из кучи
ИначеЕсли Представление = "Представление_ИмяПредставления" Тогда
с откровенно дырявым вариантом передачи параметров. Было бы проще если это было тупо 10 таких же функций с КОНСТРУКТОРОМ параметров и нужным результатом, как это сделано в ДлительныеОперации или как это сделано в бесшовке в до и еще много где.

Здесь же вся проблема только в том, что в команде зупа есть упоротый (не ошибка) тип, который толкает методологию "любая дичь в запросах, даже если для этого потребуется написать 100+ запросов в вт, а пост обработкой вопрос решается в 2 строки"
bulpi; qwinter; Spacer; bolikov; +4 Ответить
36. zup_dev 61 11.07.25 07:35 Сейчас в теме
(35)
Ну то что есть огромная проблема с отсутствием документации по механизмам, тут сложно поспорить.

лучше б бы они вместо этого костыля сделали аналог ОбщегоНазначения.ЗначенияСвойствОбъекта, когда колонки собираются динамически. По факту сейчас есть 2 процедуры с деревом из кучи

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

даже если для этого потребуется написать 100+ запросов в вт, а пост обработкой вопрос решается в 2 строки"

А можете пример привести. Я вот смотрю в код обработок МенеджерРасчетаЗарплаты, РасчетБазыНачисленийУдержаний, там нет запросов с 100+ ВТ, а почти все делается кодом.
А это по сути ключевые механизмы ЗУП.

В этом чудо костыле это выглядит так
1) устройства чтения нет. Его надо создать самому.
2) пытаешься создать, описания нигде нет, кроме как обратиться к разработчику напрямую или залезть в код

https://infostart.ru/1c/tools/2388804/ - ну я себе жизнь упростил этим инструментом
- Набиваю запрос в конструкторе (там есть таблицы для большинства представлений ЗУП)
- Отлаживаю пакет запросов в консоли
- Генерирую готовый код
...
- profit.

Казалось бы, проще не куда.

Это значительно быстрее, чем если бы я искал, условно в какой из сотен таблиц, хранятся нужные данные сотрудника
37. user1832003 60 11.07.25 08:01 Сейчас в теме
(36)
А можете пример привести. Я вот смотрю в код обработок МенеджерРасчетаЗарплаты, РасчетБазыНачисленийУдержаний, там нет запросов с 100+ ВТ, а почти все делается кодом.

Да легко. Заполнение карточки воинского учета. Там перед заполнением 130+ запросов из разряда шляпы. Буквально в январе сидел с этой шляпой отвечая на тупые вопросы пользователей.

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

связанные. У них там все отчеты формируются путем В
Процедура ПриКомпановкиРезультата()  СтандартнаяОбработка = Ложь; ... 


т.е. по факту формируются программно. На мой взгляд было бы гараздо ПРОЩЕ и удобнее сделать просто функцию типо
Функция Представление_КадроваяИстонияСотрудника(....) Экспорт

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

с функцией конструктором параметров. И так для каждого представления. Ты получаешь данные в явном виде, так же можешь в явном виде посмотреть откуда они собираются. А в скд запихивать данные внешних источников в виде объединения по таблицам. В таком случае отсутствие документации упростит сопровождение этого костыля и дальнейшую его доработку специалисту любого уровня.

В итоге получаем ровно тоже самое что и имеем сейчас, однако значительно более прозрачное и где реально разобраться без документации.


https://infostart.ru/1c/tools/2388804/ - ну я себе жизнь упростил этим инструментом
- Набиваю запрос в конструкторе (там есть таблицы для большинства представлений ЗУП)
- Отлаживаю пакет запросов в консоли
- Генерирую готовый код
...
- profit.

Казалось бы, проще не куда.


ты молодец, вопросов к тебе нет. Но механизм для отладки которого требуется сторонняя обработка по умолчанию является криворукой шляпой. Примерно как любое то на ренжах, где надо снимать кузов с рамы в любой непонятной ситуации.
38. zup_dev 61 11.07.25 09:41 Сейчас в теме
(37)
Да легко. Заполнение карточки воинского учета

Не сталкивался с этим, но верю ))))

На мой взгляд было бы гараздо ПРОЩЕ и удобнее сделать просто функцию типо

Причем такая функция уже есть КадровыйУчет.КадровыеДанныеСотрудников

А в скд запихивать данные внешних источников в виде объединения по таблицам.

То же скорее соглашусь.

Я как раз занимаюсь разработкой генератора внешних отчетов на основе запросов со своими исполняемыми представлениям.
Склоняюсь к тому что не использовать этот механизм ЗУП, а пойти путем с запихиванием внешних источников в СКД.

Основная проблема, что тут не будет работать оптимизатор СКД, который добавляет условия в нужные места,
выкидывает не нужные таблицы и т.п. Но с другой стороны, тот же метод КадровыеДанныеСотрудников, сам добавляет нужные таблицы, основываясь на полях которые мы получаем. А не оптимальная обработка каких то экзотических отборов, приемлемая цена за упрощение.
42. qwinter 684 14.07.25 13:10 Сейчас в теме
(35) Они не упоротые, а весьма и весьма продуманные, постобработкой 2 строчки кода и мало заплатят, а так налябал 100 общих модулей на тысяч строк, и которых 95% функций просто вызывают другие функции и денежек срубил. Все в ЗУП заточено на раздувание кода. Абсолютно все.
34. dehro 12 10.07.25 19:09 Сейчас в теме
(32) ЗУП едет. Если знать как работать с механизмом представлений, то экономия времени в разработке - колоссальная.
43. RocKeR_13 1426 15.07.25 10:09 Сейчас в теме
(1)
Этот механизм - просто "белый флаг", который выкинула компания 1с , признав, что конфигурации ЗУП стали слишком сложными для нормальной правки и доработки.


Спорный вывод. По сути 1С сделала API, позволяющий довольно-таки просто получать необходимые данные. Я с ЗУПом не работаю, но иногда приходится делать различные выгрузки - вот тут представления выручают и экономят колоссальное количество времени. Да, возможно подобные статьи по представлениям должна была выпустить сама 1С, но в целом сейчас информации много и проблем с использованием представлений сейчас нет. Думаю, если бы кто-то придумал что-то более удобное и универсальное, чем регистры расчета, то мы бы это давно увидели в платформе. А так да, они же сами акцентируют в том же пособии от Радченко, что это сложные периодические расчеты. Не уверен, что в других системах есть что-то более изящное при сопоставимом уровне возможностей.
3. user1832003 60 09.07.25 04:09 Сейчас в теме
описание приемлимо, статья полезна. Однако если зайти в код, то там нет ни слова описания работы механизма. Тупо функции без описания. Понять как это работает без гугла невозможно. Отладка через обработку признак того, что механизм кривой и плохой. Так что подождем пока появится механизм представлений 3.1 (по аналогии с кд), где всю отладку можно вести без костылей в виде внешних обработок.

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

никогда не любил зуп, где ради заполнения карточки воинского учета (2 странички) делается 130+ запросов в вт, ради того чтобы ничего....Видимо кто-то из команды зупа упорно подвигает путь аля "все получать запросами без обработки даже лютейшую дичь, которую проще сделать постобработкой в 2 строки".

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

пс в статье нет ответа как узнать какое представлние использовать.

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

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

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

Ps Расширить своей функцией просто. Тупо вписываешься в процедуру из этих модулей. Можно даже на расширении и все.
qwinter; NeLenin; zqzq; RustIG; +4 Ответить
6. RustIG 1886 09.07.25 07:23 Сейчас в теме
(3) хорошие вопросы вы задаете. продуманные и глубокие.
8. zup_dev 61 09.07.25 08:04 Сейчас в теме
(3) Можно попробовать вот это расширение
https://github.com/pulh1/QueryConsole1C
Там работа с представлениями встроена в консоль запросов и конструктор запросов.
Плюсом идет генерация кода для встраивания в отчеты.

Видимо кто-то из команды зупа упорно подвигает путь аля "все получать запросами без обработки даже лютейшую дичь, которую проще сделать постобработкой в 2 строки".


Кажется это проблема не только ЗУП но и многих других решений на 1С, которое идет из ложного посыла, что язык запросов это быстро, а встроенный язык всегда медленно.
9. user1832003 60 09.07.25 09:06 Сейчас в теме
(8)
Кажется это проблема не только ЗУП но и многих других решений на 1С, которое идет из ложного посыла, что язык запросов это быстро, а встроенный язык всегда медленно.


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

В тех же ERP все проводки и движения построены на запросах и все данные собираются запросами. Там при проведении огроное количество запросов сначала в вт, потом в итог, однако там нет такого бреда как в зупе типо рожать 100+ запросов через вт ради того чтобы получить условное текстовое представление назначения проводки.

Поэтому весь этот механизм представлений из статьи не более чем один большой костыль хоть и универсальный. Но все же костыль.
10. zup_dev 61 09.07.25 09:25 Сейчас в теме
(9)
Запросы реально быстрее работают, чем встроенный язык, но зуп с этим сильно перегибает палку далеко за уровень маразма.


Мне сложно сравнить. На мой взгляд запросы нужны для излечения данных. А пытаться реализовывать на них сложную бизнес логику, для которой декларативный язык запросов 1С не переназначен, такое себе решение.
Опять таки не стоит забывать, что временные таблицы это не переменные в памяти.
И да же если они маленькие, по несколько записей, то это все равно может приводить к проблемам (например постоянная перекомпиляция запросов на MS SQL)

Ну и пример с использованием сотни временных таблиц для получения представления, это скорее всего исключение да же для ЗУП )))
13. user1832003 60 09.07.25 09:54 Сейчас в теме
(10) поэтому механизм из статьи использует скд. Скд преобразует запрос в свой "оптимизированный". В определенных случаях твои 11 запросов из которых 10 это вт скд может преобразовать в 1с. Это можно увидеть если выполнять скд программно на моменте
Макет = КомпоновщикМакета.Выполнить(СхемаСКД, НастройкиКомпановки);
11. ixijixi 2034 09.07.25 09:45 Сейчас в теме
Кейс 4. Получение регистраторов.

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

Могу ошибаться, но это делается для компоновщика, а не для представлений. Представлениям всё равно на типы, там всё на таблицах фильтров и параметрах завязано, а вот компоновщику подсказка по типам требуется, чтобы в пользовательский интерфейс выводить правильные данные.
16. Трактор 1271 09.07.25 11:57 Сейчас в теме
Дочитал до текста запроса
"ТолькоРазрешенные" = ИСТИНА

и бросил. Строку сравниваем с булевым. Нафига оно мне?
17. user2012581 46 09.07.25 12:02 Сейчас в теме
(16)
и бросил.


А зря, дальше описывается, почему сравнивается "Булево" со строкой.
25. lmnlmn 69 09.07.25 15:46 Сейчас в теме
Механизм представлений впервые появился именно в ЗУП. Сейчас он распространился и присутствует в ERP, в Управлении Холдингом (УХ), возможно, уже и в других конфигурациях. Очень желательно его дальнейшее распространение.
Как по мне, очень нежелательно его дальнейшее распространение. Надеюсь что это апогей костылестроя от разработчиков 1С который сподвигнет их на платформенное решение для этого пула задач. Удобное и понятное для разработчика.
qwinter; user2068269; SanyMaga; user1832003; bulpi; +5 Ответить
29. Banka86 09.07.25 21:57 Сейчас в теме
Автору доклада спасибо, сделал по предложенному варианту иерархию подразделений. Правда нужно теперь подумать как обойтись без расширения функции ПолучитьЗапросПоПредставлению с ИзменениеИКонтроль, так как меняется она довольно часто с новыми релизами - надоедает слияние делать.

Представления очень даже удобный инструмент, особенно под задачи клепания печатных форм, а в ЗУП-е это довольно частая задача. Я думаю если бы их не было, то каждый бы всё равно делал какой-то свой программный интерфейс для получения кадровых данных, а тут всё едино.
31. aximo 2380 10.07.25 08:58 Сейчас в теме
Мое желание бы, так я исключительно с зупом работал - специфика задач ограничена, механизм давно используем

Удобно писать код… встраиваться в систему

Специалисты по зуп - так себе… если про «проводки» что-то еще могут мычать.. так тут «со взносами» вообще труба!
Оставьте свое сообщение