Откуда берется неявный отбор в списке документов (обычные формы) 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Часто при разработке или поддержке конфигураций на обычных формах мы сталкиваемся с загадочной ситуацией: при открытии списка документов (элемент управления ДокументСписок) в режиме предприятия в нем уже установлен некий отбор. Пользователь видит только часть данных. Естественной реакцией программиста является поиск программного кода, который этот отбор устанавливает. Мы открываем модуль формы в конфигураторе, проверяем обработчик события ПриОткрытии, но программного задания отбора там нет. Возникает закономерный вопрос: откуда он берется и где его искать? Разберем эту ситуацию по шагам и проанализируем все возможные причины возникновения таких "магических" отборов.

1. Открытие формы внешним кодом с передачей параметров

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

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

Способ А: Получение формы и прямая установка отбора

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


ФормаСписка = Документы.РеализацияТоваровУслуг.ПолучитьФормуСписка();
ФормаСписка.ДокументСписок.Отбор.Организация.Установить(ТекущаяОрганизация);
ФормаСписка.Открыть();

Способ Б: Использование структуры параметров при открытии

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


ПараметрыОтбора = Новый Структура("Организация", ТекущаяОрганизация);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка", ПараметрыОтбора);

В обоих случаях искать код отбора внутри самой открываемой формы абсолютно бесполезно. Как выяснить причину? Поставьте точку останова (breakpoint) в самом начале процедуры ПриОткрытии проблемной формы. Когда выполнение остановится, откройте окно стека вызовов (Call Stack). Проанализируем стек: он покажет вам всю цепочку вызовов, и вы сможете перейти в тот модуль, откуда была инициирована команда на открытие формы, и найти там нужный код.

2. Сохраненные пользовательские настройки

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

Как проверить эту гипотезу:

  1. Закройте проблемную форму списка.
  2. В интерфейсе программы кликните по меню, чтобы открыть эту форму снова, но при этом удерживайте нажатой клавишу Shift.

Открытие формы с зажатой клавишей Shift заставляет платформу игнорировать сохраненные пользовательские настройки и открывать форму в ее первозданном виде, задуманном в конфигураторе. Если после этого список открылся без отбора — значит, дело было в кэше настроек пользователя. Чтобы решить проблему глобально, можно зайти в справочник пользователей и очистить сохраненные настройки для конкретной формы.

3. Глобальные механизмы и значения по умолчанию

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

Разберем ситуацию: в конфигурации может быть настроена подписка на событие или в процедуре ПриОткрытии стоит неприметный вызов вида УправлениеПользователями.УстановитьОтборыПоУмолчанию(ЭтаФорма). Внутри этой глобальной процедуры система читает настройки текущего пользователя и автоматически накладывает отбор на список по его текущей организации, основному подразделению или складу.

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

4. Свойства элементов формы в Конфигураторе

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

  1. Связь по владельцу или Связь по типу: Если табличное поле списка связано с другим реквизитом на этой же форме (например, на форме есть поле выбора "Организация", и список связан с ним), платформа будет автоматически накладывать отбор на данные списка при изменении значения в связанном поле.
  2. Параметры выбора: В свойствах самого табличного поля (или в реквизите формы, если он имеет ссылочный тип) могут быть заданы фиксированные параметры выбора. Там может быть прописано условие, которое ограничивает выводимые данные всегда, независимо от программного кода.

5. Ограничение прав доступа на уровне записей (RLS)

Наконец, то, что визуально выглядит в списке как "установленный отбор", на самом деле может являться результатом работы подсистемы ограничения прав доступа на уровне записей (Record Level Security, сокращенно RLS).

В этом случае в интерфейсе формы никаких галочек отбора стоять не будет, кнопка "Отбор и сортировка" покажет, что отборов нет, но пользователь все равно будет видеть только малую часть документов. Разберем механику: платформа 1С отсекает недоступные данные на самом глубоком уровне — при формировании SQL-запроса к базе данных, основываясь на ролях пользователя и настроенных правилах.

Как выяснить причину: Откройте базу данных под пользователем с полными правами (у которого нет ограничений RLS). Если под полными правами список отображает все документы без проблем, а под обычным пользователем список урезан — вы столкнулись с работой RLS. В этом случае нужно проверять настройки прав доступа, профили групп доступа и шаблоны ограничений в ролях, а не модуль формы.

← На главную