Как правильно вывести отборы и настройки СКД на форму в 1С 8.3?

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

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

В этой статье мы подробно разберем, как устроен механизм вывода настроек СКД, проанализируем физику процесса работы отборов, выясним причину классической ошибки «пустого отчета» при незаполненных полях ввода и научимся правильно проектировать интерфейс отчетов как с использованием штатных автоформ, так и на кастомных управляемых формах.

Почему «не работает» отбор на форме отчета: разбираем физику процесса

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

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

  1. Основные настройки схемы (КомпоновщикНастроек.Настройки). Когда мы добавляем элемент отбора напрямую в эту коллекцию и выносим соответствующее поле на форму, платформа ожидает строгого заполнения этого поля. Если поле на форме остается пустым, СКД воспринимает это как указание отфильтровать данные по пустому значению (например, Организация = ЗначениеЗаполнено(Ложь) или Организация = ПустаяСсылка). Разумеется, система пытается найти в базе данных документы или справочники с пустой организацией, ничего не находит и возвращает пустой результат.
  2. Пользовательские настройки (КомпоновщикНастроек.ПользовательскиеНастройки). Этот механизм специально разработан для динамического управления фильтрами со стороны пользователя. Когда отбор включен в состав пользовательских настроек, платформа берет управление им на себя. Если пользователь заполняет поле на форме, система автоматически взводит флаг использования этого отбора. Если же поле очищается, флаг использования снимается, и СКД полностью игнорирует данное условие при генерации результирующего SQL-запроса к базе данных.

Таким образом, для корректной работы любых динамических фильтров на форме отчета крайне важно выводить их исключительно через механизм Пользовательских настроек.

Как вывести отборы и параметры на форму без создания самой формы

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

Рассмотрим по шагам, как вывести нужные нам параметры (например, период) или поля отбора (например, склад, организация, контрагент) в верхнюю часть формы отчета в режиме «Быстрого доступа»:

  1. Откроем схему компоновки данных (СКД) нашего отчета и перейдем на вкладку «Настройки».
  2. В нижней части окна выберем вкладку «Отбор» (или «Параметры», если нам нужно вывести на форму, например, период отчета).
  3. Выделим нужный элемент отбора или параметр, который мы хотим предоставить пользователю для быстрого заполнения.
  4. В правом нижнем углу окна настроек найдем и нажмем кнопку «Свойства элемента пользовательских настроек» (она обозначается иконкой с изображением шестеренки и синей стрелки).
  5. В открывшемся диалоговом окне установим флажок «Включать в пользовательские настройки».
  6. В поле «Режим редактирования» обязательно выберем значение «Быстрый доступ». Это укажет платформе на необходимость отображения элемента непосредственно на основной форме отчета, над табличным документом, а не в скрытом дополнительном меню.
  7. Сохраним отчет и запустим его в режиме пользователя.

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

Создание собственной управляемой формы и правильное размещение настроек

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

Разберем по шагам, как правильно спроектировать кастомную управляемую форму отчета и вывести на нее пользовательские настройки СКД:

  1. В окне конфигуратора у нашего объекта «Отчет» перейдем к разделу «Формы» и нажмем кнопку добавления формы.
  2. В мастере создания формы обязательно выберем тип формы — «Форма отчета». Назначим ее основной формой отчета. Платформа автоматически свяжет эту форму с объектом отчета и его компоновщиком настроек.
  3. Обратим внимание на дерево реквизитов формы в правом верхнем углу конфигуратора. Там находится основной реквизит Отчет (тип ОтчетОбъект.<ИмяВашегоОтчета>). Развернув его структуру, мы обнаружим путь к настройкам: Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.
  4. Для того чтобы вывести все быстрые настройки на форму одной таблицей, мы можем просто перетащить мышью элемент ПользовательскиеНастройки в левое дерево элементов формы. Платформа создаст специальную таблицу формы, которая будет автоматически синхронизироваться со схемой компоновки.
  5. Если мы хотим сделать интерфейс более компактным и изящным, перетащим в дерево элементов конкретно коллекцию элементов: Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.
  6. Выделим созданную таблицу на форме и в ее свойствах (в правой панели свойств) найдем параметр «Режим отображения». Установим для него значение «Быстрый доступ». В этом случае в таблице на форме будут отображаться исключительно те элементы, для которых мы ранее в схеме компоновки взвели флажок быстрого доступа.

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

Проанализируем следующий программный код, который размещается в модуле нашей управляемой формы отчета (поможет пошаговая отладка и анализ значений в коде):


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	// Проверим, инициализированы ли пользовательские настройки
	Если Отчет.КомпоновщикНастроек.ПользовательскиеНастройки <> Неопределено Тогда
		УстановитьНачальныйОтборПоОрганизацииНаСервере();
	КонецЕсли;
	
КонецПроцедуры

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

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

Интеграция с БСП (Библиотека Стандартных Подсистем)

Если мы разрабатываем отчет для современной тиражной конфигурации на платформе «1С:Предприятие 8.3» (например, «1С:ERP Управление предприятием», «1С:Комплексная автоматизация», «1С:Управление торговлей» или «1С:Бухгалтерия предприятия»), то создание индивидуальных форм для каждого отчета является грубой архитектурной ошибкой.

В составе БСП уже присутствует мощнейшая универсальная форма отчета (ОбщаяФорма.ФормаОтчета). Она предоставляет пользователю беспрецедентные возможности «из коробки»:

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

  1. Вообще не создавать форму у объекта отчета в конфигураторе. Оставить поле «Форма отчета» пустым.
  2. Зарегистрировать наш отчет в системе как Дополнительный отчет или обработку в режиме пользователя («НСИ и администрирование» -> «Печатные формы, отчеты и обработки»).
  3. Для тесной интеграции с БСП прописать в модуле объекта нашего отчета экспортную процедуру инициализации настроек, чтобы система знала, как именно подключать данный отчет к общим механизмам программы.

Посмотрим на пример шаблона кода в модуле объекта отчета для интеграции с механизмами БСП:


#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

// Определяет настройки для интеграции отчета с БСП.
//
// Параметры:
//   Настройки - Структура - настройки интеграции.
Процедура ПриОпределенииНастроекПервичногоЗаполнения(Настройки) Экспорт
	
	Настройки.Размещение.Добавить();
	Настройки.ДоопределитьНастройки = Истина;
	
КонецПроцедуры

#КонецЕсли

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

← На главную