Почему запрос в расширении 1С не видит иерархию счетов или типы документов и как это исправить?

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

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

Суть проблемы: невидимые связи метаданных

Представим ситуацию: мы создаем запрос, который обращается к оборотам регистра бухгалтерии, соединяет их с временной таблицей прочих расходов и фильтрует данные по конкретному типу документа-регистратора. В консоли запросов всё проходит гладко, но в конструкторе расширения мы видим следующую картину:

  1. У поля СчетДт пропадает символ «+», и система не позволяет использовать условие В ИЕРАРХИИ.
  2. При попытке указать тип документа через функцию ТИП(Документ.ВнутреннееПотребление) конструктор выдает ошибку, заявляя, что такой тип не определен, хотя документ заимствован в расширение.
  3. Поля регистратора перестают «раскрываться» через точку, ограничивая доступ к реквизитам документа.

Рассмотрим исходный запрос, который вызывает подобные затруднения:


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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ХозрасчетныйОборотыДтКт.Регистратор КАК Регистратор,
    ХозрасчетныйОборотыДтКт.СчетДт КАК СчетДт,
    ХозрасчетныйОборотыДтКт.Регистратор.Ссылка КАК РегистраторСсылка,
    СУММА(вт_прочиерасходы.Сумма) КАК Сумма
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&Н, &К, Авто, СчетДт В ИЕРАРХИИ (&СчетДт), , , , ) КАК ХозрасчетныйОборотыДтКт
ВНУТРЕННЕЕ СОЕДИНЕНИЕ вт_прочиерасходы КАК вт_прочиерасходы
    ПО ХозрасчетныйОборотыДтКт.Регистратор = вт_прочиерасходы.Регистратор
ГДЕ
    ТИПЗНАЧЕНИЯ(ХозрасчетныйОборотыДтКт.Регистратор) = ТИП(Документ.ВнутреннееПотребление)
СГРУППИРОВАТЬ ПО
    ХозрасчетныйОборотыДтКт.Регистратор,
    ХозрасчетныйОборотыДтКт.СчетДт

Разберем причину «исчезновения» иерархии счетов

В платформе 1С символ «+» рядом с полем в конструкторе запросов означает, что расширение понимает структуру этого объекта. Если мы заимствуем РегистрБухгалтерии, но не добавляем в расширение связанный с ним ПланСчетов, поле СчетДт (или СчетКт) превращается для компилятора запроса в обычную ссылку без свойств.

Проанализируем ситуацию: условие В ИЕРАРХИИ требует, чтобы система знала, что данный объект поддерживает иерархию и принадлежит конкретному плану счетов. Если План счетов не заимствован или заимствован не полностью (без учета признака иерархии), конструктор запросов в расширении блокирует использование иерархических сравнений. Выясним, как это исправить: необходимо убедиться, что соответствующий План счетов добавлен в расширение и его свойства соответствуют основной конфигурации.

Проблема видимости регистраторов в виртуальных таблицах

Наиболее коварная ошибка кроется в работе с полем Регистратор. В расширении объект РегистрБухгалтерии или РегистрНакопления может «не знать», какие именно документы могут делать в него записи. Даже если документ ВнутреннееПотребление заимствован в расширение, это еще не означает, что расширение восстановило его связь с регистром.

Посмотрим на решение, которое помогает в 100% случаев. В расширении необходимо зайти в свойства заимствованного документа и в разделе «Движения» вручную проставить галочку напротив нужного регистра. Многие опасаются, что это может повлиять на логику проведения документов в основной базе. Проанализируем этот момент подробнее: установка этой галочки в расширении не меняет структуру таблиц БД и не переопределяет код проведения (если вы не меняете модуль объекта). Она лишь сообщает компилятору метаданных расширения, что данный тип документа является валидным регистратором для этого регистра. После этого:

  1. Оператор ТИП(Документ.ВнутреннееПотребление) начинает распознаваться корректно.
  2. Поле Регистратор в конструкторе запросов расширения снова позволяет «разыменовывать» себя (обращаться к реквизитам документа через точку).
  3. Исчезают ошибки несовместимости типов при выполнении запроса в режиме «1С:Предприятие».

Использование оператора ССЫЛКА как лучшая практика

Рассмотрим альтернативный и более надежный способ проверки типа документа в запросах расширений. Вместо конструкции ТИПЗНАЧЕНИЯ(Регистратор) = ТИП(Документ.ИмяДокумента) рекомендуется использовать оператор ССЫЛКА.

Разберем пример оптимизированного условия:


ГДЕ 
    ХозрасчетныйОборотыДтКт.Регистратор ССЫЛКА Документ.ВнутреннееПотребление

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

Алгоритм действий при возникновении ошибок запроса в расширении

Если вы столкнулись с описанной проблемой, выполните следующие шаги вместе с нами:

  1. Проверьте заимствование типов: Убедитесь, что все документы, планы счетов и перечисления, используемые в запросе, добавлены в расширение.
  2. Настройте связи (Движения): Для каждого документа, который выступает регистратором в вашем запросе, проверьте вкладку «Движения» внутри расширения. Установите флаг напротив используемого регистра.
  3. Обновите свойства Плана счетов: Если не работает В ИЕРАРХИИ, убедитесь, что в расширение попал План счетов и у него активны свойства иерархии.
  4. Избегайте конструктора: Если после всех настроек конструктор запросов в конфигураторе всё равно выдает предупреждения, попробуйте внести изменения в текст запроса «руками» прямо в модуле. Часто механизмы проверки конструктора в расширениях строже, чем реальный исполнитель запросов в режиме предприятия.
  5. Проверьте параметры: Убедитесь, что параметры запроса (например, &СчетДт) передаются как ссылки на объекты основной конфигурации или расширения, а не как простые строки.

Подведем итог. Большинство проблем с запросами в расширениях 1С вызвано «фрагментарностью» метаданных. Расширение — это не копия базы, а лишь набор изменений. Чтобы запрос «увидел» связи между объектами, эти связи (такие как принадлежность документа к движениям регистра) должны быть явно обозначены внутри самого расширения. Следуя этим простым правилам, вы сможете использовать всю мощь языка запросов 1С даже в самых сложных доработках через механизм расширений.

← На главную