Почему при распаковке ZIP-архивов в 1С 8.2 появляются «кракозябры» в именах файлов?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Рассмотрим распространенную техническую проблему, с которой сталкиваются разработчики при обмене данными между разными версиями платформы 1С:Предприятие. Ситуация, когда файлы, упакованные в 1С 8.3, при распаковке в 1С 8.2 отображаются с нечитаемыми именами (например, «Р’ыгрузка»), связана с различиями в обработке кодировок метаданных ZIP-архивов.

Разберем детально, почему это происходит и как исправить ситуацию, не меняя архитектуру обмена данными.

Причина возникновения проблемы

Причина кроется в стандарте ZIP и эволюции платформы 1С. В старых версиях (включая 1С 8.2) для записи имен файлов в ZIP-архив использовалась кодировка системной локали (обычно Windows-1251). Начиная с версии 1С 8.3, платформа по умолчанию использует кодировку UTF-8, что является современным стандартом. При попытке распаковать такой архив в 1С 8.2, система интерпретирует байты UTF-8 как Windows-1251, из-за чего мы и наблюдаем «кракозябры».

Решение 1: Использование внешнего архиватора WinRAR

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

Разберем пример реализации через КомандаСистемы:


КомандаСистемы("""C:\Program files\WinRar\winrar.exe"" a -afzip -ep1 " + ИмяАрхива + " " + ИмяФайла);

Разберем параметры команды подробнее:

  1. -afzip — этот параметр принудительно указывает архиватору создавать именно ZIP-архив. Если его опустить, WinRAR может создать архив собственного формата, который встроенные средства Новый ЧтениеZipФайла не смогут распознать.
  2. -ep1 — данный параметр исключает полные пути к файлам из архива, сохраняя в нем только имена файлов. Это важно для корректной работы автоматизированных систем обмена.

Важное замечание: Мы используем WinRar.exe, а не rar.exe, так как именно консольный интерфейс WinRAR поддерживает создание ZIP-архивов с корректными заголовками.

Решение 2: Настройка кодировки штатными средствами 1С

Если вы хотите остаться в рамках встроенных методов 1С и имеете возможность внести изменения в код модуля, вы можете явно указать кодировку при записи архива. Объект ЗаписьZipФайла позволяет управлять этим процессом.

Для обеспечения максимальной совместимости при создании архива необходимо правильно задать параметр кодировки. Рассмотрим пример кода:


// Создание объекта записи архива
ЗаписьАрхива = Новый ЗаписьZipФайла(ИмяФайла, , , , , , КодировкаИменФайловВZipФайле.КодировкаОСДополнительноUTF8);

// Добавление файлов в архив
ЗаписьАрхива.Добавить(ИмяФайлаДляАрхивации);

// Закрытие записи
ЗаписьАрхива.Записать();

При использовании КодировкаИменФайловВZipФайле.КодировкаОСДополнительноUTF8 платформа принудительно указывает архиватору использовать UTF-8, что позволяет более гибко обрабатывать имена файлов на различных версиях платформы 1С.

Заключение и рекомендации

Проанализировав ситуацию, мы выяснили, что проблема несовместимости кодировок решается либо переходом на внешние инструменты архивации, либо явным указанием кодировки в коде 1С.

На будущее рекомендуем придерживаться следующих правил для автоматизированного обмена:

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

← На главную