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