Как в 1С выгрузить текстовый файл в кодировке DOS (CP866), чтобы избежать «кракозябр» в клиент-банке?

Программист 1С v8.3 (Управляемые формы) Финансы и профессиональные услуги
← На главную

При интеграции 1С с системами дистанционного банковского обслуживания (ДБО), особенно в Республике Беларусь (например, ВТБ, Беларусбанк, БПС-Сбербанк), разработчики часто сталкиваются с проблемой «кракозябр». Выгружаемый файл содержит нечитаемые символы вместо русских букв, хотя внутри 1С все отображается корректно. Рассмотрим подробно, почему это происходит и как правильно настроить экспорт данных.

Почему появляются «кракозябры» и при чем тут шрифт Terminal?

Проанализируем ситуацию: если открыть «испорченный» файл в обычном Блокноте и сменить шрифт на Terminal, текст становится читаемым. Это главный индикатор того, что файл записан в кодировке CP866 (известной также как OEM-866 или DOS-кодировка).

Исторически сложилось, что многие банковские протоколы обмена (например, знаменитый «Запрос 61» для зарплатных проектов) создавались десятилетия назад под операционную систему MS-DOS. Несмотря на то что современные клиент-банки работают под Windows, их внутренние алгоритмы импорта по-прежнему ожидают текст в старом формате. Если 1С сохраняет файл в стандарте ANSI (Windows-1251) или UTF-8, банк интерпретирует байты кириллицы неверно, и мы видим те самые «кракозябры».

Решение 1: Использование объекта ТекстовыйДокумент

Разберем наиболее распространенный способ записи текстовых файлов в 1С. Основная ошибка заключается в использовании КодировкаТекста.ANSI. Для банковских систем нам нужно явно указать кодировку CP866.

Рассмотрим пример кода, который решает проблему:


// Создаем объект для работы с текстом
л_Документ = Новый ТекстовыйДокумент;

// Добавляем строки данных (например, данные для Запроса 61)
л_Документ.ДобавитьСтроку("61;001;Иванов Иван Иванович;1000.50;BYN");

// Ключевой момент: указываем кодировку "cp866" при записи
л_ПутьКФайлу = "C:\BankExchange\export_file.txt";
л_Документ.Записать(л_ПутьКФайлу, "cp866");

Обратите внимание, что в методе Записать можно использовать как строковое обозначение "cp866", так и системное перечисление КодировкаТекста.OEM. Платформа 1С автоматически сопоставит OEM с нужной кодовой страницей в зависимости от региональных настроек вашей ОС (для русской и белорусской локали это будет CP866).

Решение 2: Использование объекта ЗаписьТекста

Проанализируем более современный и производительный способ записи файлов, который рекомендуется для больших объемов данных. Объект ЗаписьТекста позволяет задать кодировку сразу при инициализации файла.

Разберем этот метод по шагам:


л_ПутьКФайлу = "C:\BankExchange\salary_request.txt";

// Создаем объект записи, указывая кодировку "cp866" в конструкторе
// Параметры: Путь, Кодировка, РазделительСтрок, Дозаписать
л_Запись = Новый ЗаписьТекста(л_ПутьКФайлу, "cp866", Символы.ПС);

// Записываем данные построчно
л_Запись.ЗаписатьСтроку("Первая строка файла");
л_Запись.ЗаписатьСтроку("Вторая строка с русскими буквами");

// Обязательно закрываем файл для сохранения изменений
л_Запись.Закрыть();

Использование ЗаписьТекста предпочтительнее, так как этот объект работает напрямую с потоком данных и потребляет меньше оперативной памяти по сравнению с ТекстовыйДокумент.

Важные нюансы и дополнительные настройки

Выясним, какие еще факторы могут повлиять на успешную загрузку файла в банк-клиент:

  1. Разделители строк: Банковские системы старого образца крайне чувствительны к символам перевода строки. В DOS/Windows стандартом является связка CRLF (Возврат каретки + Перевод строки). При использовании ЗаписьТекста убедитесь, что вы используете правильный разделитель.
  2. Спецсимволы: Кодировка CP866 поддерживает только ограниченный набор символов. Если в 1С в фамилии сотрудника или назначении платежа встретятся символы типа «длинное тире», «кавычки-елочки» или специфические символы (например, символ евро €), при конвертации в CP866 они превратятся в знаки вопроса. Рекомендуется предварительно очищать текст от таких символов или заменять их на стандартные (например, заменять « на ").
  3. Белорусская латиница: Для белорусских банков важно учитывать наличие специфических букв. Буква «ў» в стандартной CP866 может отсутствовать или кодироваться нестандартно. В таких случаях программисты 1С часто используют функцию СтрЗаменить() для транслитерации или замены на похожие кириллические символы перед записью.

Как проверить результат?

Чтобы убедиться, что вы все сделали правильно, не дожидаясь ответа из банка, выполним простую проверку:

1. Откройте созданный файл в стандартном Notepad (Блокноте). Вы должны увидеть «кракозябры» (например, вместо «АБВ» будет «ЂЃ‚»).

2. В меню Блокнота выберите Формат -> Шрифт.

3. Найдите в списке шрифт Terminal.

4. Если после этого текст стал читаемым на русском языке — поздравляем, вы успешно сформировали файл в кодировке DOS CP866, и банк-клиент примет его без ошибок.

Таким образом, мы выяснили причину несовместимости и рассмотрели технические средства 1С для формирования корректных файлов обмена. Правильный выбор кодировки "cp866" или КодировкаТекста.OEM гарантирует, что ваши данные будут успешно обработаны банковскими системами.

← На главную