При переходе на новые релизы платформы (в частности, 8.3.25, которую часто называют «8.5») разработчики сталкиваются с тем, что отчеты на базе Системы компоновки данных (СКД), работавшие годами, перестают открываться в конфигураторе внутри расширений. Ошибка «Несовместимые типы Выбор Выбор» может застать врасплох, так как в режиме «1С:Предприятие» или в консоли запросов этот же запрос выполняется без нареканий. В рамках данной статьи мы разберем причины такого поведения и пошагово рассмотрим способы устранения проблемы.
Рассмотрим типовой пример запроса, который вызывает ошибку в расширении. Проблема обычно локализуется в блоке ВЫБОР (CASE), где платформа пытается сопоставить типы возвращаемых значений. Проанализируем конструкцию:
ВЫБРАТЬ
ЗаказКлиентаТовары.Ссылка КАК Ссылка,
ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
ВЫБОР
КОГДА ЗаказКлиентаТовары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)
ТОГДА ЗаказКлиентаТовары.Сумма
ИНАЧЕ 0
КОНЕЦ КАК СуммаУслуг
ИЗ
Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
В данном случае конструктор запроса СКД в расширении анализирует типы данных для поля СуммаУслуг. Если в основной конфигурации и в расширении есть малейшее расхождение в описании типов ЗаказКлиентаТовары.Сумма или если механизм заимствования «потерял» актуальность метаданных, платформа выдает ошибку несовместимости типов ВЫБОР.
Выясним основную причину сбоя. В новых релизах платформы механизмы проверки расширений стали значительно строже. При заимствовании объектов (документов, справочников, перечислений) в расширение, для них по умолчанию устанавливается свойство «Проверять значения при подключении расширения».
Если в основной конфигурации произошло обновление (например, изменилась длина строкового реквизита, точность числа или состав типов в ЛюбаяСсылка), а в расширении этот объект был заимствован ранее, возникает конфликт определений. Конструктор СКД считывает метаданные из расширения, видит расхождение с актуальной структурой базы и блокирует работу с запросом.
Решение по шагам:
Документ.ЗаказКлиента и Перечисление.ТипыНоменклатуры).Проанализируем работу с конструкцией ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга). Для корректной работы этого выражения в СКД расширения необходимо, чтобы в расширение было добавлено не просто само перечисление как объект, но и конкретное значение Услуга.
Если вы добавили перечисление «пустым» (только заголовок объекта без состава значений), платформа 8.3.25 может не распознать тип константы в запросе, что приведет к ошибке типизации в блоке ВЫБОР. Всегда проверяйте, чтобы используемые в коде значения перечислений были явно заимствованы в расширение.
Если манипуляции со свойствами заимствования не помогают, применим метод явного приведения типов. Это «успокоит» конструктор запроса, заставив его использовать конкретный тип данных вместо попыток вычислить его из метаданных расширения. Рассмотрим, как изменить наш запрос:
ВЫБРАТЬ
ЗаказКлиентаТовары.Ссылка КАК Ссылка,
ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
ВЫРАЗИТЬ(ВЫБОР
КОГДА ЗаказКлиентаТовары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)
ТОГДА ЗаказКлиентаТовары.Сумма
ИНАЧЕ 0
КОНЕЦ КАК ЧИСЛО(15, 2)) КАК СуммаУслуг
ИЗ
Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
Использование ВЫРАЗИТЬ(... КАК ЧИСЛО(15, 2)) гарантирует, что результат всего блока ВЫБОР будет интерпретирован как число фиксированной точности, что исключает возникновение ошибки «Несовместимые типы» при сопоставлении с нулем в ветке ИНАЧЕ.
Разберем еще несколько важных моментов, которые помогут избежать подобных проблем в будущем:
%LOCALAPPDATA%\1C\1cv8 (локальный кэш пользователя).ЗаказКлиентаТовары.Номенклатура.ТипНоменклатуры). Попробуйте переписать запрос, используя ЛЕВОЕ СОЕДИНЕНИЕ со справочником Номенклатура. Это упростит задачу типизации для конструктора СКД.Подводя итог, можно сказать, что ошибка «Несовместимые типы» в новых релизах 1С — это чаще всего следствие усиления контроля за целостностью метаданных расширения. Своевременное обновление заимствованных объектов и использование функции ВЫРАЗИТЬ являются лучшими практиками при разработке сложных отчетов в расширениях.