Поиск файлов 1С на диске и из встроенного языка
Содержание
Найти файлы в каталоге из кода 1С можно функцией НайтиФайлы(Каталог, Маска, ИскатьВПодкаталогах): она возвращает массив объектов Файл. Вручную каталог базы 1С проще всего узнать в окне запуска: выделите базу в списке, и путь появится внизу окна. Дальше работают обычные средства Windows: поиск проводника, dir /s /b или PowerShell.
Чаще всего ищут одно из трёх: саму файловую базу
1Cv8.1CD, выгрузки .dt и обработки .epf, либо файлы, которые программа сама кладёт на диск (обмены, вложения, журналы). Для каждого случая свой короткий путь.
Где 1С хранит файлы: карта каталогов
Прежде чем искать, полезно знать, куда платформа 1С:Предприятие 8.3 складывает свои данные. Ниже стандартные места для Windows.
| Что ищем | Где обычно лежит | Признак |
|---|---|---|
| 🗄️ Файловая база | каталог, указанный при создании базы | файл 1Cv8.1CD |
| 📜 Журнал регистрации файловой базы | подкаталог 1Cv8Log в каталоге базы | 1Cv8.lgd (новый формат) или 1Cv8.lgf + *.lgp |
| 🖥️ Данные кластера серверной базы | srvinfo\reg_1541\<GUID базы> | каталог с идентификатором базы |
| 📋 Список баз пользователя | %APPDATA%\1C\1CEStart\ | файл ibases.v8i |
| ⚡ Кэш конфигураций | %APPDATA%\1C\1cv8\ и %LOCALAPPDATA%\1C\1cv8\ | каталоги с именами-GUID |
| ⚙️ Исполняемые файлы платформы | C:\Program Files\1cv8\<номер версии>\bin | 1cv8.exe, 1cv8c.exe |
Для серверной базы 1Cv8.1CD не существует. Данные лежат в СУБД (MS SQL Server, PostgreSQL), а на сервере 1С остаются только служебные файлы кластера и журнал регистрации.
Не знаете, файловая база или серверная? Выполните в любой обработке СтрокаСоединенияИнформационнойБазы(). Для файловой базы строка начинается с File="C:\..., для серверной — с Srvr=.
Если база пропала из списка, путь можно вытащить из ibases.v8i. Это обычный текстовый файл: откройте его блокнотом и найдите строку Connect=File="..." нужной базы.
Поиск файлов в каталоге из встроенного языка 1С
Основной инструмент разработчика — глобальная функция НайтиФайлы. Три параметра: путь к каталогу, маска (*.xml, Выгрузка_*.zip) и флаг поиска во вложенных каталогах. Результат — массив объектов Файл.
Базовый пример
Пример ниже ищет все выгрузки .dt в каталоге и подкаталогах и возвращает путь, размер и дату изменения каждой:
&НаСервере
Функция НайтиВыгрузкиБаз(Каталог)
Результат = Новый Массив;
Если Не (Новый Файл(Каталог)).Существует() Тогда
ВызватьИсключение СтрШаблон("Каталог %1 не найден", Каталог);
КонецЕсли;
Найденные = НайтиФайлы(Каталог, "*.dt", Истина);
Для Каждого Файл Из Найденные Цикл
Если Файл.ЭтоФайл() Тогда
Результат.Добавить(Новый Структура("Путь, Размер, Изменен",
Файл.ПолноеИмя, Файл.Размер(), Файл.ПолучитьВремяИзменения()));
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Проверка существования каталога стоит в начале не случайно. Пустой массив выглядит одинаково и при отсутствии файлов, и при опечатке в пути. Без проверки вы будете искать ошибку не там.
Полезные свойства объекта Файл:
- 📄
Имя— имя с расширением; - 📁
Путь— каталог, где лежит файл; - 🔗
ПолноеИмя— путь плюс имя; - 🏷️
РасширениеиИмяБезРасширения; - 📏 методы
Размер(),ПолучитьВремяИзменения(),ЭтоКаталог(),ЭтоФайл().
Клиент или сервер: где выполняется поиск
Функция ищет на диске того компьютера, где выполняется код. Это главный источник путаницы.
- 💻 Код в процедуре
&НаКлиентеищет на компьютере пользователя (в тонком клиенте; веб-клиент к файловой системе так не обращается). - 🖥️ Код
&НаСерверев клиент-серверной базе ищет на сервере 1С. ПутьC:\Обментам — это диск сервера, а не ваш. - 🗄️ В файловой базе без веб-сервера клиент и «сервер» — одна машина, поэтому разница не видна. Она проявится в момент переезда на сервер.
Для общих каталогов обмена используйте сетевой путь вида \\fileserver\obmen\in. Он одинаково понятен и клиенту, и серверу, если у обоих есть права.
Асинхронный поиск
Поиск по большому дереву на клиенте подвешивает форму. В платформе 8.3.18 и новее есть асинхронный вариант НайтиФайлыАсинх, который вызывают с Ждать внутри процедуры с модификатором Асинх:
&НаКлиенте
Асинх Процедура НайтиОбработки(Команда)
Найденные = Ждать НайтиФайлыАсинх(КаталогПоиска, "*.epf", Истина);
Сообщить(СтрШаблон("Найдено обработок: %1", Формат(Найденные.Количество(), "ЧН=0; ЧГ=0")));
КонецПроцедуры
На старых платформах для того же есть НачатьПоискФайлов с описанием оповещения.
Поиск с ограничением глубины
Флаг Истина обходит все уровни вложенности. На каталоге с архивами за десять лет это минуты. Если нужные файлы лежат не глубже двух-трёх уровней, напишите свой обход:
&НаСервере
Процедура ОбойтиКаталог(Каталог, Маска, Глубина, Результат)
Для Каждого Файл Из НайтиФайлы(Каталог, Маска, Ложь) Цикл
Если Файл.ЭтоФайл() Тогда
Результат.Добавить(Файл.ПолноеИмя);
КонецЕсли;
КонецЦикла;
Если Глубина = 0 Тогда
Возврат;
КонецЕсли;
Для Каждого Элемент Из НайтиФайлы(Каталог, ПолучитьМаскуВсеФайлы(), Ложь) Цикл
Если Элемент.ЭтоКаталог() Тогда
ОбойтиКаталог(Элемент.ПолноеИмя, Маска, Глубина - 1, Результат);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Вызов ОбойтиКаталог("\\fileserver\obmen", "*.xml", 2, Результат) просмотрит сам каталог и два уровня под ним. ПолучитьМаскуВсеФайлы() возвращает маску «все файлы» для текущей ОС, поэтому код одинаково работает на Windows и Linux.
Как найти файлы 1С стандартными средствами Windows
Когда нужно просто отыскать потерянную базу или обработку, код писать незачем.
Проводник
В строке поиска проводника введите маску: *.1CD, *.dt, *.epf. Чтобы не ждать, начинайте с конкретного диска или папки пользователя, а не с «Этот компьютер». Проводник не заходит в скрытые каталоги вроде AppData, если их показ выключен в параметрах вида.
Командная строка
Команда dir ищет быстрее проводника и выводит полные пути, которые удобно скопировать:
dir D:\ /s /b 1Cv8.1CD
dir C:\Users /s /b *.dt *.epf *.erf
Ключ /s включает подкаталоги, /b убирает лишнее из вывода. Ещё короче — where /r D:\ *.1CD.
PowerShell
PowerShell удобен, когда нужно отфильтровать по размеру или дате. Пример: все файловые базы на диске D с размером и датой последнего изменения, крупные сверху:
Get-ChildItem -Path D:\ -Filter *.1CD -Recurse -ErrorAction SilentlyContinue |
Sort-Object Length -Descending |
Select-Object FullName, @{n='МБ';e={[math]::Round($_.Length/1MB)}}, LastWriteTime
Параметр -ErrorAction SilentlyContinue скрывает ошибки доступа к системным каталогам, иначе вывод тонет в красных строках. Дата изменения подсказывает, какой из найденных 1Cv8.1CD рабочий: в живой базе файл меняется каждый день.
Следы в журнале регистрации
Журнал регистрации не записывает, какие файлы лежат на диске. Зато он отвечает на соседние вопросы: кто загрузил вложение, кто запускал выгрузку, с какого компьютера.
Где открыть журнал
- 📂 В Бухгалтерии 3.0 и других конфигурациях на БСП:
Администрирование → Обслуживание → Журнал регистрации. - 🧰 В любой конфигурации:
Функции для технического специалиста → Стандартные → Журнал регистрации. Команда «Функции для технического специалиста» включается в параметрах программы (меню с шестерёнкой).
В отборе журнала укажите период, пользователя и событие. Для вложений ищите изменения данных по справочникам присоединённых файлов. Колонка «Компьютер» покажет, с какой машины работал пользователь, и подскажет, где искать исходник.
Пишем свои события
Если ваш код ищет и обрабатывает файлы, пусть он оставляет след. Одна строка в цикле обработки:
ЗаписьЖурналаРегистрации("Обмен.ЗагрузкаФайлов", УровеньЖурналаРегистрации.Информация,
, , СтрШаблон("Обработан файл %1", Файл.ПолноеИмя));
Через месяц, когда спросят, куда делся файл от поставщика, вы отфильтруете журнал по событию Обмен.ЗагрузкаФайлов и увидите время и полное имя.
Сами файлы журнала
Иногда нужен не журнал в интерфейсе, а его файлы: база не открывается, а события посмотреть надо. У файловой базы они в подкаталоге 1Cv8Log рядом с 1Cv8.1CD. У серверной — на сервере 1С в каталоге srvinfo\reg_1541\<GUID базы>\1Cv8Log. GUID базы виден в консоли администрирования серверов в свойствах информационной базы.
Права доступа и блокировки: почему файл не находится
Файл точно есть, а НайтиФайлы возвращает пустой массив или код падает на чтении. Обычно причина в одной из четырёх вещей.
Учётная запись службы
Серверный код выполняет рабочий процесс 1С. Он работает от имени учётной записи службы агента сервера, по умолчанию USR1CV8. Ваши личные права здесь ничего не решают.
- 🔑 Выдайте учётной записи службы права на чтение (и запись, если нужно) на каталог и сетевую папку.
- 🌐 Подключённые диски вида
Z:\служба не видит: они существуют только в сеансе пользователя. На сервере используйте только UNC-путь\\server\share. - 🖥️ Если служба работает от локальной учётной записи, доступ к сетевой папке на другом сервере нужно настраивать отдельно. Проще запустить службу от доменной учётной записи с нужными правами.
Безопасный режим и профили безопасности
Внешние обработки и расширения могут работать в безопасном режиме. Там доступ к файловой системе запрещён, и обращение к диску вызывает исключение. В кластере такие ограничения задают профили безопасности, а разрешённые каталоги прописывают в их свойствах.
Занятые файлы
Файл может находиться, но не открываться: его держит другой процесс. Типичный случай — 1Cv8.1CD, пока в базе работают пользователи, или XML обмена, который ещё дописывается.
Найти виновника можно штатно: Монитор ресурсов → ЦП → Связанные дескрипторы, в поле поиска вводите имя файла. Монитор покажет процесс, который держит файл.
Если файл держит 1cv8.exe или rphost.exe, завершение процесса оборвёт работу пользователей без сохранения. Делайте это только после предупреждения, в нерабочее время или когда сеанс точно завис.
Регистр и кодировка имён
На Windows имена файлов не различают регистр, на Linux различают. Код с маской *.XML на сервере под Linux не найдёт export.xml. Если сервер 1С может работать под Linux, приводите маски к фактическому регистру или проверяйте расширение через НРег(Файл.Расширение).
Поиск в больших каталогах и томах хранения
Когда файлов сотни тысяч, простой рекурсивный поиск становится узким местом.
Ускоряем поиск
- Сужайте маску.
Заказ_2026*.xmlвместо*.xmlотсекает лишнее ещё на уровне файловой системы. - Ограничивайте глубину собственным обходом, как в примере выше.
- Ищите на стороне, где лежат файлы. Серверный код на сервере с локальным диском быстрее, чем клиент через сеть.
- Раскладывайте файлы обмена по подкаталогам с датой:
in\2026-10\. Поиск по одному месяцу быстрее, чем по всей истории. - Переносите обработанные файлы в архивный каталог. Тогда в рабочей папке остаются только новые, и поиск занимает доли секунды.
| Способ | Когда подходит | Минусы |
|---|---|---|
НайтиФайлы(..., Истина) | небольшие каталоги, до тысяч файлов | обходит всё дерево целиком |
| Свой обход с глубиной | известна структура, глубина 1-3 уровня | больше кода |
НайтиФайлыАсинх | поиск на клиенте, нельзя вешать форму | платформа 8.3.18 и новее |
dir / PowerShell | разовый ручной поиск | вне 1С, не автоматизировать в базе |
Тома хранения присоединённых файлов
В конфигурациях на БСП вложения к документам хранятся в базе или в томах на диске. Настройка томов находится в разделе Администрирование, в настройках присоединённых файлов.
В томе файлы лежат под служебными именами, а не под исходными. Поиск проводником по имени «Договор_поставки.pdf» ничего не даст. Ищите вложение в самой программе — в карточке документа или в списке присоединённых файлов, — а уже потом при необходимости смотрите его расположение на диске.
Перед переносом томов на другой диск сделайте резервную копию и самой базы, и каталога тома. Если путь тома в настройках разойдётся с фактическим, программа не найдёт ни одного вложения.
Частые ошибки при поиске файлов
- ❌ Путь с подключённого диска в серверном коде. На клиенте
Z:\Обменработает, на сервере — нет. Решение: UNC-путь. - ❌ Маска без звёздочки.
НайтиФайлы(Каталог, ".xml")ищет файл с именем «.xml», а не все XML. Нужно*.xml. - ❌ Каталоги в результате. Маска
*возвращает и папки. Без проверкиЭтоФайл()код попытается прочитать каталог как файл. - ❌ Поиск в каталоге временных файлов чужого сеанса.
КаталогВременныхФайлов()на клиенте и на сервере — разные папки. Файл, записанный на сервере, клиент там не найдёт. - ❌ Удаление найденного без отбора по дате. Код «удалить все
*.xmlстарше месяца» без проверкиПолучитьВремяИзменения()сотрёт и сегодняшние файлы.
Частые вопросы
Можно ли искать файлы в веб-клиенте?
Как найти файл по содержимому, а не по имени?
НайтиФайлы, затем прочитайте каждый ТекстовымДокументом или ЧтениемТекста и ищите строку функцией СтрНайти. На больших объёмах сначала отфильтруйте по дате изменения.Почему база нашлась, но в ней не те данные?
1Cv8.1CD из старых архивов. Сверьте дату изменения файла и путь в ibases.v8i: рабочая база та, которая подключена в списке и меняется ежедневно.Как найти, куда 1С сохранила выгрузку отчёта?
*.xlsx с LastWriteTime за сегодня.Работает ли НайтиФайлы на Linux-сервере 1С?
/, учитывайте регистр имён и права пользователя, от которого запущен сервер 1С.