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