Полезное

Сохранение файлов на сервер из 1С

Вадим Заплетин 1 мин чтения
Сохранение файлов на сервер из 1С

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

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

Серверный и клиентский контекст: в чём разница

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

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

Как определить контекст выполнения кода

Если процедура или функция помечена директивой &НаСервере или &НаСерверБезКонтекста, код выполняется на сервере. Если &НаКлиенте — на клиенте. Без директив в управляемых формах код выполняется на клиенте, в обычных формах и модулях объектов — на сервере.

Методы работы с файлами (ЗаписьТекста, ЗаписьXML, ТекстовыйДокумент.Записать()) работают в контексте выполнения. Проверяйте, откуда вызывается код, перед тем как указывать путь к файлу.

Способ 1: прямая запись в серверном контексте

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

Самый простой метод для сохранения текстовых данных — объект ЗаписьТекста. Работает в серверном контексте, позволяет указать кодировку и режим добавления.

  1. Создайте объект ЗаписьТекста с путём к файлу и кодировкой (например, КодировкаТекста.UTF8).
  2. Запишите данные методом ЗаписатьСтроку() или Записать().
  3. Закройте файл методом Закрыть(), чтобы освободить ресурсы.

Пример кода:

&НаСервере
Процедура СохранитьОтчётНаСервер()
    ПутьКФайлу = "D:\1C_Reports\report.txt";
    Запись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
    Запись.ЗаписатьСтроку("Заголовок отчёта");
    Запись.ЗаписатьСтроку("Данные: " + ТекущаяДата());
    Запись.Закрыть();
КонецПроцедуры

Код выполняется на сервере 1С. Файл сохраняется на диск сервера по указанному пути. Если папки не существует, метод вернёт ошибку.

Запись XML-файлов

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

&НаСервере
Процедура ВыгрузитьДанныеВ XML()
    ПутьКФайлу = "D:\Exchange\data.xml";
    Запись = Новый ЗаписьXML;
    Запись.ОткрытьФайл(ПутьКФайлу);
    Запись.ЗаписатьОбъявлениеXML();
    Запись.ЗаписатьНачалоЭлемента("Данные");
    Запись.ЗаписатьАтрибут("Дата", Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd"));
    Запись.ЗаписатьКонецЭлемента();
    Запись.Закрыть();
КонецПроцедуры

Этот способ подходит для обмена с внешними системами, выгрузки в форматах УПД, ЕГАИС, ФНС.

Способ 2: сохранение табличного документа

Табличные документы (отчёты, печатные формы) сохраняются методом Записать(). Формат файла зависит от расширения в пути: .mxl для табличного документа 1С, .xlsx для Excel, .pdf для PDF.

&НаСервере
Процедура СохранитьОтчётВExcel()
    Отчёт = Новый ТабличныйДокумент;
    Отчёт.Добавить(ПолучитьМакет("Макет"));
    ПутьКФайлу = "D:\1C_Reports\report.xlsx";
    Отчёт.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
КонецПроцедуры

Метод работает на сервере. Для сохранения в PDF убедитесь, что на сервере установлен компонент печати в PDF (входит в комплект 1С).

Сохранение в нескольких форматах одновременно

Если нужно сохранить отчёт в нескольких форматах (например, для разных получателей), вызовите Записать() несколько раз с разными путями:

&НаСервере
Процедура СохранитьВНесколькихФорматах()
    Отчёт = Новый ТабличныйДокумент;
    Отчёт.Добавить(ПолучитьМакет("Макет"));

    Отчёт.Записать("D:\Reports\report.xlsx", ТипФайлаТабличногоДокумента.XLSX);
    Отчёт.Записать("D:\Reports\report.pdf", ТипФайлаТабличногоДокумента.PDF);
КонецПроцедуры

Способ 3: передача файла с клиента на сервер

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

Загрузка файла с клиента на сервер

  1. На клиенте получите адрес файла во временном хранилище методом ПоместитьВоВременноеХранилище().
  2. Передайте адрес в серверную процедуру.
  3. На сервере получите двоичные данные из хранилища и сохраните в файл.
&НаКлиенте
Процедура ЗагрузитьФайлНаСервер()
    Диалог = Новый ДиалогВыборафайла(РежимДиалогаВыбораФайла.Открытие);
    Если Диалог.Выбрать() Тогда
        АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла));
        СохранитьНаСервереИзВременногоХранилища(АдресВоВременномХранилище, Диалог.ПолноеИмяФайла);
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура СохранитьНаСервереИзВременногоХранилища(Адрес, ИмяИсходногоФайла)
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
    ПутьНаСервере = "D:\Upload\" + ПолучитьИмяФайла(ИмяИсходногоФайла);
    ДвоичныеДанные.Записать(ПутьНаСервере);
КонецПроцедуры

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

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

Способ 4: использование общих сетевых папок

Для обмена файлами между несколькими серверами или клиентами используйте сетевые папки. Укажите UNC-путь вида \\server\share\folder\file.txt.

&НаСервере
Процедура СохранитьВСетевуюПапку()
    ПутьКФайлу = "\\fileserver\exchange\data.xml";
    Запись = Новый ЗаписьXML;
    Запись.ОткрытьФайл(ПутьКФайлу);
    Запись.ЗаписатьОбъявлениеXML();
    Запись.Закрыть();
КонецПроцедуры

Убедитесь, что учётная запись службы сервера 1С имеет права на запись в эту папку. Если сервер работает под SYSTEM, доступ к сетевым ресурсам по умолчанию запрещён — измените учётную запись службы или настройте делегирование.

Настройка прав доступа

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

Проверка текущей учётной записи службы

  1. Откройте «Службы» (services.msc).
  2. Найдите службу сервера 1С (например, 1C:Enterprise 8.3 Server Agent).
  3. Проверьте колонку «Вход от имени» — там указана учётная запись.

Если служба работает под Локальная система (SYSTEM), она имеет полный доступ к локальным дискам, но не может обращаться к сетевым папкам. Для работы с сетевыми ресурсами создайте доменную учётную запись с нужными правами и запустите службу под ней.

Предоставление прав на папку

  1. Щёлкните правой кнопкой по папке → «Свойства» → «Безопасность».
  2. Нажмите «Изменить» → «Добавить».
  3. Введите имя учётной записи службы 1С (например, DOMAIN\1c_service).
  4. Установите флажки «Изменение» и «Запись».
  5. Нажмите «ОК» и проверьте доступ.

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

Типичные ошибки и как их избежать

Ошибка: «Не удаётся найти указанный файл»

Причина: путь к файлу указан неверно, либо папка не существует.

Решение: проверьте существование папки методом НайтиФайлы() или создайте её программно:

&НаСервере
Процедура СоздатьПапкуЕслиНеСуществует(ПутьКПапке)
    Файл = Новый Файл(ПутьКПапке);
    Если НЕ Файл.Существует() Тогда
        СоздатьКаталог(ПутьКПапке);
    КонецЕсли;
КонецПроцедуры

Ошибка: «Отказано в доступе»

Причина: учётная запись службы 1С не имеет прав на запись в папку.

Решение: предоставьте права на папку (см. раздел «Настройка прав доступа») или измените учётную запись службы.

Ошибка: файл сохраняется на клиенте вместо сервера

Причина: код выполняется в клиентском контексте.

Решение: переместите код в процедуру с директивой &НаСервере или &НаСерверБезКонтекста.

Ошибка: «Недопустимые символы в имени файла»

Причина: имя файла содержит символы, запрещённые в файловой системе (например, :, *, ?, ").

Решение: очистите имя файла от недопустимых символов:

&НаСервере
Функция ОчиститьИмяФайла(Имя)
    Результат = Имя;
    ЗапрещённыеСимволы = "\/:*?""<>|";
    Для Индекс = 1 По СтрДлина(ЗапрещённыеСимволы) Цикл
        Символ = Сред(ЗапрещённыеСимволы, Индекс, 1);
        Результат = СтрЗаменить(Результат, Символ, "_");
    КонецЦикла;
    Возврат Результат;
КонецФункции

Когда использовать каждый способ

Задача Способ Контекст
Сохранить текстовый файл (лог, отчёт) ЗаписьТекста На сервере
Сформировать XML для обмена ЗаписьXML На сервере
Сохранить печатную форму в Excel/PDF ТабличныйДокумент.Записать() На сервере
Загрузить файл с клиента на сервер ПоместитьВоВременноеХранилище() + ДвоичныеДанные.Записать() Клиент + сервер
Сохранить в сетевую папку Любой способ с UNC-путём На сервере

Выбирайте способ в зависимости от типа данных и места формирования файла.

Рекомендации по выбору оборудования

Производительность сервера 1С влияет на скорость обработки данных и сохранения файлов. Для комфортной работы с большими объёмами выгрузок и отчётов обратите внимание на конфигурацию сервера.

Если вы строите инфраструктуру с нуля, выбирайте серверы с достаточным объёмом оперативной памяти (от 32 ГБ для средних баз, от 64 ГБ для крупных) и быстрыми накопителями. Для баз с интенсивной записью логов и выгрузок рекомендуем SSD-накопители с высокой скоростью последовательной записи.

Файловый сервер для хранения выгрузок и архивов можно организовать на отдельной машине. Используйте HDD-накопители большого объёма для долгосрочного хранения данных. Для резервного копирования и обмена между филиалами удобно применять сетевые хранилища.

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

Часто задаваемые вопросы

Можно ли сохранить файл на сервер из клиентского кода?

Напрямую нельзя — клиентский код видит только диски компьютера пользователя. Чтобы сохранить файл на сервер, передайте данные через временное хранилище в серверную процедуру и сохраните там.

Как узнать, где выполняется код — на клиенте или на сервере?

Проверьте директиву компиляции в заголовке процедуры или функции. &НаСервере и &НаСерверБезКонтекста — код выполняется на сервере, &НаКлиенте — на клиенте. Без директив в управляемых формах код выполняется на клиенте.

Почему файл не сохраняется в сетевую папку?

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