Сохранение файлов на диск в 1С:Предприятии 8.3 — вручную и кодом
Содержание
Чтобы сохранить файл
на диск в 1С, откройте отчёт или печатную форму и нажмите значок дискеты (или Ещё → Сохранить как), выберите формат — XLSX, PDF, DOCX, MXL — и папку. В коде то же делает одна строка: ТабличныйДокумент.Записать("C:\Выгрузка\Отчет.xlsx", ТипФайлаТабличногоДокумента.XLSX).
Дальше нюансы: где именно окажется файл (на вашем компьютере или на сервере), как писать картинки и архивы, как показать пользователю окно «Сохранить как» и почему в веб-клиенте прямой путь C:\ не работает
.
1. Как сохранить отчёт или печатную форму на диск без программирования
Большинству пользователей код не нужен. Платформа 1С 8.3 умеет сохранять любой табличный документ — отчёт, печатную форму, выведенный список — штатными кнопками.
Отчёт
- Сформируйте отчёт.
- Нажмите значок дискеты на панели отчёта или откройте
Ещё → Сохранить как. - В поле «Тип файла» выберите формат.
- Укажите папку и имя, нажмите «Сохранить».
Если кнопки на панели нет, сработает главное меню: ☰ → Файл → Сохранить как. Курсор при этом должен стоять в самом табличном документе, а не в настройках отчёта.
Печатная форма
- В документе нажмите «Печать» и выберите нужную форму.
- В окне предпросмотра нажмите кнопку «Сохранить» (дискета).
- Отметьте один или несколько форматов галочками.
- Выберите, куда сохранить: в папку на компьютере или прикрепить к документу.
В типовых конфигурациях в этом окне есть ещё две полезные опции: упаковать файлы в ZIP и транслитерировать имена. Транслитерация выручает, если файл уйдёт контрагенту с почтовым сервером, который ломает кириллицу.
Список документов или справочника
- Откройте журнал или справочник.
- Выделите нужные строки (или ничего — тогда выведется весь список).
Ещё → Вывести список, отметьте колонки, нажмите «ОК».- Получится табличный документ — его сохраняйте так же, как отчёт.
Какой формат выбрать
| Формат | Когда брать | Что учесть |
|---|---|---|
📗 XLSX | Дальше считать в Excel | Объединённые ячейки и картинки иногда «плывут» |
📕 PDF | Отправить контрагенту, распечатать | Не редактируется |
📘 DOCX | Править текст договора или письма | Таблицы со сложной разметкой съезжают |
📙 MXL | Открыть потом снова в 1С | Без 1С или «Просмотра MXL» не открыть |
📄 TXT, HTML | Загрузить в другую программу, выложить на сайт | Оформление теряется |
Вложенные файлы (сканы, договоры)
К документам и справочникам в типовых конфигурациях прикрепляют файлы — значок скрепки или команда «Файлы». Чтобы забрать вложение на диск, откройте список файлов, выделите нужный и выберите «Сохранить как» в меню Ещё или в контекстном меню по правой кнопке. Двойной щелчок файл только открывает, но не сохраняет его в выбранную вами папку.
2. Программное сохранение файла: ТабличныйДокумент, ТекстовыйДокумент и объект Файл
Когда выгрузку нужно сделать из своей обработки, у каждого вида данных свой метод Записать().
Табличный документ
ТабДок = Новый ТабличныйДокумент;
// ... заполнение макетом ...
ТабДок.Записать("C:\Выгрузка\Остатки.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Второй параметр задаёт формат. Самые ходовые значения: MXL, XLSX, XLS, PDF, DOCX, ODS, HTML, TXT.
Текстовый файл
Для одного куска текста хватит ТекстовыйДокумент:
Текст = Новый ТекстовыйДокумент;
Текст.ДобавитьСтроку("Артикул;Наименование;Остаток");
Текст.ДобавитьСтроку("A-001;Бумага А4;120");
Текст.Записать("C:\Выгрузка\остатки.csv", КодировкаТекста.UTF8);
Для больших выгрузок построчно надёжнее ЗаписьТекста: она не держит весь файл в памяти.
Запись = Новый ЗаписьТекста("C:\Выгрузка\большой.csv", КодировкаТекста.ANSI);
Для Каждого Строка Из ТаблицаДанных Цикл
Запись.ЗаписатьСтроку(Строка.Артикул + ";" + Строка.Остаток);
КонецЦикла;
Запись.Закрыть();
Excel при двойном щелчке по CSV ждёт кодировку Windows-1251. Если файл откроется «кракозябрами», пишите в КодировкаТекста.ANSI или в UTF-8 с BOM.
Объект Файл: проверки перед записью
Объект Файл сам ничего не записывает. Он нужен, чтобы проверить путь и узнать свойства:
Каталог = Новый Файл("C:\Выгрузка");
Если Не Каталог.Существует() Тогда
СоздатьКаталог("C:\Выгрузка");
КонецЕсли;
ФайлОтчета = Новый Файл("C:\Выгрузка\Остатки.xlsx");
Если ФайлОтчета.Существует() Тогда
УдалитьФайлы(ФайлОтчета.ПолноеИмя);
КонецЕсли;
Полезные свойства и методы: ПолноеИмя, Имя, ИмяБезРасширения, Расширение, Путь, Существует(), Размер(), ЭтоКаталог(). Для операций с готовыми файлами есть глобальные КопироватьФайл(), ПереместитьФайл(), УдалитьФайлы(), НайтиФайлы().
3. Сохранение двоичных данных: картинки, PDF, архивы
Сканы, фото, PDF от контрагента и ZIP-архивы в 1С хранятся как ДвоичныеДанные. Чаще всего они лежат в реквизите типа ХранилищеЗначения или приходят из временного хранилища.
Запись одним вызовом
Данные = Объект.Скан.Получить(); // ХранилищеЗначения → ДвоичныеДанные
Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
Данные.Записать("C:\Выгрузка\скан.pdf");
КонецЕсли;
Если данные пришли из временного хранилища по адресу:
Данные = ПолучитьИзВременногоХранилища(Адрес);
Данные.Записать(ПолучитьИмяВременногоФайла("pdf"));
ПолучитьИмяВременногоФайла() выдаёт уникальное имя в каталоге временных файлов. Удобно для промежуточных файлов — но удалять их потом вам.
Потоки для больших объёмов
Файл в сотни мегабайт целиком в ДвоичныеДанные загружать дорого. В актуальных версиях платформы есть потоки: ФайловыйПоток, ЧтениеДанных, ЗаписьДанных. Они пишут кусками.
ПотокЗаписи = ФайловыеПотоки.ОткрытьДляЗаписи("C:\Выгрузка\архив.bin");
Запись = Новый ЗаписьДанных(ПотокЗаписи);
Запись.Записать(ПорцияДанных); // повторять для каждой порции
Запись.Закрыть();
ПотокЗаписи.Закрыть();
Для ZIP есть отдельный объект ЗаписьZipФайла: добавляете файлы методом Добавить(), затем Записать().
4. Диалог «Сохранить как»: пользователь сам выбирает имя и папку
Жёсткий путь C:\Выгрузка годится для себя. Обработке, которой пользуются другие, нужен диалог выбора файла.
Асинхронный вариант (платформа 8.3.18 и выше)
&НаКлиенте
Асинх Процедура СохранитьФайл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Куда сохранить отчёт";
Диалог.Фильтр = "Книга Excel (*.xlsx)|*.xlsx|Документ PDF (*.pdf)|*.pdf";
Диалог.ПолноеИмяФайла = "Остатки.xlsx";
Выбранные = Ждать Диалог.ВыбратьАсинх();
Если Выбранные = Неопределено Тогда
Возврат; // пользователь нажал «Отмена»
КонецЕсли;
Ждать ТабДок.ЗаписатьАсинх(Выбранные[0], ТипФайлаТабличногоДокумента.XLSX);
КонецПроцедуры
Вариант с оповещением (старые релизы платформы)
До появления Асинх/Ждать диалог открывают методом Показать() и передают ОписаниеОповещения — процедуру, которую платформа вызовет после выбора. Синхронный Диалог.Выбрать() в управляемом приложении при режиме использования модальности «Не использовать» вызовет ошибку — не опирайтесь на него в новых разработках.
Фильтр и расширение
- 🧩 Строка фильтра — пары «описание|маска», разделённые
|. - 🧩 Пользователь может стереть расширение. Проверьте его через
Новый Файл(Путь).Расширениеи при необходимости допишите. - 🧩 Свойство
Каталогзадаёт папку, которая откроется первой. Удобно подставлять последнюю выбранную пользователем — сохраните её в настройках формы, и в следующий раз человеку не придётся заново искать папку. - 🧩 Если файл с выбранным именем уже есть, перед записью стоит проверить его через
Новый Файл(Путь).Существует()и решить: перезаписать или добавить к имени дату и время. - 🧩 Формат в
Записать()и расширение в имени должны совпадать: XLSX, записанный как.xls, Excel откроет с предупреждением.
5. Тонкий клиент, веб-клиент и сервер: куда на самом деле попадёт файл
Главная причина «файл не сохраняется» — код выполнился не на том компьютере.
Где выполняется Записать() | Куда пишет | Типичная ловушка |
|---|---|---|
&НаКлиенте, тонкий клиент | Диск пользователя | Нет прав на папку |
&НаКлиенте, веб-клиент | Без расширения работы с файлами — никуда | Прямой путь C:\ недоступен браузеру |
&НаСервере, файловая база | Диск компьютера, где запущен процесс 1С | Обычно совпадает с клиентом, поэтому ошибку не видно до перехода на сервер |
&НаСервере, клиент-серверная база | Диск сервера 1С | Файл появляется на сервере, а пользователь ищет его у себя |
Правильная схема для клиент-серверной базы
- На сервере формируете данные и кладёте их во временное хранилище:
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор). - Возвращаете адрес на клиент.
- На клиенте передаёте файл пользователю.
&НаКлиенте
Асинх Процедура Выгрузить(Команда)
Адрес = СформироватьНаСервере();
Ждать ПолучитьФайлССервераАсинх(Адрес, "Остатки.xlsx");
КонецПроцедуры
В тонком клиенте платформа покажет окно сохранения. В веб-клиенте файл уйдёт в обычную загрузку браузера — в папку «Загрузки» или туда, куда настроен браузер.
Расширение работы с файлами в веб-клиенте
Чтобы веб-клиент мог писать на диск по указанному пути, ставят расширение для работы с файлами. В коде проверяют и подключают его методами НачатьПодключениеРасширенияРаботыСФайлами() и НачатьУстановкуРасширенияРаботыСФайлами(). Без расширения остаётся только скачивание через браузер — для большинства задач этого хватает.
Серверный код пишет файлы от имени учётной записи службы сервера 1С, а не от имени пользователя. Сетевая папка, открытая у бухгалтера, для службы может быть закрыта.
6. Автоматическая выгрузка файлов: регламентные задания и пакетный запуск
Ежедневные выгрузки остатков, прайсов, реестров удобно поручить самой базе.
Регламентное задание
- ⏱ Процедура задания выполняется на сервере, без клиента и без диалогов.
- ⏱ Путь указывайте сетевой (
\\fileserver\obmen\) или локальный путь сервера, не путь чьего-то рабочего места. - ⏱ Дайте учётной записи службы 1С права на запись в эту папку.
- ⏱ В имя файла добавьте дату, чтобы выгрузки не перезаписывали друг друга:
"Остатки_" + Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMdd") + ".xlsx". - ⏱ Ошибки пишите в журнал регистрации через
ЗаписьЖурналаРегистрации()— иначе о сбое никто не узнает.
В файловой базе регламентные задания выполняются, только пока база открыта у кого-то из пользователей, — для надёжной выгрузки по расписанию нужен клиент-серверный вариант или внешний запуск.
Пакетный запуск из командной строки
Для файловой базы выгрузку можно запускать планировщиком Windows: платформа открывает базу и сразу выполняет внешнюю обработку .
"C:\Program Files\1cv8\8.3.24.1691\bin\1cv8.exe" ENTERPRISE /F"D:\Bases\Buh" /N"Robot" /P"pass" /Execute"D:\Scripts\vygruzka.epf"
Номер платформы в пути подставьте свой. Обработка в обработчике ПриОткрытии делает выгрузку и закрывает сеанс через ЗавершитьРаботуСистемы(Ложь).
Не храните пароль администратора в открытом bat-файле. Заведите отдельного пользователя только с правами на чтение нужных данных.
Пакетная выгрузка вложений
Если надо забрать сотни сканов одним махом, перебирайте файлы запросом и пишите каждый методом ДвоичныеДанные.Записать(). Имена собирайте из номера и даты документа и вычищайте символы, запрещённые в Windows: \ / : * ? " < > |.
Ещё → Сохранить как, без кода.Записать() на клиенте + ДиалогВыбораФайла в режиме сохранения.ПолучитьФайлССервераАсинх() на клиенте./Execute по планировщику.7. Ошибки при сохранении файла на диск и как их избежать
| Симптом | Причина | Что сделать |
|---|---|---|
Ошибка при вызове метода контекста (Записать) | Нет папки или прав на запись | Создайте каталог через СоздатьКаталог(), проверьте права учётной записи |
| Файл «не появился» | Код отработал &НаСервере | Ищите на сервере или переделайте через временное хранилище |
Использование модальных окон в данном режиме запрещено | Вызов Выбрать() | Перейдите на ВыбратьАсинх() или Показать() |
| Безопасный режим запрещает операцию | Внешняя обработка без разрешений | Подключите её через «Дополнительные отчёты и обработки» с нужными разрешениями или включите в конфигурацию |
| Файл занят | Предыдущая версия открыта в Excel | Закройте файл или пишите под новым именем |
Перед массовой выгрузкой проверьте свободное место на диске сервера. Временные файлы, которые вы создавали через ПолучитьИмяВременногоФайла(), удаляйте в конце процедуры — сервер их сам не чистит.
8. Частые вопросы
Можно ли сохранить сразу несколько печатных форм одним файлом?
Почему при сохранении в Excel пропали картинки и штрихкоды?
Как сохранить файл из 1С, если нет кнопки «Сохранить»?
☰ → Файл → Сохранить как, предварительно щёлкнув внутри табличного документа.