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