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