Почему возникает ошибка Несовместимые типы Выбор Выбор в СКД расширения на платформе 8.5 и как ее исправить

Программист 1С v8.5 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При переходе на новые релизы платформы (в частности, 8.3.25, которую часто называют «8.5») разработчики сталкиваются с тем, что отчеты на базе Системы компоновки данных (СКД), работавшие годами, перестают открываться в конфигураторе внутри расширений. Ошибка «Несовместимые типы Выбор Выбор» может застать врасплох, так как в режиме «1С:Предприятие» или в консоли запросов этот же запрос выполняется без нареканий. В рамках данной статьи мы разберем причины такого поведения и пошагово рассмотрим способы устранения проблемы.

Анализ проблемного запроса

Рассмотрим типовой пример запроса, который вызывает ошибку в расширении. Проблема обычно локализуется в блоке ВЫБОР (CASE), где платформа пытается сопоставить типы возвращаемых значений. Проанализируем конструкцию:


ВЫБРАТЬ
    ЗаказКлиентаТовары.Ссылка КАК Ссылка,
    ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
    ВЫБОР
        КОГДА ЗаказКлиентаТовары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)
            ТОГДА ЗаказКлиентаТовары.Сумма
        ИНАЧЕ 0
    КОНЕЦ КАК СуммаУслуг    
ИЗ
    Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары

В данном случае конструктор запроса СКД в расширении анализирует типы данных для поля СуммаУслуг. Если в основной конфигурации и в расширении есть малейшее расхождение в описании типов ЗаказКлиентаТовары.Сумма или если механизм заимствования «потерял» актуальность метаданных, платформа выдает ошибку несовместимости типов ВЫБОР.

Причина 1: Свойство Проверять значения при подключении

Выясним основную причину сбоя. В новых релизах платформы механизмы проверки расширений стали значительно строже. При заимствовании объектов (документов, справочников, перечислений) в расширение, для них по умолчанию устанавливается свойство «Проверять значения при подключении расширения».

Если в основной конфигурации произошло обновление (например, изменилась длина строкового реквизита, точность числа или состав типов в ЛюбаяСсылка), а в расширении этот объект был заимствован ранее, возникает конфликт определений. Конструктор СКД считывает метаданные из расширения, видит расхождение с актуальной структурой базы и блокирует работу с запросом.

Решение по шагам:

  1. Откройте дерево метаданных вашего расширения.
  2. Найдите заимствованные объекты, которые участвуют в запросе (в нашем примере это Документ.ЗаказКлиента и Перечисление.ТипыНоменклатуры).
  3. Перейдите в свойства этих объектов.
  4. Найдите признак «Проверять значения при подключении расширения» и установите его в значение Ложь (снимите галочку).
  5. Сохраните расширение и попробуйте снова открыть конструктор СКД.

Причина 2: Неполное заимствование перечислений

Проанализируем работу с конструкцией ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга). Для корректной работы этого выражения в СКД расширения необходимо, чтобы в расширение было добавлено не просто само перечисление как объект, но и конкретное значение Услуга.

Если вы добавили перечисление «пустым» (только заголовок объекта без состава значений), платформа 8.3.25 может не распознать тип константы в запросе, что приведет к ошибке типизации в блоке ВЫБОР. Всегда проверяйте, чтобы используемые в коде значения перечислений были явно заимствованы в расширение.

Причина 3: Использование функции ВЫРАЗИТЬ для жесткой типизации

Если манипуляции со свойствами заимствования не помогают, применим метод явного приведения типов. Это «успокоит» конструктор запроса, заставив его использовать конкретный тип данных вместо попыток вычислить его из метаданных расширения. Рассмотрим, как изменить наш запрос:


ВЫБРАТЬ
    ЗаказКлиентаТовары.Ссылка КАК Ссылка,
    ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
    ВЫРАЗИТЬ(ВЫБОР
        КОГДА ЗаказКлиентаТовары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)
            ТОГДА ЗаказКлиентаТовары.Сумма
        ИНАЧЕ 0
    КОНЕЦ КАК ЧИСЛО(15, 2)) КАК СуммаУслуг    
ИЗ
    Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары

Использование ВЫРАЗИТЬ(... КАК ЧИСЛО(15, 2)) гарантирует, что результат всего блока ВЫБОР будет интерпретирован как число фиксированной точности, что исключает возникновение ошибки «Несовместимые типы» при сопоставлении с нулем в ветке ИНАЧЕ.

Дополнительные рекомендации по работе с расширениями в 8.5

Разберем еще несколько важных моментов, которые помогут избежать подобных проблем в будущем:

Подводя итог, можно сказать, что ошибка «Несовместимые типы» в новых релизах 1С — это чаще всего следствие усиления контроля за целостностью метаданных расширения. Своевременное обновление заимствованных объектов и использование функции ВЫРАЗИТЬ являются лучшими практиками при разработке сложных отчетов в расширениях.

← На главную