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