Переход с файлового варианта базы данных на клиент-серверный (SQL) — это важный шаг в развитии любой информационной системы. Однако этот процесс часто сопровождается возникновением специфических ошибок, которые не проявлялись ранее. Одной из самых распространенных проблем является внезапная «потеря» видимости файлов или каталогов, с которыми успешно работали внешние обработки. Разберем подробно, почему это происходит и как правильно адаптировать код под серверную архитектуру.
Проанализируем ситуацию: в файловом варианте весь код выполняется на компьютере пользователя. Когда вы указываете путь типа F:\Import\data.xml, система ищет этот диск непосредственно на вашей рабочей станции. В клиент-серверном варианте часть кода (особенно процедуры с директивой &НаСервере) выполняется на стороне сервера 1С:Предприятия.
Важно понимать: сервер 1С ничего не знает о ваших локальных дисках. Диск F: на вашем компьютере и диск F: на сервере — это абсолютно разные физические или логические области. Более того, серверная служба чаще всего не имеет подключенных сетевых дисков, так как они монтируются в сессии пользователя, а не в системной сессии службы.
Рассмотрим технический аспект запуска сервера. Служба 1C:Enterprise 8.3 Server Agent (процесс ragent.exe и его рабочие процессы rphost.exe) обычно запускается от имени специальной учетной записи. Это может быть:
Если ваша обработка пытается прочитать файл по сетевому пути, а у пользователя, от которого запущен rphost, нет прав на эту папку, вы неизбежно получите ошибку «Каталог не обнаружен».
Для того чтобы и клиент, и сервер могли одинаково успешно обращаться к файлу, необходимо отказаться от букв дисков в пользу UNC-путей. Вместо F:\обмен\file.xml следует использовать путь вида \\ИмяСервера\ОбщаяПапка\file.xml.
Разберем пример кода, который позволяет корректно обрабатывать пути:
// Пример преобразования пути для серверного вызова
ПутьКФайлу = "\\ServerFiles\Exchange\data.xml";
Чтение = Новый ЧтениеXML;
Попытка
Чтение.ОткрытьФайл(ПутьКФайлу);
// Дальнейшая логика обработки
Исключение
Сообщить("Не удалось открыть файл: " + ОписаниеОшибки());
КонецПопытки;
Рассмотрим более современный и правильный подход для управляемых форм. Вместо того чтобы заставлять сервер искать файл в сети, мы можем «передать» сам файл с клиента на сервер. Это исключает проблемы с правами доступа к сетевым папкам.
Алгоритм действий следующий:
Посмотрим на пример реализации:
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
ПараметрыКэша = Новый ОписаниеОповещения("ЗавершитьЗагрузку", ЭтотОбъект);
НачатьПомещениеФайла(ПараметрыКэша, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ЗавершитьЗагрузку(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Результат Тогда
ОбработатьФайлНаСервере(Адрес);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбработатьФайлНаСервере(Адрес)
ДанныеФайла = ПолучитьИзВременногоХранилища(Адрес);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
ДанныеФайла.Записать(ИмяВременногоФайла);
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяВременногоФайла);
// Читаем данные...
ЧтениеXML.Закрыть();
УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры
Выясним причину, по которой отладчик «не заходит» в серверные процедуры. По умолчанию сервер 1С запускается в режиме, где отладка запрещена для экономии ресурсов. Чтобы включить ее, необходимо изменить параметры запуска службы.
Разберем шаги для включения отладки в ОС Windows:
regedit).HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.3 Server Agent....ImagePath.-debug. Например: "C:\Program Files\1cv8\bin\ragent.exe" -srvc -agent ... -debug.Обратите внимание: если используется протокол HTTP для отладки (в современных версиях платформ), убедитесь, что соответствующие порты открыты в брандмауэре сервера.
Проанализируем ситуацию, когда файл имеет значительный объем (сотни мегабайт или гигабайты). Передача такого файла через временное хранилище или чтение его целиком в строку НаСервере может привести к резкому скачку потребления оперативной памяти процессом rphost.
В таких случаях стоит рассмотреть:
ЧтениеXML или ЧтениеТекста. Эти объекты не загружают весь файл в память, а читают его последовательно.Подводя итог, можно сказать, что переход на клиент-сервер требует от разработчика четкого понимания, где выполняется конкретный фрагмент кода.
Основные правила «хорошего тона» при работе с файлами:
\\server\...), если серверу нужен прямой доступ к файловой системе.-debug, если планируете заниматься разработкой и поиском ошибок непосредственно в серверном контуре.