При обновлении конфигурации «Бухгалтерия государственного учреждения 2.0» (БГУ) пользователи и системные администраторы часто сталкиваются с критической ошибкой: «Неправильное имя кодировки cp-1251». Данная проблема обычно проявляется в момент запуска системы после применения обновления или непосредственно в процессе выполнения обработчиков обновления. Ошибка блокирует дальнейшую работу, и программа аварийно завершается.
В этой статье мы подробно разберем, почему возникает эта ситуация, проанализируем программный код, вызывающий сбой, и рассмотрим пошаговые инструкции по устранению проблемы, опираясь на технические особенности платформы 1С:Предприятие 8.3.
Для начала выясним причину. Исходя из технологического журнала и сообщений об ошибках, сбой происходит в общем модуле ИнформацияПриЗапуске. Платформа пытается прочитать текстовый файл или макет, используя стандартные механизмы работы с текстом. Ошибка локализована в следующей функции:
Функция ИзвлечьФайлыПакета(НосительМакетов, ИмяМакета) Экспорт
// ... логика подготовки файлов ...
ЧтениеТекста = Новый ЧтениеТекста(Файл.ПолноеИмя);
КонецФункции
Проблема заключается в том, что конструктор Новый ЧтениеТекста в некоторых сборках платформы 8.3.15 (например, 8.3.15.1830) некорректно взаимодействует с системными библиотеками ICU (International Components for Unicode), которые отвечают за поддержку кодировок в 1С. Если операционная система передает информацию о кодировке в формате, который библиотека считает недопустимым, или если в системе сбиты региональные стандарты, возникает исключение «Неправильное имя кодировки».
Ситуация осложняется тем, что в старых версиях БСП (Библиотеки стандартных подсистем), на которых базируется БГУ 2.0, кодировка cp-1251 могла быть прописана жестко. Современные стандарты и обновленные библиотеки ICU требуют использования более формализованного наименования — windows-1251. Если платформа не находит синонима для сокращения «cp», выполнение кода прерывается.
Рассмотрим самый эффективный способ, который помогает в большинстве случаев, особенно если база данных переносилась с одного компьютера на другой. Платформа 1С очень чувствительна к параметру «Язык программ, не поддерживающих Юникод».
Разберем по шагам, как это исправить в Windows 7 или Windows 10:
Проанализируем ситуацию: после этих действий операционная система корректно сообщает платформе 1С о том, что кодовая страница по умолчанию — 1251, и объект ЧтениеТекста начинает работать штатно без явного указания имени кодировки.
Посмотрим на ситуацию с точки зрения временных файлов. При переносе базы (копировании файла .1CD) на другой компьютер в локальном кэше пользователя могут сохраняться пути и настройки метаданных от старой среды окружения. Это может приводить к конфликту при обращении к макетам типа ИнформацияПриЗапуске.
Выполним очистку кэша по следующему алгоритму:
%AppData%\1C\1cv8 и %LocalAppData%\1C\1cv8).Это заставит платформу заново инициализировать список доступных кодировок и корректно считать макеты из конфигурации.
Выясним причину технического сбоя в самой платформе. Версия 8.3.15.1830 известна своими ошибками в работе с ICU на операционных системах Windows 7. Если вышеуказанные способы не помогают, необходимо обновить платформу до более стабильных веток.
Рекомендуется рассмотреть переход на актуальные версии 8.3.21 или выше. В новых релизах разработчики 1С значительно переработали механизмы работы с текстовыми данными и устранили зависимость от устаревших имен кодовых страниц. При обновлении платформы важно:
Если вы имеете доступ к конфигуратору и база находится на поддержке с возможностью изменения, мы можем проанализировать участок кода, вызывающий ошибку. Посмотрим на пример вызова функции ЧтениеТекста. Если в коде конфигурации (в модуле ИнформацияПриЗапуске) явно указана строка "cp-1251", её следует заменить на автоматическое определение кодировки или на стандарт "windows-1251".
Рассмотрим пример исправления:
// Было:
ЧтениеТекста = Новый ЧтениеТекста(Файл.ПолноеИмя, "cp-1251");
// Стало (вариант 1 - автоопределение):
ЧтениеТекста = Новый ЧтениеТекста(Файл.ПолноеИмя);
// Стало (вариант 2 - более корректное имя):
ЧтениеТекста = Новый ЧтениеТекста(Файл.ПолноеИмя, "windows-1251");
Согласно справке (СП): «Если параметр не задан, формат текста будет определен автоматически по сигнатуре BOM в начале файла; если сигнатура BOM отсутствует, файл будет открыт в кодировке ANSI». В русском сегменте Windows ANSI — это и есть 1251. Убирая жесткое указание "cp-1251", мы позволяем платформе использовать системные механизмы, которые работают надежнее.
Мы проанализировали проблему «Неправильное имя кодировки cp-1251» и выяснили, что она носит комплексный характер. В большинстве случаев достаточно исправить региональные настройки ОС и очистить кэш. Однако в долгосрочной перспективе наиболее правильным решением будет отказ от использования проблемных сборок платформы 8.3.15 в пользу более современных релизов.