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