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

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

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

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

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

Главное различие, которое нужно понимать сразу: сервер 1С и компьютер пользователя — это разные машины с разными дисками. Путь C:\Отчеты на сервере и на клиенте указывает на разные места. Поэтому типовая схема выглядит так: файл формируется на сервере, передается на клиент через временное хранилище и только там записывается на диск пользователя.

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

Как устроена передача файлов между сервером и клиентом 1С

В клиент-серверном режиме весь код, выполняемый в серверных процедурах, работает на компьютере сервера 1С. Если в такой процедуре записать файл по пути D:\Выгрузки, он появится на диске сервера, а пользователь его не увидит. Это самая частая причина жалоб «файл сохраняется, но его нигде нет».

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

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

Сохранение файла через диалог выбора

Когда пользователь должен сам указать, куда сохранить файл, используется объект ДиалогВыбораФайла в режиме РежимДиалогаВыбораФайла.Сохранение. В диалоге можно задать фильтр по расширениям, заголовок окна и имя файла по умолчанию — это удобно, чтобы пользователь не ошибся с форматом.

Диалог сам по себе файл не создает: он только возвращает выбранный путь. После того как пользователь нажал «Сохранить», нужно записать данные по полученному имени файла — методом Записать у табличного документа, НачатьЗапись у двоичных данных или другим подходящим способом.

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);

Диалог.Фильтр = "Файл Excel (.xlsx)|.xlsx";

Диалог.ИмяФайла = "Отчет.xlsx";

Диалог.Заголовок = "Укажите, куда сохранить отчет";

Если Диалог.Выбрать() Тогда

ТабДок.Записать(Диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLSX);

КонецЕсли;

Обратите внимание: метод Выбрать() работает синхронно и доступен не во всех контекстах. В тонком и веб-клиенте при включенном режиме асинхронности следует использовать Диалог.Показать() с описанием оповещения — иначе платформа выдаст ошибку о недопустимости синхронного вызова.

Порядок действий при сохранении через диалог
  1. 1
    Сформируйте данные: табличный документ, текст или двоичные данные
  2. 2
    Создайте ДиалогВыбораФайла в режиме Сохранение, задайте фильтр и имя файла
  3. 3
    Покажите диалог пользователю и получите выбранный путь
  4. 4
    Запишите данные по выбранному пути подходящим методом
  5. 5
    Проверьте, что файл появился и открывается в целевой программе

Программное сохранение без диалога

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

ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);

ДвоичныеДанные.Записать("C:\Обмен\выгрузка.xml");

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

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

Сохранение типовых объектов: табличный документ, текст, картинка

Табличный документ — самый частый источник файлов в 1С. Метод Записать принимает имя файла и тип: XLSX, PDF, MXL, ODS, HTML и другие. Тип файла должен соответствовать расширению, иначе пользователь получит файл, который не открывается или открывается с предупреждением о несоответствии формата.

Текстовые данные (XML, CSV, JSON) записываются через ЗаписьТекста с указанием кодировки. Для XML, который будут читать внешние системы, явно задавайте кодировку UTF-8 — по умолчанию может использоваться системная кодировка, и кириллица у получателя превратится в нечитаемые символы.

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

Сравнение способов сохранения

Диалог + Записать

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

Запись по фиксированному пути

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

Временное хранилище + НачатьПолучениеФайлов

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

Как проверить, что файл действительно сохранился

Успешное выполнение метода Записать без исключения — уже хороший признак, но не гарантия полезного результата. Минимальная проверка: создать объект Файл с тем же путем, вызвать Существует() и посмотреть размер через свойство Размер(). Нулевой размер означает, что данные не были сформированы или потерялись при передаче.

Для файлов, передаваемых во внешние системы, полезно открыть результат в целевой программе: PDF — в просмотрщике, XLSX — в Excel, XML — в редакторе с проверкой кодировки. Так вы поймаете ошибки формата, которые программная проверка существования не покажет.

При массовой выгрузке записывайте в журнал регистрации или в лог факт сохранения каждого файла с полным путем. Когда пользователь скажет «файла нет», вы сразу увидите, на каком шаге прервалась цепочка.

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

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

Существование файла
Норма

Файл() с заданным путем, Существует() = Истина

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

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

Размер файла
Норма

Размер больше нуля и соответствует ожидаемому объему данных

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

Нулевой размер — данные не сформированы или не переданы из хранилища

Открытие в целевой программе
Норма

Файл открывается без предупреждений, кириллица читается

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

Ошибка формата или кракозябры — неверный тип файла или кодировка

Типичные ошибки и ограничения

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

Вторая группа проблем связана с правами доступа. Запись в корень диска C:, в Program Files или в чужие профили пользователей может быть запрещена операционной системой. Признак — исключение «Ошибка доступа к файлу». Решение — сохранять в профиль пользователя (Документы, Рабочий стол) или в специально выделенную папку с выданными правами.

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

Типичные ошибки
01
Запись файла в серверной процедуре по локальному пути — файл оказывается на диске сервера, а не у пользователя
02
Запись в несуществующий каталог — исключение, файл не создан; сначала проверяйте или создавайте папку
03
Перезапись существующего файла без проверки — старые данные теряются без предупреждения
04
Несоответствие типа файла расширению — файл не открывается в целевой программе
05
Синхронный вызов диалога там, где требуется асинхронный — ошибка платформы в тонком и веб-клиенте

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

Как сохранить файл на диск сервера из регламентного задания?

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

Почему НачатьПолучениеФайлов требует расширение работы с файлами?

В тонком и веб-клиенте доступ к файловой системе пользователя ограничен безопасностью браузера и платформы. Расширение работы с файлами снимает это ограничение. Если оно не установлено, предложите пользователю установить его методом НачатьУстановкуРасширенияРаботыСФайлами, либо используйте сценарий с интерактивным выбором, который платформа обрабатывает сама.

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

После записи вызовите НачатьЗапускПриложения с описанием оповещения и путем к файлу — операционная система откроет его программой по умолчанию. Либо покажите оповещение пользователя с навигационной ссылкой на файл, чтобы он открыл его по щелчку.

Можно ли сохранить файл без диалога в папку «Загрузки» пользователя?

Надежного кроссплатформенного способа узнать путь к «Загрузкам» из кода 1С нет. Практичные варианты: показать диалог сохранения с предложенным именем, запросить каталог у пользователя один раз и запомнить его в настройках, либо использовать КаталогДокументов() для получения папки документов пользователя.

Файл сохраняется, но кириллица в имени или содержимом искажена. Что делать?

Для содержимого текстовых файлов явно указывайте кодировку UTF-8 при создании объекта ЗаписьТекста. Для имен файлов избегайте специальных символов и проверяйте, как путь передается между клиентом и сервером. Если файл уходит во внешнюю систему, уточните, какую кодировку она ожидает — иногда требуется Windows-1251.

Итог

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

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