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

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

В процессе разработки в среде 1С:Предприятие 8 часто возникает задача импорта данных из внешних источников, таких как файлы CSV. После того как данные успешно считаны во временное хранилище (обычно это ТаблицаЗначений), их необходимо корректно распределить по реквизитам документа. Рассмотрим, как перенести информацию из таблицы в область табличной части (ТЧ) на примере документа «Приемо-сдаточный акт» (ПСА).

Способ 1. Построчный обход таблицы значений (универсальный метод)

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

Предположим, у нас уже есть объект ТЗ (Таблица Значений), куда загружены данные из CSV. Нам нужно перенести их в табличную часть под названием Товары (или аналогичную, соответствующую специфике ПСА).

Проанализируем пример кода:


// Предположим, ТЗ - это наша таблица с данными из CSV
// ТабличнаяЧастьДокумента - это имя ТЧ вашего документа (например, Объект.Товары)

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

Важный нюанс: при загрузке из CSV данные часто попадают в 1С в виде строк. Если реквизит Номенклатура имеет ссылочный тип, простого присваивания будет недостаточно. В этом случае нам необходимо выполнить поиск объекта в базе данных.

Способ 2. Типизация данных при загрузке

Рассмотрим ситуацию, когда в CSV-файле указано название товара, а в документе нам нужна ссылка на элемент справочника. Выясним, как автоматизировать этот поиск внутри цикла загрузки.


Для Каждого Стр Из ТЗ Цикл
    НовСтрокаТЧ = Объект.Металлолом.Добавить();
    
    // Ищем номенклатуру по наименованию, полученному из файла
    НайденнаяСсылка = Справочники.Номенклатура.НайтиПоНаименованию(Стр.НаименованиеИзФайла);
    
    Если Не НайденнаяСсылка.Пустая() Тогда
        НовСтрокаТЧ.Номенклатура = НайденнаяСсылка;
    Иначе
        // Если не нашли, можно вывести предупреждение или создать новый элемент
        Сообщить("Товар " + Стр.НаименованиеИзФайла + " не найден в справочнике!");
    КонецЕсли;
    
    // Преобразование строкового значения веса в число
    НовСтрокаТЧ.Вес = Число(Стр.ВесИзФайла);
КонецЦикла;

Способ 3. Использование метода Загрузить() для быстрой вставки

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

Посмотрим на пример реализации:


// ВАЖНО: Колонки в ТЗ должны называться точно так же, как реквизиты в ТЧ документа
// Данный метод полностью замещает существующие строки в ТЧ новыми данными из ТЗ
Объект.Товары.Загрузить(ТЗ);

Однако помните, что при использовании Загрузить() не происходит автоматического поиска ссылок по строковым названиям. Этот метод идеален, если таблица значений уже содержит готовые ссылки на объекты (Номенклатуру, Склады и т.д.).

Особенности работы с документами типа ПСА (Приемо-сдаточный акт)

Поскольку ПСА часто используется в сфере заготовки металлолома (утилизация авто, прием лома), при загрузке данных необходимо учитывать специфические поля. Разберем ситуацию с заполнением данных о засоре и массе нетто.

В документе ПСА обычно присутствуют следующие показатели:

  1. Вес брутто (общий вес с учетом транспортного средства или тары).
  2. Процент засора (доля посторонних примесей).
  3. Вес нетто (чистый вес лома, который подлежит оплате).

Проанализируем, как правильно рассчитать эти поля программно при загрузке из внешнего файла:


Для Каждого СтрТЗ Из ТЗ Цикл
    НоваяСтрока = Объект.СоставЛома.Добавить();
    
    ВесБрутто = Число(СтрТЗ.ВесБрутто);
    ПроцентЗасора = Число(СтрТЗ.ПроцентЗасора);
    
    НоваяСтрока.Брутто = ВесБрутто;
    НоваяСтрока.ПроцентЗасора = ПроцентЗасора;
    
    // Рассчитываем чистый вес (нетто)
    // Формула: Брутто - (Брутто * ПроцентЗасора / 100)
    НоваяСтрока.Нетто = ВесБрутто - (ВесБрутто * ПроцентЗасора / 100);
КонецЦикла;

Рекомендации по безопасности и стабильности кода

Работая с ИП-базами или крупными системами, важно обеспечивать целостность данных. Рассмотрим несколько правил хорошего тона при написании кода загрузки:

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


НачатьТранзакцию();
Попытка
    // Код цикла загрузки здесь...
    Объект.Записать();
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
    Сообщить("Произошла ошибка при загрузке: " + ОписаниеОшибки());
КонецПопытки;

Выполняйте код на сервере. Манипуляции с объектами документов (такими как ДокументОбъект) в современных конфигурациях на управляемых формах возможны только в серверном контексте (процедуры с префиксом &НаСервере).

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

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

← На главную