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

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

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

Анализ стандартного поведения компоновщика настроек

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

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

Способ 1. Использование параметров выбора в схеме СКД

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

Выполним следующие действия для настройки в конфигураторе:

  1. Откроем Схему компоновки данных вашей обработки или отчета.
  2. Перейдем на закладку Наборы данных.
  3. Найдем в списке полей то поле (например, ДокументРТУ), для которого нужно настроить отбор.
  4. В колонке Параметры редактирования нажмем на кнопку выбора.
  5. В открывшемся окне найдем свойство Параметры выбора.
  6. Добавим новое условие. Например, если нам нужно оставить только операции «Реализация», мы указываем: Отбор.ВидОперации(ИмяРеквизита) и конкретное значение или параметр.

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

Способ 2. Программная установка параметров выбора в схеме

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

Разберем пример кода, который модифицирует параметры поля в схеме:


// Получаем поле из схемы компоновки данных
ПолеРТУ = СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Поля.Найти("Ссылка");

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

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

Способ 3. Перехват события «ПриНачалеВыбораЗначения» в таблице отборов

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

Посмотрим на алгоритм реализации в модуле формы:

  1. Выберем на форме элемент таблицы, связанный с отборами компоновщика.
  2. Создадим обработчик события ПриНачалеВыбораЗначения.
  3. Внутри обработчика проанализируем текущие данные строки.

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


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

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

Способ 4. Связи параметров выбора (СвязиПараметровВыбора)

Рассмотрим еще один продвинутый инструмент СКД — Связи параметров выбора. Это свойство полезно, когда отбор в одном поле компоновщика должен зависеть от значения, выбранного в другом поле того же компоновщика. Например, если пользователь сначала выбрал «Организацию», а затем выбирает «Склад», мы можем сделать так, чтобы в списке складов отображались только те, что относятся к выбранной организации.

Выясним, как это настроить в схеме:

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

Использование фиксированных настроек для защиты данных

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

У объекта КомпоновщикНастроек есть свойство ФиксированныеНастройки. Отборы, установленные здесь, не видны пользователю в пользовательском интерфейсе, но они всегда объединяются с пользовательскими отборами по правилу «И». Если вы установите отбор по типу операции в фиксированные настройки, пользователь в принципе не сможет получить данные по другим операциям, даже если попытается изменить настройки вручную.

Итоги и рекомендации

Мы рассмотрели несколько способов управления формой выбора в компоновщике настроек. Подведем итоги:

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

Выбор конкретного метода зависит от архитектуры вашего решения и требований к гибкости интерфейса. В большинстве случаев комбинация первого и второго способов закрывает 90% задач разработчика 1С.

← На главную