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