Как проверить заполнение обязательных параметров отчета в обычных формах 1С и избежать ошибок?

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

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

Основная проблема заключается в том, что даже при установке флажков «Использование всегда» и «Запрещать незаполненные значения» во вкладке «Параметры» СКД, система может выдавать общую ошибку, не указывая, какой именно параметр не заполнен. Чтобы предоставить пользователю более дружелюбный интерфейс и предотвратить обращение к серверу с некорректными данными, нам потребуется реализовать проверки как на клиентской, так и на серверной стороне.

1. Клиентская проверка в модуле формы отчета

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

Использование обработчика «ОбработкаПроверкиЗаполнения»

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

  1. Расположение обработчика: Добавьте процедуру ОбработкаПроверкиЗаполнения в модуль формы отчета. Даже если форма отчета была создана автоматически платформой, вы можете создать или дополнить этот обработчик.

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

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

Свойство "Проверка заполнения" реквизитов формы

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

  1. В конфигураторе: Откройте форму отчета. Выберите нужный реквизит (который является параметром). В палитре свойств найдите свойство "Проверка заполнения" и установите его в "Выдавать ошибку".

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

Программная проверка с использованием ЗначениеЗаполнено()

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

  1. Место использования: Обычно это клиентская процедура, которая запускает формирование отчета (например, &НаКлиенте Процедура Сформировать()).

  2. Пример кода:

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

Проверка типа значения

Иногда недостаточно просто убедиться, что поле не пустое. Важно, чтобы его значение соответствовало ожидаемому типу (например, ссылка на элемент справочника, число, дата). Для этого мы можем использовать функции ТипЗнч() и Тип().

  1. Пример проверки типа:

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

2. Настройки СКД (серверная часть)

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

Параметр "Запрещать незаполненные значения"

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

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

  2. Взаимодействие: Эта проверка является дополнением к клиентской. Клиентская проверка даст более понятное сообщение пользователю, а серверная гарантирует целостность данных, даже если клиентская проверка по какой-то причине была обойдена.

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

Если некоторые параметры отчета не являются строго обязательными, и их отсутствие должно не приводить к ошибке, а лишь исключать соответствующее условие из запроса, мы можем использовать фигурные скобки {ГДЕ ...} в тексте запроса СКД.

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

  2. Пример в запросе СКД:

    
    ВЫБРАТЬ
        Заказ.Номер,
        Заказ.Дата,
        Заказ.Контрагент
    ИЗ
        Документ.ЗаказПокупателя КАК Заказ
    {ГДЕ Заказ.Контрагент = &ПараметрКонтрагент}
    {ГДЕ Заказ.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания}
    

    В этом примере, если параметр &ПараметрКонтрагент не заполнен, условие Заказ.Контрагент = &ПараметрКонтрагент будет пропущено. Аналогично для дат.

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

3. Взаимодействие клиентской и серверной проверок

Наиболее надежный и удобный для пользователя подход – это комбинация клиентских и серверных проверок. Мы рекомендуем использовать многоуровневую систему валидации:

  1. Клиентская проверка в форме отчета: Это первый и основной барьер. Используйте свойство "Проверка заполнения" и обработчик ОбработкаПроверкиЗаполнения в модуле формы. Это позволит:

    • Дать пользователю немедленную и точную обратную связь о незаполненных полях.
    • Предотвратить отправку некорректных данных на сервер, что снижает нагрузку и повышает производительность.
    • Создать более приятный пользовательский опыт, так как ошибки обнаруживаются до попытки формирования отчета.
  2. Серверная проверка в СКД: Настройки СКД, такие как "Запрещать незаполненные значения", дополняют клиентскую проверку. Они служат "страховкой", если клиентская логика была обойдена или если отчет формируется из кода без использования интерактивной формы. Это гарантирует, что даже программное формирование отчета с незаполненными обязательными параметрами приведет к ошибке, а не к неверным данным.

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

← На главную