Программное управление реквизитами формы
В этой статье мы рассмотрим, как программно управлять реквизитами формы в 1С: создавать новые реквизиты, удалять существующие и связывать их с элементами формы.
При разработке конфигураций часто возникает необходимость динамически изменять состав реквизитов формы. Например, когда структура данных определяется настройками или бизнес-правилами. В этой статье мы разберем базовые принципы программного управления реквизитами.
Основные методы, которые мы будем использовать:
ПолучитьРеквизиты()
- получение списка существующих реквизитов формыИзменитьРеквизиты()
- добавление и удаление реквизитовРеквизитФормы
- конструктор для создания описания реквизита
Разбор ключевых моментов кода:
1. Получение списка реквизитов и поиск последнего номера:
Функция ПолучитьНомерПоследнегоРеквизита()
МаксНомер = 0;
// Получаем все реквизиты формы
Реквизиты = ЭтаФорма.ПолучитьРеквизиты();
Для Каждого Реквизит Из Реквизиты Цикл
Если СтрНачинаетсяС(Реквизит.Имя, "Реквизит") Тогда
НомерСтрокой = Сред(Реквизит.Имя, СтрДлина("Реквизит") + 1);
НомерТекущий = Число(НомерСтрокой);
Если НомерТекущий > МаксНомер Тогда
МаксНомер = НомерТекущий;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат МаксНомер;
КонецФункции
В этой функции мы:
- Получаем список всех реквизитов формы
- Ищем реквизиты с именем, начинающимся на "Реквизит"
- Извлекаем номер из имени и находим максимальный
2. Создание нового реквизита:
// Создаем новый реквизит
НовыйРеквизит = Новый РеквизитФормы(ИмяНового,
Новый ОписаниеТипов("Строка"),
,
"Реквизит " + НомерНового);
// Добавляем реквизит в форму
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(НовыйРеквизит);
ИзменитьРеквизиты(МассивРеквизитов, );
Здесь демонстрируется:
- Создание описания реквизита с помощью конструктора
РеквизитФормы
- Установка типа данных через
ОписаниеТипов
- Добавление реквизита в форму методом
ИзменитьРеквизиты
3. Создание элемента формы для реквизита:
// Создаем поле ввода для реквизита
НовоеПоле = Элементы.Добавить(ИмяНового, Тип("ПолеФормы"));
НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
НовоеПоле.ПутьКДанным = ИмяНового;
Этот код показывает:
- Создание элемента формы для отображения реквизита
- Настройку вида элемента как поля ввода
- Связь элемента с реквизитом через свойство
ПутьКДанным
4. Удаление реквизита:
// Находим элемент формы для удаления
УдаляемыйЭлемент = Элементы.Найти(ИмяУдаляемого);
Если УдаляемыйЭлемент <> Неопределено Тогда
Элементы.Удалить(УдаляемыйЭлемент);
КонецЕсли;
// Удаляем реквизит
МассивУдаляемых = Новый Массив;
МассивУдаляемых.Добавить(ИмяУдаляемого);
ИзменитьРеквизиты(, МассивУдаляемых);
В процессе удаления:
- Сначала удаляется элемент формы
- Затем удаляется сам реквизит
- Все операции выполняются с проверками
Важные моменты при работе с реквизитами:
- Реквизиты можно добавлять только на сервере
- При удалении сначала нужно удалить элемент формы, а потом реквизит
- Необходимо следить за уникальностью имен реквизитов
- Рекомендуется добавлять проверки перед удалением
&НаСервере
Процедура ПриСозданииНаСервере(Отказ)
// Настройка основных параметров формы
ЭтаФорма.Заголовок = "Реквизиты формы. Программное создание и удаление, получение списка реквизитов";
ЭтаФорма.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
// Создание команд для кнопок
КомандаСоздать = Команды.Добавить("СоздатьРеквизит");
КомандаСоздать.Действие = "СоздатьРеквизит";
КомандаСоздать.Заголовок = "Создать реквизит";
КомандаУдалить = Команды.Добавить("УдалитьРеквизит");
КомандаУдалить.Действие = "УдалитьРеквизит";
КомандаУдалить.Заголовок = "Удалить реквизит";
// Добавление кнопок на форму
КнопкаСоздать = Элементы.Добавить("КнопкаСоздать", Тип("КнопкаФормы"));
КнопкаСоздать.ИмяКоманды = "СоздатьРеквизит";
КнопкаУдалить = Элементы.Добавить("КнопкаУдалить", Тип("КнопкаФормы"));
КнопкаУдалить.ИмяКоманды = "УдалитьРеквизит";
КонецПроцедуры
// Функция для поиска максимального номера среди существующих реквизитов
&НаСервере
Функция ПолучитьНомерПоследнегоРеквизита()
МаксНомер = 0;
Реквизиты = ЭтаФорма.ПолучитьРеквизиты();
Для Каждого Реквизит Из Реквизиты Цикл
// Ищем только реквизиты с нужным именем
Если СтрНачинаетсяС(Реквизит.Имя, "Реквизит") Тогда
НомерСтрокой = Сред(Реквизит.Имя, СтрДлина("Реквизит") + 1);
НомерТекущий = Число(НомерСтрокой);
Если НомерТекущий > МаксНомер Тогда
МаксНомер = НомерТекущий;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат МаксНомер;
КонецФункции
// Обработчик нажатия кнопки создания реквизита
&НаКлиенте
Процедура СоздатьРеквизит(Команда)
СоздатьРеквизитНаСервере();
КонецПроцедуры
// Серверная процедура создания нового реквизита
&НаСервере
Процедура СоздатьРеквизитНаСервере()
// Получаем следующий номер для реквизита
НомерНового = ПолучитьНомерПоследнегоРеквизита() + 1;
ИмяНового = "Реквизит" + Формат(НомерНового, "ЧГ=0");
// Создаем и добавляем новый реквизит
НовыйРеквизит = Новый РеквизитФормы(ИмяНового, Новый ОписаниеТипов("Строка"), , "Реквизит " + НомерНового);
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(НовыйРеквизит);
ИзменитьРеквизиты(МассивРеквизитов, );
// Создаем поле ввода для отображения реквизита
НовоеПоле = Элементы.Добавить(ИмяНового, Тип("ПолеФормы"));
НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
НовоеПоле.ПутьКДанным = ИмяНового;
Сообщить("Создан реквизит " + ИмяНового);
КонецПроцедуры
// Обработчик нажатия кнопки удаления реквизита
&НаКлиенте
Процедура УдалитьРеквизит(Команда)
УдалитьРеквизитНаСервере();
КонецПроцедуры
// Серверная процедура удаления реквизита
&НаСервере
Процедура УдалитьРеквизитНаСервере()
// Получаем номер последнего реквизита
НомерПоследнего = ПолучитьНомерПоследнегоРеквизита();
Если НомерПоследнего = 0 Тогда
Сообщить("Нет реквизитов для удаления");
Возврат;
КонецЕсли;
// Формируем имя для удаления
ИмяУдаляемого = "Реквизит" + Формат(НомерПоследнего, "ЧГ=0");
// Сначала удаляем элемент формы
УдаляемыйЭлемент = Элементы.Найти(ИмяУдаляемого);
Если УдаляемыйЭлемент <> Неопределено Тогда
Элементы.Удалить(УдаляемыйЭлемент);
КонецЕсли;
// Затем удаляем сам реквизит
МассивУдаляемых = Новый Массив;
МассивУдаляемых.Добавить(ИмяУдаляемого);
ИзменитьРеквизиты(, МассивУдаляемых);
Сообщить("Удален реквизит " + ИмяУдаляемого);
КонецПроцедуры