При настройке автоматической сборки, версионирования (Git) или простого резервного копирования внешних обработок и отчетов мы часто используем пакетный режим работы конфигуратора. Стандартная команда /DumpExternalDataProcessorOrReportToFiles позволяет выгрузить содержимое обработки в формат XML.
Однако, при реализации этого процесса через командные файлы (BAT/CMD), создаваемые программно из 1С, мы можем столкнуться с неприятной ситуацией: файлы создаются, но их имена превращаются в нечитаемые символы (например, ⒈幐Ȁ), или командная строка вовсе отказывается воспринимать пути на кириллице. Разберем подробно, почему это происходит и как гарантированно решить эту проблему.
Корень зла кроется в различиях кодировок, используемых разными компонентами системы при взаимодействии:
1cv8.exe, если кодировка самого BAT-файла не совпадает с тем, что ожидает интерпретатор командной строки, кириллические символы превращаются в "кракозябры".Если мы программно создаем BAT-файл в кодировке UTF-8 или Windows-1251 и скармливаем его CMD, командный процессор неправильно интерпретирует байты, отвечающие за русские буквы в путях к файлам. Разберем три способа решения этой задачи: от "правильного" создания BAT-файла до полного отказа от него.
Самый надежный способ избежать проблем с кодировкой в BAT-файле — не создавать BAT-файл вовсе. Платформа 1С позволяет запускать внешние приложения с параметрами напрямую. В этом случае параметры передаются через системные вызовы Windows, минуя текстовые преобразования командной строки CMD.
Вместо генерации текста скрипта и его запуска, мы можем сформировать строку команды и выполнить её через метод ЗапуститьПриложение.
Посмотрим, как это реализовать в коде 1С:
Процедура ВыгрузитьОбработкуНапрямую(ПутьКФайлуОбработки, ПутьККаталогуВыгрузки)
// Путь к исполняемому файлу 1С. Лучше получать его динамически или через константы
ПутьК1С = "C:\Program Files\1cv8\8.3.25.1286\bin\1cv8.exe";
// Формируем параметры запуска.
// Важно: все пути, содержащие пробелы, должны быть обернуты в кавычки ("").
// Для экранирования кавычек в 1С используем двойные кавычки (""Текст"").
ПараметрыЗапуска = "DESIGNER /IBName ""UPP_COPY"" /DumpExternalDataProcessorOrReportToFiles """ +
ПутьКФайлуОбработки + """ """ + ПутьККаталогуВыгрузки + """ /Out """ +
ПутьККаталогуВыгрузки + "\log.txt""";
КомандаЗапуска = """"+ ПутьК1С + """ " + ПараметрыЗапуска;
// Запускаем приложение и ждем завершения (Истина в третьем параметре)
Попытка
ЗапуститьПриложение(КомандаЗапуска, , Истина);
Сообщить("Выгрузка завершена.");
Исключение
Сообщить("Ошибка при запуске: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Преимущества метода:
Если по каким-то причинам (например, для логирования, отладки или сложной цепочки действий) вам необходимо создать именно .bat файл, нужно обязательно учитывать кодировку при его записи.
Командная строка Windows корректно выполнит кириллические команды, если файл сохранен в кодировке CP866 (IBM866). Стандартная кодировка Windows (1251) или UTF-8 часто приводят к ошибкам.
Рассмотрим пример правильной генерации файла. Обратите внимание на использование объекта ЗаписьТекста с явным указанием кодировки.
Процедура ГенерацияКомандногоФайла(Путь, ИмяФайлаОбработки)
ИмяКомандногоФайла = Путь + "\run_export.bat";
ФайлЛога = Путь + "\out.txt";
// Формируем текст батника
// Используем СтрШаблон для читаемости кода вместо множества плюсов
ШаблонКоманды = "@echo off
|SET PATH1C=""C:\Program Files\1cv8\8.3.25.1286\bin\1cv8.exe""
|SET EXT=""%1""
|SET SRC=""%2""
|SET OUT=""%3""
|%%PATH1C%% DESIGNER /IBName ""UPP_COPY"" /DumpExternalDataProcessorOrReportToFiles %%EXT%% %%SRC%% /Out %%OUT%%";
ТекстБатника = СтрШаблон(ШаблонКоманды,
Путь + "\" + ИмяФайлаОбработки,
Путь,
ФайлЛога);
Попытка
// Ключевой момент: кодировка "cp866" (или "IBM866")
ЗаписьФайла = Новый ЗаписьТекста(ИмяКомандногоФайла, "cp866");
ЗаписьФайла.Записать(ТекстБатника);
ЗаписьФайла.Закрыть();
// Запускаем созданный файл
ЗапуститьПриложение(ИмяКомандногоФайла, , Истина);
Исключение
Сообщить("Ошибка при создании или запуске BAT файла: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Важные нюансы:
"cp866" в конструкторе ЗаписьТекста. Это "родная" кодировка для CMD.КодировкаТекста.UTF8), то первой строкой в BAT-файле обязательно должна идти команда chcp 65001, которая переключает консоль в режим Unicode. Однако, даже с этим старые версии платформы или специфические сборки Windows могут вести себя непредсказуемо. Вариант с cp866 надежнее для кириллицы.Иногда проблема кроется не в коде 1С, а в настройках операционной системы. В Windows 10 и 11 появилась опция "Бета-версия: Использовать Юникод (UTF-8) для поддержки языка во всем мире". Если эта опция включена, она меняет поведение системных функций (API), переводя их на UTF-8. Это часто ломает работу старых приложений и скриптов, ожидающих однобайтовую кодировку (ANSI/OEM). Как проверить:
Если эта галочка установлена, 1С при пакетном запуске может некорректно интерпретировать пути, даже если вы всё сделали правильно в коде. Рекомендуется отключать эту опцию на серверах, где работают скрипты автоматизации 1С.
Чтобы свести вероятность ошибок к нулю, следуйте этим простым правилам при именовании:
1. Латиница для имен баз
В параметре /IBName указывается имя информационной базы из списка запуска. Если имя базы в списке на русском (например, "УПП_КОПИЯ"), это может стать источником проблем.
Решение: Переименуйте базу в списке запуска или создайте для неё алиас на латинице, например UPP_COPY.
2. Избегайте пробелов в путях
Хотя использование кавычек решает проблему пробелов (например, "C:\Program Files\..."), некоторые внутренние механизмы командных процессоров могут сбоить. Если есть возможность, используйте пути без пробелов, например C:\1C_Work\Export.
3. Абсолютные пути
Всегда используйте полные (абсолютные) пути к файлам и каталогам. Относительные пути зависят от текущей рабочей директории процесса, которая может отличаться от той, где лежит ваш скрипт.
Проблема с кодировкой ⒈幐Ȁ возникает из-за несоответствия кодировки BAT-файла и ожиданий командного интерпретатора.
Лучшее решение: Использовать метод ЗапуститьПриложение напрямую с параметрами, минуя создание BAT-файла.
Альтернативное решение: При создании BAT-файла использовать объект ЗаписьТекста с кодировкой cp866.