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