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