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

Программист 1С v8.3 (Управляемые формы) Управленческий учет Промышленность, строительство и АПК
← На главную

Часто при автоматизации рабочих мест в 1С перед разработчиками встает задача переноса данных из справочника в табличную часть документа. Например, при выборе комплекта нам нужно автоматически заполнить список комплектующих из спецификации. Рассмотрим, почему при попытке реализации этого функционала часто возникают пустые строки или ошибки и как сделать это правильно.

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

Основная сложность заключается в способе обращения к данным. При использовании конструктора запроса часто создается конструкция, которая пытается выбрать данные из табличной части справочника прямо в основном запросе. Когда мы перебираем результат такого запроса, мы часто забываем, что табличная часть — это вложенная коллекция записей.

Если в коде используется простое обращение, система может не «видеть» строки внутри вложенной таблицы, из-за чего табличная часть документа остается пустой или заполняется некорректно. Также часто возникают ошибки типизации или обращения к полям, которые не были определены в текущей выборке.

Пошаговое решение задачи

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

  1. Проверка исходных данных: Прежде чем писать сложный запрос, убедитесь, что в процедуре ЗаполнитьПоСпецификацииНаСервере параметр Объект.Комплект действительно содержит ссылку на элемент справочника. Если поле пустое, запрос вернет пустой результат.
  2. Корректный запрос: Вместо использования вложенных конструкций в основном запросе, лучше выбирать данные напрямую из табличной части справочника, связывая их по ссылке.

Давайте посмотрим, как может выглядеть оптимизированный запрос:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    СпецификацияНоменклатурыСпецификация.Номенклатура КАК Номенклатура,
    |    СпецификацияНоменклатурыСпецификация.Количество КАК Количество
    |ИЗ
    |    Справочник.СпецификацияНоменклатуры.Спецификация КАК СпецификацияНоменклатурыСпецификация
    |ГДЕ
    |    СпецификацияНоменклатурыСпецификация.Ссылка = &Комплект";

Запрос.УстановитьПараметр("Комплект", Объект.Комплект);
РезультатЗапроса = Запрос.Выполнить();

Заполнение табличной части документа

После получения результата необходимо правильно обойти выборку и добавить строки в табличную часть Объект.Комплектующие. Важно помнить, что каждое обращение к Объект.Комплектующие.Добавить() создает новую строку, которую нужно заполнить данными из выборки.


Если Не РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Пока Выборка.Следующий() Цикл
        НоваяСтрока = Объект.Комплектующие.Добавить();
        НоваяСтрока.Номенклатура = Выборка.Номенклатура;
        НоваяСтрока.Количество = Выборка.Количество;
    КонецЦикла;
КонецЕсли;

Советы по отладке и проверке

Если после внедрения кода табличная часть все равно пустая, выполните следующие действия:

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

← На главную