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

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

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

Понимание архитектуры: клиент и сервер

Прежде чем приступать к написанию кода, важно уяснить разделение контекстов. В управляемом приложении 1С выполнение кода делится на две части:

  1. НаКлиенте: здесь происходит взаимодействие с пользователем, работа с элементами формы (коллекция Элементы) и отображение данных. Однако здесь запрещено прямое обращение к базе данных.
  2. НаСервере: здесь выполняется бизнес-логика, работа с запросами и получение данных из справочников. Здесь недоступен объект Элементы, поэтому обращение к интерфейсу формы из серверных процедур вызовет ошибку.

Для решения нашей задачи мы будем использовать связку: обработчик на клиенте и функцию на сервере.

Решение 1: Получение данных через запрос

Этот способ является наиболее универсальным и производительным. Мы создаем функцию на сервере, которая выполняет запрос к базе данных, и вызываем её из клиентского обработчика.

Реализуем серверную функцию для получения должности:


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

Теперь добавим клиентский обработчик события ПриИзменении для колонки «Сотрудник» в табличной части:


&НаКлиенте
Процедура СотрудникиСотрудникПриИзменении(Элемент)
    ТекущиеДанные = Элементы.Сотрудники.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        ТекущиеДанные.Должность = ПолучитьДолжность(ТекущиеДанные.Сотрудник);
    КонецЕсли;
КонецПроцедуры

Решение 2: Использование точечной нотации

Если вам не требуется сложная фильтрация данных, можно обратиться к реквизиту напрямую через объект ссылки. Это лаконичный способ, который платформа 1С автоматически оптимизирует при обращении к серверу.

Напишем компактную серверную функцию:


&НаСервереБезКонтекста
Функция ПолучитьДолжность(Сотрудник)
    Возврат Сотрудник.Должность;
КонецФункции

Важно помнить: если в справочнике должность хранится как СправочникСсылка, а в документе — как Строка, 1С автоматически выполнит приведение к строковому представлению (обычно это наименование должности). Если вы хотите быть уверены в формате данных, можно использовать метод СокрЛП(Сотрудник.Должность.Наименование).

Решение 3: Использование БСП (Библиотеки Стандартных Подсистем)

Если в вашей конфигурации подключена БСП, рекомендуется использовать готовый метод ОбщегоНазначения.ЗначениеРеквизитаОбъекта. Это позволяет избежать считывания всего объекта целиком, что экономит оперативную память сервера.


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

Основные рекомендации по работе

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

← На главную