Работа с внешними источниками данных (ВИД) в 1С — мощный инструмент, однако при использовании СУБД Oracle разработчики часто сталкиваются со специфической проблемой. Внешне все выглядит исправно: таблицы подключены, Консоль запросов успешно выводит данные, отчеты на СКД формируются без ошибок. Но стоит попытаться отобразить эти же данные в Динамическом списке, как платформа выдает критическую ошибку: "ORA-00923: ключевое слово FROM не найдено там, где оно ожидалось".
В этой статье мы подробно разберем, почему возникает эта ситуация, как проанализировать "испорченный" запрос и какими методами можно победить эту ошибку.
Разберем фундаментальное различие в работе этих объектов. Когда мы выполняем запрос в консоли или простом отчете, 1С отправляет в Oracle SQL-текст, максимально близкий к тому, который мы написали. Однако Динамический список работает иначе. Для обеспечения высокой производительности, поддержки пагинации (постраничного вывода), динамических отборов и сортировок, платформа 1С выполняет трансформацию запроса.
Ваш исходный текст оборачивается во вложенные подзапросы, к нему добавляются служебные поля и конструкции для ограничения количества строк (например, использование ROWNUM). Если 1С при этой трансформации некорректно определяет синтаксис, специфичный для конкретной версии Oracle или настроек ODBC-драйвера, на сервер уходит синтаксически неверный SQL-код. Именно отсутствие FROM в нужном месте, с точки зрения парсера Oracle, говорит о том, что структура "обертки" 1С нарушена.
Проанализируем ситуацию: чтобы понять, что именно "не нравится" Oracle, нам нужно увидеть финальный текст запроса, который 1С отправляет в базу данных. Лучший способ сделать это — настроить Технологический журнал (ТЖ).
Создадим или отредактируем файл logcfg.xml в папке настроек сервера 1С (или локального клиента, если работа идет в файловом варианте). Нам нужно отловить событие DBORACLE или DBV8DBEng (в зависимости от способа подключения). Пример настройки для сбора событий внешних баз данных:
<config xmlns="http://v8.1c.ru/7.4/config/logcfg">
<log location="C:\LOGS\ORACLE" history="24">
<event>
<eq property="Name" value="DBORACLE"/>
</event>
<event>
<eq property="Name" value="DBV8DBEng"/>
</event>
<property name="all"/>
</log>
</config>
После активации лога откроем форму списка. Как только возникнет ошибка, в файлах лога появится текст SQL-запроса. Проанализируем его до "характерного щелчка": ищем место, где 1С вставила конструкцию SELECT, но забыла или сместила FROM.
Выясним причину, связанную с метаданными. Динамический список критично требователен к наличию уникального ключа. Если во внешнем источнике данных для таблицы не задано Поле ключа или оно определено неверно (допускает дубли или NULL), 1С при генерации запроса для получения идентификаторов строк может составить неверную конструкцию.
Внешнего источника данных в конфигураторе.Если в динамическом списке используется Произвольный запрос, парсер 1С пытается анализировать его текст, чтобы добавить условия WHERE. Если в тексте есть Oracle-специфичные функции (DECODE, NVL) или сложные соединения, 1С может ошибиться при "навешивании" своих условий.
Рассмотрим самый надежный способ решения — вынос логики на сторону Oracle:
View (представление), которое будет содержать всю нужную выборку и преобразования.View как обычную таблицу внешнего источника.Динамическом списке укажем это представление как Основную таблицу без использования произвольного запроса.Это позволит 1С воспринимать источник как простую таблицу, и вероятность ошибки при генерации оберток для пагинации значительно снизится.
Посмотрим на настройки соединения. Ошибка HY000 часто указывает на проблемы драйвера. Проанализируем следующие моменты:
Oracle in OraClient12Home1), а не стандартный драйвер от Microsoft для Oracle, который давно не обновлялся и плохо понимает современный синтаксис.CLOB или очень длинные VARCHAR2, динамический список может споткнуться при попытке выполнить по ним сортировку или DISTINCT. Попробуйте исключить такие поля из видимости списка.Подводя итог, можно сказать: ошибка ORA-00923 в 1С — это почти всегда результат неудачной попытки платформы "оптимизировать" ваш запрос для интерфейса. Чтобы победить проблему, выполним следующие шаги:
СКД: если там работает, значит, проблема именно в механизмах Динамического списка.View на стороне Oracle.ODBC и сменим драйвер на актуальный от производителя.Такой системный подход позволит избежать синтаксических ошибок и обеспечит стабильную работу 1С с внешними данными.