Как исправить ошибку конструктора запроса в расширении 1С при работе со справочником УпаковкиЕдиницыИзмерения

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

При разработке в расширениях 1С программисты часто сталкиваются с ситуацией, когда один и тот же запрос успешно выполняется в консоли запросов, но выдает ошибку в конфигураторе при попытке сохранить его или открыть в конструкторе. Особенно остро эта проблема проявляется при работе с системными справочниками, имеющими сложную структуру владельцев, такими как УпаковкиЕдиницыИзмерения. В данной статье мы разберем, почему возникает эта ошибка и как правильно настроить расширение, чтобы запрос работал корректно.

Анализ проблемы: почему запрос не видит данные

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


ВЫБРАТЬ
    ВЫРАЗИТЬ(УпаковкиЕдиницыИзмерения.Владелец КАК Справочник.Номенклатура) КАК Номенклатура,
    МАКСИМУМ(УпаковкиЕдиницыИзмерения.Вес) КАК Вес,
    МАКСИМУМ(УпаковкиЕдиницыИзмерения.Числитель) КАК Числитель,
    МАКСИМУМ(УпаковкиЕдиницыИзмерения.Знаменатель) КАК Знаменатель
ПОМЕСТИТЬ втУпаковки
ИЗ
    Справочник.УпаковкиЕдиницыИзмерения КАК УпаковкиЕдиницыИзмерения
СГРУППИРОВАТЬ ПО
    УпаковкиЕдиницыИзмерения.Владелец

Проанализируем причину сбоя. В современных конфигурациях (ERP, УТ 11, КА) справочник УпаковкиЕдиницыИзмерения использует составной тип данных для поля Владелец. Владельцем может выступать как конкретная Номенклатура, так и НаборыУпаковок. Когда мы работаем в расширении, механизмы платформы строго проверяют наличие всех связанных метаданных. Если в расширение заимствован только сам справочник упаковок, но не определены его связи, конструктор запросов теряет контекст и выдает ошибку.

Шаг 1. Правильное заимствование объектов в расширение

Выясним основную причину: ошибка часто уходит после того, как мы принудительно «обновляем владельцев» в расширении. Разберем по шагам, что нужно сделать:

  1. Заимствуем в расширение справочник УпаковкиЕдиницыИзмерения.
  2. Заимствуем справочник Номенклатура.
  3. Если конфигурация предполагает использование наборов, заимствуем справочник НаборыУпаковок.
  4. Важный момент: Откройте свойства заимствованного справочника УпаковкиЕдиницыИзмерения в расширении, перейдите на вкладку «Владельцы» и убедитесь, что в списке типов владельцев отмечены галочками и Номенклатура, и НаборыУпаковок. Если они не отмечены, добавьте их.
  5. Также необходимо заимствовать все реквизиты, к которым идет обращение в запросе: Вес, Числитель, Знаменатель. Без их физического наличия в метаданных расширения конструктор не сможет проверить типы полей.

Шаг 2. Оптимизация текста запроса для расширения

Посмотрим на рекомендации по написанию кода. Для улучшения читаемости и снижения нагрузки на парсер запросов в расширении, рекомендуется использовать краткие псевдонимы (алиасы) таблиц и избавляться от избыточных длинных имен. Проанализируем пример оптимизированного запроса:


ВЫБРАТЬ
    ВЫРАЗИТЬ(Т.Владелец КАК Справочник.Номенклатура) КАК Номенклатура,
    МАКСИМУМ(Т.Вес) КАК Вес,
    МАКСИМУМ(Т.Числитель) КАК Числитель,
    МАКСИМУМ(Т.Знаменатель) КАК Знаменатель
ПОМЕСТИТЬ втУпаковки
ИЗ
    Справочник.УпаковкиЕдиницыИзмерения КАК Т
СГРУППИРОВАТЬ ПО
    ВЫРАЗИТЬ(Т.Владелец КАК Справочник.Номенклатура)

Обратите внимание на конструкцию СГРУППИРОВАТЬ ПО. Использование ВЫРАЗИТЬ в блоке группировки позволяет СУБД сразу отсечь лишние таблицы составного типа, что значительно повышает производительность запроса и помогает платформе однозначно определить тип поля.

Шаг 3. Обработка логических ловушек составного типа

Разберем ситуацию, на которую указывают опытные разработчики: возможность появления «лишних» записей. Поскольку владельцем может быть НаборУпаковок, то при попытке выразить его как Справочник.Номенклатура, платформа вернет значение NULL.

Если в базе есть упаковки, принадлежащие наборам, то все они при группировке «схлопнутся» в одну строку с пустой номенклатурой. Чтобы избежать этого и повысить точность данных, добавим условие фильтрации:


ВЫБРАТЬ
    ВЫРАЗИТЬ(Т.Владелец КАК Справочник.Номенклатура) КАК Номенклатура,
    МАКСИМУМ(Т.Вес) КАК Вес,
    МАКСИМУМ(Т.Числитель) КАК Числитель,
    МАКСИМУМ(Т.Знаменатель) КАК Знаменатель
ПОМЕСТИТЬ втУпаковки
ИЗ
    Справочник.УпаковкиЕдиницыИзмерения КАК Т
ГДЕ
    Т.Владелец ССЫЛКА Справочник.Номенклатура
СГРУППИРОВАТЬ ПО
    ВЫРАЗИТЬ(Т.Владелец КАК Справочник.Номенклатура)

Использование оператора ССЫЛКА — это наиболее корректный способ проверки типа в запросе перед применением функции ВЫРАЗИТЬ.

Подведем итоги решения

Проанализировав проблему, мы выяснили, что ключ к исправлению ошибок в запросах расширения лежит в плоскости соответствия метаданных. Рассмотрим краткий чек-лист для проверки:

Если вы уверены в работоспособности запроса (он проходит в консоли), но конструктор в расширении продолжает «ругаться», попробуйте сначала заимствовать все связанные типы владельцев, как мы разобрали выше. В большинстве случаев это полностью устраняет проблему.

← На главную