Как активировать стандартные команды СКД в существующей обычной форме 1С

Программист 1С v8.3 (Обычные формы)
← На главную

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

Выясним причину: почему кнопки неактивны

В обычных формах 1С «магия» автоматической связи интерфейса и логики СКД работает только при соблюдении ряда условий. Если форма изначально создавалась как произвольная или как форма отчета без использования СКД, платформа не создаст необходимые связи автоматически. Основная причина неактивности кнопок заключается в том, что командная панель не понимает, к какому объекту ей обращаться для выполнения действия, и не находит инициализированный КомпоновщикНастроек.

Шаг 1. Настройка основного реквизита формы

Рассмотрим порядок действий с реквизитами. Для того чтобы форма начала функционировать как форма отчета, у неё должен быть задан основной реквизит. Разберем, как это проверить:

  1. Откроем конструктор формы и перейдем на закладку Реквизиты.
  2. Убедимся, что в списке присутствует реквизит с типом ОтчетОбъект.[ИмяВашегоОтчета]. Обычно он называется ОтчетОбъект.
  3. Посмотрим на его начертание: он должен быть выделен жирным шрифтом. Это означает, что он назначен основным реквизитом формы. Если это не так, нажмем на нем правой кнопкой мыши и выберем пункт «Установить как основной».
  4. В свойствах самой формы (в корне дерева свойств) проверим поле Данные. Там также должен быть указан этот реквизит.

Шаг 2. Добавление и инициализация Компоновщика настроек

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

Добавим реквизит формы с именем КомпоновщикНастроек и типом КомпоновщикНастроекКомпоновкиДанных. Однако простого добавления недостаточно — его нужно связать со схемой. Выполним инициализацию в модуле формы в процедуре ПриОткрытии:


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

Шаг 3. Настройка командной панели и источника действий

Посмотрим на свойства командной панели, где расположены ваши кнопки. Чтобы стандартные действия (например, ДействиеСформировать) заработали, у командной панели должен быть правильно указан Источник действий.

  1. Выберем командную панель на форме.
  2. В палитре свойств найдем параметр Источник действий.
  3. Укажем там наш основной реквизит — ОтчетОбъект.
  4. Для самих кнопок на панели убедимся, что в свойстве Действие выбрано стандартное значение (например, Сформировать), а не пустая ссылка или пользовательская процедура, если мы хотим использовать штатный механизм.

Шаг 4. Программный вывод как универсальное решение

Если по каким-то причинам стандартные механизмы активации кнопок не подходят (например, сложная логика подготовки данных), мы можем использовать полностью программный подход. В этом случае мы создаем обычную кнопку, называем её «Сформировать» и прописываем логику компоновки вручную. Проанализируем пример кода для вывода результата в ПолеТабличногоДокумента:


Процедура ДействиеСформировать(Кнопка)
    // Очищаем табличный документ на форме
    ЭлементыФормы.Результат.Очистить();
    
    Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Подготавливаем данные для компоновки
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);
    
    // Инициализируем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    
    // Выводим результат в поле табличного документа
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ЭлементыФормы.Результат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры

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

Резюме для быстрой проверки

Если вы решили переделать отчет на СКД в старой форме, пройдитесь по этому чек-листу:

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

← На главную