Как найти и убрать скрытый отбор при выборе реквизита на управляемых формах в 1С?

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

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

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

1. Проверка метаданных: Параметры выбора и Связи параметров выбора

Первое, что мы проверим — это статические настройки, заданные в конфигураторе. Разберем свойства самого реквизита объекта (в дереве метаданных) и свойства элемента управляемой формы.

В платформе 1С существуют два важных свойства:

  1. Параметры выбора — позволяют задать жесткий фиксированный отбор. Например, указать, что для выбора доступны только элементы с определенным типом или не помеченные на удаление.
  2. Связи параметров выбора — позволяют фильтровать список в зависимости от значения другого реквизита на форме (например, отбирать договоры только выбранного контрагента).

Выясним причину именно в этих свойствах. Часто разработчики проверяют эти настройки у элемента формы, видят, что там пусто, и заходят в тупик. Однако, как показывает практика, отбор может быть установлен на уровне самого реквизита объекта (в дереве конфигурации). Если отбор задан в метаданных объекта, он будет автоматически применяться везде, где этот реквизит выведен на форму. Обязательно проверяйте оба этих места.

2. Событие элемента формы «НачалоВыбора»

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

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


&НаКлиенте
Процедура НачислениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    // Отключаем стандартный механизм платформы
    СтандартнаяОбработка = Ложь;
    
    // Формируем структуру с отбором
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("ГруппаУчета", ПредопределенноеЗначение("Справочник.ГруппыУчета.Основная"));
    
    // Упаковываем отбор в параметры открываемой формы
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
    
    // Программно открываем нужную форму
    ОткрытьФорму("Справочник.Начисления.ФормаВыбора", ПараметрыФормы, Элемент);
    
КонецПроцедуры

Если вам нужно изменить отбор, вы просто корректируете структуру ПараметрыОтбора. Если отбор нужно убрать полностью, достаточно убрать программное открытие и установить параметр СтандартнаяОбработка = Истина.

3. Использование отладчика в форме выбора (ПриСозданииНаСервере)

Если события НачалоВыбора нет, а отбор все равно есть, нам необходимо перехватить момент создания самой формы выбора. Поставим точку останова в процедуре ПриСозданииНаСервере в модуле формы списка/выбора того справочника, который открывается.

В отладчике мы посмотрим, что приходит в переменной Параметры. Если в структуре параметров присутствует ключ Отбор, значит, система передала его извне (возможно, сработал механизм связей параметров выбора, о котором мы говорили в первом пункте, или передан системный параметр УсловиеОтбора).

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Добавляем программный отбор в динамический список "Список"
    НовыйОтбор = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Архивный");
    НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    НовыйОтбор.ПравоеЗначение = Ложь;
    НовыйОтбор.Использование = Истина;
    
КонецПроцедуры

4. Глобальные фильтры в модуле менеджера (ОбработкаПолученияДанныхВыбора)

Если вы убедились, что в форме документа и форме выбора чисто, проанализируем модуль менеджера справочника. Начиная с версии 8.3, платформа предоставляет мощное событие ОбработкаПолученияДанныхВыбора.

Это событие срабатывает каждый раз, когда система пытается получить список элементов для выбора (например, при вводе текста в поле или вызове стандартного окна выбора). Здесь можно перехватить параметры и добавить жесткие глобальные фильтры, которые будут действовать во всей конфигурации.


Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    // Принудительно скрываем помеченные на удаление элементы для всех форм выбора
    Если Не Параметры.Отбор.Свойство("ПометкаУдаления") Тогда
        Параметры.Отбор.Вставить("ПометкаУдаления", Ложь);
    КонецЕсли;
    
КонецПроцедуры

5. Настройки динамического списка внутри Формы Выбора

Если открывается нестандартная форма (переопределенная разработчиком), отбор может быть «зашит» в архитектуре самого динамического списка. Рассмотрим, где это может быть:

  1. Текст запроса: Если динамический список использует произвольный запрос, посмотрите секцию ГДЕ. Возможно, ненужное начисление исключается прямо на уровне SQL-запроса платформы.
  2. Настройки списка: В конфигураторе, открыв свойства реквизита формы типа "ДинамическийСписок", перейдите по ссылке "Настройки". На вкладке "Отбор" могут быть заданы фиксированные пользовательские настройки компоновки данных.

6. Расширения конфигурации и пользовательские настройки

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

Наконец, проанализируем самую тривиальную причину — пользовательские настройки. Пользователь мог ранее открыть форму выбора, нажать "Еще - Настроить список", установить отбор вручную и сохранить его. Платформа запоминает эти настройки для конкретного пользователя. Чтобы проверить эту гипотезу, сбросьте настройки формы к стандартным (Еще - Установить стандартные настройки) или очистите кэш пользовательских настроек в режиме 1С:Предприятие.

Используя данный системный подход, мы сможем пошагово исключить все варианты и гарантированно найти место, где устанавливается нежелательный отбор при выборе реквизита.

← На главную