Как программно создать флажок на обычной форме и настроить запуск отчета с отборами

Программист 1С v8.3 (Обычные формы) Управленческий учет Сфера услуг, туризм и социальный сектор
← На главную

При работе с обычными формами (ОФ) в 1С:Предприятии 8 программисты часто сталкиваются с ситуацией, когда статическое размещение элементов в конфигураторе приводит к нежелательным визуальным эффектам. Например, при изменении видимости элементов форма может "плыть", появляются лишние полосы прокрутки или пустые области. В таких случаях оптимальным решением является программное создание элементов управления. В данной статье мы разберем, как правильно создать флажок, привязать его к данным, назначить обработчик события и программно сформировать отчет с нужными параметрами, особенно в контексте отраслевых решений, таких как Альфа-Авто.

Программное добавление флажка на форму

Рассмотрим ситуацию, когда нам необходимо добавить флажок на существующую форму отчета только при определенных условиях. Для этого мы используем коллекцию ЭлементыФормы. Важно понимать, что при программном добавлении нам нужно четко определить координаты элемента (Лево, Верх, Ширина, Высота) и его родителя (например, панель или сама форма).

Проанализируем пример кода для добавления флажка:


// Проверяем наличие реквизита в метаданных, чтобы избежать ошибок
Если ОтчетОбъект.Метаданные().Реквизиты.Найти("ВыводитьИнформациюОбОплате") <> Неопределено Тогда

    // Добавляем элемент управления типа "Флажок"
    // Параметры: Тип, Имя, Видимость, Родитель (ЭлементыФормы.ПанельФильтра)
    ФлагОплата = ЭлементыФормы.Добавить(Тип("Флажок"), "ВыводитьИнформациюОбОплате", Истина, ЭлементыФормы.ПанельФильтра);
    
    // Устанавливаем геометрические параметры
    ФлагОплата.Лево    = 6;
    ФлагОплата.Верх    = 77;
    ФлагОплата.Ширина  = 250;
    ФлагОплата.Высота  = 15;
    ФлагОплата.Заголовок = "Выводить информацию об оплате документа";
    
    // Привязываем элемент к реквизиту объекта
    ФлагОплата.Данные = "ВыводитьИнформациюОбОплате";
    
    // Устанавливаем начальное значение из реквизита объекта
    ФлагОплата.Значение = ОтчетОбъект.ВыводитьИнформациюОбОплате;

КонецЕсли;

Обратим внимание на свойство Данные. В обычных формах установка этого свойства в виде строки с именем реквизита ("ВыводитьИнформациюОбОплате") создает двухстороннюю связь между элементом управления и данными объекта. Если же использовать только свойство Значение, автоматической синхронизации не произойдет, и состояние флажка придется отслеживать вручную.

Назначение обработчика события

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

Выясним причину ошибки: если написать Элемент.ПриИзменении = ИмяПроцедуры(), система воспримет это как вызов функции и попытается присвоить результат выполнения свойству, что приведет к ошибке. Правильный подход заключается в использовании объекта Действие.

Рассмотрим правильный синтаксис назначения события:


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

Сама процедура в модуле формы должна иметь стандартный набор параметров:


Процедура ВыводитьИнформациюОбОплатеПриИзменении(Элемент)
    // Здесь можно прописать дополнительную логику при смене состояния флажка
    // Поскольку мы использовали свойство "Данные", реквизит объекта обновится автоматически
КонецПроцедуры

Решение проблемы "искажения" формы (Привязки)

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

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


// Привязываем правую границу флажка к правой границе панели (или формы)
// Параметры: ГраницаЭлемента, ЭлементСвязи, ГраницаЭлементаСвязи
ЭлементыФормы.ВыводитьИнформациюОбОплате.УстановитьПривязку(ГраницаЭлемента.Право, ЭлементыФормы.ПанельФильтра, ГраницаЭлемента.Право);

Это гарантирует, что при растягивании формы элемент будет корректно масштабироваться, не вызывая появления скроллбаров.

Программный запуск отчета с отборами в Альфа-Авто

В конфигурациях на базе Альфа-Авто отчеты часто строятся с использованием ПостроителяОтчета. Для программного открытия такого отчета с уже заполненными фильтрами (например, по контрагенту) недостаточно просто открыть форму. Нужно создать объект отчета, заполнить его настройки и передать в общую форму.

Разберем по шагам процесс программного формирования отчета:

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

Посмотрим на практический пример реализации процедуры запуска:


Процедура ЗапускОтчетаДвиженияВзаиморасчетов(Дата, Контрагент) Экспорт

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

КонецПроцедуры

Важные нюансы и типичные ошибки

При работе с обычными формами важно помнить следующее:

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

← На главную