В процессе разработки на платформе 1С часто возникает необходимость выгрузки данных во внешние файлы для обмена с другими системами. Одной из специфических задач является сохранение файла именно на стороне сервера, а не на локальном компьютере пользователя. Это критично для регламентных заданий или при работе через веб-клиент. В этой статье мы подробно разберем, как реализовать этот механизм, какие объекты использовать и на что обратить внимание при настройке прав доступа.
Рассмотрим самый простой и наглядный способ, который предложил автор вопроса. Объект ТекстовыйДокумент удобен тем, что позволяет постепенно формировать структуру файла в оперативной памяти, а затем одним методом записать всё содержимое на диск. Проанализируем программный код, который выполняет сборку данных из результата запроса или коллекции:
&НаСервере
Процедура СохранитьДанныеНаСервере()
// Создаем объект для работы с текстом
Документ = Новый ТекстовыйДокумент;
// Формируем строку заголовка CSV
СтрЗаголовок = "Номенклатура;" + "КоличествоОстаток;" + "СуммаОстаток";
Документ.ДобавитьСтроку(СтрЗаголовок);
// Обходим коллекцию данных (например, таблицу значений или результат запроса)
Для каждого СтрокаДанных Из Объект.Результат Цикл
// Формируем строку данных с разделителем "точка с запятой"
СтрДанных = СокрЛП(СтрокаДанных.Номенклатура) + ";" +
Строка(СтрокаДанных.КоличествоОстаток) + ";" +
Строка(СтрокаДанных.СуммаОстаток);
Документ.ДобавитьСтроку(СтрДанных);
КонецЦикла;
// Указываем путь, который доступен серверу ОС
ПутьКФайлу = "C:\Exchange\ExportData.csv";
// Записываем файл на диск
Документ.Записать(ПутьКФайлу, КодировкаТекста.UTF8);
КонецПроцедуры
Разберем по шагам ключевой момент: метод Записать. Для корректного сохранения CSV-файла на сервере необходимо передать два параметра. Первый — это полный путь к файлу в файловой системе сервера. Второй — кодировка. Если вы планируете открывать этот файл в Microsoft Excel без дополнительных преобразований, лучше использовать КодировкаТекста.ANSI. Если же данные содержат специфические символы, используйте КодировкаТекста.UTF8. При необходимости автоматического преобразования полученных файлов в формат электронных таблиц можно использовать конвертор файлов из CSV в XLS.
Если в вашем отчете или таблице десятки тысяч строк, объект ТекстовыйДокумент может потреблять значительный объем оперативной памяти сервера, так как он хранит весь текст в памяти до момента вызова метода Записать. Проанализируем более профессиональный и производительный метод — использование объекта ЗаписьТекста. Этот объект пишет данные в файл «потоково», не загружая память целиком.
Выясним, как изменить алгоритм для потоковой записи:
&НаСервере
Процедура СохранитьЧерезЗаписьТекста()
ПутьКФайлу = "D:\Data\Export.csv";
// Создаем объект записи сразу с указанием пути и кодировки
Запись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.ANSI);
// Записываем заголовок
Запись.ЗаписатьСтроку("Номенклатура;Количество;Сумма");
Для каждого Строка Из Объект.Результат Цикл
// Формируем строку
ТекстСтроки = Строка.Номенклатура.Наименование + ";" +
Строка.КоличествоОстаток + ";" +
Строка.СуммаОстаток;
// Записываем строку сразу на диск
Запись.ЗаписатьСтроку(ТекстСтроки);
КонецЦикла;
// Обязательно закрываем файл, чтобы освободить ресурсы ОС
Запись.Закрыть();
КонецПроцедуры
Этот метод считается более надежным для серверных процедур, так как он минимизирует риски возникновения ошибки "Недостаточно памяти" при работе с очень большими выгрузками.
При выполнении кода в контексте &НаСервере, важно понимать, что система взаимодействует с файловой системой сервера, а не клиентского компьютера. Разберем основные причины, по которым файл может не сохраняться:
usr1cv8 (или аналогичного). Если у этого пользователя нет прав «Запись» на папку C:\Exchange, метод Записать() выдаст ошибку доступа. Решение: Убедитесь, что папка создана заранее и права для пользователя службы 1С настроены корректно./home/1c/exchange/data.csv. Помните, что Linux чувствителен к регистру символов в именах папок.\\FileServer\Share\data.csv.Зачастую файл на сервере нужен лишь временно (например, чтобы отправить его по электронной почте или передать во внешнюю систему по FTP). В этом случае не стоит жестко прописывать путь к диску C:. Посмотрим на пример использования временных папок:
Функция ПолучитьИмяВременногоФайла("csv") автоматически генерирует уникальный путь в системной временной директории сервера. Это исключает ситуацию, когда два пользователя одновременно запускают обработку и пытаются перезаписать один и тот же файл.
ИмяФайла = ПолучитьИмяВременногоФайла("csv");
ТекстовыйДок = Новый ТекстовыйДокумент;
// ... заполнение документа ...
ТекстовыйДок.Записать(ИмяФайла, КодировкаТекста.UTF8);
// После использования файла (например, отправки), его можно удалить
// УдалитьФайлы(ИмяФайла);
Чтобы ваш файл корректно воспринимался сторонними программами, проанализируем правила формирования CSV:
;). В англоязычных странах — запятая.Формат(Число, "ЧГ=0") для получения чистого числового значения.Таким образом, мы рассмотрели все этапы сохранения файла на сервере: от выбора объекта (ТекстовыйДокумент или ЗаписьТекста) до решения проблем с правами доступа и кодировками. Следуя этим рекомендациям, вы сможете настроить стабильный обмен данными в вашей системе. Для проверки серверных каталогов и передачи выгруженных файлов между клиентом и сервером можно использовать файловый менеджер для обмена файлами между клиентом и сервером.