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

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

В процессе разработки на платформе 1С:Предприятие 8 программисты часто сталкиваются с необходимостью преобразовать данные (для быстрого получения каркаса кода можно использовать Консоль кода + ИИ-помощник — см. универсальная консоль кода и запросов разработчика) из табличной части (ТЧ) или таблицы значений (ТЗ) в универсальную коллекцию Массив. Это может потребоваться для передачи данных с сервера на клиент, подготовки данных для сериализации в JSON или при интеграции со сторонними системами. Рассмотрим подробнее, почему стандартные методы поиска иногда не подходят и какими способами можно эффективно решить эту задачу.

Почему не работает НайтиСтроки() с пустым отбором?

Разберем ситуацию, с которой часто начинают новички. Метод НайтиСтроки() предназначен для получения подмножества строк, соответствующих определенному критерию, который передается в виде структуры. Попытка передать пустую структуру в надежде получить все строки часто приводит к ошибке или не дает желаемого результата, так как метод ожидает конкретные ключи (имена колонок). Для получения всех строк платформенными средствами правильнее использовать метод Выгрузить(), который создает копию таблицы, но не массив. Если же цель — именно Массив, нам придется использовать другие подходы.

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

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

Рассмотрим пример кода — сгенерировать такой каркас поможет ассистент разработчика 1С с искусственным интеллектом:


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

Важное ограничение: такой массив будет содержать объекты типа ДанныеФормыЭлементКоллекции или СтрокаТабличнойЧасти. Эти объекты нельзя передать на клиент или преобразовать в JSON напрямую. Если ваша задача ограничена сервером, этот метод самый быстрый, но для обмена данными он не подходит.

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

Выясним, как подготовить данные для передачи между контекстами (сервер-клиент) или для выгрузки во внешние системы. Для этого идеально подходит массив структур. В этом случае каждая строка таблицы превращается в отдельную Структура, где ключи — это имена колонок, а значения — данные ячеек.

Разберем по шагам создание универсального алгоритма, который сам определит колонки табличной части:


// Создаем массив, который будет содержать структуры
МассивРезультат = Новый Массив;

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

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

Этот метод гарантирует, что данные станут "простыми" и их можно будет легко сериализовать (в том числе через Выгрузку метаданных в JSON) или отобразить на клиенте. Однако помните, что ссылки на справочники внутри структур останутся ссылками, пока вы не преобразуете их в строки или UUID.

Способ 3. Использование функций БСП

Если в вашей конфигурации используется Библиотека стандартных подсистем (БСП), изучить возможности которой поможет Справочник по методам БСП, мы рекомендуем не изобретать велосипед, а воспользоваться готовым инструментом. Общий модуль ОбщегоНазначения содержит эффективную функцию для подобных задач.

Посмотрим на пример использования:


// Выгружаем табличную часть в таблицу значений
ТаблицаДанных = Объект.Товары.Выгрузить();

// Преобразуем ТЗ в массив структур одной строкой
МассивСтруктур = ОбщегоНазначения.ТаблицаЗначенийВМассив(ТаблицаДанных);

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

Способ 4. Работа с конкретной колонкой (ВыгрузитьКолонку)

Иногда нам не нужны все данные строки, а требуется только массив значений одной колонки (например, список всех номенклатур из документа). В системе 1С для этого есть встроенный метод ВыгрузитьКолонку(), который работает значительно быстрее циклов.

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


// Сначала выгружаем ТЧ в таблицу значений
ТЗ = Объект.Товары.Выгрузить();

// Получаем массив значений конкретной колонки
МассивНоменклатуры = ТЗ.ВыгрузитьКолонку("Номенклатура");

Метод ВыгрузитьКолонку() возвращает обычный Массив, который сразу готов к использованию в запросах (параметр В (&Массив)) или для передачи на клиент.

Производительность и работа с большими данными

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

  1. Временное хранилище: Если данные нужны на клиенте только для временной обработки, лучше поместить всю таблицу значений во временное хранилище с помощью ПоместитьВоВременноеХранилище() и передать на клиент только адрес (строку).
  2. Сериализация в JSON: Если данные готовятся для внешней системы, использование ЗаписатьJSON() напрямую с массивом структур является обязательным, так как ТаблицаЗначений не поддерживается сериализатором.
  3. XDTO-пакеты: Для строгой типизации и интеграции по протоколам SOAP/REST можно использовать XDTO. Это позволяет преобразовать ТЧ в объектную модель, которая автоматически валидируется и переводится в XML или JSON.

Рекомендации по выбору метода

Подведем итог нашему анализу:

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

← На главную