Как вывести сообщение пользователю с привязкой к конкретному полю параметра СКД?

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

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

Анализируем проблему: почему сообщение выводится «в воздухе»?

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


Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Поле 'На дату' обязательно для заполнения";
Сообщение.Поле = "НаДату"; // Имя параметра в СКД
Сообщение.УстановитьДанные(ЭтотОбъект); 
Сообщение.Сообщить();

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

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

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

Разберем по шагам, как это настроить в конфигураторе:

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

Что это дает? При попытке сформировать отчет с пустым параметром платформа автоматически:

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

Способ 2. Программный вывод сообщения через ОбработкаПроверкиЗаполнения

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

Рассмотрим пример кода в модуле объекта:


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

Выясним причину, почему даже такой код может не «приклеить» сообщение. На форме отчета параметры обычно выводятся из коллекции ПользовательскиеНастройки. Чтобы сообщение привязалось, в свойстве Поле должен быть указан точный путь к элементу формы. Однако, если форма создается платформой автоматически, индекс элемента в коллекции (Элементы[0]) может меняться в зависимости от настроек пользователя или версии конфигурации.

Способ 3. Создание собственной формы отчета

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

Выполним следующие действия:

  1. Создадим новую форму отчета (ФормаОтчета).
  2. Вынесем параметры СКД на форму (обычно это делается перетаскиванием КомпоновщикНастроек.ПользовательскиеНастройки).
  3. Теперь в коде модуля формы мы можем напрямую обращаться к именам элементов.

Пример кода для модуля формы:


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

Важный нюанс: Фоновые задания и сообщения

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

Рекомендация: Для проверки заполнения параметров всегда старайтесь использовать стандартные механизмы (флаг «Запрещать незаполненные значения») или делайте проверки на клиенте в модуле формы перед вызовом серверного метода формирования. Это гарантирует, что пользователь увидит «красное облачко» именно там, где он допустил ошибку.

Резюме

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

← На главную