Список файлов в 1С: загрузка из папки, Excel и программным кодом
Содержание
Добавить список файлов в 1С можно тремя путями. Если файлы нужно просто прикрепить к документу или карточке, перетащите их мышью в форму присоединённых файлов (кнопка со скрепкой) — можно сразу пачкой. Если нужен именно перечень имён и путей в таблице, загрузите его из Excel или текстового файла. А если папку нужно сканировать регулярно, поможет внешняя обработка с методом НайтиФайлы().
Выбор зависит от задачи. Для разовой привязки сканов к счёту хватит интерфейса. Для реестра из 5 000 договоров на файловом сервере — только код: вручную такой объём никто не загрузит без ошибок.
Какой способ выбрать: сравнение
| Способ | Когда подходит | Нужен программист | Ограничения |
|---|---|---|---|
| Перетаскивание в «Присоединённые файлы» | 1–50 файлов к конкретному объекту | Нет | Файлы привязываются к одному документу или элементу |
| Загрузка из Excel / TXT | Готовый перечень путей, разовая загрузка | Нет, если есть типовая загрузка | Перечень нужно сначала получить |
| Внешняя обработка сканирования папки | Регулярный разбор каталога, сотни файлов | Да, один раз | Нужны права на чтение папки |
| Код в конфигурации | Постоянный обмен, автоматическое задание | Да | Изменение конфигурации, поддержка при обновлениях |
Как добавить файлы в 1С через стандартный интерфейс
В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3, УТ 11 и другие) к документам и справочникам можно прикреплять файлы. Это и есть самый простой способ добавить список файлов к объекту.
Пошагово
- Откройте нужный документ или карточку (например, поступление товаров или контрагента).
- Нажмите кнопку со скрепкой в командной панели формы. Откроется список присоединённых файлов.
- Выделите в проводнике Windows сразу несколько файлов (
Ctrl+ клик илиCtrl+A). - Перетащите их мышью в список. Каждый файл станет отдельной строкой.
- Альтернатива — кнопка добавления в самом списке: она открывает стандартный диалог выбора, где тоже работает множественное выделение.
Счётчик на кнопке со скрепкой показывает, сколько файлов уже прикреплено. Так удобно проверять, что ничего не потерялось.
Что происходит с файлами
- 📁 По умолчанию файл копируется в базу. Исходник на диске можно удалять — копия уже в 1С.
- ✏️ Редактирование идёт через захват: файл берётся на редактирование, правится и помещается обратно.
- 🗂️ Администратор может включить хранение файлов в томах на диске. Тогда база не раздувается, а сами файлы лежат в отдельном каталоге. Эта настройка находится в разделе
Администрирование, в группе параметров работы с файлами.
Перетаскивание из проводника работает в тонком клиенте. В веб-клиенте браузер сначала попросит установить расширение для работы с файлами.
Загрузка списка файлов из Excel или текстового файла
Этот путь нужен, когда в 1С должен появиться перечень — имена, пути, даты — а не сами файлы. Например, реестр сканов первичных документов с путями на общем диске.
Шаг 1. Получите перечень без программирования
Windows умеет выгрузить список файлов одной командой. Откройте командную строку в нужной папке и выполните:
dir /b /s *.pdf > C:\Temp\spisok.txt
/b— только пути, без дат и размеров;/s— включая вложенные папки;*.pdf— маска, замените на нужную.
Ещё быстрее для 10–20 файлов: выделите их в проводнике, зажмите Shift, щёлкните правой кнопкой и выберите «Копировать как путь». Пути окажутся в буфере обмена, их можно вставить в Excel.
Если в путях есть кириллица, а в TXT вместо букв появились «кракозябры», сохраните файл в Excel или откройте его в Блокноте и пересохраните в UTF-8.
Шаг 2. Загрузите перечень в 1С
Во многих типовых документах над табличной частью есть команда загрузки из файла (иногда она спрятана в меню Ещё). Она принимает Excel и предлагает сопоставить колонки. Если такой команды нет, загружают обработкой. Табличный документ читает xls, xlsx, ods и mxl:
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("C:\Temp\spisok.xlsx");
Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
ПолныйПуть = СокрЛП(ТабДок.Область(НомерСтроки, 1).Текст);
Если ПустаяСтрока(ПолныйПуть) Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = СписокФайлов.Добавить();
НоваяСтрока.ПолноеИмя = ПолныйПуть;
КонецЦикла;
Для текстового файла код ещё короче:
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать("C:\Temp\spisok.txt", КодировкаТекста.UTF8);
Для Н = 1 По Текст.КоличествоСтрок() Цикл
СписокФайлов.Добавить().ПолноеИмя = СокрЛП(Текст.ПолучитьСтроку(Н));
КонецЦикла;
Здесь СписокФайлов — таблица значений или табличная часть с колонкой ПолноеИмя. Цикл начинается со 2-й строки Excel, потому что первая — заголовок.
Внешняя обработка для сканирования папки
Внешняя обработка (.epf) — компромисс: конфигурацию менять не нужно, а папка разбирается одной кнопкой. Её открывают через Файл → Открыть или подключают в разделе дополнительных обработок.
Типичная обработка сканирования делает четыре вещи:
- 📂 Показывает диалог выбора каталога.
- 🔍 Ищет в нём файлы по маске, при желании — во вложенных папках.
- 📋 Выводит результат в таблицу на форме: имя, расширение, размер, дата изменения.
- ✅ По кнопке создаёт элементы справочника или присоединённые файлы.
При открытии внешней обработки платформа предупреждает о защите от опасных действий. Открывайте только обработки из доверенного источника: код в .epf выполняется с вашими правами и может удалить или изменить данные.
Перед запуском на рабочей базе сделайте резервную копию и прогоните обработку на копии. Ошибка в цикле создания элементов легко наплодит тысячи дублей.
Программный способ: НайтиФайлы и объект Файл
Основа любого сканирования — глобальный метод НайтиФайлы(Путь, Маска, ИскатьВПодкаталогах). Он возвращает массив объектов Файл.
Синхронный вариант
Процедура ЗаполнитьСписокФайлов(Каталог, Маска = "*.*")
СписокФайлов.Очистить();
Найденные = НайтиФайлы(Каталог, Маска, Истина);
Для Каждого ФайлОбъект Из Найденные Цикл
Если ФайлОбъект.ЭтоКаталог() Тогда
Продолжить;
КонецЕсли;
Стр = СписокФайлов.Добавить();
Стр.Имя = ФайлОбъект.Имя;
Стр.ПолноеИмя = ФайлОбъект.ПолноеИмя;
Стр.Расширение = ФайлОбъект.Расширение;
Стр.Размер = ФайлОбъект.Размер();
Стр.ДатаИзменения = ФайлОбъект.ПолучитьВремяИзменения();
КонецЦикла;
КонецПроцедуры
Полезные свойства объекта Файл:
| Свойство / метод | Что возвращает |
|---|---|
Имя | Имя с расширением: akt_15.pdf |
ИмяБезРасширения | akt_15 |
Расширение | .pdf (с точкой) |
Путь | Каталог, в котором лежит файл |
ПолноеИмя | Полный путь к файлу |
Существует() | Есть ли файл на диске |
ЭтоКаталог() | Папка это или файл |
Размер() | Размер в байтах |
Нужны несколько расширений? Надёжнее вызвать НайтиФайлы отдельно для *.pdf и *.jpg и сложить массивы, чем полагаться на составную маску.
Асинхронный вариант для клиента
В клиентском коде синхронные вызовы работы с файлами в современных конфигурациях запрещены режимом без модальности. С платформы 8.3.18 удобнее всего писать через Асинх / Ждать:
&НаКлиенте
Асинх Процедура Сканировать(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Выбранные = Ждать Диалог.ВыбратьАсинх();
Если Выбранные = Неопределено Тогда
Возврат;
КонецЕсли;
Найденные = Ждать НайтиФайлыАсинх(Выбранные[0], "*.pdf", Истина);
Сообщить("Найдено файлов: " + Найденные.Количество());
КонецПроцедуры
На более ранних платформах используют НачатьПоискФайлов с ОписаниеОповещения.
Выбор нескольких файлов вручную
Если пользователь сам отмечает файлы, а не папку, задайте режим Открытие и включите МножественныйВыбор = Истина. Диалог вернёт массив полных путей, который дальше обрабатывается тем же циклом.
Как превратить найденный список в данные базы
Перечень в таблице на форме исчезнет при её закрытии. Чтобы список файлов остался в 1С, его записывают в справочник или регистр. Минимальный вариант для собственного справочника РеестрФайлов с реквизитами ПолноеИмя и Содержимое (тип ХранилищеЗначения):
&НаСервере
Процедура ЗаписатьСписок()
Для Каждого Стр Из СписокФайлов Цикл
Элемент = Справочники.РеестрФайлов.СоздатьЭлемент();
Элемент.Наименование = Стр.Имя;
Элемент.ПолноеИмя = Стр.ПолноеИмя;
Элемент.Содержимое = Новый ХранилищеЗначения(
Новый ДвоичныеДанные(Стр.ПолноеИмя), Новый СжатиеДанных(9));
Элемент.Записать();
КонецЦикла;
КонецПроцедуры
Если нужен только реестр путей, строку с Содержимое уберите. База останется лёгкой, а файлы — на своём месте. Справочник и его реквизиты здесь — пример; в вашей конфигурации названия будут свои.
Новый ДвоичныеДанные(Путь) на сервере читает файл с диска сервера. Для файлов с компьютера пользователя сначала передайте их во временное хранилище — об этом в следующем разделе.
Права доступа и ошибки при работе с файлами
Большинство проблем с файлами в 1С связано не с кодом, а с тем, где этот код выполняется.
Клиент и сервер видят разные диски
- 💻 Код
&НаКлиентевидит диски компьютера пользователя. - 🖥️ Код
&НаСерверев клиент-серверной базе видит диски сервера 1С. ВашC:\Сканытам не существует. - 🔁 Чтобы передать файлы с компьютера на сервер, их помещают во временное хранилище (
НачатьПомещениеФайлов, а в новых платформахПоместитьФайлыНаСерверАсинх).
Сетевые папки и пользователь службы
Сервер 1С работает от имени служебной учётной записи (часто USR1CV8). У неё нет ваших подключённых сетевых дисков. Поэтому:
- Используйте UNC-путь:
\\fileserver\scans, а неZ:\scans. - Выдайте пользователю службы права на чтение этой папки — и на ресурс, и на файловую систему.
- Проверьте доступ, войдя на сервер под этой учётной записью или попросив администратора.
Если для выдачи прав администратор перезапускает службу сервера 1С, оборвутся сеансы всех пользователей. Делайте это вне рабочего времени и предупредите коллег.
Большие списки файлов: как не повесить базу
На 100–200 файлах всё работает мгновенно. На 50 000 файлов в сетевой папке со вложенными каталогами появляются минуты ожидания и рост базы.
Что помогает:
- 🎯 Узкая маска.
*.pdfвместо*.*и поиск без подкаталогов, если они не нужны. - 📏 Не вызывать лишнее.
Размер()иПолучитьВремяИзменения()обращаются к диску на каждый файл. Нужны только имена — не запрашивайте остальное. - 🧮 Сравнение по индексу. Чтобы не добавить файл повторно, загрузите уже учтённые пути в таблицу значений с индексом по
ПолноеИмяи ищите черезНайтиСтроки. Запрос в базу на каждый файл — самый медленный вариант. - 📦 Порции. Создавайте объекты пачками по 500–1000 штук в отдельных транзакциях. Ошибка на 30 000-м файле не откатит всю работу.
- 🗄️ Тома на диске. Тысячи сканов внутри базы раздувают её до десятков гигабайт. Храните файлы в томах, а в базе — только ссылки.
- ⏱️ Фоновое выполнение. Долгое сканирование запускайте фоновым или регламентным заданием, чтобы не блокировать форму пользователя.
Простой ориентир: если сканирование идёт дольше минуты, его пора переносить на сервер в фоновое задание.