Кодировка в 1С 8.3: где она задаётся и как перейти на UTF-8

· 9 мин

Содержание

Платформа 1С 8.3 хранит и обрабатывает строки в Unicode, поэтому «кодировки базы» как единой настройки, которую можно переключить с Windows-1251 на UTF-8, нет. Кодировка появляется на границах: при чтении и записи текстовых файлов, в XML-обменах, в банковских выгрузках и в самой СУБД при клиент-серверном варианте.

Отсюда и практический вывод. Менять нужно не «кодировку 1С», а кодировку конкретного файла или обмена. Ниже разобрано, где она живёт, как её определить и как переключить там, где это реально возможно.

Что внутри: Unicode и где начинаются кодировки

Внутри платформы кодировки нет в том смысле, в каком её понимают, когда говорят про файл. Строка «Привет» в реквизите справочника, в переменной модуля и в запросе — это одна и та же последовательность символов Unicode. Кириллица, латиница, иероглифы и эмодзи хранятся без потерь.

Кодировка нужна только тогда, когда строку надо превратить в байты и обратно. Таких мест четыре:

  • 📄 Текстовые файлы. Чтение и запись через ТекстовыйДокумент, ЧтениеТекста, ЗаписьТекста.
  • 🔄 Обмен данными. XML-файлы правил обмена, сообщения обмена, выгрузки для сайтов и внешних систем.
  • 🏦 Банк-клиент и контролирующие органы. Форматы с жёстко заданной кодировкой.
  • 🗄 СУБД. Кодировка и сортировка базы при клиент-серверной работе.

Файловая база (файл 1Cv8.1CD) собственной «кодировки» для пользователя не показывает и менять её не нужно.

Три кодировки, с которыми вы столкнётесь

Различие между ними видно по тому, как выглядит ошибка. Если файл в UTF-8 открыть как Windows-1251, получится «РџСЂРёРІРµС‚» вместо «Привет». Обратная ошибка даёт ромбики с вопросом или «пустые» символы.

КодировкаБайт на русскую буквуГде встречаетсяОсобенность
Windows-1251 (в 1С — ANSI на русской Windows)1Банковские выгрузки, старые обмены, CSV для ExcelНе содержит символов других языков
UTF-82Современные обмены, веб-сервисы, JSON, XMLМожет начинаться с метки BOM
OEM (кодовая страница 866)1Результат консольных команд, старые DOS-файлыВстречается в выводе командной строки

Для 1С константа КодировкаТекста.ANSI означает не «Windows-1251» вообще, а текущую системную кодовую страницу машины. На русской Windows это 1251. На сервере с другой региональной настройкой результат будет другим, и это частая причина «на моём компьютере работает, на сервере нет».

Как определить кодировку файла

Платформа сама кодировку файла не угадывает, поэтому определять её приходится по признакам.

Быстрая проверка по виду текста

Откройте файл в любом текстовом редакторе, который позволяет переключать кодировку (Notepad++, VS Code). Переключайте варианты, пока кириллица не станет читаемой. Какая кодировка дала нормальный текст — в такой файл и записан.

По началу файла

У XML-файлов кодировка указана в первой строке, например <?xml version="1.0" encoding="UTF-8"?>. Это заявление автора файла, и оно может не совпадать с реальностью, если файл сохраняли вручную. У файлов банк-клиента в формате 1CClientBankExchange кодировка обычно Windows-1251, и именно её ждёт принимающая сторона.

UTF-8 с BOM начинается с трёх байт EF BB BF. Редакторы их не показывают, но они мешают программам, которые ждут чистое начало файла.

Через платформу

Если нужно проверить прямо в 1С, прочитайте файл с разными кодировками и посмотрите на результат:

Путь = "C:\Обмен\данные.txt";

Для Каждого Вариант Из Новый Структура("UTF8, ANSI", КодировкаТекста.UTF8, КодировкаТекста.ANSI) Цикл
	Чтение = Новый ЧтениеТекста(Путь, Вариант.Значение);
	Строка = Чтение.ПрочитатьСтроку();
	Чтение.Закрыть();
	Сообщить(Вариант.Ключ + ": " + Строка);
КонецЦикла;

В сообщениях одна из строк будет читаемой — это и есть кодировка файла. Если обе строки с «кракозябрами», файл, скорее всего, в UTF-16 или в другой кодовой странице.

Почему многие файлы до сих пор в Windows-1251

Причины скорее исторические, чем технические. Русскоязычная экосистема выросла в эпоху, когда Windows-1251 была стандартом для русского текста: один байт на букву, файлы компактные, Excel открывал CSV без вопросов.

Дальше сработала инерция:

  • банки и контролирующие органы закрепили формат с Windows-1251 в спецификациях и не торопятся его менять;
  • десятки обработок и внешних систем написаны под эту кодировку, и переписывать их ради красоты никто не хочет;
  • Excel при двойном щелчке по CSV ждёт именно её (или UTF-8 с BOM), поэтому выгрузки «для бухгалтера» делают в 1251.

Платформа тут ни при чём. Она умеет и то и другое, а выбор делает тот, кто пишет код выгрузки или настраивает обмен.

Мини-кейс: выгрузка контрагентов для сайта

Типичная задача: выгрузить список контрагентов в CSV и отдать веб-разработчику. Бухгалтер открывает файл в Excel, видит нормальный текст и отправляет. Разработчик загружает его на сервер и получает «РћРћРћ Ромашка».

Причина простая: файл записан в Windows-1251, а сайт читает его как UTF-8. Выход один из двух. Либо выгружать сразу в UTF-8 и договориться, что BOM допустим, либо заранее прочитать его на стороне сайта как 1251. Спорить, какая кодировка «правильнее», бессмысленно: важно, чтобы обе стороны записали это решение в одном месте и проверяли на файле с буквой «ё» и знаком «№».

Хорошая привычка: в имени или заголовке выгрузки указывать кодировку, например kontragenty_utf8.csv. Через полгода никто не вспомнит, в чём писали файл, а имя подскажет.

Когда переход на UTF-8 оправдан, а когда нет

Менять кодировку без причины не стоит. Работающий обмен с банком не станет лучше от смены кодировки — он просто перестанет работать.

Переходите на UTF-8, если:

  1. В обмене участвуют символы вне русского и латинского алфавитов: имена контрагентов на других языках, символы №, «ёлочки» и тире из нестандартных источников, которые в 1251 превращаются в ?.
  2. Другая сторона (сайт, веб-сервис, мобильное приложение) работает с JSON или XML в UTF-8.
  3. Вы пишете новую выгрузку и не связаны старым форматом.

Оставайтесь на Windows-1251, если:

  • формат описан в документации получателя с этой кодировкой (банк, торговая площадка, отчётность);
  • файл открывают в старых программах без поддержки UTF-8;
  • обмен давно работает и никаких потерь символов не фиксировали.

Если получатель ждёт 1251, а вы отправите UTF-8, сломается не файл, а разбор на их стороне. Чаще всего это выглядит как отказ с невнятной ошибкой формата, а не как «неправильные буквы».

Что у вас не так с кодировкой?

Как записать и прочитать файл в нужной кодировке

Меняется кодировка в коде выгрузки или в настройках обмена, а не «в базе». Когда вы пишете файл через платформу, кодировку задаёте явно.

Запись

Запись = Новый ЗаписьТекста("C:\Обмен\выгрузка.csv", КодировкаТекста.ANSI);
Запись.ЗаписатьСтроку("Номер;Контрагент;Сумма");
Запись.ЗаписатьСтроку("1;ООО Ромашка;15000,50");
Запись.Закрыть();

Замените КодировкаТекста.ANSI на КодировкаТекста.UTF8, и тот же код запишет файл в UTF-8. При записи в UTF-8 платформа по умолчанию ставит в начало метку BOM. Большинству современных систем она не мешает, но строгие парсеры и скрипты иногда принимают её за лишний символ в начале первой строки.

Чтение

Чтение = Новый ЧтениеТекста("C:\Обмен\загрузка.csv", КодировкаТекста.UTF8);
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
	Сообщить(Строка);
	Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();

Если кодировка файла неизвестна, а читать нужно, лучше сначала определить её вручную (см. выше), а не подбирать наугад в коде.

Через текстовый документ

Тот же результат даёт объект ТекстовыйДокумент: у методов Прочитать и Записать вторым параметром передаётся кодировка. Для небольших файлов это самый короткий вариант.

Для выгрузки в Excel, который будет открываться двойным щелчком, надёжнее всего Windows-1251 или UTF-8 с BOM. UTF-8 без BOM Excel часто показывает «кракозябрами».

Кодировка в обменах между базами и с внешними системами

Обмен между конфигурациями 1С через стандартные правила (например, формат EnterpriseData) платформа делает в XML сама, и кодировку этого XML вам вручную менять не нужно. Проблемы появляются, когда обмен идёт не между базами 1С.

Что проверить при обмене с внешней системой:

  • 📥 Кодировка входящего файла указана в документации источника, а не угадывается по виду.
  • 📤 Кодировка исходящего файла совпадает с ожиданиями получателя, включая наличие BOM.
  • 🔤 Разделители и десятичные знаки: запятая или точка в суммах ломают разбор так же, как и неверная кодировка.
  • 🧪 Тестовый файл с «трудными» символами: буква «ё», знаки «№», ««»», тире, латиница в названиях.

Для сопоставления полей при настройке обмена удобно сразу записать, в какую кодировку превращается каждая сторона:

Сопоставление полей
Кодировка источника (внешний файл)→Параметр чтения в 1С
Кодировка 1С при выгрузке→Параметр записи файла получателю
Заголовок XML encoding→Должен совпадать с реальной кодировкой байтов

Кодировка и сортировка в СУБД

В клиент-серверной базе кодировка и порядок сортировки определяются самой СУБД. В PostgreSQL это кодировка кластера или базы данных, и для работы с 1С используют UTF-8. В Microsoft SQL Server кодировка строк зависит от параметров сортировки базы, и для 1С подходит нечувствительная к регистру сортировка с поддержкой кириллицы. Точное имя и требования зависят от версии СУБД и платформы, поэтому смотрите рекомендации к вашей версии платформы.

Кодировку и сортировку базы в СУБД задают при её создании. Изменить их «на месте» нельзя: придётся выгрузить информационную базу в файл .dt и загрузить в новую, созданную с правильными параметрами. Перед этим сделайте резервную копию, а работу ведите в нерабочее время: пользователи не должны работать в базе.

Порядок действий при переезде:

  1. Все пользователи выходят из базы, регламентные задания остановлены.
  2. В конфигураторе выгружается информационная база в файл .dt.
  3. На сервере СУБД создаётся новая база с нужной кодировкой или сортировкой.
  4. В новую информационную базу загружается .dt.
  5. Проверяется работа: пара документов, отчёт, поиск по строке с кириллицей.

Для файловой базы этот шаг не нужен: она хранится в собственном формате платформы.

Типичные проблемы и быстрые решения

Диагностика: выберите симптом

Частые вопросы

Можно ли изменить кодировку самой базы 1С?
Для файловой базы такого параметра нет, строки хранятся в Unicode. В клиент-серверной базе кодировка задаётся в СУБД при создании, и менять её приходится переносом через файл .dt.
Что значит КодировкаТекста.ANSI в 1С?
Системная кодовая страница машины, на которой выполняется код. На русской Windows это Windows-1251.
Почему в 1С при открытии текстового файла видны кракозябры?
Файл читается не в той кодировке. Укажите нужную явно: UTF8 или ANSI.
Нужен ли BOM в UTF-8 для 1С?
Сама платформа читает UTF-8 и с BOM, и без него. Метка важна только для внешних программ, например Excel.
Чем отличается UTF-8 от Windows-1251 для обмена данными?
UTF-8 передаёт любые символы, Windows-1251 только кириллицу и латиницу. Выбор определяет то, что ждёт получатель файла.