При разработке обработок загрузки данных, интеграций или дополнительных форм часто возникает задача перенести значения только одного конкретного реквизита из промежуточной таблицы значений в существующую табличную часть документа. Рассмотрим подробно, как правильно использовать штатные методы платформы 1С для решения этой задачи, какие подводные камни существуют и какие альтернативные способы переноса данных можно применить.
В платформе 1С у объекта ТабличнаяЧасть предусмотрен метод ЗагрузитьКолонку. Данный метод предназначен для пакетного заполнения ячеек одной колонки значениями из одномерного массива. Разберем его синтаксис:
ТабличнаяЧасть.ЗагрузитьКолонку(МассивЗначений, Колонка)
Массив, содержащий значения, которые необходимо поместить в строки табличной части."ХарактеристикаНоменклатуры") либо объект метаданных колонки.Выясним причину частой ошибки разработчиков. Нередко возникает попытка передать напрямую свойство таблицы значений (например, ДетализацияДокумента.ХарактеристикаНоменклатуры), что приводит к системному исключению Поле объекта не обнаружено, либо разработчик забывает указать имя целевой колонки вторым параметром.
Посмотрим на рабочий пример правильного переноса колонки из таблицы значений ДетализацияДокумента в табличную часть Товары объекта документа:
// 1. Получаем одномерный массив значений из исходной таблицы значений
МассивХарактеристик = ДетализацияДокумента.ВыгрузитьКолонку("НаименованиеХарактеристики");
// 2. Загружаем полученный массив в целевую колонку табличной части документа
ДокументОбъект.Товары.ЗагрузитьКолонку(МассивХарактеристик, "ХарактеристикаНоменклатуры");
В результате метод последовательно запишет элементы массива в реквизит ХарактеристикаНоменклатуры каждой строки табличной части Товары.
Проанализируем особенности работы метода, которые критически важно учитывать во избежание логических ошибок и повреждения данных:
ПриИзменении, связанных с элементами управления. Это означает, что зависящие реквизиты (пересчет сумм, заполнение ставок НДС или подстановка единиц измерения) автоматически пересчитаны не будут.СправочникСсылка.ХарактеристикиНоменклатуры), а массив содержит строковые наименования, автоматического поиска по наименованию не произойдет, и в базу запишется некорректное значение либо возникнет ошибка типа.При работе в интерфейсе обычных форм обратите внимание на визуальное обновление данных. Если заполнение выполняется через контекст ДокументОбъект, а форма уже открыта на экране пользователя, табличное поле может не перерисовать внесенные изменения мгновенно. В этом случае требуется либо обращаться напрямую к реквизиту формы, либо принудительно обновить отображение через метод формы Обновить().
Также при программной модификации реквизитов объекта напрямую форма может не зафиксировать признак Модифицированность, из-за чего система не выдаст стандартное предупреждение о несохраненных данных при попытке закрыть окно.
Разберем ситуации, когда использование метода ЗагрузитьКолонку не подходит из-за несовпадения порядка строк или необходимости поиска ссылок.
Вариант 1. Построчный обход в цикле
Если требуется сопоставлять данные по ключевым реквизитам (например, по номенклатуре) или выполнять поиск ссылочных элементов по строковому представлению, наиболее надежным решением является классический обход в цикле:
Для Каждого СтрокаТЧ Из ДокументОбъект.Товары Цикл
ПараметрыОтбора = Новый Структура("Номенклатура", СтрокаТЧ.Номенклатура);
НайденныеСтроки = ДетализацияДокумента.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтроки.Количество() > 0 Тогда
СтрокаИсточника = НайденныеСтроки[0];
// Находим или присваиваем значение
СтрокаТЧ.ХарактеристикаНоменклатуры = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(СтрокаИсточника.НаименованиеХарактеристики, Истина, , СтрокаТЧ.Номенклатура);
КонецЕсли;
КонецЦикла;
Вариант 2. Полная перезагрузка таблицы при совпадении колонок
Если имена всех колонок в таблице значений и табличной части совпадают и требуется полностью перезаполнить табличную часть с созданием строк, эффективнее использовать связку методов полной выгрузки и загрузки:
// Полная замена строк табличной части данными из таблицы значений
ДокументОбъект.Товары.Загрузить(ДетализацияДокумента);
Вариант 3. Использование функции ЗаполнитьЗначенияСвойств
Если строки таблицы-источника и табличной части уже строго синхронизированы по количеству и порядку, но требуется скопировать только совпадающие по именам колонки, не затирая остальные реквизиты строки, удобно применить обход с вызовом ЗаполнитьЗначенияСвойств:
ВсегоСтрок = Мин(ДокументОбъект.Товары.Количество(), ДетализацияДокумента.Количество());
Для Индекс = 0 По ВсегоСтрок - 1 Цикл
ЗаполнитьЗначенияСвойств(ДокументОбъект.Товары[Индекс], ДетализацияДокумента[Индекс], "ХарактеристикаНоменклатуры");
КонецЦикла;