К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как создать файл на сервере 1С

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

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

Есть несколько рабочих способов: объекты встроенного языка ТекстовыйДокумент и ЗаписьТекста для текстовых файлов, ДвоичныеДанные для произвольного содержимого, а также потоки (Поток, ЗаписьДанных) для больших объёмов. Выбор зависит от типа файла, его размера и того, где должен выполняться код.

Ниже разобраны основные сценарии с примерами кода, требования к правам доступа, различия между файловым и клиент-серверным режимами и типичные ошибки, из-за которых файл не создаётся или оказывается пустым.

Где именно создаётся файл: клиент и сервер

В клиент-серверном варианте работы 1С:Предприятия код делится на клиентский и серверный. Если процедура помечена директивой &НаСервере или выполняется в серверном модуле, все файловые операции происходят на машине, где работает сервер 1С. Путь C:\Temp\export.txt в таком коде — это диск C сервера, а не рабочей станции пользователя.

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

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

Создание текстового файла через ТекстовыйДокумент

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

&НаСервере

Процедура СоздатьФайлНаСервере()

Текст = Новый ТекстовыйДокумент;

Текст.ДобавитьСтроку("Артикул;Наименование;Остаток");

Текст.ДобавитьСтроку("001;Товар А;15");

Текст.Записать("D:\1C_Exchange\ostatki.csv",

КодировкаТекста.UTF8);

КонецПроцедуры

Метод Записать перезаписывает существующий файл без предупреждения. Если нужно дописывать данные в конец файла (например, журнал обмена), используйте ЗаписьТекста с режимом добавления — ТекстовыйДокумент такого режима не имеет.

Потоковая запись: ЗаписьТекста и большие файлы

Объект ЗаписьТекста пишет данные построчно или блоками, не держа весь файл в памяти. Это важно при выгрузке сотен тысяч строк: ТекстовыйДокумент накапливает всё в оперативной памяти сервера и на больших объёмах может вызвать замедление работы серверного процесса.

&НаСервере

Процедура ДописатьВФайл()

Запись = Новый ЗаписьТекста(

"D:\1C_Exchange\log.txt",

КодировкаТекста.UTF8,

,

Истина); // добавление в конец файла

Запись.ЗаписатьСтроку(Строка(ТекущаяДатаСеанса())

+ " — обмен выполнен");

Запись.Закрыть();

КонецПроцедуры

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

Создание двоичных файлов и передача на клиент

Для файлов произвольного формата — XML из XDTO, Excel через табличный документ, PDF, архивы — итог обычно получают в виде ДвоичныеДанные и записывают методом Записать(ИмяФайла). Табличный документ, например, сначала сохраняется в поток или временный файл, затем читается как двоичные данные.

&НаСервере

Функция СформироватьФайлНаСервере()

ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");

ТабДокумент.Записать(ИмяВременногоФайла,

ТипФайлаТабличногоДокумента.XLSX);

ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);

ДвоичныеДанные.Записать("D:\1C_Exchange\report.xlsx");

УдалитьФайлы(ИмяВременногоФайла);

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

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

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

Права доступа и каталоги: почему файл не создаётся

Самая частая причина ошибок — отсутствие прав. Служба агента сервера 1С по умолчанию работает от имени учётной записи USR1CV8 (локальная учётная запись). У неё нет прав на большинство каталогов вне собственных папок сервера, и у неё нет доступа к сетевым ресурсам, требующим доменной аутентификации.

Чтобы запись работала, выполните одно из двух: либо выдайте учётной записи службы права на изменение целевого каталога (и на сетевом ресурсе, и в NTFS, если каталог сетевой), либо перенастройте службу агента на запуск от доменной учётной записи с нужными правами. Второй вариант удобнее при обмене через сетевые папки.

Отдельный нюанс — сетевые пути. Используйте UNC-пути вида \\server\share\file.txt, а не подключенные сетевые диски (Z:\, Y:\): буквы дисков существуют в контексте конкретного пользователя, и служба сервера их не видит.

Выбор способа под задачу

Для небольших текстовых файлов (CSV, логи, простые выгрузки) достаточно ТекстовыйДокумент. Для больших выгрузок и дописывания в существующий файл — ЗаписьТекста. Для готовых форматов (Excel, PDF, картинки, архивы) — формирование через профильный объект и сохранение через ДвоичныеДанные.

СпособТип данныхКогда использовать
ТекстовыйДокументТекстНебольшие файлы, создаваемые целиком за один раз
ЗаписьТекстаТекстБольшие выгрузки, дозапись в конец файла
ДвоичныеДанныеЛюбыеExcel, PDF, архивы, передача файла на клиент
Поток / ЗаписьДанныхЛюбыеОчень большие файлы, потоковая обработка
Маршрут решения

Как выбрать действие

Файл нужен на компьютере пользователяСоздайте файл на сервере, поместите во временное хранилище и передайте на клиент
Файл нужен для обмена с другой системойПишите в общий сетевой каталог по UNC-пути с настроенными правами
Файл — временный промежуточныйИспользуйте ПолучитьИмяВременногоФайла и удаляйте файл после использования

Проверка результата и типичные ошибки

После записи убедитесь, что файл реально существует и не пуст: используйте объект Файл и проверяйте Существует() и Размер(). Значение размера 0 байт при отсутствии исключений обычно означает, что данные не были записаны в поток до закрытия.

Контрольные точки

Как проверить результат

Наличие файла
Норма

Файл существует по заданному пути, размер больше нуля

Тревожный признак

Файл отсутствует — проверяйте права и путь

Содержимое
Норма

Файл открывается, кодировка читается корректно

Тревожный признак

Крякозябры — несовпадение кодировки записи и чтения

Доступность для приёмника
Норма

Внешняя система читает файл без ошибок

Тревожный признак

Файл заблокирован открытым потоком или нет прав у принимающей стороны

Типичные ошибки
01
Запись на диск C:\ сервера без создания каталога — метод Записать не создаёт промежуточные папки и выдаёт ошибку
02
Использование буквы сетевого диска вместо UNC-пути — служба сервера не видит подключённые диски пользователя
03
Отладка на файловой базе и перенос в клиент-серверный режим без смены путей — файл создаётся не там, где его ищут
04
Неуказание кодировки — принимающая система получает нечитаемый файл
05
Отсутствие Закрыть() у ЗаписьТекста — данные теряются, файл остаётся заблокированным
Для регламентных обменов удобно формировать имя файла с датой и временем, например export_20260115_143000.txt. Это исключает перезапись при параллельных запусках и упрощает поиск нужной выгрузки при разборе инцидентов.
ПЗ
Практическое замечание

Ограничения и безопасная работа

Серверный код не может показать пользователю диалог выбора пути — все пути на сервере задаются программно или хранятся в настройках (константах, регистрах сведений). Храните каталоги обмена в настройках, а не зашивайте в код: при переносе сервера или смене инфраструктуры не придётся менять конфигурацию.

Учитывайте, что файловые операции на сервере выполняются синхронно и блокируют серверный вызов. Запись очень большого файла внутри интерактивного вызова из формы приведёт к «подвисанию» клиента. Для тяжёлых выгрузок используйте фоновые задания (ФоновыеЗадания.Выполнить), а пользователю показывайте прогресс или уведомление о готовности.

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

Итог

Что важно запомнить

Серверный код пишет файлы на диск сервера от имени учётной записи службы 1С. Выбирайте объект под тип данных, используйте UNC-пути, явно указывайте кодировку, закрывайте потоки и проверяйте результат через объект Файл. Права выдавайте точечно, тяжёлые выгрузки выполняйте в фоне.

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

Как создать файл на сервере, если база файловая?

В файловом режиме серверный и клиентский контекст обычно совпадают, поэтому тот же код (ТекстовыйДокумент, ЗаписьТекста, ДвоичныеДанные) создаст файл на компьютере, где открыта база. Но пишите код сразу с учётом будущего перехода на клиент-серверный режим: не используйте локальные пути пользователя в серверных процедурах.

Какая кодировка нужна для обмена с внешними системами?

Универсальный вариант — UTF-8, он корректно читается большинством современных систем. Если принимающая сторона — старое ПО на Windows, может потребоваться ANSI (Windows-1251). Кодировку всегда согласовывайте с принимающей стороной и указывайте явно при записи.

Почему возникает ошибка «Ошибка доступа к файлу»?

Чаще всего у учётной записи службы сервера 1С нет прав на запись в каталог, либо файл уже открыт другим процессом. Реже — каталог не существует (методы записи не создают промежуточные папки) или диск переполнен. Проверьте путь, права NTFS и, для сетевых ресурсов, права на общую папку.

Можно ли дать пользователю скачать файл, созданный на сервере?

Да. Поместите двоичные данные файла во временное хранилище через ПоместитьВоВременноеХранилище, передайте адрес на клиент и вызовите НачатьПолучениеФайлаССервера. В веб-клиенте пользователю потребуется установить расширение работы с файлами.

Как записать файл в фоновом задании?

Внутри процедуры фонового задания доступен полный серверный контекст, включая файловые операции. Передайте параметры (путь, отбор данных) через параметры метода ФоновыеЗадания.Выполнить. Учтите: фоновое задание не имеет доступа к данным формы, все нужные значения передавайте явно.

Чем отличается ПолучитьИмяВременногоФайла на сервере и на клиенте?

На сервере метод возвращает путь во временном каталоге сервера, на клиенте — на машине пользователя. Временные файлы на сервере не удаляются автоматически после сеанса, поэтому удаляйте их явно через УдалитьФайлы после использования.