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