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

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

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

Рассмотрим подробнее причины возникновения этого сбоя и разберем по шагам действенные методы его устранения.

Основные причины искажения символов в запросах

Выясним причину, почему обычный текст на кириллице в строковых буферах превращается в иероглифы Unicode. Ключевая особенность ошибки заключается в том, что она проявляется исключительно в RDP-сессиях. Это указывает на комплексную проблему взаимодействия платформы 1С с операционной системой и терминальной средой:

  1. Некорректная локализация и настройки MUI терминального сервера: Если на сервере Windows Server некорректно настроен языковой пакет (MUI), либо перепутаны системные кодовые страницы (ANSI/1251 и 1250), символы UTF-16 могут неверно интерпретироваться при передаче данных между процессами RDP-сеанса.
  2. Повреждение кэша метаданных пользователя: В терминальном профиле пользователя файлы кэша 1С под воздействием частых переподключений могут повреждаться. В результате динамически формируемые строки считываются из кэша с некорректным смещением байтов.
  3. Фрагментация памяти 32-разрядного клиента: При активной конкатенации (склейке) длинных строк в клиенте 1С в режиме 32-бит происходят постоянные перенарезки памяти. Указатель на строку запроса начинает ссылаться на случайный участок памяти, байты которого платформа считывает как двухбайтовые символы Unicode (иероглифы).

Способ 1. Проверка и коррекция локали и MUI на терминальном сервере

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

  1. Откройте на терминальном сервере Панель управления — Региональные стандарты.
  2. На вкладке Дополнительно проверьте параметр Язык программ, не поддерживающих Unicode. Там должен быть установлен Русский (Россия).
  3. Убедитесь, что в реестре Windows в ветке HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage значение параметра 1252 заменено на c_1251.nls (если на сервере ранее некорректно исправлялась кодировка).
  4. Если на сервере используется MUI, убедитесь, что у всех терминальных пользователей принудительно задан одинаковый язык интерфейса ОС.

Способ 2. Очистка кэша сеанса 1С в терминале

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

Очистить кэш можно вручную, удалив содержимое каталогов с GUID-именами из следующих папок профиля Windows:

%userprofile%\AppData\Local\1C\1Cv8
%userprofile%\AppData\Roaming\1C\1Cv8

Также полезно пересоздать сам профиль Windows терминального пользователя (NTUSER), если проблема воспроизводится у строго определенных учетных записей.

Способ 3. Оптимизация исходного кода 1С

Если проблема возникает в динамически формируемых запросах, перепишем алгоритм так, чтобы сборка текста не нагружала память 32-разрядного клиента и не приводила к искажению строк.

1. Выполнение сборки и запроса на стороне сервера:
Перенесите формирующий запрос код в контекст &НаСервере. На стороне сервера (особенно 64-разрядного) адресация памяти работает стабильно, а лимиты 32-битного клиента отсутствуют.

2. Использование параметров вместо прямой конкатенации:
Избегайте склеивания текста запроса из фрагментов строк через оператор +. Используйте метод УстановитьПараметр().

Рассмотрим пример правильной передачи строковых условий:


// Корректный подход: передача параметров вместо динамической склейки строк
Запрос = Новый Запрос;
Запрос.Текст = 
	"ВЫБРАТЬ
	|	Контрагенты.Ссылка КАК Контрагент,
	|	Контрагенты.ИНН КАК ИНН
	|ИЗ
	|	Справочник.Контрагенты КАК Контрагенты
	|ГДЕ
	|	Контрагенты.Наименование ПОДОБНО &СтрокаПоиска";

Запрос.УстановитьПараметр("СтрокаПоиска", "%" + ИскомоеНаименование + "%");
Результат = Запрос.Выполнить();

3. Использование объекта СхемаЗапроса:
Для безопасного программного построения сложных запросов вместо ручной сборки текста рекомендуется использовать встроенный объект СхемаЗапроса. Это исключает прямой контакт со строковыми буферами:


// Программное формирование структуры запроса через СхемуЗапроса
Схема = Новый СхемаЗапроса;
Пакет = Схема.ПакетыЗапросов[0];
Оператор = Пакет.Операторы[0];

// Добавление источника данных и полей
Источник = Оператор.Источники.Добавить("Справочник.Контрагенты", "Контрагенты");
Оператор.ВыбираемыеПоля.Добавить("Контрагенты.Ссылка");

Запрос = Новый Запрос;
Запрос.Текст = Схема.ПолучитьТекстЗапроса();
РезультатЗапроса = Запрос.Выполнить();

Способ 4. Обновление платформы и перевод на 64-разрядный клиент

В старых версиях платформы (включая ветки 8.3.6) присутствовали платформенные ошибки управления динамической памятью при работе с Unicode-строками. Если вышеописанные шаги не дают длительного эффекта, рекомендуется:

  1. Обновить платформу 1С:Предприятие до актуального стабильного релиза.
  2. Установить на терминальный сервер 64-разрядное клиентское приложение 1С (64-bit client), что полностью убирает лимит памяти в 2 ГБ на процесс и устраняет проблему фрагментации.
← На главную