При переходе на удаленную работу многие компании сталкиваются с техническими сложностями при использовании терминальных решений, таких как Citrix или стандартный RDP. Одной из наиболее раздражающих проблем является нарушение кодировки текстовых файлов при обмене данными с банками. Особенно часто это проявляется в конфигурациях на обычных формах, таких как Управление производственным предприятием (УПП) или старых редакциях Бухгалтерии предприятия.
В этой статье мы подробно разберем, почему возникает ситуация, когда в одной программе (например, БП 3.0) все работает корректно, а в другой (УПП) файл превращается в "кракозябры", и как это исправить на уровне системных настроек и кода.
Для начала проанализируем ситуацию. Если на одном и том же сервере одна программа выгружает файлы правильно, а другая — нет, проблема кроется в методах работы с текстовыми данными. Современные конфигурации на управляемых формах (БП 3.0, ERP) используют обновленные объекты платформы 1С:Предприятие 8.3. При записи текстового файла разработчики обычно явно указывают кодировку, например, КодировкаТекста.ANSI или UTF8. Это делает программу независимой от настроек операционной системы.
В старых конфигурациях (таких как УПП) механизмы выгрузки часто используют стандартные системные вызовы Windows или объекты, которые по умолчанию обращаются к системной кодовой странице. Если в коде 1С кодировка не задана жестко, система берет значение Default ANSI Code Page из настроек Windows. На новых, "чистых" серверах эта кодировка часто установлена в значение 1252 (западноевропейская) вместо 1251 (кириллица), что и приводит к порче текста.
Это самый эффективный и быстрый способ, который помог автору темы. Нам необходимо указать операционной системе, какую кодировку использовать для программ, которые не поддерживают Юникод (к которым система относит и старые методы работы с файлами в 1С).
Рассмотрим пошагово процесс настройки на Windows Server:
Citrix.Если через графический интерфейс проблему решить не удалось, проанализируем состояние реестра. Иногда настройки "слетают" или не применяются должным образом. Нам необходимо проверить соответствие кодовых страниц кириллице.
Запустим regedit и перейдем в ветку:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
Проверим следующие параметры:
ACP должен иметь значение 1251.OEMCP должен иметь значение 866.1251 должен ссылаться на файл c_1251.nls.1252 (западноевропейская кодировка) иногда советуют принудительно перенаправить на c_1251.nls, чтобы система подставляла кириллицу даже там, где запрашивается латиница.В среде Citrix настройки могут не применяться к пользователям, если используется динамическое управление профилями (например, Citrix Profile Management). Если системный администратор изменил настройки региона, но в сессии пользователя 1С все равно выдает ошибку, нужно проверить, скопированы ли региональные настройки в профиль Default User.
Также стоит обратить внимание на то, куда именно выгружается файл. Если выгрузка идет на перенаправленный диск пользователя (например, диск C: локального ПК, видимый в Citrix как C on ClientName), могут возникать задержки записи, которые в редких случаях влияют на целостность файла. Попробуйте выгрузить файл сначала в локальную папку на сервере (например, D:\Exchange\), чтобы исключить влияние сетевых протоколов Citrix ICA.
Если у вас есть доступ к конфигуратору и вы хотите навсегда избавить пользователей от зависимости от настроек сервера, мы можем модифицировать код обработки КлиентБанк. Это особенно актуально для УПП.
Найдем в конфигурации обработку выгрузки (обычно это КлиентБанк или ОбменСБанковскимиПрограммами). Найдем место, где создается объект записи текста. Вместо стандартного создания объекта, пропишем явное указание кодировки ANSI.
Пример кода для исправления выгрузки:
// Было (условно):
Текст = Новый ЗаписьТекста(ПутьКФайлу);
// Стало (явно указываем кодировку Windows-1251):
Текст = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.ANSI);
Для Каждого СтрокаДанных Из МассивСтрок Цикл
Текст.ЗаписатьСтроку(СтрокаДанных);
КонецЦикла;
Текст.Закрыть();
Для загрузки выписки (чтения файла) применим аналогичный подход:
// Явное чтение файла в кодировке ANSI
Текст = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.ANSI);
СтрокаФайла = Текст.ПрочитатьСтроку();
Пока СтрокаФайла <> Неопределено Цикл
// Обработка данных
СтрокаФайла = Текст.ПрочитатьСтроку();
КонецЦикла;
Текст.Закрыть();
Мы выяснили, что основная причина проблем с кодировкой в связке 1С + Citrix — это несоответствие системной кодовой страницы (Locale) требуемой кириллице (1251). Для исправления ситуации необходимо:
Citrix.КодировкаТекста.ANSI.Эти действия гарантируют корректный обмен данными с Клиент-Банком вне зависимости от того, в какой терминальной среде работают ваши пользователи.