Архив ZIP из 1С: от флажка «Упаковать в архив» до регламентного задания с отправкой по почте
Содержание
Выгрузить 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. Для старых программ, ожидающих кодировку ОС, есть отдельное значение перечисления. Самый надёжный вариант для обмена с чужими системами — давать файлам в архиве латинские имена.
Автоматическая выгрузка архива по расписанию
Ручная кнопка хороша для разовых задач. Для ежедневной архивации нужен регламентный механизм.
Регламентное задание в расширении или конфигурации
- Вынесите функцию формирования архива в общий серверный модуль. Код формы из примера выше переносится почти без изменений: вместо временного хранилища архив сохраняется в сетевой каталог или сразу отправляется.
- В конфигураторе добавьте объект в ветке
Общие → Регламентные задания, укажите метод модуля, включите флажкиИспользованиеиПредопределенное. - Задайте расписание, например ежедневно в 02:00.
- Проверить и поменять расписание без конфигуратора можно в
Администрирование → Обслуживание → Регламентные и фоновые операции.
Задание выполняется под пользователем, указанным в его настройках, или с правами сеанса регламентного задания. Каталог назначения должен быть доступен на запись учётной записи, от которой работает сервер 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».
Если временные каталоги копятся на диске сервера, значит, исключение срабатывает раньше, чем УдалитьФайлы(). Перенесите удаление в обе ветки: и после успешной записи, и в блок Исключение перед повторным вызовом исключения.