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