Как настроить сложные условия отбора ИЛИ и использовать шаблоны ПОДОБНО в 1С:ERP

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

При работе с системой 1С:ERP Управление предприятием программисты и продвинутые пользователи часто сталкиваются с ситуацией, когда стандартных возможностей интерфейса отборов кажется недостаточно. Одной из типичных задач является фильтрация данных по шаблону (например, поиск одновременно «Велосипедов» и «Самокатов») или использование логического условия «ИЛИ» в механизме компоновки данных (СКД). Рассмотрим подробно, почему возникают сложности с экранированием символов и как реализовать сложные условия даже в тех случаях, когда нужные кнопки отсутствуют на форме.

Проблема 1: Экранирование символов в шаблоне ПОДОБНО

Рассмотрим ситуацию, когда в правилах обмена или отчетах необходимо задать шаблон наименования. Попытка использовать классическое регулярное выражение SQL внутри оператора ПОДОБНО (LIKE), например, [ВвСс][еа][лм][о][ск][иа][пт]%, часто приводит к неожиданному результату. При выполнении компоновки макета платформа 1С может автоматически подставить символ экранирования перед открывающей скобкой, превращая её в /[.

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

Проблема 2: Отсутствие возможности группировки условий в интерфейсе

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

Способ 1: Использование контекстного меню и скрытых команд

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

  1. Перейдем в список отборов на форме.
  2. Добавим два или более условий (например, Наименование Содержит "Велосипед" и Наименование Содержит "Самокат").
  3. Важный момент: необходимо выделить одновременно обе строки условий, удерживая клавишу Ctrl.
  4. Нажмем правую кнопку мыши. В некоторых конфигурациях пункт «Сгруппировать» появляется только при выделении нескольких строк.
  5. Если пункт появился, выберем его и в созданной группе изменим тип группы с «И» на «ИЛИ».

Если же кнопки по-прежнему нет, это означает, что разработчики программно отключили возможность группировки для данного элемента формы (свойство РежимРедактирования или настройки доступности полей СКД).

Способ 2: Программная установка параметров в СКД

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

Разберем пример кода для программного формирования отчета или обработки данных на базе СКД:


// Схема - это наш макет СКД
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = Схема.НастройкиПоУмолчанию;

КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);

// Находим нужный параметр по имени, заданному в схеме
ПараметрГруппы = Новый ПараметрКомпоновкиДанных("СписокНаименований");
ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрГруппы);

// Устанавливаем массив значений для использования в условии "В СПИСКЕ"
МассивЗначений = Новый Массив;
МассивЗначений.Добавить("Велосипед%");
МассивЗначений.Добавить("Самокат%");

ЗначениеПараметра.Значение = МассивЗначений;
ЗначениеПараметра.Использование = Истина;

// Генерация макета и процессора компоновки
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, КомпоновщикНастроек.Настройки);

ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , , Истина);

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

Способ 3: Использование расширения для восстановления интерфейса

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

Пошаговый алгоритм для программиста:

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

&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    // Разрешаем иерархический просмотр и группировку в отборах
    ЭлементОтбор = ЭтаФорма.Элементы.Отбор; // Имя элемента отбора на форме
    ЭлементОтбор.РежимРедактирования = РежимРедактированияКомпоновкиДанных.Иерархический;
КонецПроцедуры

Установка режима Иерархический часто возвращает в контекстное меню пункты «Сгруппировать условия» и «Новая группа», которые были скрыты настройками по умолчанию.

Рекомендации по работе с оператором ПОДОБНО

При написании условий «Соответствует шаблону» в интерфейсе 1С помните о следующих правилах:

Таким образом, мы рассмотрели основные причины «исчезновения» функций группировки в ERP и выяснили, как технически устроено экранирование спецсимволов. Используя предложенные программные методы и настройки интерфейса, вы сможете реализовывать гибкие фильтры для любых бизнес-задач.

← На главную