Почему появляются иероглифы при загрузке или выгрузке текстовых документов в 1С через веб-сервер и как это исправить

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

Работа с текстовыми файлами в системе 1С:Предприятие часто кажется тривиальной задачей, пока мы не сталкиваемся с распределенными средами. Одной из наиболее запутанных проблем является появление «кракозябр», иероглифов или знаков вопроса вместо русского текста при использовании тонкого клиента через веб-сервер (IIS или Apache). При этом в файловом варианте или при запуске через толстый клиент всё может работать идеально.

В данной статье мы подробно разберем, почему возникает эта ситуация, проанализируем механизмы работы кодировок в серверной среде и рассмотрим несколько эффективных способов решения проблемы.

Выясняем причину: почему веб-сервер меняет кодировку

Прежде всего, давайте разберем ситуацию. Когда программный код выполняется «НаСервере» в контексте веб-сервера, он работает от имени системной учетной записи (например, IUSR или IIS AppPool\DefaultAppPool). В отличие от обычного пользователя, у системной учетной записи могут быть свои настройки региональных стандартов (System Locale).

Если для системы языком программ, не поддерживающих Юникод, установлен английский (US), то стандартная константа КодировкаТекста.ANSI будет интерпретироваться как кодовая страница Windows-1252. Для русского языка нам необходима страница Windows-1251. В результате такого несовпадения кириллические символы превращаются в набор нечитаемых знаков или вопросительных меток.

Способ 1. Настройка системной локали на стороне сервера

Рассмотрим первый и самый фундаментальный способ — приведение региональных настроек сервера к единому стандарту. Это поможет, если вы не хотите менять программный код во множестве обработок.

  1. Откроем панель управления на сервере, где развернут IIS (например, Windows Server 2012).
  2. Перейдем в раздел Region (Региональные стандарты).
  3. На вкладке Administrative (Дополнительно) найдем раздел Language for non-Unicode programs. Убедимся, что там выбран Russian (Russia).
  4. Нажмем кнопку Copy settings (Копировать параметры).
  5. В открывшемся окне установим галочки Welcome screen and system accounts (Экран приветствия и системные учетные записи). Это критически важно, так как именно под системными записями работает веб-сервер.
  6. После применения настроек потребуется перезагрузка сервера.

Проанализируем ситуацию: теперь при обращении к методам ЧтениеТекста или ЗаписьТекста с параметром ANSI, система будет использовать корректную русскую кодовую страницу даже в контексте IIS.

Способ 2. Явное указание кодировки в программном коде

Положиться на системные настройки — это хороший шаг, но для надежной разработки мы рекомендуем всегда явно указывать кодировку в коде 1С. Использование КодировкаТекста.ANSI делает ваш код зависимым от окружения. Давайте посмотрим на пример, как сделать код более стабильным.

Вместо использования системных констант, укажем строку кодировки явно:


// Ненадежный способ, зависящий от настроек сервера
ТекстЧтения = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.ANSI);

// Надежный способ с явным указанием кодовой страницы
ТекстЧтения = Новый ЧтениеТекста(ПутьКФайлу, "windows-1251");

Аналогично поступим при записи файла. Разберем пример создания текстового документа:


// Принудительно задаем кодировку при создании файла
ТекстЗаписи = Новый ЗаписьТекста(ПутьКФайлу, "windows-1251");
ТекстЗаписи.ЗаписатьСтроку("Пример русского текста");
ТекстЗаписи.Закрыть();

Важный момент: использование строки "windows-1251" гарантирует, что 1С проигнорирует региональные настройки сервера и применит нужную таблицу символов.

Способ 3. Переход на UTF-8 или UTF-16 с меткой BOM

Как отметил автор исходной темы, переход на UTF-16 часто решает проблему мгновенно. Почему это происходит? В кодировках Юникод (особенно в UTF-16) практически всегда используется BOM (Byte Order Mark) — специальная метка в начале файла, которая сообщает любой программе (включая 1С на сервере), в каком формате представлены данные.

Рассмотрим, как правильно работать с UTF-8, чтобы избежать проблем при чтении на разных серверах:


// Запись в формате UTF-8 с BOM
Запись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку("Данные в Юникоде");
Запись.Закрыть();

Если вы читаете файл, созданный сторонней системой, которая не добавила BOM, 1С на веб-сервере может снова «споткнуться». В этом случае используйте явное указание кодировки "UTF-8" при чтении, даже если файл кажется стандартным.

Способ 4. Работа через двоичные данные (универсальный метод)

Проанализируем самый продвинутый способ, который полностью исключает влияние настроек веб-сервера и операционной системы. Этот метод заключается в чтении файла как набора байтов с последующим преобразованием в строку.

Разберем по шагам, как это реализовать:

  1. Прочитаем файл в объект ДвоичныеДанные.
  2. Используем объект ЧтениеДанных для преобразования байтов в текст с точным указанием кодировки.

Посмотрим на пример кода:


// Читаем файл как бинарный объект
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);

// Создаем поток для чтения
Поток = Новый ПотокВПамяти(ДвоичныеДанныеФайла);
Чтение = Новый ЧтениеДанных(Поток, "windows-1251");

// Получаем весь текст целиком
РезультатТекст = Чтение.ПрочитатьТекст();

Чтение.Закрыть();
Поток.Закрыть();

Этот подход считается наиболее профессиональным, так как объекты ЧтениеДанных и ЗаписьДанных предоставляют более гибкий контроль над потоками информации, чем старые объекты ЧтениеТекста.

Способ 5. Настройка глобализации в IIS

Иногда корень проблемы лежит в настройках самого веб-сервера IIS, который может принудительно изменять кодировку ответов или запросов. Выясним, где это можно проверить:

  1. Запустите Internet Information Services (IIS) Manager.
  2. Выберите ваш сайт или виртуальное приложение 1С в дереве слева.
  3. В центральной части окна (раздел ASP.NET или IIS) найдите иконку .NET Globalization.
  4. Убедитесь, что параметры Request Encoding и Response Encoding установлены в значение UTF-8 или Inherit. Если там принудительно стоит западноевропейская кодировка, её нужно изменить.

Рекомендация по архитектуре решения

Если ваша база 1С доступна через веб-клиент или тонкий клиент через HTTP, старайтесь выполнять чтение файлов на стороне клиента, если это технически возможно. Прочитав текст на клиентском компьютере (где настройки локали гарантированно верны для пользователя), вы можете передать уже готовую Строку на сервер для дальнейшей обработки. Это избавит вас от необходимости настраивать каждый сервер, на котором может быть развернута база.

Подводя итог, мы выяснили, что основная причина иероглифов — это неявное использование системной локали сервера. Используя явное указание кодировки "windows-1251" или переходя на современные методы работы с двоичными данными, вы обеспечите стабильную работу вашей конфигурации в любых условиях эксплуатации.

← На главную