Запись файлов на стороне сервера 1С: права службы, код, расписание и обходные пути

· 11 мин

Содержание

Чтобы создать файл на сервере 1С, код записи должен выполняться в серверном контексте (&НаСервере, общий модуль с флагом «Сервер», регламентное задание), а каталог на диске сервера должен быть доступен на запись учётной записи, под которой работает служба агента сервера 1С. По умолчанию это локальный пользователь USR1CV8 в Windows или usr1cv8 в Linux. Права вашего доменного пользователя здесь не играют никакой роли.

Частое заблуждение: «я администратор сервера, значит, 1С может писать куда угодно». Нет. Файл пишет процесс rphost, и для Windows он — отдельный пользователь со своими правами. Именно поэтому код, который отлично работает в файловой базе, в клиент-серверной падает с отказом в доступе.

Где окажется файл и под чьими правами он создаётся

Первое, что нужно понять: «сервер» в 1С — это не тот компьютер, за которым сидит пользователь. Одна и та же строка Запись = Новый ЗаписьТекста("C:\Temp\1.txt") даст разные результаты в зависимости от того, где она выполнилась.

Где выполняется кодНа каком компьютере появится файлПод какой учётной записью
&НаКлиенте (тонкий клиент)компьютер пользователяпользователь Windows, вошедший в систему
&НаСервере, клиент-серверная базасервер 1С, где работает рабочий процесс rphostучётная запись службы агента сервера
&НаСервере, файловая базакомпьютер пользователя (серверная часть работает в его же процессе)пользователь Windows
&НаСервере, файловая база через веб-сервервеб-серверучётная запись IIS или Apache
Регламентное задание, клиент-серверная базасервер 1Сучётная запись службы агента

Из таблицы видно главное:

  • 🖥️ В клиент-серверной базе путь C:\... в серверном коде указывает на диск сервера 1С, а не СУБД и не клиента.
  • 🔐 Права проверяются для учётной записи службы, а не для того, кто нажал кнопку в 1С.
  • 🧩 Если в кластере несколько рабочих серверов, вызов может попасть на любой из них. Локальный путь D:\Exchange должен существовать на каждом, либо используйте общую сетевую папку.

Узнать, на каком сервере выполнился вызов, можно функцией ИмяКомпьютера() в серверной процедуре. Выведите её результат в сообщение — это снимает половину вопросов «где мой файл».

Подготовка каталога на сервере 1С: права службы и пути

Перед тем как писать код, подготовьте каталог. Работа на 10 минут, а без неё всё остальное бессмысленно.

Шаг 1. Узнайте учётную запись службы

В Windows откройте services.msc, найдите службу «Агент сервера 1С:Предприятия 8.3» и посмотрите вкладку «Вход в систему». То же самое одной командой PowerShell:

Get-CimInstance Win32_Service | Where-Object Name -like "1C*" | Select-Object Name, StartName, State

В колонке StartName будет .\USR1CV8, доменная запись вида DOMAIN\svc-1c или LocalSystem.

В Linux служба по умолчанию работает от пользователя usr1cv8. Проверить можно так:

ps -o user= -C rphost | sort -u

Шаг 2. Создайте отдельный каталог

Не пишите файлы в корень диска, в Program Files и тем более в каталог кластера (srvinfo). Заведите отдельную папку под обмен, например D:\1C_Exchange с подпапками In, Out, Archive.

Шаг 3. Выдайте права на запись

Windows, право «Изменение» на папку и всё вложенное:

mkdir D:\1C_Exchange\Out
icacls "D:\1C_Exchange" /grant "USR1CV8:(OI)(CI)M"

Linux:

sudo mkdir -p /srv/1c_exchange/out
sudo chown -R usr1cv8:grp1cv8 /srv/1c_exchange
sudo chmod -R 750 /srv/1c_exchange

Права на чтение и запись — это минимум. Полный доступ (F) учётной записи службы не нужен.

Как писать путь

  • 📁 Только абсолютный путь. Относительный путь в серверном коде отсчитывается от рабочего каталога процесса, и предсказать его сложно.
  • 🔤 Разделитель берите из ПолучитьРазделительПути(), если код должен работать и на Windows, и на Linux.
  • 🌐 Подключённые сетевые диски (Z:\) службе не видны: их подключает пользователь при входе, а служба в систему не «входит». Для сетевой папки пишите UNC-путь \\fileserver\exchange.
  • ⚙️ Путь храните в константе или настройке, а не в коде. Поменять сервер станет делом одной минуты.

Создать файл на сервере из встроенного языка 1С

Для текстовых файлов есть два основных способа: построчная запись через ЗаписьТекста и запись целиком через ТекстовыйДокумент. Для XML, JSON и двоичных данных — свои объекты.

Текстовый файл через ЗаписьТекста

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

&НаСервере
Функция СоздатьФайлВыгрузки()

    Каталог = "D:\1C_Exchange\Out";
    ПроверкаКаталога = Новый Файл(Каталог);
    Если Не ПроверкаКаталога.Существует() Тогда
        СоздатьКаталог(Каталог);
    КонецЕсли;

    ИмяФайла = Каталог + ПолучитьРазделительПути() + "orders_"
        + Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMdd_HHmmss") + ".txt";

    Попытка
        Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
        Запись.ЗаписатьСтроку("Выгрузка заказов");
        Запись.ЗаписатьСтроку("Сформировано: " + Формат(ТекущаяДатаСеанса(), "ДЛФ=DT"));
        Запись.ЗаписатьСтроку("Сервер: " + ИмяКомпьютера());
        Запись.Закрыть();
    Исключение
        ЗаписьЖурналаРегистрации("Обмен.ВыгрузкаФайла", УровеньЖурналаРегистрации.Ошибка,,,
            ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
        Возврат "";
    КонецПопытки;

    Возврат ИмяФайла;

КонецФункции

Что тут важно:

  1. Закрыть() обязателен. Пока он не вызван, часть данных может остаться в буфере, а файл — заблокирован.
  2. Имя файла с датой и временем исключает перезапись при повторном запуске.
  3. Ошибка уходит в журнал регистрации. В регламентном задании сообщение пользователю никто не увидит, а журнал — увидят.

Текстовый документ, XML и JSON

Если текст собран целиком, проще так:

Текст = Новый ТекстовыйДокумент;
Текст.ДобавитьСтроку("Первая строка");
Текст.ДобавитьСтроку("Вторая строка");
Текст.Записать(ИмяФайла, КодировкаТекста.UTF8);

Для структурированных форматов:

  • 📄 ЗаписьXML — метод ОткрытьФайл(ИмяФайла, "UTF-8"), в конце Закрыть().
  • 🧾 ЗаписьJSON — тот же порядок: ОткрытьФайл, запись, Закрыть().
  • 📦 Двоичные данные (картинка, PDF из присоединённого файла) — ДвоичныеДанные.Записать(ИмяФайла).
  • 🗜️ Архив — ЗаписьZipФайла: создаёте объект с путём к архиву, добавляете файлы методом Добавить, вызываете Записать().

Временные файлы

Когда файл нужен на минуту (собрать, отправить, удалить), не придумывайте каталог. Возьмите имя у платформы:

ИмяВременного = ПолучитьИмяВременногоФайла("xml");
// ... запись и отправка ...
УдалитьФайлы(ИмяВременного);

Файл окажется во временном каталоге учётной записи службы. Удаляйте его сами: платформа за вас этого не сделает, и через полгода в Temp скопятся гигабайты.

Как отдать серверный файл пользователю

Пользователь не видит диск сервера. Чтобы он скачал файл, передайте его через временное хранилище:

&НаСервере
Функция АдресФайлаВХранилище(ИмяФайла)
    Возврат ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), УникальныйИдентификатор);
КонецФункции

На клиенте по этому адресу файл получают асинхронным методом НачатьПолучениеФайлаССервера (платформа 8.3.18 и выше). В конфигурациях на БСП удобнее вызвать ФайловаяСистемаКлиент.СохранитьФайл — модуль сам выберет подходящий способ.

Конфигуратор и командная строка: где на самом деле окажется файл

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

Отсюда три рабочих варианта, если файл нужен именно на сервере:

  1. Зайти на сервер по RDP, запустить Конфигуратор там и сохранить файл на его диск.
  2. Сохранить локально и указать в диалоге UNC-путь к общей папке на сервере (\\srv1c\exchange). Права нужны уже вашей учётной записи, а не службе.
  3. Запустить пакетный режим из командной строки на самом сервере.

Пакетный запуск 1cv8

Выгрузка базы в файл на сервере без открытия интерфейса:

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER /S "srv1c\buh" /N "Администратор" /P "пароль" /DumpIB "D:\Backup\buh.dt" /Out "D:\Backup\dump.log"

Выгрузка конфигурации — тот же запуск с параметром /DumpCfg "D:\Backup\buh.cf". Ключ /Out пишет протокол: без него ошибку пакетного режима не увидеть. Номер версии в пути замените на установленный у вас.

Пароль в bat-файле открытым текстом — плохая практика. Держите такой скрипт в папке, доступ к которой есть только у администраторов, и заведите для пакетных операций отдельного пользователя 1С с минимальными правами.

На серверах с платформой, где установлена утилита ibcmd, выгрузку можно делать ею: она работает напрямую с СУБД, без агента. Синтаксис зависит от версии, поэтому сверяйтесь со справкой ibcmd help.

Запуск своей обработки

Если файл формирует ваш код, его можно вызвать из командной строки через тонкий или толстый клиент с параметром /Execute "D:\Scripts\vygruzka.epf". Обработка откроется и выполнит код модуля формы при открытии. Это рабочий вариант, но для регулярных выгрузок есть способ надёжнее — следующий раздел.

Регламентное задание: файлы на сервере по расписанию

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

Как настроить:

  1. В Конфигураторе откройте ветку Общие → Регламентные задания и добавьте новое.
  2. В общем модуле с флагом «Сервер» создайте экспортную процедуру, например ВыгрузкаЗаказовВФайл(), и вставьте в неё код записи из раздела выше.
  3. В свойствах задания укажите эту процедуру в поле «Имя метода».
  4. Задайте расписание, включите флажки «Использование» и «Предопределенное».
  5. Обновите конфигурацию базы данных.

В типовых конфигурациях на БСП включить, выключить и перенастроить задание без Конфигуратора можно в Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания.

Проверьте ещё две вещи:

  • ⏸️ В свойствах информационной базы в консоли кластера флажок «Блокировка регламентных заданий включена» должен быть снят, иначе задание не запустится вообще.
  • 👤 Задание выполняется от имени пользователя 1С, указанного в его настройках. Если пользователь не задан, работают права, назначенные по умолчанию; для выгрузки нужны права на чтение нужных данных.

В файловой базе регламентные задания выполняются только при открытом сеансе клиента. Для расписания в файловом варианте надёжнее планировщик Windows с запуском 1cv8.exe ENTERPRISE ... /Execute.

Перед запуском регламентной выгрузки
Выполнено: 0 / 7

Безопасный режим, профили безопасности и защита каталога

Внешние обработки и расширения конфигурации могут работать в безопасном режиме. В нём запись на диск запрещена: код упадёт с ошибкой нарушения прав, даже если у службы есть все права на папку.

Где это настраивается:

  • 🧱 Внешние обработки. В конфигурациях на БСП дополнительные обработки по умолчанию подключаются в безопасном режиме. Разрешения на работу с файлами запрашиваются при регистрации обработки, а администратор их подтверждает.
  • 🧩 Расширения. У расширения есть свойство «Безопасный режим» при подключении. Снимайте его, только если доверяете автору кода.
  • 🛡️ Профили безопасности кластера. В консоли администрирования серверов 1С есть раздел «Профили безопасности». Профиль, назначенный базе, может разрешать доступ только к перечисленным виртуальным каталогам. Если для базы задан профиль без доступа к нужной папке, запись не пройдёт.

Как защитить сам каталог:

  1. Не принимайте путь от пользователя как есть. Если имя файла приходит из формы, отрежьте всё, кроме имени, и склейте его со своим каталогом.
  2. Не давайте учётной записи службы права администратора Windows ради одной папки. Это открывает весь сервер любому коду в базе.
  3. Не выдавайте права «Все — полный доступ». Достаточно учётной записи службы и группы администраторов.
  4. Ограничьте размер: выгрузку в несколько гигабайт удобнее делить на файлы по дате.
  5. Настройте очистку: старше 30 дней — в архив или на удаление.

FTP, сетевая папка или облако вместо локального диска

Часто файл нужен не на сервере 1С, а «где-то, откуда его заберёт другая система». Тогда локальный диск — лишний промежуточный шаг.

СпособКогда выбратьНа что обратить внимание
Сетевая папка (SMB, UNC-путь)внутри домена, приёмник — другая Windows-машинаслужба 1С должна работать под доменной учётной записью; у USR1CV8 нет прав в сети
FTP / FTPSобмен с внешним контрагентом или старой системойобъект FTPСоединение, метод Записать(ЛокальныйФайл, УдаленныйФайл); пароль хранить в безопасном хранилище
HTTP-сервис или веб-хранилищеоблако, WebDAV, API приёмникаобъект HTTPСоединение; авторизация и подпись запросов зависят от сервиса
Хранение в самой базефайл нужен пользователям 1С, а не внешней системеприсоединённые файлы БСП; при больших объёмах — тома хранения на диске

Сетевая папка — самый частый случай. Порядок такой:

  1. Заведите в домене служебную учётную запись, например DOMAIN\svc-1c.
  2. Переведите на неё службу агента сервера 1С. Учётной записи нужны права на каталоги кластера и на «Вход в качестве службы».
  3. Дайте ей права «Изменение» на общий ресурс и на папку в NTFS.
  4. Перезапустите службу агента.

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

Пример отправки по FTP:

Соединение = Новый FTPСоединение("ftp.partner.ru", 21, "login", "password",, Истина);
Соединение.Записать(ИмяФайла, "/incoming/orders.txt");

Последний параметр Истина включает пассивный режим — без него соединение часто блокирует межсетевой экран.

Ошибки при записи файла на сервер 1С

Ошибки записи почти всегда сводятся к одному: процесс rphost не может сделать то, что от него хотят. Найдите свой симптом.

Диагностика: выберите симптом

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

Частые вопросы

Можно ли создать файл на сервере СУБД, а не на сервере 1С?
Нет, код 1С выполняется на сервере 1С. Если это разные машины, создайте на сервере СУБД общую папку и пишите в неё по UNC-пути.
Почему файл появился не на том сервере кластера?
Кластер распределяет вызовы между рабочими серверами. Используйте общую сетевую папку или задайте требования назначения функциональности в свойствах рабочего сервера.
Как писать файлы на сервере Linux?
Так же, только путь вида /srv/1c_exchange/out/file.txt, владелец каталога — usr1cv8. Разделитель пути берите из ПолучитьРазделительПути().
Нужен ли монопольный режим, чтобы создать файл?
Нет. Запись файла из кода не требует монопольного доступа к базе. Он нужен для загрузки .dt и обновления структуры, а не для выгрузки в файл.
Как проверить права, не меняя код?
Запустите командную строку от имени учётной записи службы и попробуйте создать файл в каталоге командой echo test > файл. Если не получилось у неё — не получится и у 1С.