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