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