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

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

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

Метод 1: Вывод данных через «путь к данным» (без программирования)

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

Разберем по шагам, как это сделать в редакторе формы:

  1. Откроем форму нужного объекта (документа или справочника).
  2. В правой верхней части редактора найдем список реквизитов.
  3. Найдем реквизит, по которому происходит выбор (например, Номенклатура), и нажмем на значок «плюс» слева от него.
  4. Платформа раскроет все доступные поля этого ссылочного типа. Найдем там Код, Артикул или ЕдиницаИзмерения.
  5. Просто перетащим выбранное поле в левую часть — в дерево элементов формы, внутрь нужной группы или табличной части.

Преимущества этого метода: 1С самостоятельно управляет обновлением этих данных. Нам не нужно писать код, создавать серверные вызовы и беспокоиться об очистке полей. Это значительно экономит ресурсы системы.

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

Метод 2: Программное заполнение через событие ПриИзменении

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

Для реализации этой задачи проанализируем работу с событием ПриИзменении. Главная ошибка начинающих — попытка обратиться к данным через Объект.ИмяТаблицы. В управляемом приложении при работе с таблицами крайне важно понимать, в какой именно строке находится пользователь.

Рассмотрим правильный пример реализации кода в модуле формы:


&НаКлиенте
Процедура ТоварНоменклатураПриИзменении(Элемент)
    
    // Получаем текущую строку таблицы, с которой работает пользователь
    ТекДанные = Элементы.Товар.ТекущиеДанные;
    
    Если ТекДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Если номенклатура очищена, очищаем и зависимые реквизиты
    Если ТекДанные.Номенклатура.Пустая() Тогда
        ТекДанные.ЕдиницаИзмерения = Неопределено;
        Возврат;
    КонецЕсли;
    
    // Вызываем серверную функцию для получения данных из справочника
    ТекДанные.ЕдиницаИзмерения = ПолучитьДанныеНоменклатурыНаСервере(ТекДанные.Номенклатура);
    
КонецПроцедуры

Для получения данных из ссылки нам необходимо «сходить» на сервер. Выясним причину использования специальной директивы компиляции &НаСервереБезКонтекста. Она позволяет выполнить запрос к базе данных максимально быстро, не передавая на сервер всю тяжелую структуру формы.


&НаСервереБезКонтекста
Функция ПолучитьДанныеНоменклатурыНаСервере(ВыбНоменклатура)
    
    // Возвращаем значение реквизита из справочника
    Возврат ВыбНоменклатура.ЕдиницаИзмерения;
    
КонецФункции

Оптимизация серверных вызовов

Представим ситуацию, когда при выборе товара нам нужно заполнить не один реквизит, а сразу пять: артикул, цену, ставку НДС, единицу измерения и складской остаток. Выполнять пять отдельных вызовов на сервер — плохая практика, которая приведет к «зависанию» интерфейса у пользователя.

Проанализируем правильный подход: использование структуры. Вместо того чтобы возвращать одно значение, мы создаем одну функцию, которая собирает все необходимые данные и возвращает их разом.


&НаСервереБезКонтекста
Функция ПолучитьВсеДанныеТовара(ВыбНоменклатура)
    
    Результат = Новый Структура;
    Результат.Вставить("ЕдиницаИзмерения", ВыбНоменклатура.ЕдиницаИзмерения);
    Результат.Вставить("Код", ВыбНоменклатура.Код);
    Результат.Вставить("СтавкаНДС", ВыбНоменклатура.СтавкаНДС);
    
    Возврат Результат;
    
КонецФункции

&НаКлиенте
Процедура ТоварНоменклатураПриИзменении(Элемент)
    
    ТекДанные = Элементы.Товар.ТекущиеДанные;
    
    Если ТекДанные <> Неопределено И Не ТекДанные.Номенклатура.Пустая() Тогда
        
        // Один поход на сервер за всеми данными сразу
        СтруктураДанных = ПолучитьВсеДанныеТовара(ТекДанные.Номенклатура);
        
        // Заполняем реквизиты строки из структуры
        ЗаполнитьЗначенияСвойств(ТекДанные, СтруктураДанных);
        
    КонецЕсли;
    
КонецПроцедуры

Дополнительные механизмы контроля

Помимо прямого присваивания, разберем еще несколько полезных инструментов платформы 1С:

1. Связи параметров выбора. Если вам нужно, чтобы при выборе второго реквизита список ограничивался значениями, связанными с первым (например, при выборе «Автомобиля» в поле «Запчасть» выводились только детали для этой модели), используйте свойство Связи параметров выбора в конфигураторе. Это настраивается без единой строчки кода в свойствах реквизита.

2. Обработка выбора. Иногда задачу нужно решить еще до того, как значение попало в поле. Событие ОбработкаВыбора позволяет перехватить момент выбора из формы списка и, например, подставить разные значения в зависимости от условий или даже отменить выбор, если он не соответствует бизнес-логике.

3. Использование типовых функций (БСП). В современных конфигурациях (таких как БП 3.0 или УТ 11) разработчики из 1С уже создали множество общих модулей. Посмотрим на пример вызова стандартных механизмов: часто достаточно вызвать процедуру НоменклатураКлиентСервер.ЗаполнитьРеквизитыНоменклатуры, которая уже оптимизирована и содержит все необходимые проверки.

Важный совет: всегда проверяйте поле на пустое значение. Если пользователь стер выбранную номенклатуру, зависимые поля (код, единица измерения) должны быть очищены, иначе в документе останется некорректная информация от предыдущего выбора.

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

← На главную