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

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

Автоматизация заполнения табличных частей — одна из самых частых задач, с которой сталкиваются разработчики в 1С. В данной статье мы разберем, как правильно реализовать заполнение табличной части РасходМатериалов в документе на основании данных, хранящихся в справочнике Комплектующие, который привязан к справочнику ПараметрыОкон.

Вариант 1: Заполнение в модуле объекта (Безопасный подход)

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

Рассмотрим, как это выглядит в коде:


Процедура ПередЗаписью(Отказ)
    РасходМатериалов.Очистить();
    Для каждого Стр из СоставЗаказа Цикл
        // Получаем набор материалов из справочника
        Материалы = Стр.ОконнаяКонструкция.Материалы;
        Для Каждого Строка Из Материалы Цикл
            // Добавляем строки в ТЧ документа
            ЗаполнитьЗначенияСвойств(РасходМатериалов.Добавить(), Строка);
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

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

Вариант 2: Использование запроса (Профессиональный подход)

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

Разберем по шагам реализацию через обработчик ПриИзменении:

  1. Клиентская часть: Передаем данные из формы на сервер.
  2. Серверная часть: Формируем запрос, который соединяет состав заказа с табличной частью справочника Комплектующие.

&НаКлиенте
Процедура СоставЗаказаОконнаяКонструкцияПриИзменении(Элемент)
    ДанныеФормыСоставЗаказа = Объект.СоставЗаказа;
    ЗаполнитьРасходМатериаловПоСпискуОконныхКонструкций(ДанныеФормыСоставЗаказа);
КонецПроцедуры

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

Почему возникают ошибки?

При реализации механизмов заполнения табличных частей разработчики часто сталкиваются с ошибкой «Поле не обнаружено». Давайте разберем, как этого избежать:

Рекомендация по архитектуре

Мы настоятельно рекомендуем избегать попыток «точечного» удаления строк, если задача позволяет пересчитать всю таблицу целиком. Использование Запрос с временными таблицами — это золотой стандарт разработки в 1С. Это избавляет вас от проблемы «висячих» ссылок и накопления ошибок при многократном изменении состава заказа пользователем. Если же объем материалов очень велик, рассмотрите возможность использования Формы подбора, что даст пользователю больше контроля над процессом.

← На главную