Как проверить существование каталога в клиент-серверной базе 1С?

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

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

Рассмотрим причинно-следственные связи этой проблемы и разберем способы корректной проверки и работы с каталогами.

Выясним причину: почему код на сервере не видит каталог пользователя

Когда вы вызываете конструктор Новый Файл(Путь) и метод Существует() внутри серверной процедуры (с директивой &НаСервере), платформа проверяет наличие каталога в файловой системе того компьютера, на котором физически запущен сервер 1С, а не на локальном ПК пользователя.

Проанализируем ключевые особенности выполнения серверного кода:

  1. Изолированный контекст службы: Служба сервера 1С запускается под отдельной служебной учетной записью (например, usr1cv8 или Local System). Она работает в служебной сессии ОС и не имеет доступа к окружению рабочего стола пользователя.
  2. Недоступность RDP-перенаправлений: Если пользователь работает через Remote Desktop (RDP), виртуальные пути вида \\tsclient\C\Folder существуют только внутри сессии пользователя терминала. Сервер 1С эти пути увидеть не может.
  3. Сетевые диски: Буквы подключенных сетевых дисков (например, Z:\) создаются в рамках пользовательского сеанса и отсутствуют в контексте службы 1С.
  4. Ограничение прав: Если служба сервера 1С работает под локальной системной учетной записью, у нее нет прав для обращения к сетевым ресурсам других компьютеров в сети.

Способ 1. Выполнение проверки на стороне клиента

Если требуется проверить существование папки на локальном диске пользователя или внутри его RDP-сессии, выполнять проверку необходимо с директивой &НаКлиенте.

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


&НаКлиенте
Процедура ПроверитьКаталогНаКлиенте()
    ПутьККаталогу = "C:\МойКаталог";
    
    ФайлОбъект = Новый Файл(ПутьККаталогу);
    Если ФайлОбъект.Существует() И ФайлОбъект.ЭтоКаталог() Тогда
        ПоказатьПредупреждение(, "Каталог существует и доступен!");
    Иначе
        ПоказатьПредупреждение(, "Каталог не найден или указанный путь ведет к файлу.");
    КонецЕсли;
КонецПроцедуры

Если данные из файла или папки нужно передать на сервер для обработки, правильным подходом является чтение файла на клиенте и передача содержимого на сервер через временное хранилище с помощью функции ПоместитьВоВременноеХранилище().

Способ 2. Настройка доступа для сервера 1С и использование UNC-путей

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

Разберем по шагам настройку такой схемы:

  1. Настройка учетной записи службы: Переведите службу сервера 1С с локальной учетной записи на доменную учетную запись.
  2. Выдача прав: Предоставьте этой доменной учетной записи права чтения/записи на сетевой каталог (как на уровне Share-прав, так и на уровне NTFS).
  3. Использование UNC-путей: В коде вместо букв дисков задействуйте полные сетевые пути вида \\ИмяСервера\ИмяРесурса\Папка.

Посмотрим на пример правильного серверного кода с полной проверкой типа объекта:


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

Способ 3. Проверка через функцию НайтиФайлы

Альтернативным вариантом проверки доступности и существования каталога является использование функции НайтиФайлы().

Разберем пример реализации:


&НаСервере
Функция КаталогСуществует(ПутьККаталогу)
    НайденныеФайлы = НайтиФайлы(ПутьККаталогу);
    
    Если НайденныеФайлы.Количество() > 0 Тогда
        Возврат НайденныеФайлы[0].ЭтоКаталог();
    КонецЕсли;
    
    Возврат Ложь;
КонецФункции

Подводя итоги, при разработке в клиент-серверной базе всегда четко разделяйте контекст: проверка локальных путей пользователя выполняется на клиенте, а работа с общими сетевыми ресурсами или каталогами сервера — на сервере с использованием прямых UNC-путей и корректно настроенных прав службы 1С.

← На главную