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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Почему не работает ЗаполнитьЗначенияСвойств для пустой таблицы

Выясним причину, по которой стандартный код копирования не производит запись данных:


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

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

Чтобы зафиксировать данные, в приемнике предварительно должны быть созданы соответствующие колонки с необходимыми именами.

Вариант 1. В массиве содержатся строки таблицы значений (СтрокаТаблицыЗначений)

Если элементов массива является объект типа СтрокаТаблицыЗначений, это означает, что исходные строки привязаны к своей родительской таблице-владельцу. В 1С получить исходную таблицу можно с помощью метода Владелец().

Способ А. Использование метода Скопировать()

Если необходимо получить новую таблицу значений, содержащую только строки из массива, самый простой и быстрый способ — использовать метод Скопировать() исходной таблицы:


Если ИсходныйМассив.Количество() > 0 Тогда
    ИсходнаяТЗ = ИсходныйМассив[0].Владелец();
    НоваяТЗ = ИсходнаяТЗ.Скопировать(ИсходныйМассив);
КонецЕсли;

Способ Б. Копирование структуры колонок

Если требуется скопировать колонки и затем поочередно обработать или добавить строки:


Если ИсходныйМассив.Количество() > 0 Тогда
    ИсходнаяТЗ = ИсходныйМассив[0].Владелец();
    НоваяТЗ = ИсходнаяТЗ.СкопироватьКолонки();
    
    Для Каждого СтрокаИзМассива Из ИсходныйМассив Цикл
        НоваяСтрока = НоваяТЗ.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИзМассива);
    КонецЦикла;
КонецЕсли;

Вариант 2. В массиве содержатся элементы типа Структура

При передаче данных между клиентом и сервером или при работе с веб-сервисами часто используется массив структур. Попытка обойти СтрокаТаблицыЗначений в цикле как парную коллекцию КлючИЗначение приведет к ошибке «Поле объекта не обнаружено (Ключ)», однако для элементов типа Структура данный подход работает корректно.

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

Преобразование массива структур в ТаблицуЗначений:


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

Преобразование ТаблицыЗначений в массив структур:


Функция ПреобразоватьТаблицуЗначенийВМассив(тзДанные) Экспорт
    
    мсДанные = Новый Массив;
    
    Для Каждого СтрокаТЗ Из тзДанные Цикл
        стСтрокаТаблицы = Новый Структура;
        Для Каждого Колонка Из тзДанные.Колонки Цикл
            стСтрокаТаблицы.Вставить(Колонка.Имя, СтрокаТЗ[Колонка.Имя]);
        КонецЦикла;
        мсДанные.Добавить(стСтрокаТаблицы);
    КонецЦикла;
    
    Возврат мсДанные;
    
КонецФункции

Вариант 3. Загрузка простого массива в одну колонку

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

  1. Создаем новую ТаблицаЗначений.
  2. Добавляем колонку нужного типа через ТЗ.Колонки.Добавить("ИмяКолонки").
  3. Добавляем необходимое количество пустых строк в таблицу.
  4. Вызываем метод ЗагрузитьКолонку().

ИсходныйМассив = Новый Массив;
ИсходныйМассив.Добавить("Значение 1");
ИсходныйМассив.Добавить("Значение 2");

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("МояКолонка");

Для Каждого Элемент Из ИсходныйМассив Цикл
    ТЗ.Добавить();
КонецЦикла;

ТЗ.ЗагрузитьКолонку(ИсходныйМассив, "МояКолонка");

Подведем итоги

Для успешного переноса данных всегда учитывайте тип элементов в исходном массиве:

← На главную