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

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

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

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

Принцип работы механизма автозаполнения

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

  1. Пользователь интерактивно изменяет значение в ячейке таблицы.
  2. Срабатывает клиентский обработчик события ПриИзменении поля ввода.
  3. Из строки таблицы формы считывается ссылка на выбранный элемент справочника.
  4. Вызывается серверная процедура/функция без контекста (&НаСервереБезКонтекста), куда передается ссылка на объект.
  5. На сервере считываются нужные реквизиты и возвращаются на клиент в виде структуры.
  6. Клиентский код присваивает полученные значения полям текущей строки через свойство ТекущиеДанные.

Шаг 1. Создание обработчика события на форме

Разберем по шагам, как подключить событие к колонке табличной части в конфигураторе:

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

Шаг 2. Написание серверной функции для получения данных

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

Посмотрим на пример базовой реализации через чтение реквизитов:


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

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


&НаСервереБезКонтекста
Функция ПолучитьПараметрыСтудента(СтудентСсылка)
    
    Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
        СтудентСсылка, 
        "База, Основа_обучения"
    );
    
КонецФункции

Шаг 3. Обработка события на клиенте и заполнение строки

Теперь свяжем интерфейс и серверную функцию в клиентском обработчике. Для доступа к строке, в которой пользователь изменил значение, используется коллекция Элементы.ИмяТаблицы.ТекущиеДанные.

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


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

Частые ошибки при разработке

  1. Передача всей таблицы вместо одной ссылки: попытка написать ПолучитьПараметры(Объект.Студенты) приводит к ошибке типизации. В серверную функцию нужно передавать значение конкретной ячейки активной строки — СтрокаТаблицы.ФИО_студента.
  2. Обращение к несуществующим свойствам формы: попытка получить строку через Объект.Студент вызывает исключение «Поле объекта не обнаружено», так как реквизиты табличной части принадлежат конкретной строке коллекции, а не самому объекту документа.
  3. Отсутствие проверки на пустое значение: если пользователь нажмет клавишу «Delete» или крестик очистки в поле, в строке могут остаться старые данные, если не предусмотреть очистку зависимых полей.

Альтернативное решение: вычисляемые колонки формы без дублирования данных

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

  1. Добавляем в таблицу формы элемент типа «Поле ввода».
  2. В свойстве ПутьКДанным указываем разыменование ссылки: Объект.Студенты.ФИО_студента.База.
  3. Устанавливаем свойство ТолькоПросмотр = Истина.

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

← На главную