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

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

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

Понимание архитектуры решения

Важно уяснить, что в 1С не существует «связки» реквизитов с регистрами на уровне свойств объектов. Регистр сведений — это хранилище данных, к которому мы обращаемся программно в нужный момент времени. Процесс заполнения выглядит так: пользователь совершает действие в интерфейсе, мы ловим это событие, выполняем запрос к базе данных и записываем результат в нужный реквизит формы.

Шаг 1: Определение события для запуска кода

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

Шаг 2: Получение данных с помощью запроса

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

Сначала нам нужно создать запрос, выбрать ресурс (например, «Зарплата») из нашего регистра, отфильтровать результат по измерению «Должность» и вывести данные на форму. Посмотрите, как выглядит пример реализации:


&НаКлиенте
Процедура ДолжностьПриИзменении(Элемент)
    // Вызываем серверную функцию для получения данных
    Зарплата = ПолучитьЗарплатуПоДолжности(Объект.Должность);
    Объект.Зарплата = Зарплата;
КонецПроцедуры

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

Шаг 3: Разбор ключевых моментов

Разберем детально, что мы сделали в коде выше:

  1. Разделение на клиент и сервер: Мы всегда стараемся выполнять тяжелые операции (обращение к базе данных, запросы) на сервере. Поэтому мы создали функцию ПолучитьЗарплатуПоДолжности с директивой &НаСервереБезКонтекста.
  2. Объект Запрос: Мы инициализировали новый объект Запрос. Это стандартный способ обращения к таблицам базы данных в 1С.
  3. Условие ГДЕ: Использование параметра &Должность позволяет нам найти именно ту запись, которая нужна пользователю в текущий момент. Без этого условия запрос вернул бы все записи регистра.
  4. Метод Выполнить: После установки параметра мы вызываем Выполнить(), чтобы система подготовила данные.
  5. Обработка выборки: Проверка Пустой() гарантирует, что программа не выдаст ошибку, если для выбранной должности в регистре еще нет записей.

Альтернативный подход: метод Получить()

Если ваш регистр сведений является непериодическим, либо вам нужно получить запись по точному совпадению ключевых полей, можно воспользоваться методом менеджера записи Получить(). Этот способ короче, но работает только в том случае, если вы знаете все измерения регистра.


// Пример использования метода Получить()
СтруктураОтбора = Новый Структура("Должность", Объект.Должность);
ЗаписьРегистра = РегистрыСведений.Зарплаты.Получить(СтруктураОтбора);

Если ЗаписьРегистра <> Неопределено Тогда
    Объект.Зарплата = ЗаписьРегистра.СуммаЗарплаты;
КонецЕсли;

Этот метод часто оказывается быстрее, если требуется получить запись по полному ключу, однако Запрос остается более гибким инструментом для большинства задач в 1С.

Рекомендации по практике

Работая с данными, помните о следующем:

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

← На главную