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