В процессе разработки часто возникает задача получения списка файлов из определенной директории и их последующей обработки. Платформа 1С:Предприятие предоставляет для этого удобную функцию НайтиФайлы(), которая возвращает массив. Однако новичку не всегда очевидно, как наиболее эффективно преобразовать этот массив в объект ТаблицаЗначений для дальнейшей сортировки, фильтрации или вывода пользователю. В этой статье мы подробно разберем, как правильно перенести данные, и проанализируем типичные ошибки, которые допускают программисты.
Рассмотрим ситуацию: нам необходимо найти все текстовые файлы в корне диска C и поместить их имена в таблицу значений. Исходный код для поиска выглядит следующим образом:
МассивНайденныхФайлов = НайтиФайлы("C:\", "*.txt", Ложь);
Функция НайтиФайлы возвращает массив объектов особого типа — Файл. Важно понимать, что это не просто строки с путями, а объекты, имеющие свои свойства: Имя, ПолноеИмя, Расширение, Размер() и другие. Наша задача — извлечь эти данные и структурировать их в таблице.
Проанализируем самый надежный и гибкий способ — последовательное добавление строк в таблицу значений. Этот метод позволяет нам не только перенести имена, но и сразу преобразовать типы данных или заполнить дополнительные колонки.
Разберем по шагам, как это реализовать:
ТаблицаЗначений.Для Каждого для обхода массива.Файл.Рассмотрим пример кода:
// Создаем таблицу и описываем колонки
ТабФайлов = Новый ТаблицаЗначений;
ТабФайлов.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка"));
ТабФайлов.Колонки.Добавить("Размер", Новый ОписаниеТипов("Число"));
// Заполняем данными
Для Каждого ТекущийФайл Из МассивНайденныхФайлов Цикл
НоваяСтрока = ТабФайлов.Добавить();
НоваяСтрока.Имя = ТекущийФайл.Имя;
НоваяСтрока.Размер = ТекущийФайл.Размер();
КонецЦикла;
Этот способ является наиболее прозрачным. Мы точно контролируем, какие данные и в каком формате попадают в таблицу. Важно: если вы планируете использовать таблицу в дальнейшем (например, передавать в запрос), обязательно указывайте типы колонок при их создании через ОписаниеТипов.
Существует альтернативный метод — ЗагрузитьКолонку(). Он работает быстрее на очень больших объемах данных, но имеет свои критические особенности, на которых часто спотыкаются разработчики. Разберем ситуацию из обсуждения на форуме, где автор допустил классическую ошибку.
Проанализируем неверный код из сообщения №8:
Для Каждого Файл Из МассивНайденныхФайлов Цикл
Таб1.Добавить();
Таб1.ЗагрузитьКолонку(МассивНайденныхФайлов, "Имя");
КонецЦикла;
Почему так делать нельзя? Выясним причину. Метод ЗагрузитьКолонку предназначен для того, чтобы заменить сразу все значения в колонке значениями из массива. Вызывая его внутри цикла, мы заставляем систему перезаписывать всю колонку целиком на каждой итерации. Если в массиве 1000 файлов, 1С выполнит полную перезагрузку 1000 раз. Кроме того, этот код загрузит в колонку объекты Файл, а не строки с именами.
Рассмотрим правильный алгоритм использования ЗагрузитьКолонку:
ЗагрузитьКолонку один раз вне всяких циклов.Пример оптимизированного кода:
// 1. Предположим, у нас уже есть МассивИменФайлов (только строки)
Количество = МассивИменФайлов.Количество();
// 2. Создаем структуру таблицы
Таб1 = Новый ТаблицаЗначений;
Таб1.Колонки.Добавить("Имя");
// 3. Создаем пустые строки (быстрый способ)
Для Сч = 1 По Количество Цикл
Таб1.Добавить();
КонецЦикла;
// 4. Загружаем данные одним махом
Таб1.ЗагрузитьКолонку(МассивИменФайлов, "Имя");
Рассмотрим подробнее ограничения, с которыми мы можем столкнуться при реализации этой задачи:
1. Объект "Файл" против "Строки". Как мы уже выяснили, НайтиФайлы возвращает объекты. Если ваша задача — просто получить список имен, вам в любом случае придется пройтись циклом по массиву, чтобы извлечь свойство Имя. Прямая загрузка массива объектов в колонку с типом "Строка" приведет к ошибке или некорректному отображению.
2. Клиент-серверное взаимодействие. Помните, что объект ТаблицаЗначений доступен только на сервере (или в толстом клиенте). Если вы выполняете поиск файлов на стороне клиента (например, в тонком клиенте на компьютере пользователя), процедура должна выглядеть так:
Массив (он доступен везде).ТаблицаЗначений и заполняем её из этого массива.3. Права доступа и корень диска. Посмотрим на пример с путем C:\. В современных операционных системах Windows прямой доступ к корню системного диска может быть ограничен. Если программа не находит файлы, убедитесь, что у пользователя 1С есть соответствующие права доступа в операционной системе, или используйте пути к рабочим каталогам.
Для большинства повседневных задач мы рекомендуем использовать Метод 1 (обход в цикле). Несмотря на то, что теоретически он может работать чуть медленнее, чем ЗагрузитьКолонку, он гораздо безопаснее с точки зрения типизации данных и значительно проще в отладке. Вы сразу видите, какие свойства файла (размер, дата, имя) попадают в таблицу, и можете обрабатывать их "на лету".
Использование же ЗагрузитьКолонку оправдано только в узкоспециализированных задачах оптимизации, когда массив данных уже подготовлен и полностью соответствует структуре целевой колонки. И, как мы выяснили, этот метод никогда не должен находиться внутри цикла по элементам этого же массива.