Как программно добавить поле ввода с калькулятором и кнопками регулирования на управляемую форму 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Шаг 1. Создание программных реквизитов формы

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

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


// Массив для добавления реквизитов
ДобавляемыеРеквизиты = Новый Массив;

// Описание типа "Число" (необходимо для калькулятора)
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Число"));
ОписаниеТипаЧисло = Новый ОписаниеТипов(МассивТипов, Новый КвалификаторыЧисла(15, 3));

Для Каждого СтрокаИзТаблицы Из Измерения Цикл
    // Создаем описание нового реквизита
    НовыйРеквизит = Новый РеквизитФормы(СтрокаИзТаблицы.Название, ОписаниеТипаЧисло, , СтрокаИзТаблицы.Заголовок, Истина);
    ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
КонецЦикла;

// Вызываем метод изменения структуры формы (выполняется на сервере)
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);

Важный нюанс: метод ИзменитьРеквизиты() является ресурсоемким. Если вам нужно создать 20 полей, никогда не вызывайте его 20 раз в цикле. Всегда собирайте реквизиты в один массив и вызывайте метод один раз. Это значительно ускорит работу формы.

Шаг 2. Программное создание элементов управления

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


ГруппаПолей = Элементы.ГруппаИзмерения;

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

Обратите внимание на последовательность: свойства КнопкаВыбора и КнопкаРегулирования необходимо устанавливать строго после того, как свойству Вид присвоено значение ВидПоляФормы.ПолеВвода. В противном случае платформа может проигнорировать эти настройки, и кнопки не появятся в интерфейсе.

Шаг 3. Почему данные не отображаются?

Разберем ситуацию, описанную в Сообщении 7: программист создал реквизиты и поля, в отладчике значения в реквизитах есть, но на экране поля пустые. Выясним причину этой проблемы. Чаще всего она кроется в одном из трех факторов:

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

Шаг 4. Настройка «калькулятора» и шага регулирования

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

Дополнительно мы можем настроить поведение кнопок регулирования. Рассмотрим пример, как задать шаг изменения значения и ограничить ввод:


// Устанавливаем шаг изменения значения (например, по 0.5 за клик)
Поле.Шаг = 0.5;

// Ограничиваем ввод, чтобы нельзя было ввести отрицательные значения
Поле.МинимальноеЗначение = 0;
Поле.МаксимальноеЗначение = 1000;

Шаг 5. Оживление интерфейса: установка обработчиков событий

Просто создать поле недостаточно — программа должна реагировать на действия пользователя. Для этого используем метод УстановитьДействие. Посмотрим на пример подключения события при изменении значения:


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

Сама процедура в модуле формы должна выглядеть так:


&НаКлиенте
Процедура Подключаемый_ПриИзмененииДинамическогоПоля(Элемент)
    // Логика обработки изменения
    ТекущееЗначение = ЭтаФорма[Элемент.Имя];
    Сообщить("Пользователь изменил значение поля " + Элемент.Имя + " на " + ТекущееЗначение);
КонецПроцедуры

Подведем итог: для успешного создания интерактивного поля ввода нужно сначала программно создать РеквизитФормы нужного типа (Число), затем добавить ЭлементФормы, связать их через ПутьКДанным и только после установки вида поля включать свойства КнопкаВыбора и КнопкаРегулирования. Соблюдение этой последовательности гарантирует стабильную работу динамического интерфейса.

← На главную