На каком компьютере откроется файл при выполнении кода &НаСервере в 1С?

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

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

Разбираемся в контексте выполнения: где находится «Сервер»?

Для того чтобы ответить на вопрос, на каком компьютере запишется файл, нам необходимо сначала проанализировать топологию подключения. В системе 1С понятие &НаСервере не всегда означает физически выделенный серверный компьютер. Рассмотрим основные варианты:

  1. Файловая база в локальной сети (без веб-сервера): Если база данных расположена в «расшаренной» папке, а пользователь запускает 1С со своего компьютера, то «сервером» для этой сессии является компьютер клиента. В этом случае код &НаСервере будет видеть диск C: именно пользовательской машины.
  2. Клиент-серверный вариант (SQL): Здесь всё однозначно. Код &НаСервере выполняется на физическом сервере, где запущен Агент сервера 1С. Диск C: будет принадлежать серверу приложений.
  3. Файловая база, опубликованная на веб-сервере (IIS или Apache): Это самый интересный случай. Как только вы публикуете базу, она начинает работать по «трехзвенной» схеме. Тонкий клиент обращается к веб-серверу по протоколу HTTP/HTTPS. Веб-сервер запускает расширение 1С, которое и выполняет серверный код. В этой ситуации сервером является компьютер, на котором установлен веб-сервер.

Проверка расположения файлов программным путем

Если у вас возникают сомнения, на какой машине выполняется код, мы можем провести простой эксперимент. Воспользуемся методом НайтиФайлы, чтобы просканировать содержимое каталога. Разберем пример кода, который поможет нам идентифицировать файловую систему:


&НаСервере
Процедура ПроверитьФайлыНаСервере()
    ПутьККаталогу = "C:\"; // Или любой другой известный путь
    МассивФайлов = НайтиФайлы(ПутьККаталогу, "*.*");
    
    Для Каждого ТекущийФайл Из МассивФайлов Цикл
        Сообщить("Обнаружен файл на стороне сервера: " + ТекущийФайл.ПолноеИмя);
    КонецЦикла;
КонецПроцедуры

Запустив этот код, вы увидите список файлов. Если вы видите файлы своего локального компьютера — значит, ваш клиент выступает в роли сервера (характерно для обычной файловой базы). Если же список файлов вам незнаком — значит, вы работаете с удаленным сервером приложений или веб-сервером.

Особенности прав доступа при работе через веб-сервер

Даже если мы точно выяснили, что файл записывается на веб-сервере, мы можем столкнуться с ошибкой «Доступ запрещен». Выясним причину этой проблемы. Когда код выполняется &НаСервере через IIS или Apache, он запускается не от вашего имени пользователя Windows, а от имени системной учетной записи службы:

Важно: У этих учетных записей по умолчанию крайне ограниченные права. Они могут не иметь доступа к корню диска C: или к сетевым папкам. Поэтому, если вам нужно прочитать или записать общий файл, убедитесь, что именно у системной службы веб-сервера есть права Full Control (или хотя бы Read/Write) на целевой каталог.

Использование временного хранилища для передачи файлов

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

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

Такой подход гарантирует, что код будет работать одинаково успешно и в локальной сети, и через интернет (через веб-сервер).

Работа в среде Linux

Нельзя забывать и о кроссплатформенности. Если ваш веб-сервер (например, Apache) установлен на ОС Linux, то попытка обратиться к диску C: через код &НаСервере неизбежно приведет к ошибке, так как в Linux нет букв дисков. В этом случае пути должны соответствовать стандарту POSIX (например, /home/user/data/).

Проанализируем, как сделать код универсальным. Рекомендуется использовать функцию ПолучитьИмяВременногоФайла(). На сервере она автоматически вернет путь к папке, на которую у службы 1С или веб-сервера точно есть права:


&НаСервере
Функция ЗаписатьДанныеВоВременныйФайл(Данные)
    ИмяФайла = ПолучитьИмяВременногоФайла("txt");
    Данные.Записать(ИмяФайла);
    Возврат ИмяФайла;
КонецФункции

Сетевые пути (UNC)

Если перед нами стоит задача открыть общий файл, который находится не на сервере 1С и не на клиенте, а на стороннем файловом хранилище, следует использовать UNC-пути (формата \\ServerName\ShareFolder\file.txt). Однако здесь кроется еще одна ловушка: учетная запись, под которой работает веб-сервер, должна иметь сетевой доступ к этому ресурсу. Обычный IUSR чаще всего не имеет прав на выход в сеть, поэтому системным администраторам часто приходится перенастраивать запуск службы веб-сервера от имени доменного пользователя.

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

← На главную