Как исправить ошибку «Ожидается имя ) КАК >Общие» в динамическом списке 1С?

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

При разработке в среде 1С:Предприятие 8.3 программисты иногда сталкиваются с крайне специфической ошибкой при попытке включить Произвольный запрос в динамическом списке. Текст ошибки выглядит следующим образом: Ошибка при выполнении запроса. по причине: {(..., ...)}: Ожидается имя ) КАК >Общие. Проблема осложняется тем, что ошибка может возникать даже в пустом запросе, где выбирается только одно поле Ссылка.

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

Выясняем причину: почему слово «Общие» под запретом?

Рассмотрим природу этой ошибки. В языке запросов 1С слово ОБЩИЕ является зарезервированным ключевым словом. Оно используется в секции ИТОГИ для расчета общих итогов по всей выборке (конструкция ИТОГИ ... ПО ОБЩИЕ).

Когда мы работаем с динамическим списком и указываем для него Основную таблицу, платформа 1С берет на себя управление построением итогового SQL-запроса. Она автоматически добавляет служебные поля, обрабатывает права доступа на уровне записей (RLS) и, что самое важное в нашем случае, пытается сопоставить структуру метаданных документа с текстом запроса. Если в документе присутствует табличная часть с именем Общие, внутренний парсер платформы при генерации автоматического кода ошибочно интерпретирует это имя как синтаксическую инструкцию языка запросов, а не как имя объекта метаданных. Это приводит к нарушению логики построения запроса и выдаче ошибки «Ожидается имя».

Проанализируем ситуацию: конфликт возникает именно при сочетании двух факторов:

  1. Наличие в объекте метаданных табличной части или реквизита с именем Общие.
  2. Установленное свойство Основная таблица в настройках динамического списка.

Вариант 1: Переименование табличной части (Рекомендуемый)

Самым стабильным и правильным с точки зрения архитектуры решением является изменение имени объекта метаданных. Если система находится на этапе разработки или количество зависимостей невелико, это сэкономит массу времени в будущем.

Рассмотрим шаги по безопасному переименованию:

  1. Переименуйте табличную часть Общие в более нейтральное имя, например, ОбщиеДанные или Дополнительно.
  2. Установите Синоним табличной части обратно в значение «Общие», чтобы пользователи не заметили изменений в интерфейсе.
  3. Воспользуйтесь глобальным поиском по конфигурации (Ctrl+Shift+F), чтобы найти и заменить все обращения к этой табличной части в программном коде.

Важно: Этот метод может быть затруднительным, если документ уже давно находится в эксплуатации и на его структуру завязаны внешние отчеты, обмены данными или расширения.

Вариант 2: Использование псевдонимов в тексте запроса

Если переименовать таблицу нельзя, попробуем «обмануть» конструктор запроса, явно задав псевдонимы. Однако помните, что конструктор может блокировать сохранение, если обнаружит ключевое слово. В таком случае правки необходимо вносить вручную в поле Текст запроса, не открывая конструктор.

Посмотрим на пример запроса, который может помочь обойти проблему:


ВЫБРАТЬ
    ДокументОбъект.Ссылка КАК Ссылка,
    ДокументОбъект.Дата КАК Дата,
    ДокументОбъект.Номер КАК Номер,
    ДокументОбъект.Общие.(
        Ссылка КАК Ссылка,
        НомерСтроки КАК НомерСтроки,
        Реквизит1 КАК Реквизит1
    ) КАК ОбщиеДанныеПсевдоним
ИЗ
    Документ.НашДокумент КАК ДокументОбъект

Обратите внимание, что мы назначаем псевдоним ОбщиеДанныеПсевдоним для вложенной таблицы. Это может помочь в некоторых версиях платформы, но при наличии установленной Основной таблицы ошибка часто сохраняется, так как платформа продолжает генерировать свой код «поверх» вашего.

Вариант 3: Отказ от «Основной таблицы»

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

Однако этот метод имеет существенные недостатки, которые нам придется компенсировать вручную:

Чтобы вернуть кнопки, нам потребуется вручную добавить их на форму и привязать к ним соответствующие действия. Для отображения состояния документа (проведен/пометка удаления) придется добавить в запрос поле Проведен и ПометкаУдаления, а затем настроить Условное оформление для вывода нужных картинок.

Вариант 4: Программная настройка в расширении

Если вы столкнулись с этой проблемой при работе в расширении (например, нужно добавить колонку в типовую конфигурацию), попробуем применить программный метод изменения свойств списка. Разберем алгоритм действий в процедуре ПриСозданииНаСервере:

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

Рассмотрим пример кода:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Формируем новый текст запроса без обращения к проблемной ТЧ
    ТекстЗапроса = 
    "ВЫБРАТЬ
    |	Список.Ссылка КАК Ссылка,
    |	Список.Дата КАК Дата,
    |	Список.Номер КАК Номер,
    |	ВЫБОР КОГДА Список.Проведен ТОГДА 1 ИНАЧЕ 0 КОНЕЦ КАК СтатусКартинки
    |ИЗ
    |	Документ.НашДокумент КАК Список";
    
    // Устанавливаем свойства динамического списка
    Список.ТекстЗапроса = ТекстЗапроса;
    // Если ошибка сохраняется, можно попробовать временно очистить основную таблицу
    // Список.ОсновнаяТаблица = ""; 

КонецПроцедуры

Список других «опасных» имен

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

Подведение итогов

Ситуация с ТЧ Общие — это классический пример конфликта между метаданными и синтаксисом встроенного языка. Если вы не можете переименовать таблицу, самым действенным, хоть и трудозатратным способом, остается удаление Основной таблицы из свойств динамического списка и ручная доработка интерфейсных команд. Это гарантирует стабильную работу формы в пользовательском режиме без внезапных падений парсера запросов.

← На главную