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