Статьи 1С программиста

заметки и другая полезная информация по 1С

Программное управление реквизитами формы

1339
30 октября 2024

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

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

Основные методы, которые мы будем использовать:

  • ПолучитьРеквизиты() - получение списка существующих реквизитов формы
  • ИзменитьРеквизиты() - добавление и удаление реквизитов
  • РеквизитФормы - конструктор для создания описания реквизита

Разбор ключевых моментов кода:

1. Получение списка реквизитов и поиск последнего номера:

Функция ПолучитьНомерПоследнегоРеквизита()
    МаксНомер = 0;
    // Получаем все реквизиты формы
    Реквизиты = ЭтаФорма.ПолучитьРеквизиты();

    Для Каждого Реквизит Из Реквизиты Цикл
        Если СтрНачинаетсяС(Реквизит.Имя, "Реквизит") Тогда
            НомерСтрокой = Сред(Реквизит.Имя, СтрДлина("Реквизит") + 1);
            НомерТекущий = Число(НомерСтрокой);

            Если НомерТекущий > МаксНомер Тогда
                МаксНомер = НомерТекущий;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;

    Возврат МаксНомер;
КонецФункции

В этой функции мы:

  • Получаем список всех реквизитов формы
  • Ищем реквизиты с именем, начинающимся на "Реквизит"
  • Извлекаем номер из имени и находим максимальный

2. Создание нового реквизита:


// Создаем новый реквизит
НовыйРеквизит = Новый РеквизитФормы(ИмяНового,
                                   Новый ОписаниеТипов("Строка"),
                                   ,
                                   "Реквизит " + НомерНового);

// Добавляем реквизит в форму
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(НовыйРеквизит);
ИзменитьРеквизиты(МассивРеквизитов, );

Здесь демонстрируется:

  • Создание описания реквизита с помощью конструктора РеквизитФормы
  • Установка типа данных через ОписаниеТипов
  • Добавление реквизита в форму методом ИзменитьРеквизиты

3. Создание элемента формы для реквизита:


// Создаем поле ввода для реквизита
НовоеПоле = Элементы.Добавить(ИмяНового, Тип("ПолеФормы"));
НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
НовоеПоле.ПутьКДанным = ИмяНового;

Этот код показывает:

  • Создание элемента формы для отображения реквизита
  • Настройку вида элемента как поля ввода
  • Связь элемента с реквизитом через свойство ПутьКДанным

4. Удаление реквизита:


// Находим элемент формы для удаления
УдаляемыйЭлемент = Элементы.Найти(ИмяУдаляемого);
Если УдаляемыйЭлемент <> Неопределено Тогда
    Элементы.Удалить(УдаляемыйЭлемент);
КонецЕсли;

// Удаляем реквизит
МассивУдаляемых = Новый Массив;
МассивУдаляемых.Добавить(ИмяУдаляемого);
ИзменитьРеквизиты(, МассивУдаляемых);

В процессе удаления:

  • Сначала удаляется элемент формы
  • Затем удаляется сам реквизит
  • Все операции выполняются с проверками

Важные моменты при работе с реквизитами:

  • Реквизиты можно добавлять только на сервере
  • При удалении сначала нужно удалить элемент формы, а потом реквизит
  • Необходимо следить за уникальностью имен реквизитов
  • Рекомендуется добавлять проверки перед удалением

&НаСервере
Процедура ПриСозданииНаСервере(Отказ)
    // Настройка основных параметров формы
    ЭтаФорма.Заголовок = "Реквизиты формы. Программное создание и удаление, получение списка реквизитов";
    ЭтаФорма.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;

    // Создание команд для кнопок
    КомандаСоздать = Команды.Добавить("СоздатьРеквизит");
    КомандаСоздать.Действие = "СоздатьРеквизит";
    КомандаСоздать.Заголовок = "Создать реквизит";

    КомандаУдалить = Команды.Добавить("УдалитьРеквизит");
    КомандаУдалить.Действие = "УдалитьРеквизит";
    КомандаУдалить.Заголовок = "Удалить реквизит";

    // Добавление кнопок на форму
    КнопкаСоздать = Элементы.Добавить("КнопкаСоздать", Тип("КнопкаФормы"));
    КнопкаСоздать.ИмяКоманды = "СоздатьРеквизит";

    КнопкаУдалить = Элементы.Добавить("КнопкаУдалить", Тип("КнопкаФормы"));
    КнопкаУдалить.ИмяКоманды = "УдалитьРеквизит";
КонецПроцедуры

// Функция для поиска максимального номера среди существующих реквизитов
&НаСервере
Функция ПолучитьНомерПоследнегоРеквизита()
    МаксНомер = 0;
    Реквизиты = ЭтаФорма.ПолучитьРеквизиты();

    Для Каждого Реквизит Из Реквизиты Цикл
        // Ищем только реквизиты с нужным именем
        Если СтрНачинаетсяС(Реквизит.Имя, "Реквизит") Тогда
            НомерСтрокой = Сред(Реквизит.Имя, СтрДлина("Реквизит") + 1);
            НомерТекущий = Число(НомерСтрокой);

            Если НомерТекущий > МаксНомер Тогда
                МаксНомер = НомерТекущий;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;

    Возврат МаксНомер;
КонецФункции

// Обработчик нажатия кнопки создания реквизита
&НаКлиенте
Процедура СоздатьРеквизит(Команда)
    СоздатьРеквизитНаСервере();
КонецПроцедуры

// Серверная процедура создания нового реквизита
&НаСервере
Процедура СоздатьРеквизитНаСервере()
    // Получаем следующий номер для реквизита
    НомерНового = ПолучитьНомерПоследнегоРеквизита() + 1;
    ИмяНового = "Реквизит" + Формат(НомерНового, "ЧГ=0");

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

    // Создаем поле ввода для отображения реквизита
    НовоеПоле = Элементы.Добавить(ИмяНового, Тип("ПолеФормы"));
    НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
    НовоеПоле.ПутьКДанным = ИмяНового;

    Сообщить("Создан реквизит " + ИмяНового);
КонецПроцедуры

// Обработчик нажатия кнопки удаления реквизита
&НаКлиенте
Процедура УдалитьРеквизит(Команда)
    УдалитьРеквизитНаСервере();
КонецПроцедуры

// Серверная процедура удаления реквизита
&НаСервере
Процедура УдалитьРеквизитНаСервере()
    // Получаем номер последнего реквизита
    НомерПоследнего = ПолучитьНомерПоследнегоРеквизита();

    Если НомерПоследнего = 0 Тогда
        Сообщить("Нет реквизитов для удаления");
        Возврат;
    КонецЕсли;

    // Формируем имя для удаления
    ИмяУдаляемого = "Реквизит" + Формат(НомерПоследнего, "ЧГ=0");

    // Сначала удаляем элемент формы
    УдаляемыйЭлемент = Элементы.Найти(ИмяУдаляемого);
    Если УдаляемыйЭлемент <> Неопределено Тогда
        Элементы.Удалить(УдаляемыйЭлемент);
    КонецЕсли;

    // Затем удаляем сам реквизит
    МассивУдаляемых = Новый Массив;
    МассивУдаляемых.Добавить(ИмяУдаляемого);
    ИзменитьРеквизиты(, МассивУдаляемых);

    Сообщить("Удален реквизит " + ИмяУдаляемого);
КонецПроцедуры

1339
30 октября 2024