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

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    124939    682    389    

732

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

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

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

11.04.2024    2247    andrey_sag    10    

28

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

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

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

13.02.2024    6006    KawaNoNeko    23    

25

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

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

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

1 стартмани

31.01.2024    2149    2    Yashazz    0    

31

Запрос 1С copilot

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

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

5 стартмани

15.01.2024    6641    31    mkalimulin    27    

51

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

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

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

14.12.2023    1880    vandalsvq    7    

29

Объектная модель запроса "Схема запроса" 2

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

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    5626    user1923546    26    

46

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16594    skovpin_sa    14    

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