Как исправить ошибку «Тип не может быть выбран в запросе» при обновлении модуля Битрикс в 1С:УТ

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При обновлении модуля интеграции «1С-Битрикс» в конфигурации «Управление торговлей 11.5» (например, при переходе на версию 7.0.2.23) разработчики часто сталкиваются с ошибкой исполнения запроса. Текст ошибки выглядит следующим образом: {(6, 2)}: Тип не может быть выбран в запросе >&ИсточникДанных КАК ВложенныйЗапрос. Эта проблема особенно актуальна для пользователей, работающих на свежих релизах платформы 1С:Предприятие (8.3.27 и выше), где ужесточены требования к типизации данных.

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

Анализируем причину возникновения ошибки

Рассмотрим механизм работы модуля Битрикс. При синхронизации документов или товаров модуль формирует временные таблицы на основе данных, полученных с сайта. Проблема локализована в процедуре ДобавитьВременнуюТаблицуПоКоллекции. В этой процедуре таблица значений (переменная Коллекция) передается в запрос в качестве параметра &ИсточникДанных.

Ошибка Тип не может быть выбран в запросе означает, что в одной или нескольких колонках таблицы значений, которая передается в запрос, не определен тип данных (тип Неопределено) либо содержатся типы, которые платформа не может обработать внутри SQL-запроса (например, структуры, соответствия или COM-объекты). Платформа 8.3.27 крайне чувствительна к таким ситуациям: если в предыдущих версиях запрос мог выполниться, если колонка просто была пустой, то теперь наличие колонки с неопределенным типом приводит к прерыванию транзакции.

Проанализируем фрагмент кода, где происходит сбой:


Процедура ДобавитьВременнуюТаблицуПоКоллекции(ОписаниеЗапроса, Коллекция, КэшированныеЗначения)
    ТаблицаИсточник = Новый ТаблицаЗначений;
    Если ТипЗнч(Коллекция) = Тип("ТаблицаЗначений") Тогда
        // Здесь добавляется только одна типизированная колонка
        Если Коллекция.Колонки.Найти("ИдентификаторСтрокиВТ") = Неопределено Тогда
            Коллекция.Колонки.Добавить("ИдентификаторСтрокиВТ", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(36)));
            // ... заполнение идентификаторов
        КонецЕсли;
        ТаблицаИсточник = Коллекция.Скопировать;
    ИначеЕсли ...
        // ... преобразование данных формы
    КонецЕсли;

    ТекстЗапроса = "ВЫБРАТЬ | * |ПОМЕСТИТЬ | ВтИсточникДанных |ИЗ | &ИсточникДанных КАК ВложенныйЗапрос";
    // ... выполнение запроса
КонецПроцедуры

Как мы видим, код гарантирует наличие типа только для колонки ИдентификаторСтрокиВТ. Все остальные колонки, которые приходят в параметре Коллекция (например, свойства товаров, дополнительные реквизиты заказов), копируются «как есть». Если в данных с сайта пришло поле, для которого в 1С еще не создана структура типов, колонка создается с типом Неопределено, что и вызывает критическую ошибку.

Настройка отладки для фоновых заданий и HTTP-сервисов

Часто программисты не могут «поймать» эту ошибку в конфигураторе, так как обмен с Битриксом выполняется в контексте фонового задания или через HTTP-сервис. Обычная точка останова в этом случае игнорируется. Разберем по шагам, как включить отладку:

  1. Включение отладки на сервере: Убедимся, что сервер 1С запущен с параметром -debug. Если это не так, отладка серверных вызовов будет невозможна.
  2. Параметры отладки в Конфигураторе: Перейдем в меню Сервис — Параметры — Отладка. Установим переключатель в положение «Информационная база» и обязательно поставим флажки «Отлаживать HTTP-сервисы» и «Отлаживать фоновые задания».
  3. Автоматическое подключение: Откроем меню Отладка — Подключение — Автоматическое подключение. Установим флажки для типов соединений: «Фоновые задания» и «HTTP-сервисы».

После этих манипуляций точка останова в процедуре ДобавитьВременнуюТаблицуПоКоллекции должна сработать при запуске синхронизации из административной панели сайта или вручную из 1С.

Решение проблемы через принудительную типизацию

Для устранения ошибки нам необходимо гарантировать, что все колонки таблицы ТаблицаИсточник имеют четко заданный тип перед тем, как таблица будет передана в запрос. Рассмотрим алгоритм исправления.

Выясним причину: какие именно колонки не имеют типа. Для этого в момент остановки в отладчике проанализируем свойство ТаблицаИсточник.Колонки. Если мы видим колонки с пустым типом, нам нужно модифицировать код. Мы можем создать новую таблицу значений, описать в ней типы всех колонок исходной таблицы и перенести данные.

Пример кода для исправления ситуации (вставляется перед формированием текста запроса):


// Создаем копию таблицы с явным указанием типов
МассивТиповСтрока = Новый Массив;
МассивТиповСтрока.Добавить(Тип("Строка"));
ОписаниеТиповСтрока = Новый ОписаниеТипов(МассивТиповСтрока, , Новый КвалификаторыСтроки(0));

ТаблицаСТипами = Новый ТаблицаЗначений;
Для Каждого КолонкаИзИсточника Из ТаблицаИсточник.Колонки Цикл
    // Если тип колонки не определен, назначаем ему тип "Строка"
    Если КолонкаИзИсточника.ТипЗнч.Типы().Количество() = 0 Тогда
        ТипКолонки = ОписаниеТиповСтрока;
    Иначе
        ТипКолонки = КолонкаИзИсточника.ТипЗнч;
    КонецЕсли;
    ТаблицаСТипами.Колонки.Добавить(КолонкаИзИсточника.Имя, ТипКолонки, КолонкаИзИсточника.Заголовок);
КонецЦикла;

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

// Подменяем параметр запроса
ОписаниеЗапроса.ПараметрыЗапроса.Вставить("ИсточникДанных", ТаблицаСТипами);

Важный момент: в модулях Битрикс часто используется вспомогательная процедура УдалитьНеподдерживаемыеТипыВЗапросе. Проанализируем её работу. Иногда она просто очищает значения в ячейках, но не меняет описание типов самих колонок. Если платформа продолжает выдавать ошибку, значит, проблема именно в метаданных колонок таблицы значений, и вышеприведенный способ с пересозданием таблицы является единственно верным.

Дополнительные рекомендации

Посмотрим на ситуацию шире. Если ошибка возникла сразу после обновления модуля через «Сравнение и объединение», возможны следующие проблемы:

Таким образом, мы выяснили, что основной причиной ошибки является возросшая строгость платформы 1С к типизации временных таблиц. Применяя метод принудительной типизации колонок и правильно используя инструменты отладки фоновых заданий, вы сможете оперативно устранить сбой в работе модуля интеграции.

← На главную