Часто при разработке отчетов на Системе Компоновки Данных (СКД) мы сталкиваемся с ситуацией, когда синтаксически верный запрос выдает ошибку исполнения. Особенно это касается работы с виртуальными таблицами регистра бухгалтерии и сложными типами данных, такими как Субконто. Разберем ситуацию, когда попытка передать список значений в параметр приводит к ошибке сравнения типов, и выясним, почему истинная причина может скрываться не в коде, а в механизмах платформы.
Представим ситуацию: у нас есть работающий отчет, который получает обороты по счету. В виртуальной таблице используется условие на субконто. Изначально параметр &ПериодПЛН был одиночным значением (ссылкой), и запрос выглядел так:
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(, &КонецПериода, Запись, ПОДСТРОКА(СчетДт.код, 1, 3) = "ПЛН", , , , СубконтоДт2 = &ПериодПЛН) КАК ХозрасчетныйОборотыДтКт
Затем возникла необходимость отбирать данные не по одному значению, а по списку. Мы устанавливаем в настройках параметра галочку "Доступен список значений" и меняем условие в запросе на вхождение в список:
СубконтоДт2 В (&ПериодПЛН)
Однако при формировании отчета возникает ошибка: **«Сравнение значения неограниченной длины или несовместимых типов»**. При этом, если в списке всего одно значение, отчет может сработать, но на нескольких значениях падает.
В данной ситуации необходимо проанализировать два направления: типизацию полей в запросе и особенности работы платформы с внешними отчетами.
Поле Субконто в регистрах бухгалтерии имеет составной тип (Характеристика). Это означает, что в одной колонке могут храниться данные разных типов (Справочники, Документы, Строки и т.д.). Когда мы пытаемся сравнить такое поле со списком значений без явного указания типа, СУБД может "запутаться", пытаясь сравнить несопоставимые данные.
Хорошей практикой программирования в 1С является явное приведение типов с помощью конструкции ВЫРАЗИТЬ. Это делает запрос надежнее и часто решает проблему несовместимости типов.
ВЫРАЗИТЬ(СубконтоДт2 КАК Справочник.БланкиСтрогойОтчетности) В (&ПериодПЛН)
Если вы уверены, что на данном счете (в нашем примере с кодом, начинающимся на "ПЛН") второе субконто всегда имеет определенный тип, используйте ВЫРАЗИТЬ. Это отсечет "мусорные" данные и подскажет оптимизатору запросов, как правильно сравнивать значения.
Если код написан верно, но ошибка сохраняется, особенно при отладке внешнего отчета, подключенного к базе, причина кроется в механизме сохранения настроек. Когда внешний отчет подключен в базу (через справочник "Дополнительные отчеты и обработки"), платформа запоминает его настройки (в том числе структуру параметров СКД) в системном хранилище, привязываясь к **Имени объекта** (метаданных). Давайте проследим, что происходит:
Это и вызывает ошибку "несовместимых типов" или некорректной работы параметров, несмотря на правильный код.
Чтобы корректно отладить изменения в схеме компоновки данных внешнего отчета, нам нужно "обмануть" платформу, заставив её забыть о старых настройках. Самый надежный способ — **изменить имя отчета**.
Выполним следующие действия:
Имя (Name).ОтчетПоБланкам, назовем его ОтчетПоБланкам_Тест.Теперь платформа воспримет этот файл как совершенно новый объект, для которого еще нет сохраненных настроек в базе. Она загрузит настройки по умолчанию непосредственно из вашей схемы компоновки данных, где параметр корректно определен как список. После завершения отладки и перед загрузкой финальной версии обратно в базу, не забудьте вернуть исходное **Имя** отчета.
При работе с параметрами виртуальных таблиц в СКД помните:
ВЫРАЗИТЬ для явной типизации.