Как правильно использовать предопределенные значения и выводить уведомления пользователю в отчетах СКД?

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

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

Разбор синтаксиса предопределенных значений в СКД

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


Если((_ВидЗаказа = ПредопределенноеЗначение("Перечисление._ВидЗаказа._ЗаказНаМебель")) И (_СтадияЗаказа = ПредопределенноеЗначение("Перечисление._СтадияЗаказа._ЗаказВРаботе")) ИЛИ 
    (_ВидЗаказа = ПредопределенноеЗначение("Перечисление._ВидЗаказа._ЗаказНаМебель")) И (_СтадияЗаказа = ПредопределенноеЗначение("Перечисление._СтадияЗаказа._ЗаказУтвержденКлиентом")) ИЛИ
    (_ВидЗаказа = ПредопределенноеЗначение("Перечисление._ВидЗаказа._ЗаказНаМебель")) И (_СтадияЗаказа = ПредопределенноеЗначение("Перечисление._СтадияЗаказа._ОжиданиеОтгрузки"))) Тогда
    // Логика формирования данных
КонецЕсли;

Разберем, почему такой подход может не работать в контексте СКД и где именно допущены ошибки:

  1. Место использования: В СКД есть два принципиально разных места для написания условий. Если вы пишете запрос в Наборе данных - запрос, функция ПредопределенноеЗначение там не работает. Вместо нее используется конструкция ЗНАЧЕНИЕ(Перечисление.Имя.Значение). Если же вы настраиваете Вычисляемое поле или Выражение в параметрах, то используется именно ПредопределенноеЗначение, но в виде строки.
  2. Лишние символы: Обратим внимание на подчеркивания. В конфигураторе метаданные часто имеют имена без начального подчеркивания. Если ваше перечисление называется ВидЗаказа, то обращение к нему как к _ВидЗаказа приведет к ошибке, так как система не найдет объект с таким именем.
  3. Типизация: Если поле в наборе данных имеет тип, отличный от ссылки на перечисление (например, Строка), сравнение с предопределенным значением всегда будет возвращать Ложь.

Оптимизация условий через параметры

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

Выполним следующие шаги для оптимизации:

  1. Перейдем на закладку Параметры в СКД.
  2. Создадим новый параметр, например, СтадииЗаказов.
  3. Установим тип значения этого параметра как Ссылка на ваше перечисление и включим флаг Доступен список значений.
  4. В тексте запроса или в настройках отбора используем простое условие: СтадияЗаказа В (&СтадииЗаказов).

Проанализируем преимущества: теперь, если в компании появится новая стадия "Заказ Готов к Выдаче", вам не придется переписывать код. Достаточно будет просто добавить это значение в список параметров отчета.

Реализация уведомлений для пользователя: Резерв vs Остатки

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

Рассмотрим правильные способы реализации такой бизнес-логики.

Способ 1: Условное оформление (Визуальный акцент)

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

  1. Перейдем на закладку Настройки, затем на вкладку Условное оформление.
  2. Добавим новый элемент оформления.
  3. В поле Оформление выберем, например, Цвет текста — Красный и Шрифт — Жирный.
  4. В поле Условие пропишем: Резерв Больше Остаток.
  5. В поле Оформляемые поля выберем те колонки, которые должны загореться красным.

Также в условном оформлении можно использовать свойство Текст. Если условие выполняется, в определенной колонке вместо цифр или пустоты появится ваша фраза: "Всё плохо, нужно больше работать".

Способ 2: Вычисляемое поле (Статус данных)

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

  1. Перейдем на закладку Вычисляемые поля.
  2. Добавим поле с заголовком АнализДостаточности.
  3. В колонке Выражение напишем следующий код:

Выбор 
    Когда Резерв > Остаток Тогда "Всё плохо, нужно больше работать" 
    Иначе "Все в порядке" 
Конец

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

Способ 3: Программный анализ после вывода

Если же бизнес-требование жестко настаивает именно на сообщении в окне, это нужно делать в модуле отчета, в процедуре ПриКомпоновкеРезультата. Рассмотрим алгоритм действий:

  1. Отключаем стандартную обработку вывода.
  2. Инициализируем процессор компоновки и выводим результат в промежуточную таблицу значений или дерево.
  3. Проходим циклом по результату и проверяем условие Резерв > Остаток.
  4. Если нашли хотя бы одну такую строку, устанавливаем флаг.
  5. Выводим данные пользователю и в конце, если флаг установлен, используем метод ОбщегоНазначенияКлиентСервер.СообщитьПользователю().

Пример кода в модуле отчета:


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

Подведение итогов

Проанализировав ситуацию, мы выяснили, что для корректной работы условий по перечислениям необходимо следить за контекстом использования функций ЗНАЧЕНИЕ и ПредопределенноеЗначение, а также избегать опечаток в именах объектов метаданных. Что касается уведомлений пользователю, наиболее эргономичным и "правильным" с точки зрения платформы 1С 8.3 является использование Условного оформления. Это позволяет пользователю мгновенно фокусировать внимание на проблемных зонах отчета, не отвлекаясь на закрытие лишних диалоговых окон.

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

← На главную