Почему функция СоздатьКаталог в 1С не создает папку на диске C

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

При разработке и отладке процедур выгрузки данных разработчики нередко сталкиваются с ситуацией, когда метод СоздатьКаталог() отрабатывает без каких-либо ошибок, но нужная папка на диске C:\ не появляется. Рассмотрим подробнее, почему происходит такое поведение, где на самом деле создаются файлы и как правильно организовать работу с каталогами в клиент-серверной архитектуре.

Главная причина: исполнение кода в контексте сервера

Проанализируем базовый сценарий. Если информационная база работает в клиент-серверном режиме, ключевое значение имеет контекст исполнения кода — на клиенте или на сервере:

  1. Код исполняется на сервере: Все файловые операции (включая СоздатьКаталог() и получение пути через КаталогВременныхФайлов()) выполняются в файловой системе компьютера, на котором запущен сервер 1С:Предприятие. Папка создается на серверной машине под учетной записью службы 1С. Разработчик, проверяя локальный диск C:\ на своем рабочем ПК, естественно, ничего не обнаружит.
  2. Код исполняется на клиенте: Файловые операции выполняются непосредственно в файловой системе ПК пользователя (или терминального сервера, где запущен клиент).

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


&НаКлиенте
Процедура КнопкаВыполнить(Кнопка, КаталогДляВыгрузки)
    КаталогДляВыгрузки = КаталогВременныхФайлов() + "ВыгрНаПч";
    СоздатьКаталог(КаталогДляВыгрузки);
    
    Сообщить("Врем кат: " + КаталогВременныхФайлов());
    Сообщить("Кат файлов: " + КаталогДляВыгрузки);
    
    СоздатьКаталог("C:\Users\ASayenko\AppData\Local\Temp\DDR");
    СоздатьКаталог("C:\1111");
КонецПроцедуры

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

Влияние системы безопасности Windows (UAC и VirtualStore)

Выясним еще одну важную причину, из-за которой папка может не появляться в корне диска C:\. При включенном механизме контроля учетных записей (UAC) в Windows попытка записать данные в корень системного диска или в защищенные системные папки без прав администратора не всегда приводит к ошибке доступа.

Вместо этого операционная система применяет виртуализацию файлов (VirtualStore). Фактически каталог создается по пути вида:

C:\Users\<ИмяПользователя>\AppData\Local\VirtualStore\

Код 1С отрабатывает успешно, однако в корне диска C:\ новая папка отображаться не будет.

Особенности работы через RDP и RemoteApp

Если сеанс 1С запущен через удаленный рабочий стол или в режиме RemoteApp, метод КаталогВременныхФайлов() вернет путь к временной папке на терминальном сервере, например:

C:\Users\<ИмяПользователя>\AppData\Local\Temp\<НомерСеанса>\

В этом случае папка создается на терминальном сервере, а не на физическом ПК пользователя.

Современные асинхронные методы платформы 1С

В современных конфигурациях 1С синхронный метод СоздатьКаталог() считается устаревшим, а при установленном запрете на использование синхронных вызовов в веб-клиенте его вызов блокируется. Для создания каталогов рекомендуется использовать асинхронные методы:

  1. Метод с использованием ключевого слова Ждать (в асинхронных процедурах):
    
    &НаКлиенте
    Асинх Процедура СоздатьПапкуАсинхронно()
        ПутьКПапке = "C:\Выгрузка";
        Ждать СоздатьКаталогАсинх(ПутьКПапке);
    КонецПроцедуры
    
  2. Метод с использованием ОписанияОповещения:
    
    &НаКлиенте
    Процедура СоздатьПапкуЧерезОповещение()
        ОписаниеОповещения = Новый ОписаниеОповещения("ПослеСозданияКаталога", ЭтотОбъект);
        НачатьСозданиеКаталога(ОписаниеОповещения, "C:\Выгрузка");
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ПослеСозданияКаталога(ИмяКаталога, ДополнительныеПараметры) Экспорт
        Сообщить("Каталог успешно создан: " + ИмяКаталога);
    КонецПроцедуры
    

Программная проверка создания каталога

Чтобы убедиться, что каталог действительно создан и доступен для программы, проанализируем состояние файловой системы с помощью объекта Файл:


ПутьККаталогу = КаталогВременныхФайлов() + "ВыгрузкаДанных";
СоздатьКаталог(ПутьККаталогу);

ПроверяемыйКаталог = Новый Файл(ПутьККаталогу);
Если НЕ ПроверяемыйКаталог.Существует() Тогда
    Сообщить("Каталог не был создан! Проверьте права доступа или контекст выполнения.");
Иначе
    Сообщить("Каталог успешно создан и доступен.");
КонецЕсли;

Передача файлов между сервером и клиентом без создания локальных папок

Чтобы избежать проблем с путями и правами доступа на сервере или клиенте, разберем рекомендуемый паттерн передачи данных:

  1. Формируйте файл или данные во временном каталоге на сервере с помощью ПолучитьИмяВременногоФайла().
  2. Помещайте сформированный файл во временное хранилище методом ПоместитьВоВременноеХранилище().
  3. Передавайте адрес хранилища на клиент и скачивайте файл с помощью метода ПолучитьФайлИзВременногоХранилища() или ПолучитьФайлы().

Такой подход гарантирует корректную работу обработки независимо от режима работы базы и прав системных пользователей.

← На главную