В процессе разработки на платформе 1С:Предприятие 8.3, особенно при переходе на интерфейс «Такси», программисты часто сталкиваются со специфическими ошибками, которые не проявляются в обычном интерфейсе или толстом клиенте. Одной из самых коварных является ошибка: «Ошибка получения информации набора данных по причине: Ошибка в запросе набора данных по причине: {(..., ...)}: Синтаксическая ошибка "," Выбор». Давайте подробно разберем, почему она возникает и как её исправить.
Проанализируем ситуацию: ошибка чаще всего возникает в динамических списках (формах списка документов или справочников). Главная особенность заключается в том, что в конфигураторе запрос может отсутствовать (используется стандартная выборка), а форма создана автоматически. При этом в интерфейсе «Такси» система выдает сбой, тогда как в старых интерфейсах всё работает корректно.
Разберем внутренний механизм работы платформы. Когда мы открываем форму списка, 1С автоматически генерирует SQL-запрос к базе данных. В интерфейсе «Такси» этот механизм работает более сложно: платформа добавляет служебные поля для обеспечения быстрого поиска, фильтрации и динамического считывания данных. Если в метаданных документа (в реквизитах или табличных частях) присутствует поле с именем Выбор, возникает конфликт.
Важный момент: Слово ВЫБОР (или SELECT, CASE в SQL-трансляции) является зарезервированным оператором языка запросов 1С. Когда платформа формирует текст внутреннего запроса, она перечисляет поля через запятую. Если имя поля совпадает с ключевым словом, парсер запросов ожидает увидеть конструкцию ВЫБОР ... КОГДА ... ТОГДА, но вместо этого встречает запятую или другое имя поля. Это и приводит к синтаксической ошибке "," Выбор.
Рассмотрим самый надежный и правильный с точки зрения стандартов разработки способ. Если в вашем объекте (документе, справочнике) есть реквизит или колонка табличной части с именем Выбор, его необходимо переименовать.
Выбор в нечто более специфичное, например, ВариантВыбора или ОтметкаВыбора.Проанализируем последствия: после переименования платформа перестанет воспринимать имя поля как оператор ВЫБОР, и автоматическая генерация запроса для динамического списка в интерфейсе «Такси» пройдет успешно.
Бывают ситуации, когда переименование реквизита в метаданных невозможно или крайне затруднительно (например, на этом поле завязано множество внешних интеграций или сложных расчетов). В этом случае мы можем прибегнуть к использованию произвольного запроса в динамическом списке.
Выполним следующие шаги:
Список с типом ДинамическийСписок).Рассмотрим пример кода такого запроса:
ВЫБРАТЬ
ДокументРеализация.Ссылка КАК Ссылка,
ДокументРеализация.Дата КАК Дата,
ДокументРеализация.Номер КАК Номер,
ДокументРеализация.Выбор КАК ПолеВыбор
ИЗ
Документ.Реализация КАК ДокументРеализация
Обратите внимание: В тексте запроса мы используем конструкцию Документ.Выбор КАК ПолеВыбор. Таким образом, для визуального интерфейса и программного кода формы поле будет называться ПолеВыбор, что исключит синтаксическую коллизию с оператором ВЫБОР.
Посмотрим на ситуацию, когда аналогичная ошибка возникает во внешнем отчете или в схеме компоновки данных. Проанализируем структуру наборов данных. Ошибка получения информации может возникнуть, если:
Выбор без использования квадратных скобок или псевдонимов.В случае с СКД убедимся, что все наборы данных корректно возвращают структуру полей. Если набор данных формируется программно, проверим, что в таблицу значений (которая передается как внешний набор) добавлены все колонки, описанные в схеме компоновки.
Выясним, почему ошибка может проявляться не сразу или только в определенных клиентах. Как показывает практика, интерфейс «Такси» активно использует механизмы кэширования метаданных на стороне клиента. Если вы удаляли и создавали форму заново, ошибка могла исчезнуть на один сеанс из-за обновления локального кэша, но вернуться при следующем запуске, когда платформа снова обращается к дескриптору объекта в базе данных.
Рекомендуем придерживаться следующих правил во избежание подобных проблем:
Выбор, Дата, Номер, Ссылка, Когда, Тогда. Несмотря на то, что платформа позволяет это сделать, внутренние механизмы трансляции запросов (особенно в веб-клиенте и «Такси») могут дать сбой.Таким образом, мы выяснили, что «ларчик открывался просто»: использование зарезервированных слов в именах полей — это мина замедленного действия, которая срабатывает при обновлении платформы или смене интерфейса. Своевременное исправление имен реквизитов или использование псевдонимов в запросах полностью решает проблему.