Почему в 1С 7.7 возникают ошибки в группировках запроса под некоторыми пользователями Windows?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Проанализируем ситуацию: при вызове метода Запрос.Выполнить(ТекстЗапроса) система выдает сообщение об ошибке вида:


Группировка Автомобиль <<?>> ;
Запрос[16] : Переменная 'Автомобиль' не определена

При этом под учетной записью администратора или при изменении имени переменной (например, с Автомобиль на Авто) запрос начинает выполняться без каких-либо сбоев. Разберем подробнее, почему возникает такое поведение и как корректно решить эту проблему.

Причина возникновения ошибки

Платформа 1С:Предприятие 7.7 является 32-разрядным ANSI-приложением и не имеет встроенной поддержки Unicode. При разборе текста запросов лексический анализатор платформы обращается к системным функциям операционной системы Windows для перекодировки и сравнения кириллических символов.

Если у учетной записи пользователя Windows установлены региональные стандарты, отличные от стандартных (например, системный язык для программ, не поддерживающих Unicode, установлен как украинский, английский или другой язык без полной поддержки кодовой страницы 1251), парсер 1С не может сопоставить имя переменной из секции описания с именем в секции Группировка, Условие или Функция.

СУБД MS SQL Server в данном случае не является источником проблемы. Настройки сортировки баз данных (Collation, например Cyrillic_General_CI_AS) не влияют на синтаксический анализатор текста запросов на стороне клиента 1С.

Способ 1. Настройка системной локали Windows (Основное решение)

Разберем по шагам порядок настройки операционной системы на сервере или рабочем столе пользователя:

  1. Зайдем в системную Панель управления (Control Panel) под правами администратора.
  2. Перейдем в раздел Региональные стандарты (Region / Regional and Language Options).
  3. Откроем вкладку Дополнительно (Administrative).
  4. В блоке Язык программ, не поддерживающих Юникод (Language for non-Unicode programs) нажмем кнопку изменения языка системы.
  5. Установим значение Русский (Россия).
  6. Важно: Убедимся, что снята галочка напротив пункта «Бета-версия: Использовать Unicode UTF-8 для поддержки языков во всем мире» (Beta: Use Unicode UTF-8 for worldwide language support). Включение этого бета-режима разрушает работу синтаксического анализатора 1С 7.7.
  7. Применим изменения и выполним перезагрузку сервера или рабочей станции.

Если пользователи работают через терминальный сервер (RDP), также рекомендуем скопировать эти региональные параметры для всех новых пользователей и системных учетных записей через кнопку Копировать параметры (Copy settings).

Способ 2. Проверка кодовой страницы в Конфигураторе

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

  1. Откроем информационную базу в режиме Конфигуратор с административными правами.
  2. В главном меню выберем пункт Администрирование — Кодовая страница таблиц ИБ.
  3. Установим значение 1251 — Русский, Белорусский, Болгарский... либо Использовать текущие настройки системы.
  4. Сохраним изменения.

Обходные технические решения

Если оперативно изменить региональные настройки операционной системы невозможно, рассмотрим альтернативные варианты решения задачи в коде:

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

2. Использование объектных выборок
Если запрос выполняется к простому справочнику и не содержит сложных агрегатных функций, замените «черный» запрос на стандартную выборку средствами встроенного языка:


Спр = СоздатьОбъект("Справочник.Автомобили");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
    // Обработка элементов справочника
КонецЦикла;

Объектный метод ВыбратьЭлементы() не использует внутренний парсер текстов запросов 1С 7.7 и работает независимо от системных региональных настроек пользователя.

← На главную