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