При переносе информационной базы 1С:Предприятие 7.7 на новый сервер или обновлении операционной системы разработчики и администраторы иногда сталкиваются со странным поведением встроенного языка запросов (так называемых «черных» запросов). Одно и то же решение исправно работает у одного пользователя, но вызывает синтаксическую ошибку у другого.
Проанализируем ситуацию: при вызове метода Запрос.Выполнить(ТекстЗапроса) система выдает сообщение об ошибке вида:
Группировка Автомобиль <<?>> ;
Запрос[16] : Переменная 'Автомобиль' не определена
При этом под учетной записью администратора или при изменении имени переменной (например, с Автомобиль на Авто) запрос начинает выполняться без каких-либо сбоев. Разберем подробнее, почему возникает такое поведение и как корректно решить эту проблему.
Платформа 1С:Предприятие 7.7 является 32-разрядным ANSI-приложением и не имеет встроенной поддержки Unicode. При разборе текста запросов лексический анализатор платформы обращается к системным функциям операционной системы Windows для перекодировки и сравнения кириллических символов.
Если у учетной записи пользователя Windows установлены региональные стандарты, отличные от стандартных (например, системный язык для программ, не поддерживающих Unicode, установлен как украинский, английский или другой язык без полной поддержки кодовой страницы 1251), парсер 1С не может сопоставить имя переменной из секции описания с именем в секции Группировка, Условие или Функция.
СУБД MS SQL Server в данном случае не является источником проблемы. Настройки сортировки баз данных (Collation, например Cyrillic_General_CI_AS) не влияют на синтаксический анализатор текста запросов на стороне клиента 1С.
Разберем по шагам порядок настройки операционной системы на сервере или рабочем столе пользователя:
Если пользователи работают через терминальный сервер (RDP), также рекомендуем скопировать эти региональные параметры для всех новых пользователей и системных учетных записей через кнопку Копировать параметры (Copy settings).
Выясним дополнительный момент, который может влиять на обработку символов внутри базы данных:
Если оперативно изменить региональные настройки операционной системы невозможно, рассмотрим альтернативные варианты решения задачи в коде:
1. Сокращение/изменение имен переменных в запросе
Как показала практика, сокращение длины кириллических идентификаторов (например, замена переменной Автомобиль на Авто) может временно устранить ошибку парсера. Однако этот метод является компромиссным и не гарантирует стабильную работу остальных запросов системы.
2. Использование объектных выборок
Если запрос выполняется к простому справочнику и не содержит сложных агрегатных функций, замените «черный» запрос на стандартную выборку средствами встроенного языка:
Спр = СоздатьОбъект("Справочник.Автомобили");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
// Обработка элементов справочника
КонецЦикла;
Объектный метод ВыбратьЭлементы() не использует внутренний парсер текстов запросов 1С 7.7 и работает независимо от системных региональных настроек пользователя.