В процессе разработки в конфигурации Управление производственным предприятием (УПП) 1.3 часто возникает задача автоматического заполнения табличных частей документа на основе данных из других таблиц или внешних источников. При добавлении строк методом Добавить() возникают сложности: зависимые поля, такие как ЕдиницаИзмерения, Коэффициент или Спецификация, остаются незаполненными, так как типовые механизмы 1С «завязаны» на событиях формы, которые не срабатывают при простом программном создании строк.
Давайте разберем, как правильно реализовать заполнение табличной части, чтобы все связанные реквизиты корректно подтягивались автоматически.
Когда мы программно добавляем строку в табличную часть, система просто создает пустую структуру данных. Типовая логика 1С, обеспечивающая автоматический подбор спецификаций или единиц измерения, обычно находится в процедурах модуля ОбработкаТабличныхЧастей. Чтобы эти данные заполнились «как в интерфейсе», нам необходимо принудительно вызвать соответствующие процедуры после того, как мы заполнили основной реквизит — Номенклатура.
Для решения нашей задачи необходимо внутри цикла обхода исходных данных вызывать стандартные методы УПП. Давайте проанализируем, как должен выглядеть итоговый код.
Предположим, у нас есть процедура, которая переносит данные из ТаблицаСборки в табличную часть ПродукцияСборки. Вместо того чтобы полагаться на события формы, мы интегрируем вызовы обработчиков прямо в цикл:
Процедура ЗаполнитьСборкуПриходПродукции(Элемент)
Для каждого Стр из ТаблицаСборки Цикл
// Добавляем новую строку в табличную часть
НоваяСтрока = ПродукцияСборки.Добавить();
// Устанавливаем ключевой реквизит
НоваяСтрока.Номенклатура = Стр.ИсполняемыйПрибор;
// Вызываем типовые процедуры для заполнения связанных данных
ОбработкаТабличныхЧастей.ПриИзмененииНоменклатурыТабЧасти(НоваяСтрока, ЭтотОбъект);
ОбработкаТабличныхЧастей.ЗаполнитьЕдиницуТабЧасти(НоваяСтрока, ЭтотОбъект);
// Дополнительно определяем спецификацию по умолчанию через типовой менеджер
НоваяСтрока.Спецификация = УправлениеПроизводством.ОпределитьСпецификациюПоУмолчанию(
НоваяСтрока.Номенклатура,
НоваяСтрока.ХарактеристикаНоменклатуры,
Дата,
НоваяСтрока.Подразделение);
// Заполняем прочие данные
НоваяСтрока.Количество = Стр.КоличествоНаВыходеСУчастка;
НоваяСтрока.Склад = Стр.Склад;
КонецЦикла;
// Передаем фокус пользователю
Этаформа.ТекущийЭлемент = ЭлементыФормы.ПродукцияСборки;
КонецПроцедуры
ПриИзмененииНоменклатурыТабЧасти: Этот метод инициирует стандартные проверки и заполнения, которые происходят в системе, когда пользователь меняет номенклатуру в ячейке.НоваяСтрока вместо СтрокаТабличнойЧасти: Очень важно передавать именно ту строку, которую мы только что создали в цикле. Использование контекста ТекущиеДанные формы будет работать некорректно, так как при программном добавлении фокус может оставаться на старой строке.ЭтотОбъект во все процедуры. Это необходимо, так как функции поиска спецификаций и единиц измерения требуют доступа к текущему документу (его дате, складу или подразделению) для правильной фильтрации данных.При работе с большими объемами данных помните о следующих моментах:
ТаблицаСборки) могут содержать ошибки или неполную номенклатуру, оберните код внутри цикла в блок Попытка...Исключение, чтобы одна некорректная строка не прерывала процесс заполнения всего документа.ОпределитьСпецификациюПоУмолчанию убедитесь, что все аргументы, такие как Дата или Подразделение, определены и содержат верные значения.Используя этот подход, вы гарантируете, что данные в табличной части вашего документа будут такими же полными и корректными, как если бы они были внесены вручную, при этом максимально используя стандартные механизмы УПП 1.3.