Как ограничить ввод числового значения в параметр отчета СКД, чтобы оно не превышало 100?

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

При разработке отчетов на Системе Компоновки Данных (СКД) часто возникает задача не просто обработать введенное пользователем значение параметра, но и ограничить сам ввод, чтобы предотвратить ввод некорректных данных на этапе работы с формой. Например, требуется, чтобы числовой параметр "Процент" никогда не превышал 100. Стандартные механизмы СКД не предоставляют прямого и простого способа для клиентской валидации ввода в поле параметра, отображаемого в стандартной форме настроек отчета.

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

Анализируем стандартные возможности СКД и их ограничения

Прежде чем перейти к решениям, давайте выясним, почему эта задача не имеет простого "коробочного" решения в 1С для отчетов СКД.

  1. Тип значения параметра (Число(5,2) и т.д.)

    Мы можем установить для параметра СКД тип значения, например, Число(5,2), что означает число до пяти знаков, из которых два после запятой. Это влияет на хранение данных и их отображение, но, к сожалению, не ограничивает максимальное вводимое значение. Пользователь всё равно может ввести "150,00" или "999,99", и система 1С попытается преобразовать это значение к заданному типу. Ограничение длины (например, 3 символа) позволит ввести "999", но не "100" как верхний предел. Это значит, что настройка типа не решает нашу задачу ограничения значения до 100.

  2. Доступные значения для параметра

    СКД позволяет задать список "Доступных значений" для параметра. В этом случае пользователь сможет выбрать значение только из предопределенного списка. Однако этот подход практически неприменим для числовых диапазонов, где требуется гибкость ввода. Представьте, если бы нам пришлось вбивать в список все числа от 0.01 до 100 с точностью до сотых – это тысячи значений, что делает интерфейс крайне неудобным и недружелюбным.

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

Подход 1: Программная корректировка значения параметра при компоновке или в выражении СКД

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

  1. Корректировка в обработчике ПриКомпановкеРезультата

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

    Рассмотрим пример кода, который можно разместить в модуле объекта отчета:

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

    Преимущества: Простота реализации, гарантированное использование корректного значения в отчете.

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

  2. Использование выражения для параметра в СКД

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

    Посмотрим, как это сделать:

    • Откройте схему компоновки данных.
    • Перейдите на вкладку "Параметры".
    • Найдите ваш параметр "Процент".
    • В колонке "Выражение" для этого параметра укажите: Мин(&Процент, 100)

    В этом случае, если пользователь введет значение, например, 150,00, функция Мин выберет меньшее из двух значений (150 и 100), и в запрос будет передано 100. Если пользователь введет 50,00, то в запрос пойдет 50.

    Преимущества: Не требует написания кода в модуле отчета, настройка осуществляется непосредственно в схеме СКД, что упрощает переносимость.

    Недостатки: Как и в предыдущем случае, этот метод не ограничивает ввод на стороне клиента. Пользователь увидит свое "150,00" в поле, но отчет будет использовать "100,00".

Подход 2: Использование обработчиков событий формы отчета через БСП (Библиотеку Стандартных Подсистем)

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

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

  1. Регистрация обработчиков в процедуре ОпределитьНастройкиФормы

    Процедура ОпределитьНастройкиФормы в модуле объекта отчета является первой точкой входа для настройки поведения формы. Здесь мы указываем системе, какие события формы мы хотим перехватывать и какими процедурами их обрабатывать.

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

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

    Мы должны найти элемент формы, соответствующий нашему параметру "Процент". Имя элемента формы часто формируется по определенным правилам БСП или зависит от пути к данным параметра.

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

    Важно: Директива &НаКлиенте обязательна для процедур, которые будут выполняться на клиентской стороне (например, при изменении поля ввода). Имя элемента формы или его путь к данным могут варьироваться в зависимости от реализации отчета и версии БСП.

  3. Использование события Подключаемый_ЭлементНастройки_ПриИзменении

    Это событие является частью механизма БСП для обработки изменений в элементах настроек. Оно позволяет централизованно реагировать на изменения параметров отчета.

    
    // В модуле объекта отчета
    // Обработчик события формы "Подключаемый_ЭлементНастройки_ПриИзменении"
    // Вызывается на сервере при изменении элемента настройки (например, параметра)
    Процедура Подключаемый_ЭлементНастройки_ПриИзменении(ЭлементНастройки, СтандартнаяОбработка)
    
        // ЭлементНастройки - это объект, представляющий измененную настройку (например, параметр).
        // Его Имя соответствует имени параметра в схеме СКД.
        Если ЭлементНастройки.Имя = "Процент" Тогда 
            Если ЭлементНастройки.Значение > 100 Тогда
                Сообщить("Значение параметра 'Процент' не может быть больше 100!", СтатусСообщения.Важное);
                ЭлементНастройки.Значение = 100; // Корректируем значение параметра
                СтандартнаяОбработка = Ложь; // Отменяем стандартную обработку, чтобы зафиксировать наше значение
            КонецЕсли;
        КонецЕсли;
    
    КонецПроцедуры
    

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

  4. Проверка значения перед формированием отчета на сервере (ПередФормированиемОтчетаНаСервере)

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

    
    // В модуле объекта отчета
    // Обработчик события формы "ПередФормированиемОтчетаНаСервере"
    Процедура ПередФормированиемОтчетаНаСервере(Отказ, КомпоновщикНастроек, ДополнительныеПараметры)
    
        // Получаем значение параметра "Процент" из настроек компоновщика
        Для Каждого ПараметрНастройки Из КомпоновщикНастроек.Настройки.ПараметрыДанных Цикл
            Если ПараметрНастройки.Имя = "Процент" Тогда
                Если ПараметрНастройки.Значение > 100 Тогда
                    Сообщить("Значение параметра 'Процент' не может превышать 100. Отчет не может быть сформирован!", СтатусСообщения.Важное);
                    Отказ = Истина; // Устанавливаем Отказ = Истина, чтобы отменить формирование отчета
                    Возврат; // Выходим из процедуры
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    
    КонецПроцедуры
    

    Преимущества: Гарантирует, что отчет не будет сформирован с некорректными данными, предоставляет четкую обратную связь пользователю.

    Недостатки: Валидация происходит поздно, только при попытке сформировать отчет.

Подход 3: Вызов исключения при некорректном вводе

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

Мы можем реализовать этот подход в обработчиках, которые срабатывают на сервере перед формированием отчета, например, в ПриКомпановкеРезультата или ПередФормированиемОтчетаНаСервере.

Рассмотрим пример в ПриКомпановкеРезультата:


// В модуле объекта отчета
Процедура ПриКомпановкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    Если КомпоновщикНастроек.Настройки.ПараметрыДанных.Процент.Значение > 100 Тогда
        Сообщить("Введено некорректное значение для параметра 'Процент'. Максимальное значение - 100.", СтатусСообщения.Ошибка);
        ВызватьИсключение "Ошибка формирования отчета: значение параметра 'Процент' не может превышать 100.";
    КонецЕсли;

КонецПроцедуры

Преимущества: Прозрачная и однозначная обратная связь для пользователя, невозможность сформировать отчет с невалидными данными.

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

Когда стоит рассмотреть произвольную форму отчета

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

Преимущества произвольной формы:

Недостатки произвольной формы:

Рассмотрим гипотетический код для модуля произвольной формы отчета:


// В модуле формы отчета (для произвольной формы)
&НаКлиенте
Процедура ПроцентПриИзменении(Элемент)
    // Элемент - это поле формы, связанное с нашим параметром
    Если Элемент.Значение > 100 Тогда
        Сообщить("Значение процента не может быть больше 100!", СтатусСообщения.Внимание);
        Элемент.Значение = 100; // Автоматически корректируем введенное значение
    КонецЕсли;
КонецПроцедуры

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

Выводы и рекомендации

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

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

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

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

← На главную