При разработке и доработке конфигураций на платформе 1С:Предприятие часто возникает ситуация, когда при попытке выбрать значение реквизита из справочника (например, вид начисления в документе) открывается форма списка, в которой уже установлен некий отбор. Пользователь видит не все элементы справочника, а лишь часть из них, и не всегда очевидно, откуда этот отбор берется. Проанализируем эту ситуацию подробно и разберем по шагам все возможные механизмы, которые влияют на формирование списка выбора.
Рассмотрим алгоритм действий разработчика для поиска, изменения или удаления такого скрытого фильтра.
Первое, что мы проверим — это статические настройки, заданные в конфигураторе. Разберем свойства самого реквизита объекта (в дереве метаданных) и свойства элемента управляемой формы.
В платформе 1С существуют два важных свойства:
Выясним причину именно в этих свойствах. Часто разработчики проверяют эти настройки у элемента формы, видят, что там пусто, и заходят в тупик. Однако, как показывает практика, отбор может быть установлен на уровне самого реквизита объекта (в дереве конфигурации). Если отбор задан в метаданных объекта, он будет автоматически применяться везде, где этот реквизит выведен на форму. Обязательно проверяйте оба этих места.
Если в статических параметрах реквизита пусто, проанализируем программный код. Часто логику фильтрации переопределяют в модуле формы документа. Для этого используется обработчик события НачалоВыбора поля ввода.
В этом событии разработчик может отключить стандартное поведение системы и открыть форму выбора самостоятельно, передав в нее нужные параметры. Посмотрим на классический пример такого кода:
&НаКлиенте
Процедура НачислениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Отключаем стандартный механизм платформы
СтандартнаяОбработка = Ложь;
// Формируем структуру с отбором
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("ГруппаУчета", ПредопределенноеЗначение("Справочник.ГруппыУчета.Основная"));
// Упаковываем отбор в параметры открываемой формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
// Программно открываем нужную форму
ОткрытьФорму("Справочник.Начисления.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры
Если вам нужно изменить отбор, вы просто корректируете структуру ПараметрыОтбора. Если отбор нужно убрать полностью, достаточно убрать программное открытие и установить параметр СтандартнаяОбработка = Истина.
Если события НачалоВыбора нет, а отбор все равно есть, нам необходимо перехватить момент создания самой формы выбора. Поставим точку останова в процедуре ПриСозданииНаСервере в модуле формы списка/выбора того справочника, который открывается.
В отладчике мы посмотрим, что приходит в переменной Параметры. Если в структуре параметров присутствует ключ Отбор, значит, система передала его извне (возможно, сработал механизм связей параметров выбора, о котором мы говорили в первом пункте, или передан системный параметр УсловиеОтбора).
В этой же процедуре разработчик предыдущего кода мог программно добавить отбор непосредственно в компоновку данных динамического списка самой формы. Разберем пример такого кода:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Добавляем программный отбор в динамический список "Список"
НовыйОтбор = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Архивный");
НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйОтбор.ПравоеЗначение = Ложь;
НовыйОтбор.Использование = Истина;
КонецПроцедуры
Если вы убедились, что в форме документа и форме выбора чисто, проанализируем модуль менеджера справочника. Начиная с версии 8.3, платформа предоставляет мощное событие ОбработкаПолученияДанныхВыбора.
Это событие срабатывает каждый раз, когда система пытается получить список элементов для выбора (например, при вводе текста в поле или вызове стандартного окна выбора). Здесь можно перехватить параметры и добавить жесткие глобальные фильтры, которые будут действовать во всей конфигурации.
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
// Принудительно скрываем помеченные на удаление элементы для всех форм выбора
Если Не Параметры.Отбор.Свойство("ПометкаУдаления") Тогда
Параметры.Отбор.Вставить("ПометкаУдаления", Ложь);
КонецЕсли;
КонецПроцедуры
Если открывается нестандартная форма (переопределенная разработчиком), отбор может быть «зашит» в архитектуре самого динамического списка. Рассмотрим, где это может быть:
ГДЕ. Возможно, ненужное начисление исключается прямо на уровне SQL-запроса платформы.В современных реалиях 1С нельзя забывать про Расширения. Если основная конфигурация абсолютно чиста, проверим подключенные расширения. Возможно, логика перехватывается с помощью аннотаций &Вместо или &После в событиях модуля формы документа или модуля менеджера справочника.
Наконец, проанализируем самую тривиальную причину — пользовательские настройки. Пользователь мог ранее открыть форму выбора, нажать "Еще - Настроить список", установить отбор вручную и сохранить его. Платформа запоминает эти настройки для конкретного пользователя. Чтобы проверить эту гипотезу, сбросьте настройки формы к стандартным (Еще - Установить стандартные настройки) или очистите кэш пользовательских настроек в режиме 1С:Предприятие.
Используя данный системный подход, мы сможем пошагово исключить все варианты и гарантированно найти место, где устанавливается нежелательный отбор при выборе реквизита.