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

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

Часто при разработке на платформе 1С:Предприятие 8 возникает задача динамического изменения интерфейса. Например, нам требуется отобразить информацию, которая зависит от выбора пользователя в списке, но при этом мы хотим создать элемент формы программно, а не через конфигуратор. Давайте разберем эту задачу по шагам.

Этап 1: Создание реквизита формы на сервере

Для того чтобы данные могли где-то храниться в рамках жизни формы, нам необходимо создать РеквизитФормы. Это делается с помощью метода ИзменитьРеквизиты. Важно помнить, что любые манипуляции со структурой формы должны выполняться исключительно на сервере, чаще всего в процедуре ПриСозданииНаСервере.

Рассмотрим процедуру, которая добавляет новый реквизит в коллекцию реквизитов формы:


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

Этап 2: Программное добавление элемента на форму

После того как реквизит создан, он еще не виден пользователю. Чтобы отобразить его, нам нужно добавить ЭлементФормы и связать его с созданным реквизитом через свойство ПутьКДанным.


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

Здесь мы используем метод Элементы.Добавить. В качестве родителя можно указать группу или таблицу, в которую будет помещен новый элемент.

Этап 3: Организация события при активации строки

Наша цель — выводить стаж при переходе между сотрудниками. Для этого мы используем событие ПриАктивизацииСтроки элемента списка. На клиенте мы перехватываем текущую ссылку на физлицо, а за расчетом стажа обращаемся к серверу.

Разберем логику модуля: при смене строки мы вызываем функцию, которая выполняет Запрос к РегиструСведений.СтажиФизическихЛиц. Получив результат, мы возвращаем строку, которую присваиваем нашему программно созданному реквизиту.


&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
    ТекущееФизЛицо = Элемент.ТекущиеДанные.Ссылка;
    // Вызов серверной функции для получения данных
    ВодительскийСтаж = ПолучитьСтажНаСервере(ТекущееФизЛицо);
КонецПроцедуры

Этап 4: Получение данных о стаже

Для корректного получения стажа используем Запрос с использованием виртуальной таблицы СрезПоследних. Это позволит нам получить актуальные данные на текущий момент.


&НаСервере
Функция ПолучитьСтажНаСервере(ФизическоеЛицо)
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ РазмерМесяцев, РазмерДней 
                   | ИЗ РегистрСведений.СтажиФизическихЛиц.СрезПоследних(&Дата, ФизическоеЛицо = &ФизЛицо)
                   | ГДЕ ВидСтажа.Наименование = 'Водительский стаж'";
    Запрос.УстановитьПараметр("Дата", ТекущаяДата());
    Запрос.УстановитьПараметр("ФизЛицо", ФизическоеЛицо);
    
    Результат = Запрос.Выполнить().Выбрать();
    Если Результат.Следующий() Тогда
        // Расчет и формирование строки вывода
        КоличЛет = Цел(Результат.РазмерМесяцев / 12);
        КоличМес = Результат.РазмерМесяцев - (КоличЛет * 12);
        Возврат "" + КоличЛет + " лет " + КоличМес + " мес " + Результат.РазмерДней + " дн.";
    КонецЕсли;
    Возврат "Стаж не определен";
КонецФункции

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

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

← На главную