Пример использования объекта "Схема запроса" в реальном проекте

03.06.21

Разработка - Запросы

Разберём решение задачи реального проекта: контекст, логика решения, само решение. Рассмотрим возможности объекта СхемаЗапроса.

В статье рассмотрим пример использования объекта СхемаЗапроса в реальном проекте.

Контекст задачи проекта освещается с согласия Заказчика - ООО "ЭФМЕК РУС", за что ему огромное спасибо.

Проект англоязычный, поэтому интерфейс будет на английском языке.

Суть задачи:

  1. Работаем в агросекторе - выращиваем сельскохозяйственные культуры на полях фермерского хозяйства.
  2. Рассматриваемый процесс - планирование структуры посевных площадей агрономом. В ходе этого мероприятия определяется какая культура на каком поле и в какой сезон будет выращиваться.
  3. Выглядит это так:
  4. Наша задача организовать "Фильтр по предшественникам" (Filter by predecesor)
  5. То есть надо показать только те поля, в которых соблюдалась последовательность выращивания.

    Например, в 2021 растили Пшеницу (Wheat), в 2022 - кукурузу (Corn).

  6. Результат отбора:

    В результат попало только Field 3. Field 2 не попало, так как в 2021 на нём ничего не росло.


Отчет строится на базе документа "План выращивания" со следующей структурой метаданных:

 

Особенности

  1. На одну комбинацию Сезон/Поле может существовать только один План выращивания
  2. Выращиваемая культура (Номенклатура) хранится в табличной части
  3. Связано это с ситуацией Multiple-cropping. Когда на одном поле в сезоне одновременно растут несколько культур.

 

Посмотрим на форму фильтра:

 

 

На ней таблица (колонки Сезон, Номенклатура, КультураПоКлассификатору) и тумблер ТипОтбора (Число).

Тумблер задаёт режим ввода

  1. при значении 0 - вводим культуру (Номенклатура, Item)
  2. при значении 1 - вводим культуру по классификатору (отдельный справочник, реквизит Номенклатуры)

Нам надо получить только те поля, на которых соблюдалась последовательность выращивания.

Рассматриваем входные данные таблицы из приведённого выше примера: в 2021 - Пшеница, в 2022 - Кукуруза.

Результатом будет являться массив полей, удовлетворяющих данным таблицы.

Ясно, что результат надо получить одним пакетным запросом.

 

Подумаем над логикой запроса

  1. Для каждой строки таблицы формируем запрос, получающий поля сезона строки с учетом отбора по культуре/классификатору
  2. Полученные запросы объединяем
  3. Далее надо отобрать только те поля, которые будут присутствовать в каждом из запросов
  4. Имеем несколько запросов для объединения - количество равно количеству строк таблицы с заполненным отбором
  5. Всё, что нужно - это свернуть итоговый результат объединения и сравнить количество вхождений каждого поля с количеством строк с отбором.
  6. Для этих целей в запрос включим счетчик - число со значением 1.
  7. При свертывании будем суммировать по счетчику.
  8. Результат сворачивания отфильтруем по Сумма(Счетчик)=КоличествоСтрок

Переведём эти размышления в текст запроса.

 

 

Приведённый текст имеет "методологическую" ошибку. Сможете найти?

 
 Ответ в свернутой области)

В итоге приходим к тому, что текст запроса собирается из частей.

Перейдём к коду обработчика кнопки.

 

 

Как же собрать текст запроса?

Есть несколько подходов

  1. Используем банальную конкатенацию строк - символ "+"

     

    Код получился не очень читаем и "со сложностями" типа добавления "ПОМЕСТИТЬ" только в первый запрос и удаления "ОБЪЕДИНИТЬ ВСЕ" из последнего.

  2. Второй способ более продвинутый: собираем части текста в массив и в конце используем СтрСоединить

    Уже лучше, но всё равно остался артефакт с "ПОМЕСТИТЬ" в первом запросе.

    Этот способ рекомендован фирмой 1С и наиболее часто используется в типовых.

  3. И третий способ - интересный) Используем объект СхемаЗапроса

В Синтакс-помощнике про него пишут так: "Объект для создания и редактирования запросов из встроенного языка."

 


Программная модель

  1. ПакетЗапросовСхемыЗапроса - коллекция объектов с говорящими названиями ЗапросВыбораСхемыЗапроса, ЗапросУничтоженияТаблицыСхемыЗапроса

    При создании схемы, она сразу содержит один пакет и один оператор пакета

    Пакет - это один запрос пакетного запроса

    СхемаЗапроса.ПакетЗапросов - это весь пакетный запрос.

    Можно получить его текст с помощью СхемаЗапроса.ПолучитьТекстЗапроса()

  2. ЗапросВыбораСхемыЗапроса - содержит коллекцию операторов, .Операторы

    ЗапросВыбора - это объединение операторов.

    Оператор - это секция "ВЫБРАТЬ ..."

    ОператорВыбратьСхемыЗапроса - наша секция "ВЫБРАТЬ ..." с основными свойствами

    1. Источники // таблицы из ИЗ
    2. ВыбираемыеПоля // поля запроса
    3. Отбор // отбор из ГДЕ
    4. ТипОбъединения // ОБЪЕДИНИТЬ или ОБЪЕДИНИТЬ ВСЕ
  3. ПоляСхемыЗапроса - коллекция элементов ВыражениеСхемыЗапроса

    ВыбираемыеПоля = коллекция полей

    добавление поля: ВыбираемыеПоля.Добавить(<строка>)

  4. ВыражениеСхемыЗапроса - создаётся по строке

В итоге наш код может выглядеть так:

  1. Создаём шаблон секции запроса

    Если сейчас получить текст запроса, то

  2. Наполняем первый запрос пакета

  3.  

    Формируем второй запрос пакета

 

 
 Итоговый код

 

В результате получается такое вот элегантное решение с использованием объекта СхемаЗапроса.

Надеюсь, статья будет вам полезна. Спасибо дочитавшим до конца)

Желающих изучить 1С приглашаю на свой курс-репетитор по программированию в 1С 8.3: infostart.ru/courses/1380252/

СхемаЗапроса конкатенация СтрСоединить

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159453    874    399    

861

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    9879    sergey279    18    

64

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    5168    XilDen    36    

80

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    7903    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2394    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    8685    implecs_team    6    

47

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

11.04.2024    3391    andrey_sag    10    

36
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Yashazz 4791 04.06.21 11:05 Сейчас в теме
Ну то есть куча разговоров про схему запроса, а текст запроса в итоге всё равно собирается колхозно-строковым образом.
Fox-trot; brr; BomjBandit; logarifm; +4 Ответить
2. Bassgood 1449 04.06.21 11:07 Сейчас в теме
А не проще ли такого рода задач решать при помощи СКД, а не схем запросов?
Revachol; olololeg; logarifm; +3 Ответить
3. Jimbo 10 04.06.21 11:32 Сейчас в теме
Такое шаманство использовал 1 раз, когда динамически собирался запрос, как раз и из разных объединить и тд
4. Dmitryiv 161 04.06.21 11:37 Сейчас в теме
У автора просто не очень удачный пример использования. А в целом СхемаЗапроса очень мощный инструмент. Особенно когда надо поправить уже имеющиеся запросы в типовых конфигурациях при доработках.
8. maraton1185 150 04.06.21 14:14 Сейчас в теме
(4) ну да, в типовых чаще всего вот так:
Прикрепленные файлы:
nekit_rdx; +1 Ответить
20. Darklight 33 07.06.21 09:50 Сейчас в теме
(4)Мощный - но настолько неудобный и настолько сложный в использовании: очень легко получить ошибку при выполнении действия над запросом - требуется прецизионная работа "под микроскопом" и чёткое соблюдение последовательности действий - которых для простой операции, скажем, добавления нового поля (в подзапрос и с трансляцией его из глубины наружу) или включения в подзапрос запроса, например левым соединением или объединением, нужно сделать немерено - и все они будут выглядеть крайне неочевидными при их анализе; а если запрос манятся несколькими алгоритмами - то вообще - "пиши пропало" - очень легко сломать одно изменение другим - что лучше по старинке (через текст) - вероятность сразу словить ошибку там ниже, как и вероятность словить её в будущем (но она всё равно будет не очень низкой - до тех пор, пока в 1С не появится нормальной современной модели построения запросов, допускающей неполностью детерминированное отложенное построение, с декларативными командами, со сборкой лишь перед выполнением (или по требованию)).
Сколько раз порывался приметь "Схему запроса" - столько же раз плевался и отказывался от её использования! Очень заморочено, и очень нестабильны результат!
nekit_rdx; ImHunter; +2 Ответить
5. Bassgood 1449 04.06.21 11:40 Сейчас в теме
Юзал схему запроса пока только для добавления в запросы необходимых отборов, чтобы не модифицировать исходный текст запроса
6. Sashares 35 04.06.21 11:50 Сейчас в теме
Спорно, если честно. Обычный отчет, обычный запрос.
Какая особо разница, как формировать текст этого запроса?
7. Dzenn 894 04.06.21 13:49 Сейчас в теме
Считаю, что СхемаЗапроса очень полезный инструмент, и регулярно его использую там, где он действительно добавляет красоты и понимания
13. Yashazz 4791 04.06.21 20:36 Сейчас в теме
(7) Можно хоть один пример, где его использование действительно упрощает понимание? Кроме разбора адских запросов ЗУП при отладке?
14. Dzenn 894 04.06.21 20:49 Сейчас в теме
(13) Например, вот: http://prntscr.com/141mzot и продолжение: http://prntscr.com/141nfqe

Есть запрос, получающий данные из производственной системы, встроенной в виде внешнего источника. И мало того, что сам запрос сложен, так и условия, которые нужно в него включить, далеко не наглядны. Хорошо, я как программист разобрался, что за что отвечает. Однако что делать тому, кто придёт после меня? Как ему понять? Выход такой — все условия шлёпаем в виде функций, дополняющих схему запроса. Получается, что и выключить что-то легко, просто закомментировав, и добавить новое легко, просто по аналогии, и изначальный запрос простой, а не непонятно что, обросшее непонятно какими условиями непонятно за что отвечающими. В итоге получилось всё просто, наглядно и поддерживаемо. Плюс, некоторые условия экспортируемы и добавляются в другие запросы в таком же виде.
18. webester 26 06.06.21 07:00 Сейчас в теме
(14)>Хорошо, я как программист разобрался, что за что отвечает. Однако что делать тому, кто придёт после меня? Как ему понять?
Предполагается, что после вас придет не программист? Тогда ему, что схема, что не схема, все едино
21. Darklight 33 07.06.21 09:53 Сейчас в теме
(18)Разбираться с текстовыми манипуляциями будет проще (они нагляднее, и проще отлаживаются) - чем с манипуляциями над кучей вложенных коллекций объектов "Схемы запроса" с доступом по непонятным индексам
Yashazz; zqzq; +2 Ответить
29. webester 26 09.06.21 10:20 Сейчас в теме
(21)Два вопроса: В данном случае манипуляции с текстом запроса, от маниипуляций со схемой вообще не отличаются. С текстом было бы хуже немного, но ок. В первом посте вы приводите пример как хорошо со схемой, а мне отвечаете, что все таки с текстом удобнее. Так где же все таки хорошо?) И вопрос на который вы не ответили: почему вам кажется, что после вас обязательно должен работать идиот?
30. Darklight 33 09.06.21 14:33 Сейчас в теме
(29)Где я написал, что со схемой хорошо? Наоборот - в той реализации как сейчас - она отвратительна.
В другой теме на Инфорстарте (где тоже обсуждали "СхемаЗапроса") я привёл более развёрнутый ответ и дал своё виденье того, как можно было бы сделать работу со Схемой запроса куда лучше, чем есть сейчас в 1С Предприятие 8.
Работа с текстом же просто более прозрачна - его проще обрабатывать не теряя ясности действий, а зачастую - просто требуется меньше действий. Но да - при работе с текстами есть свои заморочки и свои проблемы - это далеко не идеальный механизм.

Замечу, что предложенное мной там решение - это лишь улучшение концепции объекта "СхемаЗапроса". Хотя я не сторонник вообще такого подхода к написанию запросов. И считаю, что, скажем, в 1С Предприятие 9 (или любом ином учётном универсальном продукте) к середине XXI века должен применяться совсем иной подход. Менее текстовый, более декларативный. Намного более декларативный и менее текстовый, нежели сейчас, скажем, C# LINQ. Сам я продвигаю идею обращения к данным через "Реквесты" - микро требования, описывающие откуда и какие данные нужно получить для того или иного алгоритма. Они все сначала консолидируются, затем анализируются (включая обращение к статистике СУБД), и затем генерируется оптимальный запрос - план выполнения которого так же анализируется (и потом автоматически может быть составлен другой запрос, при следующем вызове - т.е. нет фиксированного запроса на одинаковый набор Реквестов - всё в движении в поисках оптимума на текущий момент - текущего состояния СУБД, и текущих параметров запроса). После выполнения каждый алгоритм получает свою порцию данных - причём, по возможности - источник-результат выполнения может быть более общий, а порции - не более чем индексированные проекции - уже строго в памяти на сервере - ещё один уровень оптимизации.
Но это моя идея и мой мнение, на будущее. В такой модели практически нет нужды (это скорее нонсенс) менять запрос - так его нет изначально - он строится каждый раз - после сбора всех требований "Реквестов" со всех мест, включая не типовые алгоритмы. В этой модели ещё и активно применяется абстрагирование - когда в запрос добавляются абстрактные (для алгоритма) сущности, которые будут определены статически (при компиляции конфигурации) или даже динамически (при сборке), но их реальное содержание исходному универсальному алгоритму может быть до фени - он так и будет обрабатывать результат запроса - обрабатывая эти абстрактные сущности скопом (условно через "ЗаполнитьЗначенияСвойств" - но это, просто для понимания, конечно всё должно быть более чётко).
И скажу так - ничего особенно я не предлагаю. Если урезать анализ статистики и динамическую перестройку запросов - построить API такой модели доступа к данным можно хоть сейчас в 1С Предприятие 8. Вот только пока этого не будет в типовых конфигурациях и этому не будут учить на курсах - толку от такой модели будет не много - пока она не станет популярной - ведь это глобальное изменение всего подхода к построения запросов. А вот в 1С Предприятие 9 - так сказать "с нуля" - внедрить такой подход уже можно было бы!

И вопрос на который вы не ответили: почему вам кажется, что после вас обязательно должен работать идиот?

Кто бы не работал. Да хоть я же, через год вернусь к тому же запросу - разбираться в операциях через "СхемаЗапроса" на более менее сложных запросах - это мучительно больно!
31. webester 26 10.06.21 07:39 Сейчас в теме
(30)>Где я написал, что со схемой хорошо?
Возможно я вас неправильно понял. Вы говорите, как здорово и прекрасно засунуть отборы в функции, и одновременно показываете скрин с функциями которые модифицируют текст запроса через схему. Возможно вы показали как делать плохо(по вашему мнению) а как делать хорошо, не показали. Я кстати никакого ада не увидел, вполне себе читаемый код. Согласен, не очень удобно по индексам понимать на какую таблицу накладываются отборы. Но в целом жить можно вполне себе. Соглашусь схема запроса действительно реализована немного... странно мягко говоря. Я думаю причина этого в том, что это тупо программный интерфейс конструктора запросов.

На тему декларативности. Я не вижу реализации в данной модели получения данных. Возможно потому, что туповат. Было бы интересно посмотреть, на какую-то библиотечку с примерами. Если вы говорите, что написать обертку вокруг текущих запросов написать не сложно. Мне кажется, вы ошибаетесь. Возможно потому, что у меня мало опыта работы с такими способами получения данных и мне это кажется какой-то магией. Я немного щупал такой способ, простота действительно впечатляет. Но тогда под этой простотой лежала nosql база которая изначально разрабатывалась под определенный синтаксис запросов.
32. Darklight 33 10.06.21 11:26 Сейчас в теме
(31)
Вы говорите, как здорово и прекрасно засунуть отборы в функции, и одновременно показываете скрин с функциями которые модифицируют текст запроса через схему.

Что-то не могу понять, что Вы имеете в виду - дайте цитату/ссылку

Я кстати никакого ада не увидел, вполне себе читаемый код

Если запрос простой - то его изменение через "СхемуЗапроса" не сложно читается. Но текстовое изменение всё-равно будет более понятным.
Если запрос посложнее (ну хотя бы 10-20 запросов в пакете, с 3-4 уровнями вложениям и соединения) - и всё - это код становится адовым.
А уж какой ад писать такой код модификации - попробуйте сами - поймёте!
Это я ещё не стал упоминать подход из ЗУП (и EPR2) где ещё и куча временных таблиц - которые определяются в одном месте (одним текстом запроса), а используются в другом. Но тут редактирование через обработку строк не поможет. Только моя идея декларативной сборки.

Я думаю причина этого в том, что это тупо программный интерфейс конструктора запросов.

"СхемаЗапросов" отличный инструмент, чтобы перевести текст запроса в объектную модель (но первые версии и для этого были не пригодны - в общем случае). Отчасти неплохой инструмент, чтобы, собрать запрос "с нуля" (или часть запроса, которую легко конкатенировать (но не встраивать) в существующий), или чтобы что-то удалить из запроса. Но для изменения -
практически не годится. Поэтому конструктор запросов может использовать "СхемуЗапросов" только для преобразования в/из объектной модели. Но из объектной модели собрать запрос КУДА ПРОЩЕ именно через текст.

Ущербности "СхемыЗапросов" можно посвятит достаточно большую статью. Но, вот простой пример

	Текст =  "ВЫБРАТЬ
	         |	Временная.Поле
	         |ИЗ
	         |	Временная КАК Временная" ;
	сз = Новый СхемаЗапроса();
	сз.УстановитьТекстЗапроса(Текст); //Строка 0
	сз.ПакетЗапросов[0].Операторы[0].ВыбираемыеПоля.Добавить("Временная.Поле2",1); //Строка 1
	сз.ПакетЗапросов[0].Операторы[0].Отбор.Добавить("Временная.Поле2 = 1"); //Строка 2
	Текст2 = сз.ПолучитьТекстЗапроса();
Показать


Ещё пару релизов назад "Строка 0" вообще не выполнилась бы.
Но и сейчас - на 8.3.19 не выполнится ни "Строка 1" ни "Строка 2":
Ошибка: Поле не найдено &quot;Временная.Поле2


Если глубоко покапать эту тему - то станет понятно, что не хватает вот такой инструкции (перед проблемными строками)
сз.ПакетЗапросов[0].Операторы[0].Источники[0].Источник.ДоступныеПоля.Добавить("Поле2");

Результат


Обращу внимание на аргумент со значением 1 в строке "Строка 1" - это позиция добавляемого поля - именно в нё оно и будет добавлено - напишешь там 0 - затрёт существующее поле - напишешь больше 1 - добавит промежуточные поля со значениями NULL. Нужно ещё и позицию отслеживать (справедливости ради надо заметить, что этот аргумент можно опустить - и тогда поля добавляются в конец). А уж если надо вставить между существующими полями - всё - "пиши пропало"!

А теперь представьте как усложнится алгоритм - когда нужно будет так добавить сотни полей в десятки временных таблиц!
А уж как соединения добавляются...


А вот так идёт сборка с нуля

	сз = Новый СхемаЗапроса();
	пз = сз.ПакетЗапросов[0].Операторы[0];
	//пз.Источники.Добавить("Временная"); //Строка 1
	пз.Источники.Добавить(Тип("ОписаниеВременнойТаблицыСхемыЗапроса"),"Временная"); //Строка 2
	пз.Источники[0].Источник.ДоступныеПоля.Добавить("Поле");
	пз.Источники[0].Источник.ДоступныеПоля.Добавить("Поле2");
	пз.ВыбираемыеПоля.Добавить("Временная.Поле");
	пз.ВыбираемыеПоля.Добавить("Временная.Поле2");
	пз.Отбор.Добавить("Временная.Поле2 = 1"); 
	Текст2 = сз.ПолучитьТекстЗапроса();
Показать

Результат


Строка "Строка 1" не работает (хотя строковые аргументы поддерживаются) - а "Строка 2" обязательна для работы с временными таблицами.
Временные таблицы нужно обязательно каждый раз описывать.

А если уже есть готовый подзапрос - который нужно встроить в новый? Такого функционала вовсе нет - переносить нужно будет поэлементно!

Вот так нужно создавать вложенный запрос:

	сз = Новый СхемаЗапроса();
	пз0= сз.ПакетЗапросов[0].Операторы[0];
	пз = пз0.Источники.Добавить(Тип("ВложенныйЗапросСхемыЗапроса"),"Вложенная").Источник.Запрос.Операторы[0];
	пз.Источники.Добавить(Тип("ОписаниеВременнойТаблицыСхемыЗапроса"),"Временная");
	пз.Источники[0].Источник.ДоступныеПоля.Добавить("Поле");
	пз.Источники[0].Источник.ДоступныеПоля.Добавить("Поле2");
	пз.ВыбираемыеПоля.Добавить("Временная.Поле");
	пз.ВыбираемыеПоля.Добавить("Временная.Поле2");
	пз.Отбор.Добавить("Временная.Поле2 = 1"); 
	пз0.ВыбираемыеПоля.Добавить("Вложенная.Поле");
	пз0.ВыбираемыеПоля.Добавить("Вложенная.Поле2");
	Текст2 = сз.ПолучитьТекстЗапроса();
Показать

Результат


Главное - все источники описывать перед их применением и обращением к ним. Кому-то это покажется правильным, и с этим сложно не согласиться. Но в целом - всё очень заморочено - даже на таких простых примерах. Вложенных видов объектов(классов) модели "СхемаЗапроса" очень и очень много, и запутаться в них "как пить дать"!

Я не вижу реализации в данной модели получения данных

Не понял, что Вы не видете.

Если вы говорите, что написать обертку вокруг текущих запросов написать не сложно. Мне кажется, вы ошибаетесь.

Не то, чтобы совсем не сложно. Тут многое зависит от того, насколько глубоко будет происходить оптимизация - а ведь в ней вся суть и именно из-за неё будут хейтить идею адепты "чистых SQL запросов" (или просто - любители тонкой ручной настройки запросов). А оптимизаторы - это один из самых сложных блоков в любом компиляторе/кодогенераторе. Но - их развивать можно постепенно, сначала создать API взаимодействия, а потом уже оптимизировать внутренние процессы. Более того, для тонкой настройки можно вводить в конструкции Реквестов так называемые "Хинты" (подсказки - треования) - которые будут задавать определённый режим к обработке текущих Реквестов - например требующие создания промежуточного источника во временной таблице с определёнными индексами (такой подход есть и в расширенном SQL многих СУБД). Но в целом - эти "Хинты" - штука плохая - это крайняя мера - в идеале - оптимизатор сам должен это решать, опираясь на машинное обучение и статистику - делать такую оптимизацию уже совсем не просто - это уже уровень совершенно нового поколения платформы учета.

А декларативное формирование запросов 1С уже практиковала - до сих пор можете найти попытки, скажем, в УПП - где текст запроса формировался отчасти декларативно

Пример из Документ.РеализацияТоваровУслуг.ПодготовитьТаблицыДокумента


Это, конечно, жалкое зрелище, но идея правильная - странно, что отказались от развития.

Теперь пишут так (из EPR2)

Документ.РеализацияТоваровУслуг.ДанныеДокументаДляПроведения

Ну а функции как "ТекстЗапросаТаблицаТоварыОрганизаций" внутри имеют просто статический текст запроса (иногда с вариациями в виде закомментированных кусков).

Да ещё и возвращаемые вот так
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
	
Возврат ТекстЗапроса;


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

Кстати, эти вариация текстов запросов в виде закомментированных частей при работе через "СхемаЗапроса" ещё и теряются! А при текстовой обработке - не теряются (но тут уже сложности в определении, где комментарий, а где нет - но это не большие сложности).

Текущее развитие идеи запросов в конфигурация 1С - это 100% тупик! И кромешный ад! И "СхемаЗапросов" - это один из демонов (или бесов) этого ада!
9. kembrik 10 04.06.21 15:12 Сейчас в теме
Полезный пример, но в погоне за красотой листинга автором странно видеть "Т." + ИмяПоля +"=&" + ИмяПараметра вместо модного СтрШаблон("Т.%1=&%2",ИмяПоля,ИмяПараметра)
17. maraton1185 150 05.06.21 15:41 Сейчас в теме
(9) да, в типовой есть ещё вот такая обёртка:
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Текст сообщения %1, %2';
				|en = 'Message text %1, %2';"), 
			Пареметр1, Параметр2);
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,,,Отказ);	 
10. sisdrou 23 04.06.21 17:58 Сейчас в теме
Работа конечно отличная ! Явно люди заморочились с написанием кода и это наверное сейчас отлично работает. ИМХО я так код 100% реализовывать бы не стал. Если написать проще, пусть и не так красиво, то вполне удобно будет потом дорабатывать . А вот ты теперь попробуй это другому программисту отдать и пусть он тебе доработает с учетом различных изменений (удобрений и рекультивации полей или т.д.), ну или еще что там бизнесу в голову придет. Вот тут то и будут вилы, лишний мозготрах.
Fox-trot; zqzq; davdykin; +3 Ответить
11. davdykin 25 04.06.21 18:07 Сейчас в теме
Однозначно плюс за проделанную работу, но видимо я - старовер, мне понятней первый или второй вариант. А вот использовать эту штуку для "Доработки" запросов без их переписывания - это конечно хорошая идея. При необходимости попробую )
unknown181538; +1 Ответить
12. FatPanzer 04.06.21 19:38 Сейчас в теме
Для обфускации самое то.
Ну и для параметризуемого софткода удобный инструмент.

А вот для поддержки - инструмент ужасный, конечно (особенно, если его параметризировать, а не писать полностроки в скобках операторов и отборов). Хотя иногда 1С и в типовых такого начудит, что уж лучше бы написали на СхемеЗапроса - было бы понятнее.
15. PerlAmutor 155 05.06.21 09:00 Сейчас в теме
Насчет "методологической ошибки". Как мне кажется, Вашу проблему правильнее решить двумя другими способами, нежели использовать СРЕДНЕЕ():

ВЫБРАТЬ
	"Широкое поле" КАК Поле,
	2021 КАК Сезон,
	"Кукуруза" КАК Номенклатура,
	"Хрущевская" КАК Характеристика
ПОМЕСТИТЬ ТЧ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	"Широкое поле" КАК Поле,
	2021 КАК Сезон,
	"Кукуруза",
	"Прочая" КАК Характеристика
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	"Скромная грядка" КАК Поле,
	2022 КАК Сезон,
	"Огурец",
	"СШипами" КАК Характеристика
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	"Скромная грядка" КАК Поле,
	2022 КАК Сезон,
	"Огурец",
	"Горький" КАК Характеристика
Показать


// Способ 1. РАЗЛИЧНЫЕ
ВЫБРАТЬ РАЗЛИЧНЫЕ
	Т.Поле КАК Поле,
	1 КАК Поле1
ПОМЕСТИТЬ СписокПолей
ИЗ
	ТЧ КАК Т
ГДЕ
	Т.Сезон = 2021
	И Т.Номенклатура = "Кукуруза"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ РАЗЛИЧНЫЕ
	Т.Поле КАК Поле,
	1 КАК Поле1
ИЗ
	ТЧ КАК Т
ГДЕ
	Т.Сезон = 2022
	И Т.Номенклатура = "Огурец"
;
ВЫБРАТЬ
	СУММА(Т.Поле1) КАК Поле1,
	Т.Поле КАК Поле
ИЗ
	СписокПолей КАК Т
СГРУППИРОВАТЬ ПО
	Т.Поле
Показать


// Способ 2. ОБЪЕДИНИТЬ вместо ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	Т.Поле КАК Поле,
	1 КАК Поле1
ПОМЕСТИТЬ СписокПолей
ИЗ
	ТЧ КАК Т
ГДЕ
	Т.Сезон = 2021
	И Т.Номенклатура = "Кукуруза"

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	Т.Поле КАК Поле,
	1 КАК Поле1
ИЗ
	ТЧ КАК Т
ГДЕ
	Т.Сезон = 2022
	И Т.Номенклатура = "Огурец"
Показать


ВЫБРАТЬ
	СУММА(Т.Поле1) КАК Поле1,
	Т.Поле КАК Поле
ИЗ
	СписокПолей КАК Т
СГРУППИРОВАТЬ ПО
	Т.Поле


И третий способ, бонусом:

ВЫБРАТЬ
	Т.Поле КАК Поле,
	1 КАК Поле1
ПОМЕСТИТЬ СписокПолей
ИЗ
	ТЧ КАК Т
ГДЕ
	Т.Сезон = 2021
	И Т.Номенклатура = "Кукуруза"
СГРУППИРОВАТЬ ПО
	Т.Поле, 1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	Т.Поле КАК Поле,
	1 КАК Поле1
ИЗ
	ТЧ КАК Т
ГДЕ
	Т.Сезон = 2022
	И Т.Номенклатура = "Огурец"
СГРУППИРОВАТЬ ПО
	Т.Поле, 1
Показать
16. DAAbramov 10 05.06.21 14:27 Сейчас в теме
Отличная статья!
Пробовали использовать схему запроса для генерации текста запроса, однако скорость работы по сравнению с обычной конкатенацией отличается на порядки. Схема запроса медленнее примерно раз в 100.
Поэтому если надо формировать 1 запрос, это нормально, но на нагрузке она не вытягивает.
Sashares; tormozit; +2 Ответить
28. kalyaka 1105 09.06.21 09:56 Сейчас в теме
(16) Тут главное не попасть вот на это: "Программисты тратят огромное количество времени, размышляя и беспокоясь о некритичных местах кода, и пытаются оптимизировать их, что исключительно негативно сказывается на последующей отладке и поддержке. Мы должны вообще забыть об оптимизации в, скажем, 97% случаев; более того, поспешная оптимизация является корнем всех зол. И напротив, мы должны уделить все внимание оставшимся 3%."
Дональд Кнут, Структурное программирование с операторами go to
19. logarifm 1122 07.06.21 09:01 Сейчас в теме
(0) А чем отличается схема от старого доброго построителя?))
Как по мне вот его напоминание:
Прикрепленные файлы:
22. Darklight 33 07.06.21 09:59 Сейчас в теме
(19)Построитель был отличным инструментов в своём время. Его бы до ума довести - и было бы здорово! Но "Схема запроса" - конечно помощнее будет. (можно сравить так - "Построитель запроса" - это как язык 1С (или как Питон, но оба без внешних расширений), а "Схема запроса" - это как Ассемблер... хот нет - до мощи Ассемблера не дотягивает - ну тогда как Си (илм Си++) - возможностей намного больше - но жутко неудобно, очень запутанно и чревато ошибками). А главное - чтобы боле-менее эффективнее работать с построителем - нужно, чтобы текст запроса изначально был адаптирован под построитель - это было бы правильно - но, увы, никто не делает это
23. Yashazz 4791 07.06.21 11:06 Сейчас в теме
(19) в нагруженных местах до сих пор активно юзаю Построитель и всё очень даже)
24. olololeg 08.06.21 13:36 Сейчас в теме
В свое время считал что Схема Запроса это спасение от СтрЗаменить, но в типовых конфигурациях чаще встречаю СтрЗаменить, поэтому возникает вопрос настолько ли хорош этот конструктор, сколько потом у последующих разработчиков будет проблем со Схемой.
26. Dmitryiv 161 08.06.21 15:14 Сейчас в теме
(24) В типовых внедрение плюшек ограничивается большой глубиной легаси-кода и режимом обратной совместимости.
25. pepe 64 08.06.21 14:58 Сейчас в теме
А почему нельзя передать в запрос просто таблицу и потом внутренним соединением соединить с документом "Планы выращивания FPS" зачем городить такой сложный механизм? Данный механизм интересный для изменения типовых запросов, чтобы в дальнейшем проще обновлять их. Спасибо за пример.
27. savelievD 73 08.06.21 21:47 Сейчас в теме
Я в своей практике нашёл всего одно реальное применения объекту "СхемаЗапроса" - изменение запроса в источнике данных схемы компоновки данных с целью добавить поддержку ограничения выборки по количеству строк (Первые N).
Оставьте свое сообщение