Как программно устанавливать элементы на форму в 1С 7.7

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В стандартной платформе 1С:Предприятие 7.7 отсутствует штатная возможность динамического добавления элементов управления (кнопок, флажков, текстовых полей) на форму во время работы приложения. Однако эта задача часто возникает при создании универсальных инструментов или сложных интерфейсов, которые должны подстраиваться под права пользователя или настройки объектов. Решение кроется в использовании внешних компонент, таких как FormEx.dll и 1CPP.dll. Рассмотрим подробно, как реализовать этот функционал.

Подготовка инструментов и концепция

Для того чтобы начать работу с динамическими атрибутами, нам необходимо расширить возможности стандартной формы. Основным инструментом здесь выступает объект РасширениеФормы из библиотеки FormEx. Этот объект позволяет манипулировать окном формы на уровне WinAPI, добавляя в него стандартные элементы управления Windows.

Проанализируем основные этапы процесса:

  1. Подключение внешней компоненты.
  2. Создание объекта расширения формы и привязка его к контексту текущей формы.
  3. Определение координат для новых элементов (часто на основе уже существующих объектов).
  4. Вызов метода добавления атрибута с указанием типа данных и идентификатора.
  5. Настройка внешнего вида (стили, заголовки) и логики (формулы).

Реализация динамического добавления флажков

Рассмотрим практическую ситуацию: нам нужно добавить на форму документа флажки «Упр» и «Бух» только в том случае, если это разрешено в специальном справочнике настроек. Разберем программный код, который выполняет эту задачу в перехватчике события ПослеОткрытия.


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

    // Пытаемся получить стиль оформления от существующего элемента, 
    // чтобы новый флажок выглядел нативно
    Попытка
        Флажок = ФормаРасш.ПолучитьАтрибут("КДИР");
        СтильФлажка = Флажок.Стиль;
    Исключение
        // Если образец не найден, используем стандартное "магическое число" стиля
        СтильФлажка = 1073889283; 
    КонецПопытки;

    // Определяем координаты относительно существующего реквизита "ДатаДок"
    Попытка
        АттрДатаДок = ФормаРасш.ПолучитьАтрибут("ДатаДок");
        ЛевК_АДД = 0; ВерхК_АДД = 0; ШирК_АДД = 0; ВысК_АДД = 0;
        СлойДатаДок = АттрДатаДок.Слой;
        АттрДатаДок.ПолучитьКоординаты(ЛевК_АДД, ВерхК_АДД, ШирК_АДД, ВысК_АДД);
        
        ЛевоК = ЛевК_АДД + ШирК_АДД + 2;
        ВерхК = ?(ВерхК_АДД > 0, ВерхК_АДД, -ВерхК_АДД);    
        ШиринаК = Цел(ШирК_АДД / 2);
        ВысотаК = ВысК_АДД;
    Исключение
        // Значения по умолчанию, если ДатаДок не найдена
        ШиринаК = 20; ЛевоК = 2; ВерхК = 2; ВысотаК = 10;
        СлойДатаДок = "Основной";
    КонецПопытки;

    // Добавляем первый флажок (Управленческий учет)
    ф_флУпр = ФормаРасш.ДобавитьАтрибут("флДокУпрУчет", 12, "Число");
    ф_флУпр.Слой = СлойДатаДок;
    ф_флУпр.УстановитьКоординаты(ЛевоК, ВерхК, ШиринаК, ВысотаК);    
    // Привязываем функцию, которая будет выполняться при нажатии
    ф_флУпр.Формула = "ПриНажатииФлагаУчета(Контекст, ""флДокУпрУчет"", ""ДокУпр"")";
    ф_флУпр.Заголовок = "Упр";
    ф_флУпр.Подсказка = "Документ по упручету";
    ф_флУпр.Стиль = СтильФлажка;
    
    // Устанавливаем начальное значение из реквизита объекта
    Зн = Конт.ПолучитьАтрибут("ДокУпр");
    ф_флУпр.Значение = Зн;

    // Добавляем второй флажок (Бухгалтерский учет) со смещением вправо
    ф_флБух = ФормаРасш.ДобавитьАтрибут("флДокБухУчет", 12, "Число");
    ф_флБух.Слой = СлойДатаДок;
    ЛевоК = ЛевоК + 2 + ШиринаК;  
    ф_флБух.УстановитьКоординаты(ЛевоК, ВерхК, ШиринаК, ВысотаК);    
    ф_флБух.Формула = "ПриНажатииФлагаУчета(Контекст, ""флДокБухУчет"", ""ДокБух"")";
    ф_флБух.Заголовок = "Бух";
    ф_флБух.Подсказка = "Документ по бухучету";
    ф_флБух.Стиль = СтильФлажка;
    
    Зн_бух = Конт.ПолучитьАтрибут("ДокБух");
    ф_флБух.Значение = Зн_бух;

    // Обновляем слои формы для корректной отрисовки
    Конт.Форма.ИспользоватьСлой(СлойДатаДок, 1);
КонецПроцедуры

Разбор технических нюансов

Проанализируем важные детали, использованные в примере кода, которые обеспечивают стабильную работу интерфейса.

1. Работа со стилями (Window Styles).
В методе ДобавитьАтрибут третьим параметром часто передается числовой код стиля. Например, число 1073889283 является комбинацией флагов WinAPI: WS_CHILD (видимость в качестве дочернего окна) и BS_AUTOCHECKBOX (автоматический флажок). Чтобы не высчитывать эти значения вручную, рекомендуется использовать метод ПолучитьАтрибут() от уже существующего на форме аналогичного элемента и копировать его свойство Стиль.

2. Использование слоев.
Для управления видимостью динамических элементов удобно использовать стандартный механизм слоев 1С 7.7. Присваивая добавленному атрибуту свойство Слой, мы можем скрывать или показывать его целиком вместе с другими элементами через команду Форма.ИспользоватьСлой(). Это избавляет от необходимости программно удалять и заново создавать объекты.

3. Обработка событий.
Чтобы программно созданный элемент реагировал на действия пользователя, используется свойство Формула. В него записывается строковое выражение, которое платформа вычислит при изменении состояния элемента. Обратите внимание, что в формулу можно передать Контекст формы, идентификатор созданного элемента и имя реквизита, с которым он должен быть синхронизирован. Это позволяет написать одну универсальную процедуру-обработчик для всех динамических флажков.

Программное управление колонками таблиц

Помимо добавления отдельных кнопок и флажков, часто требуется управлять табличными частями (ТЧ) или списками справочников. Выясним, как это реализовать с помощью 1CPP.

Для программного управления колонками используется объект ТабличноеПоле. Он предоставляет следующие возможности:

Пример изменения параметров колонки:


// Предположим, ТП - это объект ТабличноеПоле, связанное с ТЧ
ТП.УстановитьПараметрыКолонки("Количество", , 100, , , 1); // Установка ширины 100 и видимости

Рекомендации по позиционированию

Одной из главных трудностей при динамическом добавлении элементов является расчет координат. Рассмотрим несколько советов по решению этой задачи:

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

Использование связки FormEx и 1CPP превращает разработку на 1С 7.7 в мощный инструмент, позволяющий создавать интерфейсы, практически не уступающие по гибкости современным версиям платформы.

← На главную