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

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

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

Разбор исходной задачи

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

МассивНайденныхФайлов = НайтиФайлы("C:\", "*.txt", Ложь);

Функция НайтиФайлы возвращает массив объектов особого типа — Файл. Важно понимать, что это не просто строки с путями, а объекты, имеющие свои свойства: Имя, ПолноеИмя, Расширение, Размер() и другие. Наша задача — извлечь эти данные и структурировать их в таблице.

Метод 1: Прямой обход в цикле (Рекомендуемый)

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

Разберем по шагам, как это реализовать:

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

Рассмотрим пример кода:


// Создаем таблицу и описываем колонки
ТабФайлов = Новый ТаблицаЗначений;
ТабФайлов.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка"));
ТабФайлов.Колонки.Добавить("Размер", Новый ОписаниеТипов("Число"));

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

Этот способ является наиболее прозрачным. Мы точно контролируем, какие данные и в каком формате попадают в таблицу. Важно: если вы планируете использовать таблицу в дальнейшем (например, передавать в запрос), обязательно указывайте типы колонок при их создании через ОписаниеТипов.

Метод 2: Использование метода ЗагрузитьКолонку

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

Проанализируем неверный код из сообщения №8:


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

Почему так делать нельзя? Выясним причину. Метод ЗагрузитьКолонку предназначен для того, чтобы заменить сразу все значения в колонке значениями из массива. Вызывая его внутри цикла, мы заставляем систему перезаписывать всю колонку целиком на каждой итерации. Если в массиве 1000 файлов, 1С выполнит полную перезагрузку 1000 раз. Кроме того, этот код загрузит в колонку объекты Файл, а не строки с именами.

Рассмотрим правильный алгоритм использования ЗагрузитьКолонку:

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

Пример оптимизированного кода:


// 1. Предположим, у нас уже есть МассивИменФайлов (только строки)
Количество = МассивИменФайлов.Количество();

// 2. Создаем структуру таблицы
Таб1 = Новый ТаблицаЗначений;
Таб1.Колонки.Добавить("Имя");

// 3. Создаем пустые строки (быстрый способ)
Для Сч = 1 По Количество Цикл
    Таб1.Добавить();
КонецЦикла;

// 4. Загружаем данные одним махом
Таб1.ЗагрузитьКолонку(МассивИменФайлов, "Имя");

Важные технические нюансы

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

1. Объект "Файл" против "Строки". Как мы уже выяснили, НайтиФайлы возвращает объекты. Если ваша задача — просто получить список имен, вам в любом случае придется пройтись циклом по массиву, чтобы извлечь свойство Имя. Прямая загрузка массива объектов в колонку с типом "Строка" приведет к ошибке или некорректному отображению.

2. Клиент-серверное взаимодействие. Помните, что объект ТаблицаЗначений доступен только на сервере (или в толстом клиенте). Если вы выполняете поиск файлов на стороне клиента (например, в тонком клиенте на компьютере пользователя), процедура должна выглядеть так:

3. Права доступа и корень диска. Посмотрим на пример с путем C:\. В современных операционных системах Windows прямой доступ к корню системного диска может быть ограничен. Если программа не находит файлы, убедитесь, что у пользователя 1С есть соответствующие права доступа в операционной системе, или используйте пути к рабочим каталогам.

Выводы и рекомендации

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

Использование же ЗагрузитьКолонку оправдано только в узкоспециализированных задачах оптимизации, когда массив данных уже подготовлен и полностью соответствует структуре целевой колонки. И, как мы выяснили, этот метод никогда не должен находиться внутри цикла по элементам этого же массива.

← На главную