Список файлов в 1С: загрузка из папки, Excel и программным кодом

· 9 мин

Содержание

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

Выбор зависит от задачи. Для разовой привязки сканов к счёту хватит интерфейса. Для реестра из 5 000 договоров на файловом сервере — только код: вручную такой объём никто не загрузит без ошибок.

Какой способ выбрать: сравнение

СпособКогда подходитНужен программистОграничения
Перетаскивание в «Присоединённые файлы»1–50 файлов к конкретному объектуНетФайлы привязываются к одному документу или элементу
Загрузка из Excel / TXTГотовый перечень путей, разовая загрузкаНет, если есть типовая загрузкаПеречень нужно сначала получить
Внешняя обработка сканирования папкиРегулярный разбор каталога, сотни файловДа, один разНужны права на чтение папки
Код в конфигурацииПостоянный обмен, автоматическое заданиеДаИзменение конфигурации, поддержка при обновлениях
Что вам нужно сделать?

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

В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3, УТ 11 и другие) к документам и справочникам можно прикреплять файлы. Это и есть самый простой способ добавить список файлов к объекту.

Пошагово

  1. Откройте нужный документ или карточку (например, поступление товаров или контрагента).
  2. Нажмите кнопку со скрепкой в командной панели формы. Откроется список присоединённых файлов.
  3. Выделите в проводнике Windows сразу несколько файлов (Ctrl + клик или Ctrl+A).
  4. Перетащите их мышью в список. Каждый файл станет отдельной строкой.
  5. Альтернатива — кнопка добавления в самом списке: она открывает стандартный диалог выбора, где тоже работает множественное выделение.

Счётчик на кнопке со скрепкой показывает, сколько файлов уже прикреплено. Так удобно проверять, что ничего не потерялось.

Что происходит с файлами

  • 📁 По умолчанию файл копируется в базу. Исходник на диске можно удалять — копия уже в 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) — компромисс: конфигурацию менять не нужно, а папка разбирается одной кнопкой. Её открывают через Файл → Открыть или подключают в разделе дополнительных обработок.

Типичная обработка сканирования делает четыре вещи:

  1. 📂 Показывает диалог выбора каталога.
  2. 🔍 Ищет в нём файлы по маске, при желании — во вложенных папках.
  3. 📋 Выводит результат в таблицу на форме: имя, расширение, размер, дата изменения.
  4. ✅ По кнопке создаёт элементы справочника или присоединённые файлы.

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

Перед запуском на рабочей базе сделайте резервную копию и прогоните обработку на копии. Ошибка в цикле создания элементов легко наплодит тысячи дублей.

Программный способ: НайтиФайлы и объект Файл

Основа любого сканирования — глобальный метод НайтиФайлы(Путь, Маска, ИскатьВПодкаталогах). Он возвращает массив объектов Файл.

Синхронный вариант

Процедура ЗаполнитьСписокФайлов(Каталог, Маска = "*.*")
    СписокФайлов.Очистить();
    Найденные = НайтиФайлы(Каталог, Маска, Истина);
    Для Каждого ФайлОбъект Из Найденные Цикл
        Если ФайлОбъект.ЭтоКаталог() Тогда
            Продолжить;
        КонецЕсли;
        Стр = СписокФайлов.Добавить();
        Стр.Имя          = ФайлОбъект.Имя;
        Стр.ПолноеИмя    = ФайлОбъект.ПолноеИмя;
        Стр.Расширение   = ФайлОбъект.Расширение;
        Стр.Размер       = ФайлОбъект.Размер();
        Стр.ДатаИзменения = ФайлОбъект.ПолучитьВремяИзменения();
    КонецЦикла;
КонецПроцедуры

Полезные свойства объекта Файл:

Свойство / методЧто возвращает
ИмяИмя с расширением: akt_15.pdf
ИмяБезРасширенияakt_15
Расширение.pdf (с точкой)
ПутьКаталог, в котором лежит файл
ПолноеИмяПолный путь к файлу
Существует()Есть ли файл на диске
ЭтоКаталог()Папка это или файл
Размер()Размер в байтах

Нужны несколько расширений? Надёжнее вызвать НайтиФайлы отдельно для *.pdf и *.jpg и сложить массивы, чем полагаться на составную маску.

Асинхронный вариант для клиента

В клиентском коде синхронные вызовы работы с файлами в современных конфигурациях запрещены режимом без модальности. С платформы 8.3.18 удобнее всего писать через Асинх / Ждать:

&НаКлиенте
Асинх Процедура Сканировать(Команда)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
    Выбранные = Ждать Диалог.ВыбратьАсинх();
    Если Выбранные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    Найденные = Ждать НайтиФайлыАсинх(Выбранные[0], "*.pdf", Истина);
    Сообщить("Найдено файлов: " + Найденные.Количество());
КонецПроцедуры

На более ранних платформах используют НачатьПоискФайлов с ОписаниеОповещения.

Выбор нескольких файлов вручную

Если пользователь сам отмечает файлы, а не папку, задайте режим Открытие и включите МножественныйВыбор = Истина. Диалог вернёт массив полных путей, который дальше обрабатывается тем же циклом.

Как превратить найденный список в данные базы

Перечень в таблице на форме исчезнет при её закрытии. Чтобы список файлов остался в 1С, его записывают в справочник или регистр. Минимальный вариант для собственного справочника РеестрФайлов с реквизитами ПолноеИмя и Содержимое (тип ХранилищеЗначения):

&НаСервере
Процедура ЗаписатьСписок()
    Для Каждого Стр Из СписокФайлов Цикл
        Элемент = Справочники.РеестрФайлов.СоздатьЭлемент();
        Элемент.Наименование = Стр.Имя;
        Элемент.ПолноеИмя    = Стр.ПолноеИмя;
        Элемент.Содержимое   = Новый ХранилищеЗначения(
            Новый ДвоичныеДанные(Стр.ПолноеИмя), Новый СжатиеДанных(9));
        Элемент.Записать();
    КонецЦикла;
КонецПроцедуры

Если нужен только реестр путей, строку с Содержимое уберите. База останется лёгкой, а файлы — на своём месте. Справочник и его реквизиты здесь — пример; в вашей конфигурации названия будут свои.

Новый ДвоичныеДанные(Путь) на сервере читает файл с диска сервера. Для файлов с компьютера пользователя сначала передайте их во временное хранилище — об этом в следующем разделе.

Права доступа и ошибки при работе с файлами

Большинство проблем с файлами в 1С связано не с кодом, а с тем, где этот код выполняется.

Клиент и сервер видят разные диски

  • 💻 Код &НаКлиенте видит диски компьютера пользователя.
  • 🖥️ Код &НаСервере в клиент-серверной базе видит диски сервера 1С. Ваш C:\Сканы там не существует.
  • 🔁 Чтобы передать файлы с компьютера на сервер, их помещают во временное хранилище (НачатьПомещениеФайлов, а в новых платформах ПоместитьФайлыНаСерверАсинх).

Сетевые папки и пользователь службы

Сервер 1С работает от имени служебной учётной записи (часто USR1CV8). У неё нет ваших подключённых сетевых дисков. Поэтому:

  1. Используйте UNC-путь: \\fileserver\scans, а не Z:\scans.
  2. Выдайте пользователю службы права на чтение этой папки — и на ресурс, и на файловую систему.
  3. Проверьте доступ, войдя на сервер под этой учётной записью или попросив администратора.
Диагностика: выберите симптом

Если для выдачи прав администратор перезапускает службу сервера 1С, оборвутся сеансы всех пользователей. Делайте это вне рабочего времени и предупредите коллег.

Большие списки файлов: как не повесить базу

На 100–200 файлах всё работает мгновенно. На 50 000 файлов в сетевой папке со вложенными каталогами появляются минуты ожидания и рост базы.

Что помогает:

  • 🎯 Узкая маска. *.pdf вместо *.* и поиск без подкаталогов, если они не нужны.
  • 📏 Не вызывать лишнее. Размер() и ПолучитьВремяИзменения() обращаются к диску на каждый файл. Нужны только имена — не запрашивайте остальное.
  • 🧮 Сравнение по индексу. Чтобы не добавить файл повторно, загрузите уже учтённые пути в таблицу значений с индексом по ПолноеИмя и ищите через НайтиСтроки. Запрос в базу на каждый файл — самый медленный вариант.
  • 📦 Порции. Создавайте объекты пачками по 500–1000 штук в отдельных транзакциях. Ошибка на 30 000-м файле не откатит всю работу.
  • 🗄️ Тома на диске. Тысячи сканов внутри базы раздувают её до десятков гигабайт. Храните файлы в томах, а в базе — только ссылки.
  • ⏱️ Фоновое выполнение. Долгое сканирование запускайте фоновым или регламентным заданием, чтобы не блокировать форму пользователя.

Простой ориентир: если сканирование идёт дольше минуты, его пора переносить на сервер в фоновое задание.

Частые вопросы

Можно ли добавить в 1С сразу всю папку с файлами?
Через присоединённые файлы — да: выделите все файлы в папке и перетащите их в список. Вложенные папки так не переносятся, для них нужна обработка с поиском в подкаталогах.
Файл, добавленный в 1С, изменится, если я поправлю оригинал на диске?
Нет. В базу или том попадает копия. Изменения в исходнике 1С не увидит, файл нужно заменить заново.
Как получить из 1С список прикреплённых к документам файлов?
Присоединённые файлы хранятся в отдельных справочниках, поэтому их перечень можно получить отчётом или запросом к этим справочникам с отбором по владельцу.
Какой максимальный размер файла можно прикрепить?
Лимит задаёт администратор в настройках работы с файлами. Если файл не добавляется с сообщением о превышении размера, попросите увеличить ограничение.
Можно ли загрузить список файлов в файловую базу так же, как в серверную?
Да. В файловой базе серверный код выполняется на том же компьютере, поэтому локальные пути видны и в серверных процедурах. Сложности с правами начинаются только в клиент-серверном варианте.