Почему 1С перестала видеть файлы после перехода на клиент-серверный вариант и как это исправить?

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

Переход с файлового варианта базы данных на клиент-серверный (SQL) — это важный шаг в развитии любой информационной системы. Однако этот процесс часто сопровождается возникновением специфических ошибок, которые не проявлялись ранее. Одной из самых распространенных проблем является внезапная «потеря» видимости файлов или каталогов, с которыми успешно работали внешние обработки. Разберем подробно, почему это происходит и как правильно адаптировать код под серверную архитектуру.

Причина 1: Различие в контексте исполнения кода

Проанализируем ситуацию: в файловом варианте весь код выполняется на компьютере пользователя. Когда вы указываете путь типа F:\Import\data.xml, система ищет этот диск непосредственно на вашей рабочей станции. В клиент-серверном варианте часть кода (особенно процедуры с директивой &НаСервере) выполняется на стороне сервера 1С:Предприятия.

Важно понимать: сервер 1С ничего не знает о ваших локальных дисках. Диск F: на вашем компьютере и диск F: на сервере — это абсолютно разные физические или логические области. Более того, серверная служба чаще всего не имеет подключенных сетевых дисков, так как они монтируются в сессии пользователя, а не в системной сессии службы.

Причина 2: Учетная запись службы сервера 1С

Рассмотрим технический аспект запуска сервера. Служба 1C:Enterprise 8.3 Server Agent (процесс ragent.exe и его рабочие процессы rphost.exe) обычно запускается от имени специальной учетной записи. Это может быть:

  1. Локальная системная учетная запись (LocalSystem) — у нее нет прав на доступ к сетевым ресурсам.
  2. Специальный локальный пользователь (например, USR1CV8) — он имеет права только на локальные папки сервера.
  3. Доменная учетная запись — единственный вариант, позволяющий серверу «выходить» в сеть.

Если ваша обработка пытается прочитать файл по сетевому пути, а у пользователя, от которого запущен rphost, нет прав на эту папку, вы неизбежно получите ошибку «Каталог не обнаружен».

Решение 1: Использование полных сетевых путей (UNC)

Для того чтобы и клиент, и сервер могли одинаково успешно обращаться к файлу, необходимо отказаться от букв дисков в пользу UNC-путей. Вместо F:\обмен\file.xml следует использовать путь вида \\ИмяСервера\ОбщаяПапка\file.xml.

Разберем пример кода, который позволяет корректно обрабатывать пути:


// Пример преобразования пути для серверного вызова
ПутьКФайлу = "\\ServerFiles\Exchange\data.xml";
Чтение = Новый ЧтениеXML;
Попытка
    Чтение.ОткрытьФайл(ПутьКФайлу);
    // Дальнейшая логика обработки
Исключение
    Сообщить("Не удалось открыть файл: " + ОписаниеОшибки());
КонецПопытки;

Решение 2: Передача файла через Временное хранилище (рекомендуется)

Рассмотрим более современный и правильный подход для управляемых форм. Вместо того чтобы заставлять сервер искать файл в сети, мы можем «передать» сам файл с клиента на сервер. Это исключает проблемы с правами доступа к сетевым папкам.

Алгоритм действий следующий:

  1. На клиенте пользователь выбирает файл.
  2. Файл помещается во временное хранилище.
  3. Адрес хранилища передается на сервер.
  4. На сервере файл извлекается и обрабатывается.

Посмотрим на пример реализации:


&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
    ПараметрыКэша = Новый ОписаниеОповещения("ЗавершитьЗагрузку", ЭтотОбъект);
    НачатьПомещениеФайла(ПараметрыКэша, , , Истина, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьЗагрузку(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    Если Результат Тогда
        ОбработатьФайлНаСервере(Адрес);
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ОбработатьФайлНаСервере(Адрес)
    ДанныеФайла = ПолучитьИзВременногоХранилища(Адрес);
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
    ДанныеФайла.Записать(ИмяВременногоФайла);
    
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(ИмяВременногоФайла);
    // Читаем данные...
    ЧтениеXML.Закрыть();
    УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры

Проблема с отладкой на сервере

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

Разберем шаги для включения отладки в ОС Windows:

  1. Откройте редактор реестра (regedit).
  2. Перейдите к ветке HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.3 Server Agent....
  3. Найдите параметр ImagePath.
  4. В конец строки добавьте ключ -debug. Например: "C:\Program Files\1cv8\bin\ragent.exe" -srvc -agent ... -debug.
  5. Перезапустите службу сервера 1С.

Обратите внимание: если используется протокол HTTP для отладки (в современных версиях платформ), убедитесь, что соответствующие порты открыты в брандмауэре сервера.

Особенности работы с большими файлами

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

В таких случаях стоит рассмотреть:

Итоги и рекомендации

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

Основные правила «хорошего тона» при работе с файлами:

  1. Всегда используйте UNC-пути (\\server\...), если серверу нужен прямой доступ к файловой системе.
  2. Проверяйте, под каким пользователем Windows запущена служба 1С и есть ли у этого пользователя права на целевые сетевые ресурсы.
  3. Для интерактивных обработок в управляемом приложении отдавайте предпочтение методу с Временным хранилищем — это наиболее универсальный способ, не зависящий от сетевых настроек инфраструктуры.
  4. Не забывайте про флаг -debug, если планируете заниматься разработкой и поиском ошибок непосредственно в серверном контуре.
← На главную