Отбор и сортировка данных в запросе с использованием приоритетов

08.01.17

Разработка - Запросы

Небольшая хитрость, позволяющая упростить сложный отбор в запросе

Имеется компания, максимально лояльно относящаяся к своим сотрудникам. Лояльность подразумевает возможность брать отпуск любой продолжительности, любое количество раз в пределах накопленного количества + авансового отпуска будущего периода + доп. дни отпуска. При всем при этом учет отпусков ведется в рабочих днях. После накопления определенного количества фактических отпускных дней они группируются по неделям, переводятся в календарные дни и "проводятся официально". Компания имеет несколько юр. лиц, и большое количество сотрудников. Учет всего, в том числе кадровый и зарплаты, ведется в 1С ERP 2 с минимальными изменениями в типовой системе учета. Для реализации возможности ведения учета отпусков была внедрена отдельная подсистема, описание которой - тема для отдельной статьи.

Имеется в этой компании некоторый портал, на котором можно посмотреть информацию по каждому из сотрудников, в том числе, находится ли он сейчас в отпуске, либо отсутствует по какой-либо другой причине. Также, на своей странице можно посмотреть все свои фактические отсутствия, накопленное количество дней отпуска, а также оставшееся количество дней дополнительного отпуска. Данные запрашиваются на лету из 1С через HTTP сервис при открытии страницы сотрудника. В качестве идентификатора сотрудника используется его логин в AD. Поле с логином сделали обязательным для заполнения в карточке физ.лица.

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

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

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

ВЫБРАТЬ РАЗРЕШЕННЫЕ
	ФизическиеЛицаКонтактнаяИнформация.Ссылка КАК ФизЛицо,
	ФизическиеЛицаКонтактнаяИнформация.Представление КАК Логин
ПОМЕСТИТЬ ВТФЛ
ИЗ
	Справочник.ФизическиеЛица.КонтактнаяИнформация КАК ФизическиеЛицаКонтактнаяИнформация
ГДЕ
	ФизическиеЛицаКонтактнаяИнформация.Вид.Наименование ПОДОБНО "%Логин%AD%"
	И ФизическиеЛицаКонтактнаяИнформация.Представление В(&Логины)

ИНДЕКСИРОВАТЬ ПО
	ФизЛицо
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	ТекущиеКадровыеДанныеСотрудников.Сотрудник КАК Сотрудник,
	ТекущиеКадровыеДанныеСотрудников.ДатаПриема КАК ДатаПриема,
	ТекущиеКадровыеДанныеСотрудников.ТекущийВидЗанятости КАК ТекущийВидЗанятости,
	ВТФЛ.ФизЛицо КАК ФизЛицо,
	ВТФЛ.Логин
ПОМЕСТИТЬ ВТСотрудники
ИЗ
	ВТФЛ КАК ВТФЛ
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТекущиеКадровыеДанныеСотрудников
		ПО ВТФЛ.ФизЛицо = ТекущиеКадровыеДанныеСотрудников.ФизическоеЛицо
			И (ТекущиеКадровыеДанныеСотрудников.ДатаПриема <> ДАТАВРЕМЯ(1, 1, 1))
			И (ТекущиеКадровыеДанныеСотрудников.ДатаУвольнения = ДАТАВРЕМЯ(1, 1, 1))

ИНДЕКСИРОВАТЬ ПО
	ДатаПриема,
	ФизЛицо
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	ВТСотрудники.ДатаПриема КАК ДатаПриема,
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТСотрудники1.ДатаПриема) КАК Порядок,
	ВТСотрудники.Логин КАК Логин,
	ВТСотрудники.Сотрудник
ПОМЕСТИТЬ ВТПриоритеты
ИЗ
	ВТСотрудники КАК ВТСотрудники
		ЛЕВОЕ СОЕДИНЕНИЕ ВТСотрудники КАК ВТСотрудники1
		ПО ВТСотрудники.ФизЛицо = ВТСотрудники1.ФизЛицо
			И ВТСотрудники.ДатаПриема >= ВТСотрудники1.ДатаПриема
			И (ВТСотрудники1.ТекущийВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.ОсновноеМестоРаботы))
ГДЕ
	ВТСотрудники.ТекущийВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.ОсновноеМестоРаботы)

СГРУППИРОВАТЬ ПО
	ВТСотрудники.Логин,
	ВТСотрудники.ДатаПриема,
	ВТСотрудники.Сотрудник

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

ВЫБРАТЬ
	ВТСотрудники.ДатаПриема,
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТСотрудники1.ДатаПриема) + 100,
	ВТСотрудники.Логин,
	ВТСотрудники.Сотрудник
ИЗ
	ВТСотрудники КАК ВТСотрудники
		ЛЕВОЕ СОЕДИНЕНИЕ ВТСотрудники КАК ВТСотрудники1
		ПО ВТСотрудники.ФизЛицо = ВТСотрудники1.ФизЛицо
			И ВТСотрудники.ДатаПриема >= ВТСотрудники1.ДатаПриема
			И (ВТСотрудники1.ТекущийВидЗанятости <> ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.ОсновноеМестоРаботы))
ГДЕ
	ВТСотрудники.ТекущийВидЗанятости <> ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.ОсновноеМестоРаботы)

СГРУППИРОВАТЬ ПО
	ВТСотрудники.Логин,
	ВТСотрудники.ДатаПриема,
	ВТСотрудники.Сотрудник
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	ОтборФЛ.Логин КАК Логин,
	ВТПриоритеты.ДатаПриема,
	ВТПриоритеты.Сотрудник
ИЗ
	(ВЫБРАТЬ
		ВТПриоритеты.Логин КАК Логин,
		МИНИМУМ(ВТПриоритеты.Порядок) КАК Порядок
	ИЗ
		ВТПриоритеты КАК ВТПриоритеты
	
	СГРУППИРОВАТЬ ПО
		ВТПриоритеты.Логин) КАК ОтборФЛ
		ЛЕВОЕ СОЕДИНЕНИЕ ВТПриоритеты КАК ВТПриоритеты
		ПО ОтборФЛ.Логин = ВТПриоритеты.Логин
			И ОтборФЛ.Порядок = ВТПриоритеты.Порядок

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

Использование такого нехитрого приема позволило достигнуть приемлемой скорости получения данных и снизить задержки при формирование ответа HTTP-сервиса.

Запросы приоритеты

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    131993    721    390    

763

Как посмотреть итоговый запрос в отчете СКД

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

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

15.05.2024    3922    implecs_team    6    

38

Пропорциональное распределение в запросе с использованием АвтоНомерЗаписи()

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    2691    andrey_sag    10    

32

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

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

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    6390    KawaNoNeko    23    

26

Набор-объект для СКД по тексту или запросу

Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2351    2    Yashazz    0    

32

Запрос 1С copilot

Инструментарий разработчика Запросы Программист Стажер Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Бесплатно (free)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

15.01.2024    7335    51    mkalimulin    32    

54

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Программист Стажер Платформа 1С v8.3 Бесплатно (free)

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

14.12.2023    2081    vandalsvq    7    

29

Консоль запросов УФ 8.3.2.24.12 (мод от Dr.Zombi)

Инструментарий разработчика Запросы Программист Платформа 1С v8.3 Управляемые формы Запросы Россия Абонемент ($m)

Работа с запросом и СКД, Полная поддержка пакетных запросов, временных таблиц. Главное скорость отладки запроса и данных, а красота вторична.

1 стартмани

07.12.2023    3553    52    DrZombi    54    

21
Оставьте свое сообщение