При разработке пользовательских интерфейсов на управляемых формах часто возникает задача: пользователь выбирает элемент одного справочника (например, Город), и на форме сразу же должно отобразиться или заполниться связанное с ним значение (например, Коэффициент из карточки этого города). Разберем, как решить эту задачу стандартными средствами платформы 1С:Предприятие 8.3.
Нередко разработчики пытаются настроить автоматическое заполнение через стандартные свойства реквизита, такие как Связь по владельцу или Связи параметров выбора. Проанализируем, почему этот подход не решает задачу заполнения значения:
Если коэффициент не требуется отдельно хранить в базе данных или редактировать индивидуально для каждого сотрудника, а нужно лишь видеть актуальное значение из карточки выбранного города, самым простым и производительным решением будет вывод реквизита «через точку».
Выполним следующие шаги в конфигураторе:
Сотрудники).Объект.Город, имеющий ссылочный тип (ссылка на справочник Города).Город — откроется список всех реквизитов связанного справочника.Коэффициент и перетащим его мышью в дерево элементов формы (в левую часть редактора формы).В результате на форме появится поле ввода с путем к данным Объект.Город.Коэффициент. Платформа 1С автоматически отобразит значение коэффициента сразу же после выбора города и очистит его, если поле города станет пустым. Никакого программного кода писать не требуется.
Перед выбором данного метода важно учитывать архитектурные особенности разыменования ссылок:
Города коэффициент изменится, он автоматически обновится и при просмотре всех ранее записанных сотрудников.Если коэффициент должен храниться в реквизите сотрудника на момент выбора или пользователь должен иметь возможность вручную изменить предложенный коэффициент, создается собственный реквизит Коэффициент у объекта и настраивается обработчик события.
Разберем реализацию по шагам:
Коэффициент в справочник Сотрудники и вынесем его на форму.Город, перейдем в панель Свойства и в секции События создадим обработчик ПриИзменении.Посмотрим на пример программного кода:
&НаКлиенте
Процедура ГородПриИзменении(Элемент)
Если ЗначениеЗаполнено(Объект.Город) Тогда
Объект.Коэффициент = ПолучитьКоэффициентГорода(Объект.Город);
Иначе
// Обязательно обрабатываем очистку зависимого реквизита
Объект.Коэффициент = 0;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьКоэффициентГорода(СсылкаНаГород)
// Считываем только нужный реквизит без лишней нагрузки на сервер
Возврат СсылкаНаГород.Коэффициент;
КонецФункции
Если в конфигурации используется Библиотека Стандартных Подсистем (БСП), для чтения реквизита на сервере можно применить типовую функцию ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаГород, "Коэффициент"). Обратите внимание: не следует использовать метод ПолучитьОбъект(), так как считывание всего объекта целиком избыточно нагружает систему.