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

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

При работе со стандартным списком документов в обычном приложении (обычные формы) пользователи часто хотят найти документы по части наименования связанного справочника, выбрав условие Содержит в стандартном окне настройки отбора («воронке»). Однако для ссылочных полей данный вид сравнения в интерфейсе отсутствует.

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

Почему в обычном приложении недоступно условие Содержит для ссылок

Проанализируем архитектуру хранения данных. В табличном поле с типом ДокументСписок реквизиты ссылочного типа (например, контрагент, склад, договор) хранятся и связываются на уровне СУБД по уникальным идентификаторам (UUID), а не по строковому представлению.

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

Способ 1. Использование управляемой формы с динамическим списком

Наиболее современный и удобный вариант — создать для списка документов управляемую форму с основным реквизитом типа ДинамическийСписок. Платформа «1С:Предприятие 8.3» позволяет бесшовно открывать и использовать управляемые формы внутри обычного приложения (толстого клиента).

Разберем по шагам, как внедрить управляемую форму в конфигурацию на обычных формах:

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

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

Способ 2. Программный отбор через массив ссылок (без изменения типа формы)

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

Рассмотрим алгоритм реализации:

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

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


Процедура ПрименитьОтборПоПодстроке()
    
    Если ПустаяСтрока(ТекстПоискаКонтрагента) Тогда
        // Отключаем отбор, если строка поиска пустая
        ЭлементОтбора = ДокументСписок.Отбор.Контрагент;
        ЭлементОтбора.Использование = Ложь;
        Возврат;
    КонецЕсли;
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Контрагенты.Ссылка КАК Ссылка
        |ИЗ
        |	Справочник.Контрагенты КАК Контрагенты
        |ГДЕ
        |	Контрагенты.Наименование ПОДОБНО &ШаблонПоиска";
    
    Запрос.УстановитьПараметр("ШаблонПоиска", "%" + СокрЛП(ТекстПоискаКонтрагента) + "%");
    
    Выборка = Запрос.Выполнить().Выгрузить();
    МассивСсылок = Выборка.ВыгрузитьКолонку("Ссылка");
    
    ЭлементОтбора = ДокументСписок.Отбор.Контрагент;
    ЭлементОтбора.ВидСравнения = ВидСравнения.ВСписке;
    ЭлементОтбора.Значение.ЗагрузитьЗначения(МассивСсылок);
    ЭлементОтбора.Использование = Истина;
    
КонецПроцедуры

Способ 3. Денормализация данных (дополнительный реквизит)

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

В этом случае строковое поле отображается в стандартной «серой воронке» настройки отбора, и для него штатно доступен вид сравнения Содержит.

Особенности производительности

Важно учитывать влияние поиска по подстроке на производительность СУБД. Конструкция вида ПОДОБНО "%Текст%" начинается с символа маски %, из-за чего СУБД не может задействовать стандартные индексы по наименованию и выполняет полное сканирование таблицы. На больших базах данных частый поиск по подстроке без дополнительных ограничивающих фильтров может приводить к повышенной нагрузке на сервер.

← На главную