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

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

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

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

Способ 1: Настройка в схеме компоновки данных (декларативный метод)

Наиболее простым и правильным с точки зрения архитектуры СКД является использование параметров редактирования непосредственно в схеме. Давайте рассмотрим этот процесс по шагам:

  1. Откроем схему компоновки данных (СКД) нашей обработки или отчета — в этом поможет набор инструментов разработчика с консолью СКД и запросов для 1С.
  2. Перейдем на закладку «Наборы данных» и выберем нужное поле, для которого требуется изменить форму выбора.
  3. В колонке «Параметры редактирования» нажмем на кнопку выбора.
  4. Найдем параметр «Форма выбора». Здесь необходимо указать путь к нужной форме. Если мы хотим использовать типовую форму из состава БСП, прописываем путь: ОбщаяФорма.ВводЗначенийСпискомСФлажками.

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

Способ 2: Программный перехват события «НачалоВыбора» в таблице отборов

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

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

Воспользуемся событием таблицы ПриАктивизацииЯчейки, чтобы динамически определять, в какой колонке находится пользователь. Если это колонка «Значение», мы можем принудительно назначить обработчик.


&НаКлиенте
Процедура НастройкиОтборПриАктивизацииЯчейки(Элемент)
    
    ТекущиеДанные = Элемент.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Проверяем, что активна колонка со значением
    Если Элемент.ТекущийЭлемент.Имя = "НастройкиОтборЗначение" Тогда
        // Устанавливаем кнопку выбора, если она еще не установлена
        Элемент.ТекущийЭлемент.КнопкаВыбора = Истина;
    КонецЕсли;
    
КонецПроцедуры

Затем в обработчике НачалоВыбора для поля значения мы прописываем логику открытия нашей кастомной формы:


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

&НаКлиенте
Процедура ПослеВыбораЗначенийСписком(Результат, ДополнительныеПараметры) Экспорт
    
    Если Результат <> Неопределено Тогда
        // Записываем полученный список обратно в элемент отбора СКД
        ДополнительныеПараметры.Значение = Результат;
    КонецЕсли;
    
КонецПроцедуры

Способ 3: Использование программного интерфейса БСП

В современных конфигурациях на базе БСП (Библиотека Стандартных Подсистем) существует еще более элегантный способ. Рассмотрим использование общего модуля РаботаСФормамиКлиент. Метод ПодобратьЗначенияВСписок позволяет вызвать унифицированное окно подбора, которое уже включает в себя функционал работы с буфером обмена и корректную обработку типов.

Выясним причину, почему это лучше: использование БСП гарантирует, что форма будет выглядеть и вести себя единообразно во всей системе, а также автоматически подхватит настройки прав доступа и заголовки типов. Пример вызова может выглядеть так:


// Пример вызова через БСП
ПараметрыПодбора = РаботаСФормамиКлиент.ПараметрыПодбораЗначенийВСписок();
ПараметрыПодбора.СписокЗначений = ТекущееЗначениеОтбора;
ПараметрыПодбора.ОписаниеТиповЭлементов = ОписаниеТиповДляПоля;

РаботаСФормамиКлиент.ПодобратьЗначенияВСписок(ЭтотОбъект, ПараметрыПодбора, "ОбработкаВыбораСписка");

Способ 4: Полная кастомизация через свою таблицу настроек

Иногда стандартный элемент формы «Редактор настроек компоновки данных» накладывает слишком много ограничений. В таком случае мы можем пойти по пути создания собственной таблицы на форме, которая будет зеркально отображать элементы КомпоновщикНастроек.Настройки.Отбор.Элементы.

Проанализируем этот подход. Мы создаем реквизит формы с типом ТаблицаЗначений (или используем динамический список, если это оправдано) и при открытии формы заполняем его данными из компоновщика. В этой таблице мы имеем полный контроль над колонками:

Посмотрим на пример обработки изменения такой таблицы. Когда пользователь нажимает кнопку выбора в колонке ПравоеЗначение, мы проверяем ВидСравнения. Если он предполагает список (ВСписке, НеВСписке), мы вызываем форму ВводЗначенийСпискомСФлажками или создаем свою форму на лету. После завершения редактирования мы программно обновляем объект КомпоновщикНастроек перед выполнением компоновки или открытием отчета.

Особенности формы «ВводЗначенийСпискомСФлажками»

При работе с этой формой крайне важно передавать корректный ОписаниеТипов. Если вы передадите пустой тип, кнопки добавления элементов могут оказаться недоступными. Для извлечения типов из поля компоновки можно использовать метод ПолучитьДоступныеПоляКомпоновкиДанных() или обращаться к метаданным, если поле привязано к конкретному объекту конфигурации.

Рассмотрим пример формирования ОписаниеТипов для передачи в форму выбора:


МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("СправочникСсылка.Номенклатура"));
ОписаниеТиповНоменклатура = Новый ОписаниеТипов(МассивТипов);

ПараметрыФормы.Вставить("ТипЗначения", ОписаниеТиповНоменклатура);

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

← На главную