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