Архив ZIP из 1С: от флажка «Упаковать в архив» до регламентного задания с отправкой по почте

· 9 мин

Содержание

Выгрузить ZIP из 1С можно двумя путями. Без программирования: при сохранении или отправке печатной формы поставьте флажок Упаковать в архив (.zip), а для сообщений обмена включите сжатие в настройках транспорта. Программно: объект встроенного языка ЗаписьZipФайла упаковывает любые файлы, которые вы до этого выгрузили из базы, — XML, CSV, XLSX, PDF.

Первый путь подходит бухгалтеру, которому нужно раз в месяц отправить пачку счетов. Второй — для архивации и обмена данными по расписанию: обработка сама выгружает данные, сжимает их, ставит пароль и отправляет архив по почте, на FTP или в HTTP-сервис.

Какими способами получить ZIP-архив из 1С

Платформа 1С:Предприятие 8.3 умеет создавать и читать ZIP сама, без внешних архиваторов вроде 7-Zip или WinRAR. Типовые конфигурации на Библиотеке стандартных подсистем (БП 3.0, ЗУП 3.1, УТ 11, КА, ERP) используют это в нескольких местах.

СпособГде включаетсяКогда выбирать
📄 Сохранение печатных формОкно печати → Сохранить → флажок Упаковать в архив (.zip)Нужно отдать набор документов одним файлом
✉️ Отправка печатных формОкно печати → Отправить → тот же флажокПисьмо контрагенту с вложением-архивом
🔄 Обмен данными БСПНастройки транспорта узла обмена: сжатие сообщения и пароль архиваРегулярный обмен между базами через каталог, FTP, почту
💾 Резервное копирование файловой базыАдминистрирование → Обслуживание → Резервное копирование и восстановлениеАрхив самой базы, а не отдельных данных
🧩 Своя обработка на ЗаписьZipФайлаВнешняя обработка или расширениеНестандартный набор данных, пароль, расписание, интеграция

В печатных формах флажок архива есть в типовых конфигурациях на БСП. В самописных и старых конфигурациях его может не быть — тогда остаётся программный способ.

Файлы XLSX, DOCX и ODS уже являются ZIP-контейнерами внутри. Повторное сжатие уменьшит их на единицы процентов. Архив для них нужен ради «одного файла» и пароля, а не ради размера. XML и CSV, наоборот, сжимаются в 5–15 раз.

Объекты встроенного языка для работы с ZIP

Все операции с архивами в 1С держатся на двух объектах и нескольких системных перечислениях.

  • 📦 ЗаписьZipФайла — создаёт архив: принимает имя файла, пароль, комментарий, метод и уровень сжатия, метод шифрования.
  • 📂 ЧтениеZipФайла — открывает готовый архив, даёт коллекцию Элементы и методы Извлечь() и ИзвлечьВсе().
  • ⚙️ МетодСжатияZIP — Сжатие или Копирование (файлы кладутся без сжатия).
  • 📊 УровеньСжатияZIP — Минимальный, Оптимальный, Максимальный.
  • 🔐 МетодШифрованияZIP — Zip20, AES128, AES192, AES256.
  • 🗂 РежимСохраненияПутейZIP — НеСохранятьПути, СохранятьОтносительныеПути, СохранятьПолныеПути.
  • 🔁 РежимОбработкиПодкаталоговZIP — НеОбрабатывать или ОбрабатыватьРекурсивно.

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

Как выгрузить данные в ZIP программно: пошагово

Задача из практики: выгрузить список контрагентов с ИНН в CSV, упаковать в архив и отдать пользователю. Порядок одинаков для любых данных.

Шаг 1. Подготовьте временный каталог

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

Шаг 2. Выгрузите данные в файлы

Запрос → ЗаписьТекста для CSV, ЗаписьXML для XML или ТабличныйДокумент.Записать() для XLSX. Файлов может быть сколько угодно.

Шаг 3. Создайте архив и добавьте файлы

Метод Добавить() принимает путь к файлу или маску вида каталог\*.*. Его можно вызывать несколько раз подряд.

Шаг 4. Запишите архив и передайте клиенту

Метод Записать() формирует файл на диске. До его вызова архива нет. Затем двоичные данные кладут во временное хранилище, а клиент сохраняет их на свой компьютер.

Код формы обработки целиком:

&НаСервере
Функция СформироватьАрхивНаСервере()

	Разделитель = ПолучитьРазделительПути();
	Каталог = КаталогВременныхФайлов() + "export_" + Строка(Новый УникальныйИдентификатор);
	СоздатьКаталог(Каталог);

	// Шаг 2. Выгрузка данных в CSV
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Контрагенты.Наименование КАК Наименование,
	|	Контрагенты.ИНН КАК ИНН
	|ИЗ
	|	Справочник.Контрагенты КАК Контрагенты
	|ГДЕ
	|	НЕ Контрагенты.ЭтоГруппа
	|	И НЕ Контрагенты.ПометкаУдаления";
	Выборка = Запрос.Выполнить().Выбрать();

	ИмяCSV = Каталог + Разделитель + "kontragenty.csv";
	Текст = Новый ЗаписьТекста(ИмяCSV, КодировкаТекста.UTF8);
	Текст.ЗаписатьСтроку("Наименование;ИНН");
	Пока Выборка.Следующий() Цикл
		Текст.ЗаписатьСтроку(СтрШаблон("%1;%2", Выборка.Наименование, Выборка.ИНН));
	КонецЦикла;
	Текст.Закрыть();

	// Шаг 3. Упаковка
	ИмяАрхива = ПолучитьИмяВременногоФайла("zip");
	Архив = Новый ЗаписьZipФайла(ИмяАрхива, ,
		"Выгрузка от " + Формат(ТекущаяДатаСеанса(), "ДФ=dd.MM.yyyy"),
		МетодСжатияZIP.Сжатие, УровеньСжатияZIP.Оптимальный);
	Архив.Добавить(Каталог + Разделитель + "*.*",
		РежимСохраненияПутейZIP.СохранятьОтносительныеПути,
		РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
	Архив.Записать();

	// Шаг 4. В хранилище и уборка
	Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяАрхива), УникальныйИдентификатор);
	УдалитьФайлы(Каталог);
	УдалитьФайлы(ИмяАрхива);

	Возврат Адрес;

КонецФункции

&НаКлиенте
Процедура ВыгрузитьВZip(Команда)
	Адрес = СформироватьАрхивНаСервере();
	ФайловаяСистемаКлиент.СохранитьФайл(Неопределено, Адрес, "kontragenty.zip");
КонецПроцедуры

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

Не склеивайте пути через «\» вручную, если сервер 1С может работать на Linux. ПолучитьРазделительПути() вернёт правильный символ на любой ОС.

Сжатие, пароль и кодировка имён: настройка параметров архива

Параметры передаются в конструктор ЗаписьZipФайла или в метод Открыть() в таком порядке: имя файла, пароль, комментарий, метод сжатия, уровень сжатия, метод шифрования, кодировка имён файлов.

Уровень сжатия

УровеньСкоростьРазмерКогда ставить
МинимальныйСамый быстрыйБольше остальныхБольшие выгрузки каждую ночь, где важна скорость
ОптимальныйСреднийСреднийВыбор по умолчанию для XML, CSV, текстов
МаксимальныйСамый медленныйМинимальныйАрхив отправляется по медленному каналу или почте с лимитом
МетодСжатияZIP.КопированиеМгновенноКак у исходниковСканы JPG, PDF, XLSX — сжимать нечего

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

Пароль и шифрование

Пароль задаётся вторым параметром. Без указания метода шифрования применяется классический Zip20.

  • 🔓 Zip20 открывает проводник Windows и любой архиватор. Защита слабая: подходит, чтобы письмо не прочитали «случайно».
  • 🔐 AES256 — надёжное шифрование. Но встроенный проводник Windows такие архивы часто не открывает: получателю понадобится 7-Zip или аналог.

Если в архиве персональные данные сотрудников или контрагентов, выбирайте AES и передавайте пароль отдельным каналом — не в том же письме.

Кириллица в именах файлов

Классическая беда: файл «Акт сверки.pdf» в архиве превращается в набор закорючек. Это расхождение кодировок между тем, кто пишет архив, и тем, кто его читает.

Последний параметр конструктора — КодировкаИменФайловВZipФайле — решает проблему. Значение UTF8 понимают современные архиваторы и Linux. Для старых программ, ожидающих кодировку ОС, есть отдельное значение перечисления. Самый надёжный вариант для обмена с чужими системами — давать файлам в архиве латинские имена.

Автоматическая выгрузка архива по расписанию

Ручная кнопка хороша для разовых задач. Для ежедневной архивации нужен регламентный механизм.

Регламентное задание в расширении или конфигурации

  1. Вынесите функцию формирования архива в общий серверный модуль. Код формы из примера выше переносится почти без изменений: вместо временного хранилища архив сохраняется в сетевой каталог или сразу отправляется.
  2. В конфигураторе добавьте объект в ветке Общие → Регламентные задания, укажите метод модуля, включите флажки Использование и Предопределенное.
  3. Задайте расписание, например ежедневно в 02:00.
  4. Проверить и поменять расписание без конфигуратора можно в Администрирование → Обслуживание → Регламентные и фоновые операции.

Задание выполняется под пользователем, указанным в его настройках, или с правами сеанса регламентного задания. Каталог назначения должен быть доступен на запись учётной записи, от которой работает сервер 1С.

В файловой базе регламентные задания выполняются, только пока к базе подключён хотя бы один сеанс. Если ночью все разошлись, архив не сформируется. Для гарантированного запуска нужен клиент-серверный вариант или запуск обработки через планировщик Windows.

Запуск через планировщик Windows

Для файловой базы рабочая схема — пакетный запуск клиента с параметром /Execute:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F"D:\Bases\Buh" /N"Robot" /P"пароль" /Execute"D:\Obrabotki\ZipExport.epf" /DisableStartupMessages

Обработка выполняет выгрузку в обработчике открытия формы и закрывает сеанс командой ЗавершитьРаботуСистемы(Ложь). Для такого запуска заведите отдельного пользователя с минимальными правами.

Как отправить ZIP-архив по почте, на FTP или в HTTP-сервис

Архив редко нужен сам по себе. Обычно его сразу передают в банк, бухгалтерию головной компании, сайт или облачное хранилище.

Вложение в письмо

Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.example.ru";
Профиль.ПортSMTP = 465;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ПользовательSMTP = "export@example.ru";
Профиль.ПарольSMTP = ПарольИзНастроек;

Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Отправитель = "export@example.ru";
Письмо.Получатели.Добавить("buh@example.ru");
Письмо.Тема = "Выгрузка контрагентов";
Письмо.Тексты.Добавить("Архив во вложении.");
Письмо.Вложения.Добавить(ИмяАрхива, "kontragenty.zip");

Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);
Почта.Послать(Письмо);
Почта.Отключиться();

В конфигурациях на БСП удобнее взять учётную запись из справочника учётных записей электронной почты и отправлять через модуль работы с почтовыми сообщениями. Так пароль не хранится в коде.

FTP и HTTP

  • 📤 FTP: Новый FTPСоединение(Сервер, Порт, Пользователь, Пароль), затем метод Записать(ИмяЛокальногоФайла, ИмяФайлаНаСервере).
  • 🌐 HTTP: создайте HTTPЗапрос, задайте тело методом УстановитьИмяФайлаТела(ИмяАрхива) и заголовок Content-Type: application/zip, отправьте через HTTPСоединение с ЗащищенноеСоединениеOpenSSL для HTTPS.

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

Обратная операция: распаковать архив в 1С

Входящий архив разбирают объектом ЧтениеZipФайла: открыть файл с паролем, при необходимости пройти по коллекции Элементы и вызвать ИзвлечьВсе(Каталог, РежимВосстановленияПутейФайловZIP.Восстанавливать). Затем загрузить данные из распакованных файлов обычным способом.

Ошибки при создании ZIP в 1С и как их разобрать

Каждую операцию с архивом оборачивайте в Попытка … Исключение и пишите подробности в журнал регистрации. Без этого регламентное задание будет падать молча.

Попытка
	Архив.Записать();
Исключение
	ЗаписьЖурналаРегистрации("ВыгрузкаZip", УровеньЖурналаРегистрации.Ошибка, , ,
		ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	ВызватьИсключение;
КонецПопытки;

Журнал смотрят в Администрирование → Обслуживание → Журнал регистрации, отбор по событию «ВыгрузкаZip».

Диагностика: выберите симптом

Если временные каталоги копятся на диске сервера, значит, исключение срабатывает раньше, чем УдалитьФайлы(). Перенесите удаление в обе ветки: и после успешной записи, и в блок Исключение перед повторным вызовом исключения.

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

Нужен ли установленный 7-Zip или WinRAR, чтобы 1С создала ZIP?
Нет. Объекты ЗаписьZipФайла и ЧтениеZipФайла встроены в платформу 8.3 и работают без внешних программ, в том числе на сервере под Linux.
Можно ли создать архив прямо в памяти, не записывая файл на диск?
Для надёжности используйте временный файл из ПолучитьИмяВременногоФайла(“zip”) и сразу удаляйте его после передачи. Это работает на всех версиях платформы и в любом клиенте.
Чем ZIP-архив данных отличается от выгрузки базы в .dt?
Файл .dt — это полная копия информационной базы для загрузки в конфигураторе. ZIP из обработки содержит только те данные, которые вы выбрали, в открытом формате: XML, CSV, XLSX.
Как разбить большой архив на части для почты?
Встроенного разбиения на тома у платформы нет. Делите данные заранее: например, по месяцам или по организациям, и создавайте несколько архивов.
Можно ли выгрузить в ZIP присоединённые файлы документов?
Да. Получите двоичные данные присоединённых файлов, запишите их во временный каталог под понятными именами и упакуйте каталог целиком методом Добавить с рекурсивной обработкой подкаталогов.