В статье показан пример оптимизации запроса к информационной базе, позволивший ускорить вывод информации для пользователей.
Задача решалась в нестандартной конфигурации, поэтому такая особенность платформы, как RLS, с помощью которой данную задачу можно решить в стандартных продуктах, не применялась. Описанный ниже пример пригоден для решения таких задач, как вывод в формах списков нестандартных вычисляемых реквизитов. В практике они встречаются довольно часто.
Описание задачи.
В табличной части(далее ТЧ) ПраваДоступа справочника Контрагенты есть Сотрудники, работающие в разных Отделах. В зависимости от Отделов задаются Приоритеты, используя которые нужно выбрать одного из пользователей, который отличается от другого реквизита справочника – Ответственный - и добавить его к основной таблице справочника Контрагенты.
Не очень тривиальная задача, которая ранее решалась запросом к ТЧ в цикле:
ВЫБРАТЬ ПЕРВЫЕ 1
КонтрагентыПраваДоступа.Сотрудник,
КонтрагентыПраваДоступа.Сотрудник. Подразделение,
ВЫБОР
КОГДА КонтрагентыПраваДоступа.Сотрудник. Подразделение = ЗНАЧЕНИЕ(Справочник.Подразделения.ПодразделениеНомерОдин)
ТОГДА 1…
2…4
КОНЕЦ КАК Приоритет
ИЗ
Справочник.Контрагенты.ПраваДоступа КАК ОрганизацииПраваДоступа
ГДЕ
КонтрагентыПраваДоступа .Сотрудник <> &ТекущийПользователь
И КонтрагентыПраваДоступа.Ссылка = &Контрагент
УПОРЯДОЧИТЬ ПО
Приоритет
Запрос в цикле это всегда плохо. В данной статье я хочу показать метод решения этой задачи в рамках одного запроса.
Чтобы продемонстрировать процесс возьмём абстрактный контрольный пример, по которому будем последовательно получать требуемый результат.
Пусть имеются 6 элементов справочника Контрагенты К1…К6, у которых ТЧ Права Доступа заполнены следующим образом:
|
Контрагент |
Сотрудник |
Подразделение |
|
К1 |
С1 |
П1 |
|
К1 |
С2 |
П2 |
|
К2 |
С3 |
П3 |
|
К3 |
С4 |
П4 |
|
К3 |
С8 |
П4 |
|
К4 |
С0 |
П1 |
|
К5 |
С0 |
П1 |
|
К6 |
С5 |
П2 |
|
К6 |
С6 |
П3 |
|
К6 |
С7 |
П2 |
|
К6 |
С0 |
П1 |
где С0 – текущий пользователь, П1…4 – подразделения. Для простоты номер подразделения = приоритет вывода.
Эта таблица выбрана из справочника Контагенты по условию равенства значения реквизита Ответственный заданному пользователю - С0.
Для решения воспользуемся таким инструментом, как временные таблицы. Для начала выберем из исходной ТЧ тех контрагентов, у которых есть пользователи, отличные от текущего, чтобы реализовать условие
КонтрагентыПраваДоступа. Сотрудник <> &ТекущийПользователь (С0).
| Контрагент |
Подразделение |
|
К1 |
П1 |
|
К1 |
П2 |
|
К2 |
П3 |
|
К3 |
П4 |
|
К3 |
П4 |
|
К6 |
П2 |
|
К6 |
П3 |
|
К6 |
П2 |
|
К6 |
П1 |
Во временной таблице КонтрагентыСДругимиСотрудниками останутся К1, К2, К3, К6. Добавив к этой таблице поле
Приоритет, с помощью оператора ВЫБОР, получим следующую таблицу:
|
Контрагент |
Подразделение |
Приоритет |
|
К1 |
П1 |
1 |
|
К1 |
П2 |
2 |
|
К2 |
П3 |
3 |
|
К3 |
П4 |
4 |
|
К3 |
П4 |
4 |
|
К6 |
П2 |
2 |
|
К6 |
П3 |
3 |
|
К6 |
П2 |
2 |
Применим группировку по полю Контрагент, чтобы выбрать минимальное значение поля Приоритет:
|
Контрагент |
Подразделение |
Приоритет |
|
К1 |
П1 |
1 |
|
К2 |
Вступайте в нашу телеграмм-группу Инфостарт Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
См. также16500 руб. 02.09.2020 273914 1523 422 09.10.2025 11891 aximo 18 1 стартмани 16.05.2025 12639 159 zup_dev 32 2 стартмани 05.03.2025 7085 24 XilDen 12 3 стартмани 06.02.2025 6332 38 XilDen 26 |