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

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

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

Разбор типовых заблуждений: механизм связей параметров выбора

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

  1. Механизм связей предназначен исключительно для фильтрации списка выбора в поле ввода (например, чтобы при выборе города в списке отображались только улицы, принадлежащие этому конкретному городу).
  2. Автоматически считывать и подставлять данные из одного поля в другое без использования разыменования реквизитов или программного кода механизм связей не умеет.

Способ 1. Отображение реквизита «через точку» на форме (без программирования)

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

Выполним следующие шаги в конфигураторе:

  1. Откроем управляемую форму элемента (например, справочника Сотрудники).
  2. На вкладке Реквизиты (в правой верхней части редактора формы) раскроем основной реквизит Объект.
  3. Найдем реквизит Город, имеющий ссылочный тип (ссылка на справочник Города).
  4. Раскроем плюсик (крестик) возле реквизита Город — откроется список всех реквизитов связанного справочника.
  5. Найдем реквизит Коэффициент и перетащим его мышью в дерево элементов формы (в левую часть редактора формы).

В результате на форме появится поле ввода с путем к данным Объект.Город.Коэффициент. Платформа 1С автоматически отобразит значение коэффициента сразу же после выбора города и очистит его, если поле города станет пустым. Никакого программного кода писать не требуется.

Ограничения отображения данных «через точку»

Перед выбором данного метода важно учитывать архитектурные особенности разыменования ссылок:

  1. Отсутствие фиксации в базе: Значение не сохраняется в текущем объекте. Если в справочнике Города коэффициент изменится, он автоматически обновится и при просмотре всех ранее записанных сотрудников.
  2. Только для чтения: Поля, выведенные «через точку», по умолчанию недоступны для ручного редактирования пользователем.

Способ 2. Программное автозаполнение с сохранением значения в объекте

Если коэффициент должен храниться в реквизите сотрудника на момент выбора или пользователь должен иметь возможность вручную изменить предложенный коэффициент, создается собственный реквизит Коэффициент у объекта и настраивается обработчик события.

Разберем реализацию по шагам:

  1. Добавим реквизит Коэффициент в справочник Сотрудники и вынесем его на форму.
  2. Выделим элемент формы Город, перейдем в панель Свойства и в секции События создадим обработчик ПриИзменении.
  3. В модуле формы напишем клиентскую процедуру и серверную функцию для оптимального считывания данных.

Посмотрим на пример программного кода:


&НаКлиенте
Процедура ГородПриИзменении(Элемент)
    
    Если ЗначениеЗаполнено(Объект.Город) Тогда
        Объект.Коэффициент = ПолучитьКоэффициентГорода(Объект.Город);
    Иначе
        // Обязательно обрабатываем очистку зависимого реквизита
        Объект.Коэффициент = 0;
    КонецЕсли;

КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьКоэффициентГорода(СсылкаНаГород)
    
    // Считываем только нужный реквизит без лишней нагрузки на сервер
    Возврат СсылкаНаГород.Коэффициент;

КонецФункции

Если в конфигурации используется Библиотека Стандартных Подсистем (БСП), для чтения реквизита на сервере можно применить типовую функцию ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаГород, "Коэффициент"). Обратите внимание: не следует использовать метод ПолучитьОбъект(), так как считывание всего объекта целиком избыточно нагружает систему.

← На главную