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

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей
← На главную

При работе с базами 1С на неуправляемых формах часто возникает задача изменить стандартное поведение окна отбора. Например, пользователи могут хотеть, чтобы для поля «Номер» по умолчанию использовался вид сравнения «Содержит» вместо «Равно». Давайте разберем, возможно ли это сделать глобально для всей конфигурации и какие существуют подходы для реализации подобных требований.

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

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

Программное изменение отбора для форм списка

Несмотря на отсутствие глобального механизма, мы можем программно влиять на отбор, который уже применен к динамическому списку формы. Динамический список является основным реквизитом большинства форм списка и форм выбора (для справочников, документов и т.д.). Мы можем настроить его свойства еще до того, как пользователь увидит окно отбора.

Рассмотрим по шагам, как это можно сделать:

  1. Определяем объект формы: Когда мы говорим о формах списка, их основной реквизит, как правило, является ДинамическимСписком. Именно к этому объекту мы будем применять изменения.
  2. Событие для изменения: Изменения следует вносить в обработчике события, которое происходит при открытии или создании формы. Наиболее подходящими являются события ПриСозданииНаСервере (для управляемых форм, но концептуально похоже) или ПриОткрытии, а также ПриВыбореИзСписка для обычных форм. В этом событии форма еще не отображена пользователю, и мы можем подготовить ее к работе.
  3. Доступ к отбору: У объекта ДинамическийСписок есть свойство Отбор, которое представляет собой коллекцию элементов отбора. Мы можем найти нужный элемент отбора по имени поля и изменить его свойства.

Давайте посмотрим на пример кода, который демонстрирует, как изменить вид сравнения для поля "Номер" на "Содержит":


// Пример для формы списка справочника, например "СправочникСписок"
// Предположим, что основной реквизит формы называется "Список"
// и имеет тип ДинамическийСписок.

Процедура ПриОткрытии()

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

КонецПроцедуры

В этом примере мы проверяем наличие элемента отбора по полю "Номер". Если его нет, мы создаем новый элемент отбора для ДинамическогоСписка, устанавливаем ему ВидСравнения.Содержит и делаем его используемым. Если элемент уже есть, мы просто меняем его ВидСравнения. После выполнения этого кода, когда пользователь откроет форму и затем нажмет стандартную кнопку "Отбор" на панели, в открывшемся окне для поля "Номер" уже будет стоять вид сравнения "Содержит".

Важно помнить, что ВидСравнения у ЭлементаОтбораКомпоновкиДанных может быть одним из следующих значений: Равно, НеРавно, Больше, Меньше, БольшеИлиРавно, МеньшеИлиРавно, ВСписке, НеВСписке, Содержит, НеСодержит, Заполнено, НеЗаполнено.

Применение изменений в общих процедурах

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

Например, если у вас есть общая процедура, которая выполняется для всех форм списка, вы могли бы добавить туда следующий блок кода:


// В некоторой общей процедуре, вызываемой при открытии форм списков
Процедура ОбщаяНастройкаФормыСписка(Форма)

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

КонецПроцедуры

Этот подход значительно упрощает поддержку кода, так как изменения вносятся в одном месте.

Ограничения стандартного отбора и альтернативы

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

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

  1. Создание своей кнопки и своей формы отбора: Мы можем полностью отказаться от стандартной кнопки "Отбор" и создать свою собственную. При нажатии на такую кнопку будет открываться ваша собственная форма, в которой вы можете реализовать любую логику отбора и предоставить любой интерфейс. Это дает полный контроль над процессом.
  2. Использование элементов отбора компоновки данных для сложных условий: Для более сложных условий отбора, когда простого равенства или "содержит" недостаточно, мы можем применять элементы отбора компоновки данных. Это дает возможность задавать разнообразные виды сравнения, группировать условия с логическими операторами "И" и "Или". Для этого необходимо программно создавать и настраивать ЭлементыОтбораКомпоновкиДанных, добавляя их в коллекцию отбора ДинамическогоСписка.
  3. Передача параметров отбора при программном открытии форм: Если вы программно открываете формы списка или выбора, вы можете передавать в них структуру с параметрами отбора. Этот метод позволяет устанавливать отбор по определенным полям. Однако для более сложных условий сравнения, таких как "содержит" или "в списке", требуется использование элементов отбора компоновки данных внутри самой открываемой формы, как было описано выше.
  4. Фиксированный и динамический отбор в конфигураторе: В конфигураторе мы можем настроить как фиксированный отбор (который будет применяться для всех пользователей и всегда), так и динамический (программный) отбор. Динамический отбор можно устанавливать при открытии формы выбора, передавая в нее параметры, по которым будет установлен отбор. Это похоже на программную настройку в ПриОткрытии, но может быть реализовано через параметры формы.

Особенности работы с отборами для разных типов данных

При работе с отборами важно учитывать особенности типов данных и объектов 1С:

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

← На главную