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