Как исправить ошибку «Попытка сравнения значений, для которых не поддерживается операция сравнения» при выводе картинок в отчете?

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

При разработке отчетов в системе компоновки данных (СКД), особенно в современных конфигурациях на базе БСП (например, УТ 11, ERP, КА), программисты часто сталкиваются с необходимостью вывода изображений номенклатуры. Одной из самых коварных ошибок в этом процессе является сообщение: «Попытка сравнения значений для которых не поддерживается операция сравнения». На первый взгляд кажется, что проблема кроется в тексте запроса или условиях соединения таблиц, но зачастую корень проблемы лежит гораздо глубже — в настройках самой схемы компоновки данных.

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

Разбор причины возникновения ошибки

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


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка,
    ДвоичныеДанныеФайлов.ДвоичныеДанныеФайла КАК ДвоичныеДанныеФайла
ИЗ
    Справочник.Номенклатура КАК Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДвоичныеДанныеФайлов КАК ДвоичныеДанныеФайлов
        ПО Номенклатура.ФайлКартинки = ДвоичныеДанныеФайлов.Файл

Проблема заключается в том, что поле ДвоичныеДанныеФайла имеет тип ХранилищеЗначения. На уровне базы данных это бинарные данные, которые СУБД не может сравнивать операторами «больше», «меньше» или «равно» в контексте группировок или агрегации.

Когда мы добавляем такое поле в СКД, система компоновки данных может автоматически или по нашей неосторожности назначить это поле ресурсом. По умолчанию для ресурсов предлагается функция СУММА или МАКСИМУМ. Проанализируем, что происходит при использовании функции МАКСИМУМ(ДвоичныеДанныеФайла): СКД пытается сравнить между собой два набора бинарных данных, чтобы выбрать из них «больший». Поскольку операция сравнения для этого типа данных не определена, платформа выбрасывает исключение.

Решение проблемы: правильная настройка ресурсов

Первое и самое важное действие — проверить вкладку «Ресурсы» в вашей схеме компоновки данных. Если поле, содержащее картинку (двоичные данные), попало в список ресурсов с функцией МАКСИМУМ, МИНИМУМ или любой другой, требующей сравнения, это приведет к ошибке.

Пошаговый алгоритм исправления:

  1. Откроем схему компоновки данных вашего отчета.
  2. Перейдем на закладку «Ресурсы».
  3. Найдем поле, отвечающее за хранение картинки (в нашем примере это ДвоичныеДанныеФайла).
  4. Удалим это поле из списка ресурсов или уберем агрегатную функцию, если она была установлена ошибочно. Для вывода картинки в детальных записях это поле вообще не должно быть ресурсом.
  5. Если нам всё же необходимо выводить картинку в группировках (что не рекомендуется из-за производительности), следует использовать функцию Количество() или другие функции, не требующие сравнения содержимого бинарного поля.

Ошибки в условиях соединения (JOIN)

Хотя в большинстве случаев проблема решается в ресурсах, иногда ошибка может возникать и в самом запросе, если мы пытаемся соединять таблицы по полям с неопределенным или составным типом. Рассмотрим пример использования ВЫРАЗИТЬ для обеспечения типизации:


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка,
    ДвоичныеДанныеФайлов.ДвоичныеДанныеФайла КАК ДвоичныеДанныеФайла
ИЗ
    Справочник.Номенклатура КАК Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДвоичныеДанныеФайлов КАК ДвоичныеДанныеФайлов
        ПО (Номенклатура.ФайлКартинки = (ВЫРАЗИТЬ(ДвоичныеДанныеФайлов.Файл КАК Справочник.НоменклатураПрисоединенныеФайлы)))

Использование оператора ВЫРАЗИТЬ помогает системе однозначно определить тип поля при сравнении в условии ПО. Это критично, когда поле Файл в регистре имеет составной тип или тип ОпределяемыйТип.ПрисоединенныйФайл. Однако помните: ВЫРАЗИТЬ не поможет, если вы пытаетесь сравнить само ХранилищеЗначения.

Особенности работы в УТ 11 и использование БСП

В современных конфигурациях, таких как «Управление торговлей 11.4», работа с присоединенными файлами стандартизирована через Библиотеку стандартных подсистем (БСП). Важно понимать, что прямой запрос к регистру ДвоичныеДанныеФайлов не всегда является оптимальным решением.

Рассмотрим важные нюансы:

Для правильного вывода изображений в УТ 11 рекомендуется использовать функции общих модулей БСП. Вместо того чтобы тянуть двоичные данные в запросе, выберем только ссылку на присоединенный файл. Затем в СКД на закладке «Вычисляемые поля» добавим поле Картинка, где в выражении укажем вызов функции, возвращающей адрес картинки или сами данные, например:

ПрисоединенныеФайлы.ПолучитьДанныеФайла(СсылкаНаФайл)

Итоги и рекомендации

Подводя итог, проанализируем основные правила работы с картинками в СКД, которые помогут избежать ошибки сравнения:

  1. Никогда не используйте агрегатные функции (МАКСИМУМ, МИНИМУМ) для полей с типом ХранилищеЗначения или ДвоичныеДанные в ресурсах СКД.
  2. Проверьте, чтобы поле с картинкой не попадало в группировки отчета. Группировка подразумевает сравнение значений для объединения дублей, что невозможно для бинарных данных. Помещайте поле с картинкой только в «Выбранные поля» детальных записей.
  3. Убедитесь, что в условиях соединения (ПО) сравниваются поля одного и того же ссылочного типа. При необходимости используйте ВЫРАЗИТЬ.
  4. В сложных конфигурациях отдавайте предпочтение получению картинок через механизмы БСП и вычисляемые поля СКД, а не через прямые запросы к регистрам хранения данных.

Соблюдение этих простых правил позволит вам создавать стабильные и быстрые отчеты, корректно отображающие визуальную информацию без досадных ошибок платформы.

← На главную