Часто при разработке или поддержке конфигураций на обычных формах мы сталкиваемся с загадочной ситуацией: при открытии списка документов (элемент управления ДокументСписок) в режиме предприятия в нем уже установлен некий отбор. Пользователь видит только часть данных. Естественной реакцией программиста является поиск программного кода, который этот отбор устанавливает. Мы открываем модуль формы в конфигураторе, проверяем обработчик события ПриОткрытии, но программного задания отбора там нет. Возникает закономерный вопрос: откуда он берется и где его искать? Разберем эту ситуацию по шагам и проанализируем все возможные причины возникновения таких "магических" отборов.
Если в самом модуле открываемой формы отбора нет, первое, что мы должны проверить — не открывается ли эта форма каким-либо внешним кодом. Зачастую форма вызывается из другой обработки, документа или общего модуля, и именно вызывающий код устанавливает параметры отбора перед открытием.
В обычных формах это можно реализовать двумя способами. Рассмотрим подробнее каждый из них.
Способ А: Получение формы и прямая установка отбора
Вызывающий код может сначала получить форму, обратиться к ее элементу управления и установить отбор, а только затем показать ее пользователю. Посмотрим на пример:
ФормаСписка = Документы.РеализацияТоваровУслуг.ПолучитьФормуСписка();
ФормаСписка.ДокументСписок.Отбор.Организация.Установить(ТекущаяОрганизация);
ФормаСписка.Открыть();
Способ Б: Использование структуры параметров при открытии
Второй, более аккуратный вариант — использование системной структуры параметров. Вызывающий код формирует структуру ПараметрыОтбора и передает ее в метод открытия. Платформа сама применяет этот отбор при инициализации формы.
ПараметрыОтбора = Новый Структура("Организация", ТекущаяОрганизация);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка", ПараметрыОтбора);
В обоих случаях искать код отбора внутри самой открываемой формы абсолютно бесполезно. Как выяснить причину? Поставьте точку останова (breakpoint) в самом начале процедуры ПриОткрытии проблемной формы. Когда выполнение остановится, откройте окно стека вызовов (Call Stack). Проанализируем стек: он покажет вам всю цепочку вызовов, и вы сможете перейти в тот модуль, откуда была инициирована команда на открытие формы, и найти там нужный код.
Очень часто то, что программист воспринимает как ошибку или скрытый код, оказывается стандартным поведением платформы 1С по сохранению настроек пользователя. Если пользователь (или вы сами во время тестирования) ранее открыл этот список, установил отбор вручную через интерфейс программы и закрыл форму, то при следующем открытии платформа заботливо восстановит этот отбор из кэша. Никакого программного кода для этого не требуется.
Как проверить эту гипотезу:
Открытие формы с зажатой клавишей Shift заставляет платформу игнорировать сохраненные пользовательские настройки и открывать форму в ее первозданном виде, задуманном в конфигураторе. Если после этого список открылся без отбора — значит, дело было в кэше настроек пользователя. Чтобы решить проблему глобально, можно зайти в справочник пользователей и очистить сохраненные настройки для конкретной формы.
Во многих сложных типовых конфигурациях (таких как УПП, Комплексная автоматизация, УТ 10.3) реализованы мощные механизмы автоматической подстановки значений по умолчанию. Даже если в модуле самой формы нет явного кода установки отбора, в момент открытия формы может неявно вызываться процедура из общего или глобального модуля.
Разберем ситуацию: в конфигурации может быть настроена подписка на событие или в процедуре ПриОткрытии стоит неприметный вызов вида УправлениеПользователями.УстановитьОтборыПоУмолчанию(ЭтаФорма). Внутри этой глобальной процедуры система читает настройки текущего пользователя и автоматически накладывает отбор на список по его текущей организации, основному подразделению или складу.
Чтобы исключить этот вариант, воспользуйтесь замером производительности во время открытия формы. Включите замер, откройте форму, выключите замер. Проанализируем результат: посмотрите, какие общие модули вызывались в процессе открытия. Это поможет сузить круг поиска.
Отбор может быть жестко задан не в коде, а на уровне свойств элементов непосредственно в Конфигураторе. Откроем форму в режиме конфигуратора, выделим элемент ДокументСписок и внимательно изучим его палитру свойств.
Наконец, то, что визуально выглядит в списке как "установленный отбор", на самом деле может являться результатом работы подсистемы ограничения прав доступа на уровне записей (Record Level Security, сокращенно RLS).
В этом случае в интерфейсе формы никаких галочек отбора стоять не будет, кнопка "Отбор и сортировка" покажет, что отборов нет, но пользователь все равно будет видеть только малую часть документов. Разберем механику: платформа 1С отсекает недоступные данные на самом глубоком уровне — при формировании SQL-запроса к базе данных, основываясь на ролях пользователя и настроенных правилах.
Как выяснить причину: Откройте базу данных под пользователем с полными правами (у которого нет ограничений RLS). Если под полными правами список отображает все документы без проблем, а под обычным пользователем список урезан — вы столкнулись с работой RLS. В этом случае нужно проверять настройки прав доступа, профили групп доступа и шаблоны ограничений в ролях, а не модуль формы.