ZIP-архив в 1С:Предприятии 8.3: обмены, обработки и распаковка кодом

· 10 мин

Содержание

Загрузить архив ZIP в 1С можно тремя путями. Пакет обмена из синхронизации платформа распакует сама, если положить его в папку обмена. Файл универсального обмена XML можно отдать обработке прямо в .zip. Всё остальное (внешние обработки, .dt, .cfu, выгрузки из сторонних программ) сначала распаковывают, а уже потом загружают содержимое. Для своих задач есть объект встроенного языка ЧтениеZipФайла: он распаковывает архив на сервере без 7-Zip и WinRAR.

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

Что лежит в архиве и куда его загружать

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

Что внутри ZIPЧто этоКуда загружать
Message_*.xml или сам архив Message_*.zipпакет синхронизации данныхпапка обмена, затем запуск синхронизации
.xml с правилами или данными обменавыгрузка универсального обменаобработка «Универсальный обмен данными в формате XML»
.epf, .erfвнешняя обработка или отчётсправочник дополнительных отчётов и обработок
.dtвыгрузка информационной базыКонфигуратор, загрузка информационной базы
.cf, .cfu, setup.exeконфигурация или обновлениеКонфигуратор, режим обновления конфигурации
.xml, .csv, .txt от другой программыданные для разбораобработка с ЧтениеZipФайла

Файлы .xlsx и .docx по устройству тоже ZIP-архивы. Распаковывать их не нужно: 1С читает табличный документ Excel напрямую.

Права, без которых загрузка не начнётся

Проверьте учётную запись до того, как искать причину в архиве:

  • 🔑 для внешних обработок нужна роль, которая разрешает добавлять дополнительные отчёты и обработки, или право интерактивного открытия внешних обработок;
  • 🛡️ на платформе 8.3.22 и новее у пользователя может стоять флажок «Защита от опасных действий» в свойствах пользователя в Конфигураторе: при открытии внешнего файла программа покажет предупреждение;
  • 🗂️ в клиент-серверной базе файлы читает служба сервера 1С, а не ваш Windows-пользователь. У её учётной записи (по умолчанию USR1CV8) должно быть право на чтение и запись в папку с архивом;
  • 💾 на диске нужно свободное место примерно в 3-5 раз больше размера архива: текстовые XML сжимаются сильно.

Как загрузить ZIP-пакет синхронизации данных

Типовые конфигурации на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11, КА, ERP) обмениваются сообщениями через синхронизацию данных. Если в настройках транспорта включено сжатие, каждое сообщение уходит в виде архива с именем вида Message_<код отправителя>_<код получателя>.zip. Распаковывать его вручную не нужно.

Ручная загрузка такого архива нужна, когда автоматический канал сломался: FTP недоступен, почта не дошла, файл прислали на флешке.

  1. Откройте Администрирование → Синхронизация данных.
  2. Перейдите к списку настроек синхронизации и откройте нужную настройку.
  3. В параметрах подключения посмотрите путь к каталогу обмена (вариант «через локальный или сетевой каталог»).
  4. Скопируйте полученный архив в этот каталог, не меняя имени файла.
  5. Если архив защищён паролем, проверьте, что пароль в настройке совпадает с паролем на стороне отправителя.
  6. Вернитесь в список и запустите синхронизацию по этой настройке.

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

Не переименовывайте архив. Программа ищет файл по кодам узлов в имени. Архив Message_BP_UT.zip, сохранённый как Message_BP_UT(1).zip, просто не будет найден.

Если пришёл архив от другого узла

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

ZIP в универсальном обмене данными в формате XML

Обработка «Универсальный обмен данными в формате XML» умеет выгружать результат сразу в архив. На вкладке выгрузки для этого есть флажок сжатия файла. Загружает она такой архив тоже напрямую.

Порядок загрузки:

  1. Сделайте резервную копию базы -приёмника. Универсальный обмен пишет в базу без промежуточного просмотра.
  2. Откройте обработку через Файл → Открыть в режиме 1С:Предприятие (или через список дополнительных обработок, если её туда добавили).
  3. Перейдите на вкладку загрузки данных.
  4. В поле имени файла выберите .zip. Если диалог показывает только .xml, переключите фильтр на «Все файлы».
  5. Если архив с паролем, введите его в поле пароля архива.
  6. Нажмите команду загрузки и дождитесь протокола.

Не загружайте выгрузку из чужой конфигурации без проверки правил обмена. Правила связывают объекты источника и приёмника. Если они составлены под другие версии, обработка создаст дубли контрагентов и номенклатуры.

Сами правила обмена (обычно .xml, подготовленные в «Конвертации данных») тоже иногда присылают в ZIP. Их распакуйте и укажите на вкладке выгрузки. Файл правил обработка в архиве не читает.

Внешняя обработка или отчёт из ZIP-архива

Разработчики и сайты с обработками часто отдают файлы .epf и .erf в архиве. Окно добавления дополнительной обработки ждёт именно .epf или .erf, архив оно не примет. Сначала распакуйте файл.

Разово открыть обработку

  1. Распакуйте архив в отдельную папку, например D:\1C\Obrabotki.
  2. В 1С откройте главное меню (кнопка с тремя полосками или стрелкой в заголовке окна) и выберите Файл → Открыть.
  3. Укажите файл .epf.
  4. Если появилось предупреждение о защите от опасных действий, прочитайте его. Подтверждайте, только если источник обработки вам известен.

Подключить постоянно

В Бухгалтерии 3.0, ЗУП 3.1 и УТ 11 путь одинаковый: Администрирование → Печатные формы, отчеты и обработки.

  1. Включите флажок «Дополнительные отчеты и обработки».
  2. Перейдите по ссылке с тем же названием.
  3. Нажмите «Добавить из файла» и выберите распакованный .epf или .erf.
  4. Программа может спросить про безопасный режим. Обработке, которая работает с файлами, нужны разрешения: в БСП их показывают списком перед подключением.
  5. Настройте размещение (в каких разделах видна команда) и пользователей, затем запишите.

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

Распаковка ZIP средствами встроенного языка 1С

Когда архив приходит от банка, маркетплейса или складской программы, штатной команды загрузки нет. Тогда пишут небольшую обработку. В платформе 8.3 для этого есть два объекта:

  • 📦 ЧтениеZipФайла — открыть архив, перебрать Элементы, извлечь один файл методом Извлечь или все сразу методом ИзвлечьВсе;
  • 🗜️ ЗаписьZipФайла — собрать архив: методы Добавить и Записать, можно задать пароль и метод шифрования.

Пользователь выбирает файл на своём компьютере, а читать его нужно на сервере. Поэтому архив сначала передают во временное хранилище, а на сервере записывают во временный файл.

Пример: загрузить архив и прочитать все XML из него

Код формы внешней обработки. Команда формы «ЗагрузитьАрхив» вызывает выбор файла:

&НаКлиенте
Процедура ЗагрузитьАрхив(Команда)
    Оповещение = Новый ОписаниеОповещения("ЗагрузитьАрхивЗавершение", ЭтотОбъект);
    НачатьПомещениеФайла(Оповещение, , "", Истина, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьАрхивЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    Если Не Результат Тогда
        Возврат;
    КонецЕсли;
    Если ВРег(Прав(ВыбранноеИмяФайла, 4)) <> ".ZIP" Тогда
        Сообщить("Выбран не ZIP-архив: " + ВыбранноеИмяФайла);
        Возврат;
    КонецЕсли;
    Итог = РазобратьАрхивНаСервере(Адрес);
    Для Каждого Строка Из Итог Цикл
        Сообщить(СтрШаблон("%1: %2 символов", Строка.Имя, Формат(Строка.Длина, "ЧГ=0")));
    КонецЦикла;
КонецПроцедуры

&НаСервереБезКонтекста
Функция РазобратьАрхивНаСервере(Адрес)
    Итог = Новый Массив;

    ИмяАрхива = ПолучитьИмяВременногоФайла("zip");
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
    ДвоичныеДанные.Записать(ИмяАрхива);

    Каталог = ПолучитьИмяВременногоФайла();
    СоздатьКаталог(Каталог);

    Архив = Новый ЧтениеZipФайла(ИмяАрхива);
    Архив.ИзвлечьВсе(Каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
    Архив.Закрыть();

    Файлы = НайтиФайлы(Каталог, "*.xml");
    Для Каждого Файл Из Файлы Цикл
        Текст = Новый ТекстовыйДокумент;
        Текст.Прочитать(Файл.ПолноеИмя, КодировкаТекста.UTF8);
        Содержимое = Текст.ПолучитьТекст();
        Итог.Добавить(Новый Структура("Имя, Длина, Текст", Файл.Имя, СтрДлина(Содержимое), Содержимое));
    КонецЦикла;

    УдалитьФайлы(ИмяАрхива);
    УдалитьФайлы(Каталог);
    Возврат Итог;
КонецФункции

Что здесь происходит:

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

Для разбора самих XML замените чтение через ТекстовыйДокумент на ЧтениеXML или XDTOФабрика, если формат описан схемой.

Если архив защищён паролем, передайте его вторым параметром: Новый ЧтениеZipФайла(ИмяАрхива, "пароль").

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

Переберите Архив.Элементы и сравните Элемент.Имя с нужным. Затем вызовите Архив.Извлечь(Элемент, Каталог). Так удобно, когда в архиве сотни файлов, а нужен один реестр. Размер до распаковки показывает свойство ИсходныйРазмер: по нему легко отсечь подозрительно большие файлы.

Загрузка ZIP-архивов по расписанию через командную строку

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

@echo off
set ARCH=D:\Obmen\in\data.zip
set EPF=D:\Obmen\load_zip.epf
set V8="C:\Program Files\1cv8\common\1cestart.exe"

if not exist "%ARCH%" exit /b 0

%V8% ENTERPRISE /S "srv1c\buh" /N "Obmen" /P "%OBMEN_PWD%" ^
  /Execute "%EPF%" /C "%ARCH%" /DisableStartupMessages /Out "D:\Obmen\log.txt"

move /Y "%ARCH%" "D:\Obmen\done\"

Ключи, которые здесь используются:

КлючНазначение
ENTERPRISEзапуск в режиме 1С:Предприятие
/S или /Fсерверная база (сервер\база) или файловая (путь к каталогу)
/N, /Pимя и пароль пользователя
/Executeоткрыть внешнюю обработку сразу после старта
/Cстрока параметра, в обработке она доступна через ПараметрЗапуска
/DisableStartupMessagesподавить стартовые сообщения
/Outфайл для служебных сообщений

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

Для такой учётной записи заведите отдельного пользователя с минимальными правами. У него в Конфигураторе снимите флажок «Защита от опасных действий». Иначе предупреждение о внешнем файле остановит запуск, и окно будет висеть, пока его никто не закроет.

Пароль не храните в bat-файле открытым текстом. В примере он берётся из переменной окружения OBMEN_PWD. Ещё вариант — аутентификация операционной системы для служебного пользователя.

Если архив нужно просто распаковать до запуска 1С, это делает PowerShell без сторонних программ:

powershell -NoProfile -Command "Expand-Archive -Path 'D:\Obmen\in\data.zip' -DestinationPath 'D:\Obmen\work' -Force"

Выгрузка базы и обновления в ZIP

Сюда же относятся архивы с .dt и обновлениями конфигурации. 1С их из ZIP не читает:

  • 📁 .dt распакуйте, затем в Конфигураторе выберите Администрирование → Загрузить информационную базу. Загрузка заменит все данные базы, поэтому сначала выгрузите текущую;
  • 🔄 дистрибутив обновления с сайта поддержки распакуйте и запустите setup.exe: он положит .cfu в каталог шаблонов. После этого в Конфигураторе откройте Конфигурация → Поддержка → Обновить конфигурацию и выберите файл обновления.

Переименовать .zip в .dt нельзя: это разные форматы, и Конфигуратор сообщит об ошибке формата файла.

Почему 1С не загружает ZIP и как это исправить

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

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

Можно ли загрузить ZIP в 1С без распаковки?
Да, в двух случаях: пакет синхронизации данных и файл универсального обмена XML. Остальное содержимое архива загружают после распаковки.
Нужен ли установленный архиватор на сервере 1С?
Нет. Объекты ЧтениеZipФайла и ЗаписьZipФайла встроены в платформу 8.3 и работают без 7-Zip и WinRAR.
Работает ли распаковка в веб-клиенте?
Выполняйте её на сервере. Файл передают с компьютера пользователя во временное хранилище, а архив разбирают в серверной процедуре. Такой код одинаково работает в тонком и веб-клиенте.
Поддерживает ли 1С архивы с шифрованием AES?
Да. При создании архива метод шифрования выбирают параметром ЗаписьZipФайла, среди вариантов есть AES с ключом 128, 192 и 256 бит. При чтении достаточно передать пароль.
Как собрать ZIP из 1С для отправки?
Создайте ЗаписьZipФайла с именем будущего архива, добавьте файлы методом Добавить и вызовите Записать. Готовый файл можно приложить к письму или выгрузить пользователю.