Как заполнить колонки табличной части запросом при изменении значения в 1С

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

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

Анализ частых ошибок при составлении запроса

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

  1. Лишние параметры для булевых значений: Сопоставление вида ПроизводствоТабличнаяЧасть1.Ссылка.Проведен = &ИСТИНА с последующей установкой параметра Запрос.УстановитьПараметр("ИСТИНА", ИСТИНА); является избыточным. В языке запросов 1С булево поле можно проверять напрямую по его значению.
  2. Сравнение ссылок с наименованием (строкой): Обращение к Ссылка.Сотрудник.Наименование вместо самой ссылки на объект Сотрудник нарушает ссылочную целостность и снижает производительность. Для подстановки в реквизиты формы требуются ссылки на элементы справочников, а не их строковые наименования.
  3. Отсутствие фильтра по выбранному значению: Чтобы получить сотрудников конкретного изделия, необходимо передавать выбранный в текущей строке код изделия в качестве параметра запроса &КодИзделия.

Шаг 1. Формирование корректного текста запроса

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ПроизводствоТабличнаяЧасть1.Код КАК КодИзделия,
    |	ПроизводствоТабличнаяЧасть1.Ссылка.Сотрудник КАК Сотрудник1,
    |	ПроизводствоТабличнаяЧасть1.Ссылка.Сотрудник2 КАК Сотрудник2
    |ИЗ
    |	Документ.Производство.ТабличнаяЧасть1 КАК ПроизводствоТабличнаяЧасть1
    |ГДЕ
    |	ПроизводствоТабличнаяЧасть1.Ссылка.Проведен
    |	И ПроизводствоТабличнаяЧасть1.Код = &КодИзделия
    |
    |СГРУППИРОВАТЬ ПО
    |	ПроизводствоТабличнаяЧасть1.Код,
    |	ПроизводствоТабличнаяЧасть1.Ссылка.Сотрудник,
    |	ПроизводствоТабличнаяЧасть1.Ссылка.Сотрудник2";

Шаг 2. Передача параметров и обработка результата

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


// Устанавливаем значение параметра запроса (получаем код из текущей строки)
Запрос.УстановитьПараметр("КодИзделия", СтрокаТаблицы.КодИзделия);

РезультатТаблица = Запрос.Выполнить().Выгрузить();

Для Каждого СтрокаРезультата Из РезультатТаблица Цикл
    ЗаполнитьЗначенияСвойств(СтрокаТаблицы, СтрокаРезультата);
КонецЦикла;

Особенности реализации в Управляемом приложении

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

  1. Объект Запрос недоступен на клиенте. Выполнение запроса следует выносить в отдельную серверную процедуру с директивой &НаСервере или &НаСервереБезКонтекста.
  2. Для получения редактируемой строки на форме используется свойство элементов формы: Элементы.ИмяТабличнойЧасти.ТекущиеДанные.
  3. Если запрос может вернуть несколько строк по одному коду, рекомендуется использовать ключевое слово ПЕРВЫЕ 1 и сортировку по дате УПОРЯДОЧИТЬ ПО Ссылка.Дата УБЫВ, чтобы заполнить данные из наиболее актуального документа.
← На главную