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