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