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