Как отобразить вид сравнения "Равно" для отбора СКД прямо на форме и сделать его доступным для изменения?

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

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

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

Решение 1: Отображение вида сравнения для индивидуального пользователя

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

  1. Откройте отчет: Запустите нужный отчет в режиме "1С:Предприятие".

  2. Вызовите форму изменения настроек: Нажмите на кнопку "Еще" (или аналогичную, в зависимости от конфигурации) в командной панели формы отчета и выберите пункт "Изменить форму...". Также для анализа структуры можно использовать Редактор форм в режиме предприятия.

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

  4. Установите видимость для "Вида сравнения": Разверните найденный элемент отбора. Среди его свойств вы увидите пункт "Вид сравнения". Установите для него флажок видимости.

  5. Примените изменения: Нажмите кнопку "ОК".

После выполнения этих действий, поле "Вид сравнения" для выбранного отбора должно появиться на форме отчета и быть доступным для изменения. Эта настройка сохранится для текущего пользователя. Это подтверждается сообщениями на форуме, где пользователь успешно применил этот метод (сообщение 5).

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

Решение 2: Отображение вида сравнения для всех пользователей и программно

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

Программное управление отображением элементов отбора

Система Компоновки Данных предоставляет широкие возможности для программного управления настройками отчета. Ключевым свойством для управления отображением элементов настройки на форме является РежимОтображенияЭлементаНастройкиКомпоновкиДанных. Разберем его подробнее:

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

Пошаговая реализация:

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

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

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

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

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

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

Реализация через собственную форму отчета

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

Пошаговая реализация:

  1. Создание новой управляемой формы: Создайте новую управляемую форму для вашего отчета. Это может быть новая общая форма или форма для конкретного объекта отчета.

  2. Размещение элементов управления: На созданной форме разместите необходимые элементы управления для отбора. Например:

    • Поле ввода для значения отбора (например, "Контрагент").

    • Поле выбора, содержащее доступные виды сравнения (например, "Равно", "Не равно", "В списке", "Содержит" и т.д.). Заполнить это поле можно программно или статически на форме.

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

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

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

Особенности работы со стандартными формами отчетов в БСП

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

Мы проанализируем, как это работает в БСП:

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

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

  3. Программное создание элементов формы: Для некоторых видов сравнения, которые не отображаются по умолчанию, может потребоваться программно создавать элементы управляемой формы (например, поле выбора) и привязывать их к соответствующим свойствам отбора СКД. Это особенно актуально, когда стандартные элементы формы не предоставляют нужной гибкости или скрыты из-за внутренней логики БСП.

  4. Контекстное меню: В некоторых версиях конфигураций на БСП (например, УТ 11.2 и более поздние) выбор вида сравнения для отбора может быть реализован через контекстное меню, вызываемое правым кликом мыши на поле отбора. Это не совсем "прямо на форме", но более удобно, чем переход в полную форму настроек.

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

Мы выяснили, что задача отображения вида сравнения "Равно" на форме отчета СКД имеет несколько решений. Для индивидуального пользователя подойдет быстрая настройка через "Изменить форму...". Если же цель – глобальное применение для всех пользователей и полная гибкость, то следует рассмотреть программное управление настройками СКД в модуле формы или, для полного контроля, создание собственной управляемой формы отчета. При работе с конфигурациями на базе БСП мы должны учитывать ее архитектуру и использовать расширения для модификации стандартного поведения.

← На главную