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