Программная работа с файлами на сервере — базовый навык для разработчиков 1С. Вы выгружаете отчёты в общую папку, формируете XML для обмена с внешними системами, пишете логи или резервные копии конфигураций. При этом типичные ошибки возникают из-за непонимания различий между клиентским и серверным контекстом, неправильной работы с путями и отсутствия нужных прав доступа.
Разбираем четыре способа сохранения файлов на сервер, объясняем, когда какой использовать, и показываем, как избежать распространённых проблем.
Серверный и клиентский контекст: в чём разница
1С работает в архитектуре клиент-сервер. Клиентское приложение выполняется на рабочем месте пользователя, серверное — на сервере 1С. Код с директивой &НаКлиенте видит диски и папки компьютера пользователя, код с &НаСервере — диски сервера.
Если вызвать метод ТекстовыйДокумент.Записать() в клиентском контексте, файл сохранится на компьютере пользователя. В серверном контексте — на сервере 1С. Это базовое правило, нарушение которого приводит к тому, что файл оказывается не там, где ожидали.
Как определить контекст выполнения кода
Если процедура или функция помечена директивой &НаСервере или &НаСерверБезКонтекста, код выполняется на сервере. Если &НаКлиенте — на клиенте. Без директив в управляемых формах код выполняется на клиенте, в обычных формах и модулях объектов — на сервере.
Методы работы с файлами (ЗаписьТекста, ЗаписьXML, ТекстовыйДокумент.Записать()) работают в контексте выполнения. Проверяйте, откуда вызывается код, перед тем как указывать путь к файлу.
Способ 1: прямая запись в серверном контексте
Запись текстового файла через ЗаписьТекста
Самый простой метод для сохранения текстовых данных — объект ЗаписьТекста. Работает в серверном контексте, позволяет указать кодировку и режим добавления.
- Создайте объект
ЗаписьТекстас путём к файлу и кодировкой (например,КодировкаТекста.UTF8). - Запишите данные методом
ЗаписатьСтроку()илиЗаписать(). - Закройте файл методом
Закрыть(), чтобы освободить ресурсы.
Пример кода:
&НаСервере
Процедура СохранитьОтчётНаСервер()
ПутьКФайлу = "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: передача файла с клиента на сервер
Иногда файл формируется на клиенте (например, пользователь выбрал документ через диалог), а сохранить его нужно на сервере. Для этого используйте метод ПоместитьФайл().
Загрузка файла с клиента на сервер
- На клиенте получите адрес файла во временном хранилище методом
ПоместитьВоВременноеХранилище(). - Передайте адрес в серверную процедуру.
- На сервере получите двоичные данные из хранилища и сохраните в файл.
&НаКлиенте
Процедура ЗагрузитьФайлНаСервер()
Диалог = Новый ДиалогВыборафайла(РежимДиалогаВыбораФайла.Открытие);
Если Диалог.Выбрать() Тогда
АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла));
СохранитьНаСервереИзВременногоХранилища(АдресВоВременномХранилище, Диалог.ПолноеИмяФайла);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СохранитьНаСервереИзВременногоХранилища(Адрес, ИмяИсходногоФайла)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
ПутьНаСервере = "D:\Upload\" + ПолучитьИмяФайла(ИмяИсходногоФайла);
ДвоичныеДанные.Записать(ПутьНаСервере);
КонецПроцедуры
&НаСервере
Функция ПолучитьИмяФайла(ПолныйПуть)
Файл = Новый Файл(ПолныйПуть);
Возврат Файл.Имя;
КонецФункции
Этот способ позволяет передать файл с клиента на сервер без промежуточного сохранения на диск клиента.
Способ 4: использование общих сетевых папок
Для обмена файлами между несколькими серверами или клиентами используйте сетевые папки. Укажите UNC-путь вида \\server\share\folder\file.txt.
&НаСервере
Процедура СохранитьВСетевуюПапку()
ПутьКФайлу = "\\fileserver\exchange\data.xml";
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ПутьКФайлу);
Запись.ЗаписатьОбъявлениеXML();
Запись.Закрыть();
КонецПроцедуры
Убедитесь, что учётная запись службы сервера 1С имеет права на запись в эту папку. Если сервер работает под SYSTEM, доступ к сетевым ресурсам по умолчанию запрещён — измените учётную запись службы или настройте делегирование.
Настройка прав доступа
Отсутствие прав — самая частая причина ошибок при сохранении файлов. Сервер 1С работает под учётной записью, которой нужны права на запись в целевую папку.
Проверка текущей учётной записи службы
- Откройте «Службы» (
services.msc). - Найдите службу сервера 1С (например,
1C:Enterprise 8.3 Server Agent). - Проверьте колонку «Вход от имени» — там указана учётная запись.
Если служба работает под Локальная система (SYSTEM), она имеет полный доступ к локальным дискам, но не может обращаться к сетевым папкам. Для работы с сетевыми ресурсами создайте доменную учётную запись с нужными правами и запустите службу под ней.
Предоставление прав на папку
- Щёлкните правой кнопкой по папке → «Свойства» → «Безопасность».
- Нажмите «Изменить» → «Добавить».
- Введите имя учётной записи службы 1С (например,
DOMAIN\1c_service). - Установите флажки «Изменение» и «Запись».
- Нажмите «ОК» и проверьте доступ.
Для серверных приложений рекомендуется создавать отдельную учётную запись с минимально необходимыми правами, а не использовать административные учётные записи.
Типичные ошибки и как их избежать
Ошибка: «Не удаётся найти указанный файл»
Причина: путь к файлу указан неверно, либо папка не существует.
Решение: проверьте существование папки методом НайтиФайлы() или создайте её программно:
&НаСервере
Процедура СоздатьПапкуЕслиНеСуществует(ПутьКПапке)
Файл = Новый Файл(ПутьКПапке);
Если НЕ Файл.Существует() Тогда
СоздатьКаталог(ПутьКПапке);
КонецЕсли;
КонецПроцедуры
Ошибка: «Отказано в доступе»
Причина: учётная запись службы 1С не имеет прав на запись в папку.
Решение: предоставьте права на папку (см. раздел «Настройка прав доступа») или измените учётную запись службы.
Ошибка: файл сохраняется на клиенте вместо сервера
Причина: код выполняется в клиентском контексте.
Решение: переместите код в процедуру с директивой &НаСервере или &НаСерверБезКонтекста.
Ошибка: «Недопустимые символы в имени файла»
Причина: имя файла содержит символы, запрещённые в файловой системе (например, :, *, ?, ").
Решение: очистите имя файла от недопустимых символов:
&НаСервере
Функция ОчиститьИмяФайла(Имя)
Результат = Имя;
ЗапрещённыеСимволы = "\/:*?""<>|";
Для Индекс = 1 По СтрДлина(ЗапрещённыеСимволы) Цикл
Символ = Сред(ЗапрещённыеСимволы, Индекс, 1);
Результат = СтрЗаменить(Результат, Символ, "_");
КонецЦикла;
Возврат Результат;
КонецФункции
Когда использовать каждый способ
| Задача | Способ | Контекст |
|---|---|---|
| Сохранить текстовый файл (лог, отчёт) | ЗаписьТекста | На сервере |
| Сформировать XML для обмена | ЗаписьXML | На сервере |
| Сохранить печатную форму в Excel/PDF | ТабличныйДокумент.Записать() | На сервере |
| Загрузить файл с клиента на сервер | ПоместитьВоВременноеХранилище() + ДвоичныеДанные.Записать() | Клиент + сервер |
| Сохранить в сетевую папку | Любой способ с UNC-путём | На сервере |
Выбирайте способ в зависимости от типа данных и места формирования файла.
Рекомендации по выбору оборудования
Производительность сервера 1С влияет на скорость обработки данных и сохранения файлов. Для комфортной работы с большими объёмами выгрузок и отчётов обратите внимание на конфигурацию сервера.
Если вы строите инфраструктуру с нуля, выбирайте серверы с достаточным объёмом оперативной памяти (от 32 ГБ для средних баз, от 64 ГБ для крупных) и быстрыми накопителями. Для баз с интенсивной записью логов и выгрузок рекомендуем SSD-накопители с высокой скоростью последовательной записи.
Файловый сервер для хранения выгрузок и архивов можно организовать на отдельной машине. Используйте HDD-накопители большого объёма для долгосрочного хранения данных. Для резервного копирования и обмена между филиалами удобно применять сетевые хранилища.
При выборе комплектующих обращайте внимание на надёжность и совместимость с вашей конфигурацией 1С. Консультанты Server360 помогут подобрать оборудование под конкретные задачи.
Часто задаваемые вопросы
Можно ли сохранить файл на сервер из клиентского кода?
Напрямую нельзя — клиентский код видит только диски компьютера пользователя. Чтобы сохранить файл на сервер, передайте данные через временное хранилище в серверную процедуру и сохраните там.
Как узнать, где выполняется код — на клиенте или на сервере?
Проверьте директиву компиляции в заголовке процедуры или функции. &НаСервере и &НаСерверБезКонтекста — код выполняется на сервере, &НаКлиенте — на клиенте. Без директив в управляемых формах код выполняется на клиенте.
Почему файл не сохраняется в сетевую папку?
Чаще всего причина — в отсутствии прав у учётной записи службы 1С. Проверьте, что служба запущена под учётной записью с доступом к сетевому ресурсу, а не под SYSTEM. Предоставьте этой учётной записи права на запись в целевую папку.