Рассмотрим распространенную техническую проблему, с которой сталкиваются разработчики при обмене данными между разными версиями платформы 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С 8.3, наиболее простым и надежным способом будет вынос процесса архивации во внешнюю утилиту. В этом случае мы используем возможности WinRAR, который корректно формирует ZIP-архивы, совместимые с различными версиями распаковщиков.
Разберем пример реализации через КомандаСистемы:
КомандаСистемы("""C:\Program files\WinRar\winrar.exe"" a -afzip -ep1 " + ИмяАрхива + " " + ИмяФайла);
Разберем параметры команды подробнее:
-afzip — этот параметр принудительно указывает архиватору создавать именно ZIP-архив. Если его опустить, WinRAR может создать архив собственного формата, который встроенные средства Новый ЧтениеZipФайла не смогут распознать.-ep1 — данный параметр исключает полные пути к файлам из архива, сохраняя в нем только имена файлов. Это важно для корректной работы автоматизированных систем обмена.Важное замечание: Мы используем WinRar.exe, а не rar.exe, так как именно консольный интерфейс WinRAR поддерживает создание ZIP-архивов с корректными заголовками.
Если вы хотите остаться в рамках встроенных методов 1С и имеете возможность внести изменения в код модуля, вы можете явно указать кодировку при записи архива. Объект ЗаписьZipФайла позволяет управлять этим процессом.
Для обеспечения максимальной совместимости при создании архива необходимо правильно задать параметр кодировки. Рассмотрим пример кода:
// Создание объекта записи архива
ЗаписьАрхива = Новый ЗаписьZipФайла(ИмяФайла, , , , , , КодировкаИменФайловВZipФайле.КодировкаОСДополнительноUTF8);
// Добавление файлов в архив
ЗаписьАрхива.Добавить(ИмяФайлаДляАрхивации);
// Закрытие записи
ЗаписьАрхива.Записать();
При использовании КодировкаИменФайловВZipФайле.КодировкаОСДополнительноUTF8 платформа принудительно указывает архиватору использовать UTF-8, что позволяет более гибко обрабатывать имена файлов на различных версиях платформы 1С.
Проанализировав ситуацию, мы выяснили, что проблема несовместимости кодировок решается либо переходом на внешние инструменты архивации, либо явным указанием кодировки в коде 1С.
На будущее рекомендуем придерживаться следующих правил для автоматизированного обмена:
ЗаписьZipФайла и ЧтениеZipФайла всегда проверяйте настройки кодировки, если обмен данными происходит между разнородными версиями 1С:Предприятие.Применение любого из предложенных вариантов позволит вам избежать ошибок при обмене данными и обеспечить стабильную работу вашей программы на всех узлах системы.