Работа со схемой запроса

14.09.20

Разработка - Инструментарий разработчика

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

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Работа со схемой запроса:
.cf 57,21Kb ver:2.0.0.2
164 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

Оглавление

Введение. 1

Объектная модель запроса. 1

Структура модели. 1

Источники. 1

Соединения. 1

Поля. 1

Отбор. 1

Группировка. 1

Порядок. 1

Колонки. 1

Итоги. 1

Получение текста запроса. 1

Особенности. 1

Подсистема Работа со схемой запроса. 1

Введение. 1

Построение структуры запроса. API 1

Порядок работы.. 1

Резюме. 1

Практика использования. 1

Шаблон «Выборка из временной таблицы». 1

Шаблон «Построение текста запроса по параметрам отбора». 1

Шаблон «Последовательность преобразований источника»

Шаблон "Ханойская башня"

Шаблон «Расширение данных источника»

. 1Шаблон "Работа с характеристиками"

Примеры.. 1

Объединение. 1

Группировка. 1

Вложенный запрос. 1

Приложения. 1

Обработка «Конструктор схемы запроса». 1

Поставка. 1

Источники


. 1

Введение

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

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

Объектная модель запроса, реализованная в платформе начиная с версии 8.3.5, позволила при решении задачи получения динамического текста запроса использовать код, который уже отражал бы не манипуляции с текстом, а логику структурного построения запроса. Кроме того, в объектной модели нет смысла в манипуляции с параметрами запроса для динамического изменения логики работы запроса. Таким образом программное формирование текста запроса с использованием объектной модели позволяет получить код, подчиненный логике запроса и делает ненужным манипуляции с параметрами. Первое способствует упрощению отладки, уменьшению затрат на сопровождение и развитие программного кода, а второе - лучшей производительности выполнения запроса.

Объектная модель запроса

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

Рисунок 1. Объектная структура запроса

Объект верхнего уровня модели - это пакет запросов. Создание модели начинается с добавления запроса в пакет.

Запрос может быть:

  • на выборку данных
  • на создание временной таблицы из параметра
  • на уничтожение временной таблицы

В свойствах запроса можно указать: Разрешенные, Автоупорядочивание, Имя таблицы для помещения. Также на уровне запроса можно задать порядок выборки данных, а также настроить итоги.

Запрос состоит из операторов Выбрать. Основные составляющие оператора: источники, связи источников и поля данных. В качестве источника можно указать физическую, виртуальную, временную таблицу, параметр или вложенный запрос. В операторе Выбрать можно настроить ограничение на количество строк результата выборки и дополнительно указать признак "Выбрать различные". Результат выборки определяется условиями связей и отборов. Несколько операторов Выбрать могут быть объединены в рамках одного запроса по условию, допускающему дублирования данных (действует по-умолчанию) - "Объединить" или по условию исключающему дублирование - "Объединить Все".

Рисунок 2. Источники оператора Выбрать

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

Для виртуальной таблицы доступны параметры, по которым будет построена таблица при выполнении запроса. Список параметров для каждого вида виртуальной таблицы можно уточнить во встроенной справке (Работа с запросом -> Таблицы). В модели доступ к параметрам осуществляется по индексу.

В случае, когда необходимо описать в качестве Источника временную таблицу, которая будет создана из прикладного объекта или получена из менеджера временных таблиц, нужно указать имя параметра запроса или имя временной таблицы из менеджера временных таблиц.

Для получения связанных отношениями данных мало указать только Источники, необходимо также указать их связи или в терминах объектной модели - Соединения. По сути Соединения содержат информацию о связях двух Источников по некоторому условию.

Данные Источников оператора Выбрать определяют доступные для выбора поля. На уровне запроса поля операторов Выбрать группируются в колонках (см. описание Колонки).

Завершается описание оператора Выбрать указанием условий отбора.

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

Сортировка или в терминах модели - Порядок, определяется перечнем полей и направлений сортировки. Определяется порядок на уровне колонок запроса.

Колонки запроса определят поля выборки. При объединении нескольких операторов Выбрать одной колонке будет соответствовать несколько полей (по одному от каждого оператора Выбрать).

В отличии от полей оператора в колонках запроса можно задать тип и порядок.

Таблица 1. Соотнесение колонок запроса и полей операторов Выбрать

Индекс

Колонка запроса

Поле оператора 1

...

Поле оператора N

0

Псевдоним 1

Путь к данным 1

...

Путь к данным 1

1

Псевдоним 2

Путь к данным 2

...

Путь к данным 2

...

...

...

...

...

N

Псевдоним N

Путь к данным N

...

Путь к данным N

На уровне Запроса, помимо группировки в операторах Выбрать, можно также описать получение итогов. Итоги описываются перечнем полей группировки и выражений итогов. Поля группировки в терминологии модели - Контрольные точки итогов помимо названия поля содержат также дополнительные параметры: Начало периода дополнения, Конец периода дополнения, Тип дополнения периодами, Тип контрольной точки. Также в Запросе можно указать признак Общие итоги.

Текст запроса можно получить как для всего пакета запросов, так и для отдельного запроса из пакета.

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

Это же интерактивное поведение накладывает ограничение на порядок построения схемы запроса:

  • Запрос пакета 0
    • Оператор Выбрать
      • Источники
      • Соединения, Поля
      • Отбор
    • Оператор Выбрать ...
    • Колонки, порядок, итоги
  • Запрос пакета 1 ...

Подсистема Работа со схемой запроса

Работа напрямую с объектом "Схема запроса" обладает рядом недостатков:

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

Предлагаемая подсистема позволяет нивелировать недостатки работы объекта схемы запроса. Функции подсистемы позволяют за один вызов добавить и настроить объект подсистемы. Для достижения однозначности работы результат «интерактивных» действий объекта очищается. Объекты, которые нельзя удалить, переиспользуются при последующем вызове функции добавления. Также в подсистему добавлены сервисные функции поддержки построения запроса.

Построение структуры запроса. API

Более подробное описание API подсистемы находится в самом модуле. К функциям модуля есть комментарии в формате стандартов 1С (Описание процедур и функций), дающие полное представление об их работе: общее описание, описание параметров, примеры. Это описание доступно в контекстной подсказке при наборе кода.

Таблица 2. API

Функции

Краткое описание

Работа с запросом

 

ДобавитьЗапросПакета

Добавляет запрос выбора, создания временной таблицы, на уничтожение временной таблицы

ДобавитьЗапросПакетаИзТаблицы

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

УстановитьИндексЗапросаПакета

Вступайте в нашу телеграмм-группу Инфостарт

Схема запроса Объектная модель Конструктор запросов Конвертация Консоль

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    273320    1519    422    

1184

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы, интерфейс 8.5. Может выполнять свертку одновременно в несколько потоков, а также без непосредственного участия пользователя. Решение в Реестре отечественного ПО.

24900 руб.

20.08.2024    77053    388    171    

331

Пакетная печать Печатные формы Инструментарий разработчика Программист 1С:Предприятие 8 Платные (руб)

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

22570 руб.

06.10.2023    41268    120    54    

129

Инструментарий разработчика Нейросети Платные (руб)

Первые попытки разработки на 1С с использованием больших языковых моделей (LLM) могут разочаровать. LLMки сильно галлюцинируют, потому что не знают устройства конфигураций 1С, не знают нюансов синтаксиса. Но если дать им подсказки с помощью MCP, то результат получается кардинально лучше. Далее в публикации: MCP для поиска по метаданным 1С, справке синтакс-помощника и проверки синтаксиса.

15250 руб.

25.08.2025    67000    134    38    

142

Инструментарий разработчика Разработка Администрирование веб-серверов Системный администратор Программист Бизнес-аналитик Руководитель проекта 1С 8.3 Платные (руб)

Analyzer 1C сводит выгрузку 1С — основную конфигурацию и все расширения — в единый граф знаний. Любой запрос по связям за доли секунды, с пометками «Доб.» / «Заимств.» / «Переопределено». Новое в 2.0 — обновление поставки: сравнение и объединение версий деревом «как в Конфигураторе» с выгрузкой плана решений; поиск конфликтов из-за перехватов расширений и висячих ссылок; загрузка из бинарных .cf/.cfe; циклические зависимости. Плюс анализ влияния, запросы BSL, роли и RLS, граф вызовов. Минута на развёртывание через Docker без необходимости подключения к Интернет. Любая 1С:Предприятие 8.3+.

14000 руб.

17.04.2026    10169    43    61    

57

Инструменты администратора БД Инструментарий разработчика Роли и права Программист 1С:Предприятие 8 1C:Бухгалтерия Россия Платные (руб)

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

17000 руб.

10.11.2023    27104    99    46    

105

Инструментарий разработчика Программист 1С:Предприятие 8 Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки. 1.3.11 Доработан механизм контекстной подсказки по метаданным

9500 руб.

17.05.2024    55448    189    63    

220
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 24.04.18 10:09
Сообщение было скрыто модератором.
...
9. пользователь 26.04.18 03:59
Сообщение было скрыто модератором.
...
13. пользователь 27.04.18 03:52
Сообщение было скрыто модератором.
...
15. пользователь 28.04.18 05:25
Сообщение было скрыто модератором.
...
2. BigB 193 24.04.18 15:01 Сейчас в теме
А будет версия без БСП?
4. пользователь 25.04.18 08:26
Сообщение было скрыто модератором.
...
3. kalyaka 1182 24.04.18 15:11 Сейчас в теме
В этой подсистеме не используется БСП. Это я ввел в заблуждение.

Дело в том, что эта подсистема хотя и является самостоятельной, задумывалась как составная более крупной, в которой как раз БСП уже используется.
5. webester 26 25.04.18 15:37 Сейчас в теме
Для понимания объектной модели запроса очень помогла эта статья: https://infostart.ru/public/307045/ и вот эта обработка для раскуривания сложных запросов https://infostart.ru/public/305809/
Resident1C; +1 Ответить
6. kalyaka 1182 25.04.18 16:09 Сейчас в теме
(5) схему из 1-ой статьи я использую как дополнение к типовой справке и сейчас. Аналог обработки из 2-ой (https://infostart.ru/public/307066/) я использовал по началу, но мне очень не нравился код на выходе.
7. Fragster 1168 25.04.18 16:17 Сейчас в теме
Все равно неудобно. Построитель запросов и СтрЗаменить(Текст, "&_Плейсхолдер", "Нужный фрагмент") удобнее намного и для понимания и для доработки. Ну или в сложных случаях - скд (когда требуются плюшки типа необязательных таблиц или параметров).
8. kalyaka 1182 25.04.18 16:44 Сейчас в теме
(7) Смотря что понимать под удобством.
Я понимаю под «удобством» лучшую читаемость кода. Когда я читаю что-то типа: СтрЗаменить(Текст, Чтото, НаЧтото) -, то это мало что говорит о происходящем с самим запросом. Другое дело, когда в коде что-то типа такого: ОператорВыбрать.Отбор.Добавить(«Контрагент.Плейсхолдер = &Плейсхолдер»);
ИНТЕГРА; +1 Ответить
10. Fragster 1168 26.04.18 13:06 Сейчас в теме
(8) Просто надо задавать правильные "чтото", например &_Звездочка (это обход разворачивания звездочки во все поля конструктором;) ), &_ОтборКонтрагентов и т.п. И тогда СтрЗаменить(Текст, Чтото, НаЧтото) становится намного понятнее. А ОператорВыбрать.Отбор.Добавить(«Контрагент.Плейсхолдер = &Плейсхолдер») запросто ломается при добавлении временной таблицы или еще одной таблицы в соединение...
Ну а полностью собирать текст запроса с помощью схемы - это вообще мазохизм, загружать из строки и чуть менять - более менее, но все равно неудобно из-за того, что часто при изменении исходного запроса надо переделывать код, причем очень аккуратно.
11. kalyaka 1182 26.04.18 14:50 Сейчас в теме
(10) Допускаю, что работу с текстом можно сделать понятнее, но это все равно будет работа с текстом и только в конце результат будет загружен в запрос. Вероятность допустить ошибку при конструировании текста будет выше, т.к. при работе с моделью Вам не нужно держать модель в голове.

запросто ломается при добавлении временной таблицы или еще одной таблицы в соединение...

Почему же ломается схема при добавлении временной таблицы или соединения? Вот пример добавления временной таблицы и соединения с ней:
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "Документ.СписаниеСРасчетногоСчета", "Документы");
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "ВТ_ПЕРИОДЫ_ВГО");
РаботаСоСхемойЗапроса.ДобавитьСоединение(ОператорВыбрать, "Документы", "ВТ_ПЕРИОДЫ_ВГО", "ВТ_ПЕРИОДЫ_ВГО.Контрагент = Документы.Контрагент
|  И Документы.Дата МЕЖДУ ВТ_ПЕРИОДЫ_ВГО.ДатаНачала И ВТ_ПЕРИОДЫ_ВГО.ДатаОкончания", ТипСоединенияСхемыЗапроса.Внутреннее);
ОператорВыбрать.Отбор.Добавить("Документы.Проведен
|  И Документы.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания");


полностью собирать текст запроса с помощью схемы - это вообще мазохизм

Тоже не соглашусь. При разработки подсистемы я преследовал цель: добиться более краткого и понятного кода построения текста запроса средствами модели. Для маленьких запросов краткость не заметна, а для больших с повторениями структур код заметно компактнее (см. использование шаблонов).
Вот пример маленького запроса:
СхемаЗапроса 	= Новый СхемаЗапроса;
////////////////////////////////////////////////////////////­////////////////////
//  ЗАПРОС ПАКЕТА 0
ЗапросПакета 	= РаботаСоСхемойЗапроса.ДобавитьЗапросПакета(СхемаЗапроса);
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета);
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "Документ.ПриходныйКассовыйОрдер");
ОператорВыбрать.Отбор.Добавить("ПриходныйКассовыйОрдер.Проведен
| И ПриходныйКассовыйОрдер.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "ПриходныйКассовыйОрдер.Ссылка");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "ПриходныйКассовыйОрдер.Организация");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "ПриходныйКассовыйОрдер.Контрагент");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "ПриходныйКассовыйОрдер.СуммаДокумента");
РаботаСоСхемойЗапроса.ДобавитьПорядок(ЗапросПакета, "Ссылка");
ЗапросПакета.Автопорядок = Истина;
Выборка = РаботаСоСхемойЗапроса.СоздатьЗапрос(СхемаЗапроса, Новый Структура("ДатаНачала,ДатаОкончания", ДатаНачала,ДатаОкончания)).Выполнить().Выбрать();
Показать

На мой взгляд с таким кодом можно вполне нормально работать и изменять, добавляя новые источники, соединения и т.д.
12. Fragster 1168 26.04.18 16:00 Сейчас в теме
(11)
Почему же ломается схема при добавлении временной таблицы или соединения

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


(11)
полностью собирать текст запроса с помощью схемы - это вообще мазохизм

Теперь сравните скорость, трудоемкость и "напряжение ума" с конструктором запросов, даже в вашем примере. Например для добавления всех полей. Или группировку с функциями, всякими "естьNULL" и прочими "Имеющие".
14. kalyaka 1182 27.04.18 09:12 Сейчас в теме
(12)
я про случай когда в схему загружается текст запроса, в схеме меняются индексы подзапросов, таблиц, полей и т.п.

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

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

Теперь сравните скорость, трудоемкость и "напряжение ума" с конструктором запросов, даже в вашем примере. Например для добавления всех полей. Или группировку с функциями, всякими "естьNULL" и прочими "Имеющие"

Согласен, не стоит лишний раз напрягать мозги, когда рутинные действия можно автоматизировать. Для конструирования и отладки кода я и сделал обработку "Конструктор схемы запроса". Работать с ней можно как от исходного текста запроса или с интерактивным конструктором запроса, так и при отладке кода со схемой запроса. В 1-ом случае можно быстро получить работающий код со схемой, во 2-ом - оптимизировать код с использованием шаблонов или иными способами. Для отладки кода нужно в окне текста модуля произвести необходимые изменения и получить текст запроса.
16. Dmitriy_Kolesnikov 10 11.10.18 10:25 Сейчас в теме
Подскажите, как работает функция ЗаменитьИсточник?
17. kalyaka 1182 11.10.18 11:45 Сейчас в теме
(16) Используется метод Заменить источника схемы запроса:
Оператор.Источники.Заменить(ИндексИсточника, ДоступнаяТаблица)

Описание процедуры из подсистемы:

// Заменяет источник оператора выбрать с сохранением соединений и псевдонима.
//
// Параметры:
//  ЗапросПакета - ЗапросСхемыЗапроса
//  Оператор     - ОператорСхемыЗапроса
//  Источник     - Строка - Псевдоним источника
//			     - ИсточникСхемыЗапроса
//  Таблица      - Строка - Имя доступной таблицы (формат в справке Работа с запросами - Таблицы запросов). Если нужно передать имя временной таблицы, то указать ВременнаяТаблица.ИмяТаблицы
//  Псевдоним    - Строка - если задан, то будет заменен на псевдоним. Если использовать "*", то будет использован псевдоним по-умолчанию из имени таблицы
//	ПараметрыВиртуальнойТаблицы - Структура - ключи структуры соответствуют названиям параметров виртуальной таблицы из справки в конфигураторе без пробелов. 
//
// Пример:
//  ЗаменитьИсточник(ЗапросПакета, ОператорВыбрать, "Документы", "Документ.ПоступлениеНаРасчетныйСчет");
Процедура ЗаменитьИсточник(ЗапросПакета, Знач Оператор = Неопределено, Знач Источник, Таблица, Знач Псевдоним = "", ПараметрыВиртуальнойТаблицы = Неопределено) Экспорт
Показать
18. Dmitriy_Kolesnikov 10 14.10.18 02:41 Сейчас в теме
(17)
ИсточникСхемыЗапроса

У этого объекта есть метод Заменить.
Его параметром является НовыйИсточник типа ДоступнаяТаблицаСхемыЗапроса.
Вопрос в том, как создать ДоступнаяТаблицаСхемыЗапроса.
Конструктора у этого объекта нет.
Получить его неоткуда.
Всё, что я знаю - имя новой таблицы.
Как из имени таблицы получить объект ДоступнаяТаблицаСхемыЗапроса?
19. kalyaka 1182 15.10.18 10:01 Сейчас в теме
(18) Доступные таблицы можно получить из коллекции ДоступныеТаблицы объекта ЗапросПакета. Следующий код выведет все доступные таблицы текущей конфигурации:
---
СхемаЗапроса = Новый СхемаЗапроса;
	ЗапросПакета = СхемаЗапроса.ПакетЗапросов.Добавить(Тип("ЗапросВыбораСхемыЗапроса"));
	ДоступныеТаблицы = ЗапросПакета.ДоступныеТаблицы;
	Для Каждого ДоступнаяГруппаТаблиц Из ДоступныеТаблицы Цикл
		Сообщить("***"+ДоступнаяГруппаТаблиц.Представление+"***");
		Для каждого ДоступнаяТаблица Из ДоступнаяГруппаТаблиц.Состав Цикл
			Сообщить(ДоступнаяТаблица.Имя);
		КонецЦикла;
	КонецЦикла;
Показать

---
Пример вывода:

***Справочники***
Справочник.БанковскиеСчета
Справочник.БанковскиеСчета.Изменения
Справочник.Валюты
Справочник.Валюты.Изменения
Справочник.ВариантыОтчетов
Справочник.ВариантыОтчетов.Изменения
20. Boneman 302 15.10.18 10:13 Сейчас в теме
Баловство это все )) Когда только появилась схема запроса, я ее немного повтыкал в разных разработках..так, ради интереса, и расширения познаний. А потом забил на это, все-таки запрос поудобнее да и попривычнее будет.
В типовых конфигурациях, тоже, пока не встречал применения схемы запроса. Пусть сначала сами 1С-овцы начнут ее применять у себя, а там посмотрим.
Достаточно просто знать, что да, есть такой конструктор, можно текст запроса и по другому формировать.
А так, как в анекдоте,- " и нафига нам эти навороты в зоопарке."
s_vidyakin; +1 Ответить
21. trustasia 14 19.11.18 05:45 Сейчас в теме
(20)однако, надо поддерживать новое, качну пожалуй, вкурюсь
22. trustasia 14 19.11.18 06:02 Сейчас в теме
а вкуривать надо пожалуй начиная еще отсюда
https://infostart.ru/public/307045/
23. AllexSoft 06.02.19 00:24 Сейчас в теме
Нужная библеотека, пока в платформе не придумали подобных методов у схемы запроса.
ПС: архив для скачивания под макосью что ли собирался? Какая то проблема с кодировкой имен файлов в архиве. Не дело.. Открываю через 7zip
24. kalyaka 1182 06.02.19 08:28 Сейчас в теме
(23)
пока в платформе не придумали подобных методов у схемы запроса
Согласен, платформа сильно отстает от потребностей разработчиков. Взять тот же БСП, все то что не относится к прикладной области нужно вынести на уровень реализации в платформе.

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

На этой неделе планирую выложить существенно обновленную версию: проведен рефакторинг, позволяющий улучшить выразительность кода, добавлена поддержка работы с СКД, обновлен конструктор схемы: улучшена выразительность кода модуля схемы запроса.
25. AllexSoft 07.02.19 00:21 Сейчас в теме
(24) попробовал в деле вашу библиотеку. Вот какие выводы:
1. Общие модули переименовать с префиксом, напимер сз_РаботаСоСхемойЗапроса. Ведь в сильно измененных конфигурациях без прификсов никуда - для того что бы визуально отличать свои объекты от типовых. У себя пришлось переименовать модули и вызовы их соответственно
2. Библиотека заточена насколько я понял под конструирование запросов "с нуля", но чаще всего задачи все же изменение типового уже готового запроса программным путем через объектную модель. И вот тут не хватает функции поиска по пакетам запросов, к примеру: ЗапросПакета = РаботаСоСхемойЗапроса.НайтиПакетЗапроса(СхемаЗапроса, "втТаблицаТовары"), а то в современных типовых там запросы из стольки пакетов состоят.. сами знаете)
2.1. К предыдущему пункту - в статье не хватает самых простых примеров использования, добавление левым соединением доп. таблицы и колонки к существующему запросу или добавление поля к существующему запросу.
В примере "Построение текста запроса по параметрам отбора»" есть набросок, но в этом примере в строке РаботаСоСхемойЗапроса.ДобавитьУсловиеХарактеристики(ОператорВыбрать, Источник, "РегистрСведений.ДополнительныеСвойства»" "", "", …);
используется переменная ОператорВыбрать, которая выше никак не определена, тип ее не ясен, как она инициировалась не понятно. В общем потратив время разобраться можно конечно...
Оставлю тут готовый кусок кода модификации запроса, для тех кто начинает знакомство с библиотекой, может кому поможет
        Схема = Новый СхемаЗапроса;
	Схема.УстановитьТекстЗапроса(ТекстЗапроса);
	ОператорВыбрать = Схема.ПакетЗапросов[0].Операторы[0];
	ЗапросПакета = Схема.ПакетЗапросов[0];
	
	//  Источники
	РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "РегистрСведений.ПолученныеОригиналыДокументов");
	//  Соединения
	РаботаСоСхемойЗапроса.ДобавитьСоединение(ОператорВыбрать, "ДокументРеализацияТоваровУслуг", "ПолученныеОригиналыДокументов", "ДокументРеализацияТоваровУслуг.Ссылка = ПолученныеОригиналыДокументов.Документ");
	//  Поля
	РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "ПолученныеОригиналыДокументов.ПолученЧерезЭДО");
	
	ТекстЗапроса = Схема.ПолучитьТекстЗапроса();
Показать


3. По коду модулей, не хватает объединения в области, к хорошему быстро привыкаешь ...
4. Зачем там второй модуль общих функций не совсем понял, тем более там используется всего лишь несколько функций оттуда, может есть смысл запихнуть их в модуль РаботаСоСхемойЗапроса и избавится от доп. сервисного модуля общих функций.

А так библиотека понравилась, буду пользоваться и жду обновлений
26. kalyaka 1182 07.02.19 09:36 Сейчас в теме
(25)
1. Общие модули переименовать с префиксом
Я очень тщательно подхожу к выбору наименований названий модулей, функций, переменных. Критерий удачного выбора - выразительность написанного кода, когда смысл понятен без комментариев.

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

Ваш довод по поводу пересечения названий я понимаю. Возможно выходом может быть постобработка модулей перед внедрением, как вы и сделали, только автоматизированно. Тогда каждый сможет выбирать какой ему префикс использовать. У меня отношение к префиксам отрицательное.
2. Библиотека заточена насколько я понял под конструирование запросов "с нуля"
Действительно, библиотека родилась из практической потребности в алгоритмическом конструировании сложных запросов в нетиповой конфигурации с нуля. В ней есть функции по модификации: УдалитьИсточник, ЗаменитьИсточник, КопияОператора, ЗапросПакетаИзТаблицы, ВыражениеПоля - все они заточены на переиспользование пакетов и операторов при построении схемы.

Еще библиотека позволяет строить схему на основании промежуточных данных из менеджера временных таблиц или из таблицы значений.

Библиотека уже как год выложена, у нее несколько десятков скачиваний, однако действительно конструктивных предложений пока не поступало, и Ваше первое. Хотелось бы, чтобы сообщество более активно участвовала в ее развитии, делясь своими впечатлениями и предложениями.

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

Перед началом использования библиотеки рекомендую поиграться обработкой конструктора. В конструкторе можно увидеть рабочие примеры кода на основе любого запроса (даже с использованием индексов и итогов). Правда Конструктор раскрывает не все возможности библиотеки и это я планирую исправить в реализации его расширенной версии.
3. По коду модулей, не хватает объединения в области
Уже выложил с выделением областей.
4. Зачем там второй модуль общих функций не совсем понял
Я веду разработку нескольких универсальных библиотек, которые используют как общие модули из БСП, так и мои. Работа со схемой - это одна из. На будущее думаю сделать что-то типа автоматизированной поставки, когда функциональность отдельной библиотеки "выкусывается" из общей и в "очищенном" виде поставляется.

Спасибо за конструктивный отзыв!
27. AllexSoft 07.02.19 10:33 Сейчас в теме
(26)
(26)
В свое время, программируя на языках общего назначения, я вначале придерживался системы префиксов, однако на практике стало ясно, что т.к. количество возможных типов неограничено, то и смысл в использовании префиксов пропадает - лучше использовать верблюжью нотацию.

Я то же сторонник верблюжьей нотации, но тут есть одно но, 1С то же сторонник ее же, в итоге в сравнении\объединении в сильно измененных конфах не разберетесь где свое, а где типовое, просто по причине того что все написано единообразно и модуль РаботаСоСхемойЗапроса потеряется в куче БСПшных модулей типа РаботаСФайлами, РаботаСКонтрагентами, РаботаСБанками и тд.. собственно поэтому используем такую систему <общий префикс доработок>_<префикс типа объекта>_<наименование объекта>_<функциональное описание>
получается что то типа
пт_Док_РеализацияТоваровУслуг_Сервер
пт_Рег_ШтрихкодыНоменклатуры_Сервер
и тд.. в дереве метаданных есть же быстрый поиск, собственно вводим туда пт_ - получаем все доработанные объекты, _Док - доработанные объекты только по документам, ну и тд.
В нашей конфе (УТ11) например только добавленных общих модулей больше 100, больше 150 своих подписок, около 50 регистров сведений своих, ну и само собой кучу типовых объектов измененных. И вот представьте нам надо обновить УТ 11.0 (релиз от 2013 года), до УТ 11.4.6 (релиз 2019 года), без потери данных. именно обновить, а не перенести остатки) Там разработчик УТ уже все поменял, а тут еще наши изменения.. без какого то визуального разделения функционала это просто нереальная задача, а визуально разделить только префиксом возможно, к сожалению (группы объектов в дереве метаданных в 1С не придумали к сожалению).
Прикрепил скрин из нашей конфы, думаю понятно будет в чем плюсы нашего подхода) Касаемо конечно сильно измененных типовых конфигураций.


(26)
Перед началом использования библиотеки рекомендую поиграться обработкой конструктора.

да, собственно он мне и помог разобраться, без него к сожалению потребовалось бы гораздо больше времени что бы разобраться с использованием функционала.


(26)
Я веду разработку нескольких универсальных библиотек, которые используют как общие модули из БСП, так и мои. Работа со схемой - это одна из. На будущее думаю сделать что-то типа автоматизированной поставки, когда функциональность отдельной библиотеки "выкусывается" из общей и в "очищенном" виде поставляется.

у меня то же есть несколько довольно больших подсистем и могу вам сказать из личного опыта лучше идти по пути переопределяемых модулей (как и в БСП) - прокси вызовов БСП, своих сервисных модулей и тд. Ведь у пользователей будет целый зоопарк из версий БСП, в которых функции постоянно переименовывают и перемещают. Ну и собственно сделать модуль скажем РаботаСоСхемойЗапросаПереопределяемый, а там что нибудь типа
Функция ОкончаниеСтрокиПослеРазделителя(Строка, Разделитель = ".") Экспорт
	Возврат ОбщийКлиентСервер.ОкончаниеСтрокиПослеРазделителя(Строка, Разделитель) ;
КонецФункции

собственно и "выкусывать" при автоматизированной поставке будет проще гораздо, ведь придется обрабатывать только относительно простые переопределямые модули - прокси. Да и адаптировать к различным конфам и версиям БСП намного проще
Прикрепленные файлы:
28. AllexSoft 07.02.19 14:38 Сейчас в теме
Скачал новую версию 2.0.0.1
1. ОбщийКлиентСервер, забыли изменить версию // Версия 1.02
хотя изменения по коду есть (объединялось сравнением\объединением)
2. в модуле РаботаСоСхемойЗапроса, зачем то затесались функции по СКД. Лучше их выделить в отдельный модуль, тем более поставляете же модуль КомпановкаДанных и КомпановкаДанныхКлиентСервер - там им самое место. У себя пришлось вырезать, так как я эти два модуля не внедряю, по скд есть и БСПшный функционал + свой, эти модули далеко не всем нужны будут точно.
3. В Функция СхемаЗапросаКомпоновкиДанных, есть вызов com -объекта, лучше от него избавится, по коду особо не вчитывался, но насколько я вижу это можно переписать и без regexp. Иначе нужно обозначить что библиотека работает только на Windows
4. Конструктор схемы запроса: куда делись комментарии между блоками соединения, источники и тд.. а сейчас общей кучей, так гораздо хуже. если запрос большой фиг разберешься где какой источник добавляется, где к нему поля.. и тд.. лучше наоборот больше комментариев типа
//источники - РеализацияТоваровУслуг
....
//Источники - вложенный запрос взТовары

и тд.. вот пытался разобрать запрос с несколькими вложенными запросами и кучей источников в одном пакете, жуть )
29. kalyaka 1182 08.02.19 09:39 Сейчас в теме
(28)
1. ОбщийКлиентСервер, забыли изменить версию
Пока нет управления зависимостями как в onescript - не критично :)
2. в модуле РаботаСоСхемойЗапроса, зачем то затесались функции по СКД
Эти функции мне потребовались при работе с универсальными отборами, когда на их основе нужно построить запрос (встроить условия из СКД в запрос)
3. В Функция СхемаЗапросаКомпоновкиДанных, есть вызов com -объекта
Там используется regexp для конвертации параметров отбора СКД в выражениях условий. Далее я планирую еще шире использовать регулярные выражения, например, для описания состава полей.
4. Конструктор схемы запроса: куда делись комментарии между блоками соединения
В конструкторе есть галочка "Добавить комментарии", по всей видимости вам не хватило. Ок, в следующей версии добавлю еще, например, ваше предложение в запросы пакета добавить в комментарий имя временной таблицы или имя первого источника - принято :).
вот пытался разобрать запрос с несколькими вложенными запросами
Могу себе представить. Вложенные запросы очень громоздки и плохо оптимизируются при исполнении. Вместо подзапросов рекомендую использовать временные таблицы.

Работа с временными таблицами хорошо поддерживается библиотекой. Например, нужно выбрать таблицу значений в объединении с таблицей из базы с расчетом суммы разницы по полю Количество:
Перем СхемаЗапроса, ОператорВыбрать;

Таблица = Документы._ДемоРеализацияТоваров.СоздатьДокумент().Товары.Выгрузить();
////////////////////////////////////////////////////////////­////////////////////
//  ЗАПРОС ПАКЕТА 0. ВТ_ТОВАРЫ_0 Выбор из таблицы
РаботаСоСхемойЗапроса.ЗапросПакетаИзТаблицы(СхемаЗапроса, РаботаСоСхемойЗапроса.ОписаниеВременнойТаблицы("&Товары", Таблица),, "*", "ВТ_ТОВАРЫ_0",,,, Истина);
////////////////////////////////////////////////////////////­////////////////////
//  ЗАПРОС ПАКЕТА 1. ВТ_ТОВАРЫ_1 Объединение таблицы с данными из базы
ЗапросПакета = РаботаСоСхемойЗапроса.ЗапросПакетаИзТаблицы(СхемаЗапроса, "ВТ_ТОВАРЫ_0",, "*", "ВТ_ТОВАРЫ_1",,, ОператорВыбрать);
ОператорВыбрать = РаботаСоСхемойЗапроса.КопияОператора(ЗапросПакета, ОператорВыбрать);
РаботаСоСхемойЗапроса.ЗаменитьИсточник(ЗапросПакета, ОператорВыбрать, "ВТ_ТОВАРЫ_1", "Документ._ДемоРеализацияТоваров.Товары");
ОператорВыбрать.Отбор.Добавить("ВТ_ТОВАРЫ_1.Номенклатура = &Номенклатура");
РаботаСоСхемойЗапроса.ВыражениеПоля(ОператорВыбрать,, "Количество", "-Количество");
РаботаСоСхемойЗапроса.УдалитьКолонку(ЗапросПакета, "НомерСтроки");
РаботаСоСхемойЗапроса.УдалитьКолонку(ЗапросПакета, "Цена");
////////////////////////////////////////////////////////////­////////////////////
//  ЗАПРОС ПАКЕТА 2. ВТ_ТОВАРЫ Группировка результата
ЗапросПакета = РаботаСоСхемойЗапроса.ЗапросПакетаИзТаблицы(СхемаЗапроса, "ВТ_ТОВАРЫ_1",, "*", "ВТ_ТОВАРЫ",,, ОператорВыбрать);
РаботаСоСхемойЗапроса.ВыражениеПоля(ОператорВыбрать, "СУММА", "Количество");
Показать
Здесь использованы приемы, описанные в статье:
Шаблон «Выборка из временной таблицы»
Шаблон «Последовательность преобразований источника»
Шаблон "Ханойская башня".
Насколько получился компактным код можно оценить, если скопировать этот код в конструктор и получить текст запроса. Если же пойти дальше и по полученному тексту запроса сгенерировать код схемы, то можно оценить как знание приемов библиотеки позволяет сокращать код. Более того, использование при построении схемы указания неявного списка полей "*" позволяет писать универсальные алгоритмы.
30. ylyas 25 25.03.19 13:33 Сейчас в теме
Вроде бы круто... но применительно к запросом с временными таблицами на несколько экранов..
читать их в такой парадигме- просто жесть. каша из кода который сразу весь не просмотришь. и не поймешь сразу где что надо поправить... ну.. фиг знает...
31. s_vidyakin 68 17.04.19 21:16 Сейчас в теме
1С попыталась сделать аналог Hibernate Criteria но из-за куцего языка всё это превратилось в унылое громоздкое нечто
В JavaScript для node есть knex.js , вот это реально удобно использовать
39. mity1982 08.09.20 19:47 Сейчас в теме
(31)
knex.js
Посмотрел, knex. Вообще если задаться целью вполне реально такой синтаксис прикрутить к 1С. Контекстной подсказки только не будет, и что то локоничное в замен передачи функции параметром придется придумывать.
32. MuI_I_Ika 1239 07.06.19 16:22 Сейчас в теме
А условия распространения какие?
33. kalyaka 1182 10.06.19 14:19 Сейчас в теме
(32) Свободные :)
Думаю в ближайшее время опубликовать на github на условиях open source, пусть это будут условия Attribution 4.0 International (CC BY 4.0)
34. sparhh 18.06.19 12:34 Сейчас в теме
Есть ли возможность добавлять через схему необязательные источники?
Имею ввиду через фигурные скобки {ЛЕВОЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет}
35. kalyaka 1182 19.06.19 10:32 Сейчас в теме
(34) Можно стандартным способом, используя свойство соединения
Соединение.ОбязательноеСоединение = Ложь;

Пример кода:
	Перем СхемаЗапроса, ОператорВыбрать;
	////////////////////////////////////////////////////////////­////////////////////
	//  ЗАПРОС ПАКЕТА 0
	ЗапросПакета 	= РаботаСоСхемойЗапроса.ЗапросПакета(СхемаЗапроса,,, ОператорВыбрать, Истина);
	РаботаСоСхемойЗапроса.Источник(ОператорВыбрать, "Справочник.Валюты");
	РаботаСоСхемойЗапроса.Источник(ОператорВыбрать, "РегистрСведений.КурсыВалют.СрезПоследних", "КурсыВалютСрезПоследних");
	Соединение = РаботаСоСхемойЗапроса.Соединение(ОператорВыбрать, "Валюты", "КурсыВалютСрезПоследних", "Валюты.Ссылка = КурсыВалютСрезПоследних.Валюта", ТипСоединенияСхемыЗапроса.Внутреннее);
	РаботаСоСхемойЗапроса.Поле(ЗапросПакета, ОператорВыбрать,, "Валюты.Ссылка");
	РаботаСоСхемойЗапроса.Поле(ЗапросПакета, ОператорВыбрать,, "КурсыВалютСрезПоследних.Курс");
	
	Сообщить(СхемаЗапроса.ПолучитьТекстЗапроса());
	
//ВЫБРАТЬ
//	Валюты.Ссылка КАК Ссылка,
//	КурсыВалютСрезПоследних.Курс КАК Курс
//ИЗ
//	Справочник.Валюты КАК Валюты
//		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
//		ПО Валюты.Ссылка = КурсыВалютСрезПоследних.Валюта
	
	Соединение.ОбязательноеСоединение = Ложь;
	
	Сообщить(СхемаЗапроса.ПолучитьТекстЗапроса());
	
//ВЫБРАТЬ
//	Валюты.Ссылка КАК Ссылка,
//	КурсыВалютСрезПоследних.Курс КАК Курс
//ИЗ
//	Справочник.Валюты КАК Валюты
//		{ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
//		ПО Валюты.Ссылка = КурсыВалютСрезПоследних.Валюта}
Показать

Однако практического применения такому я не нашел. Дело в том, что я предполагаю, что запрос алгоритмически строится в нужном виде сразу, а используя подход СКД не нужно использовать схему, достаточно просто один раз сделать запрос в конструкторе.
36. sparhh 19.06.19 11:05 Сейчас в теме
(35) Понятно. Спасибо.
Я просто не дочитал Справку)

А практическое применение такое: доработка форм списка и журнала в типовых, доработка динамического запроса в переопределяемых модулях. Все чисто и красиво.
37. kalyaka 1182 19.06.19 11:45 Сейчас в теме
(36) для доработки запроса динамического списка в формах выбора у меня есть решение Работа с данными выбора, которое базируется на использовании схемы запроса
38. skv_79 393 29.08.19 10:37 Сейчас в теме
Спасибо, интересно
40. JohnyDeath 302 12.04.21 15:08 Сейчас в теме
Подскажите, можно ли манипулировать таким запросом:
ВЫБРАТЬ
	Реквизиты.Дата КАК Период,
	Реквизиты.Ссылка КАК Регистратор,
	Реквизиты.Организация КАК Организация
ИЗ
	Реквизиты КАК Реквизиты


Генератор модели подсказывает, что код будет следующим:
МодельЗапроса = ХПП_ОбщегоНазначения.МодельЗапроса();
//  ЗАПРОС ПАКЕТА. Реквизиты
МодельЗапроса.ЗапросПакета("Реквизиты");
МодельЗапроса.Выбрать()
	.Источник("Реквизиты", "Реквизиты")
	.Поле("Реквизиты.Дата", "Период")
	.Поле("Реквизиты.Ссылка", "Регистратор")
	.Поле("Реквизиты.Организация");
Показать

Но его выполнение вываливает ошибку:
Таблица не найдена
{ОбщийМодуль.РаботаСоСхемойЗапроса.Модуль(687)}: Оператор.Источники.Добавить(Таблица, Псевдоним);
{Обработка.МодельЗапроса.МодульОбъекта(251)}: Источник = РаботаСоСхемойЗапроса.Источник(ОператорВыбрать, Таблица, Псевдоним, ПараметрыТаблицы);
{(4)}:МодельЗапроса.Выбрать()
{ВнешняяОбработка.КонструкторМоделиЗапроса.Форма.Форма.Форма(81)}: Выполнить(Объект.ТекстМодели.ПолучитьТекст());
{ВнешняяОбработка.КонструкторМоделиЗапроса.Форма.Форма.Форма(88)}: Текст.УстановитьТекст(ПолучитьТекстЗапроса());

по причине:
Таблица не найдена
41. kalyaka 1182 12.04.21 15:17 Сейчас в теме
(40) Модель может работать только с валидными запросами, так же как и схема запросов. В вашем тексте запроса не определена таблица Реквизиты. Если это параметр, то нужно написать так: &Реквизиты КАК Реквизиты. Однако даже в этом случае потребуется описание источника: .Источник("&Реквизиты", "Реквизиты", Таблица), где Таблица - таблица значений, коллекция данных формы.
Еще возможно это временная таблица, но тогда она тоже должна быть описана выше, или находится в менеджере временных таблиц модели.
42. JohnyDeath 302 12.04.21 16:03 Сейчас в теме
(41) так в том-то и дело, что хотел добавить реквизит в типовой документ, а там запрос же собирается по разным процедурам и вышестоящий запрос, где определена эта ВТ располагается в другой процедуре

Выглядит это почти во всех типовых вот так:
Функция ТекстЗапросаРеквизитыДокумента(НомераТаблиц)

	НомераТаблиц.Вставить("Реквизиты", НомераТаблиц.Количество());
	
	ТекстЗапроса =
	"ВЫБРАТЬ
	|	Реквизиты.Дата КАК Период,
	|	Реквизиты.Ссылка КАК Регистратор,
	|	Реквизиты.ВидОперации КАК ВидОперации,
	|	Реквизиты.Организация КАК Организация,
	|	Реквизиты.СчетУчетаРасчетовСКонтрагентом КАК СчетУчета,
	|	Реквизиты.НалоговыйПериод КАК НалоговыйПериод,
	|	Реквизиты.ВалютаДокумента КАК ВалютаДокумента,
	|	ВЫБОР
	|		КОГДА Реквизиты.НомерВходящегоДокумента = """"
	|			ТОГДА &БезНомера
	|		ИНАЧЕ Реквизиты.НомерВходящегоДокумента
	|	КОНЕЦ КАК НомерВходящегоДокумента,
	|	Реквизиты.Дата КАК ДатаВходящегоДокумента,
	|	&ОрганизацияПрименяетУСН КАК УчитыватьЗадолженностьУСН,
	|	&ОрганизацияПрименяетУСНПатент КАК УчитыватьЗадолженностьУСНПатент,
	|	Реквизиты.НаправлениеДвижения КАК НаправлениеДвижения,
	|	Реквизиты.РасчетыПоРеализации КАК РасчетыПоРеализации,
	|	Реквизиты.РасчетыПоКредитамИЗаймам КАК РасчетыПоКредитамИЗаймам,
	|	Реквизиты.ВозвратКредитаЗайма КАК ВозвратКредитаЗайма,
	|	Реквизиты.ЭтоВозврат КАК ЭтоВозврат,
	|	Реквизиты.ЭтоВыплатаЗарплаты КАК ЭтоВыплатаЗарплаты,
	|	Реквизиты.ЭтоВыплатаПоДоговоруПодряда КАК ЭтоВыплатаПоДоговоруПодряда,
	|	НЕОПРЕДЕЛЕНО КАК БанковскийСчет,
	|	Реквизиты.СчетКасса КАК СчетУчетаДенежныхСредств,
	|	Реквизиты.ПодразделениеОрганизации КАК Подразделение,
	|	НЕОПРЕДЕЛЕНО КАК ПодразделениеДт,
	|	Реквизиты.Приложение КАК Приложение,
	|	Реквизиты.СуммаДокумента КАК СуммаДокумента,
	|	ВЫРАЗИТЬ(Реквизиты.Содержание КАК СТРОКА(150)) КАК Содержание
	|ИЗ
	|	Реквизиты КАК Реквизиты";
		
	// Сюда хотел встроиться и добавить один реквизит в выборку
	
	Возврат ТекстЗапроса + ОбщегоНазначенияБПВызовСервера.ТекстРазделителяЗапросовПакета();
	
КонецФункции
Показать


Придется, наверное, по старинке - через стрЗаменить (
43. kalyaka 1182 12.04.21 16:15 Сейчас в теме
(42) Ну да, в отличии от текста, в схеме запроса схема всегда валидна.
44. 1cembreg 25 16.07.21 18:09 Сейчас в теме
Возник вопрос по ходу изучения функционала схемы запроса. Имеется большой текст запроса, который потом модифицируется с помощью схемы. Последняя таблица пакета это объединение двух источников. Раньше просто мы этот запрос собирали из ТекстЗапросаПервогоисточника + ТекстОбъединитьВсё + ТекстЗапросаВторогоИсточника либо только из ТекстЗапросаПервогоИсточника либо из ТекстЗапросаВторогоИсточника

Пробуем использовать схему, если я правильно понимаю, делать это надо через удаление операторов объединения (Их там два идентичных с индексом 0 и 1) и одного из источников со сменой индекса в случае необходимости?
45. kalyaka 1182 16.07.21 20:05 Сейчас в теме
(44) Схема запроса не очень хорошо приспособлена для модификации существующих запросов, как ни странно это может звучать :). На мой взгляд схема хороша именно при сборке сложных динамических или часто меняющихся запросов. Также она хороша для частых модификаций и рефакторинга запросов. Для работы со схемой у меня есть отдельная разработка Модель запроса, которая является объектной надстройкой над библиотекой РаботаСоСхемойЗапроса. Сам проект открыт, выложен на github, а библиотека теперь развивается в составе нового проекта.

Возможно в вашем случае вам поможет пример из публикации Снежинка для запроса: Объединение результатов, использование однородных по структуре выборок в запросе с объединением.

Если скажем вы делаете объединение путем копирования оператора по образцу, то возможно текущий оператор уточнять: удалять лишние источники, заменять источники, удалять поля, описывать дополнительные поля - это нормально и укладывается в парадигму конструирования запроса.

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

Если же вы начнете модифицировать запросы из пакета, то могут случиться неприятности - схема может порушится. Скажем вы удалили поле в первом запросе, а оно использовалось в других запросах. Или вы удалили поля и тут же добавили, возможно те же, но схема уже будет разрушена!

Еще есть же конструктор схемы и модели запроса, в них можно экспериментировать. Там можно генерировать как код модели, так и из модели получать текст запроса.
46. cdiamond 237 22.01.25 20:38 Сейчас в теме
NULL КАК ПустоеПоле - как добавить? В лоб Оператор.ВыбираемыеПоля.Добавить("NULL") не вставляет NULL в запрос
47. kalyaka 1182 23.01.25 11:27 Сейчас в теме
(46) Если воспользоваться конструктором:
Исходный текст запроса:
выбрать null как ПустоеПоле

Код для схемы запроса:
Перем СхемаЗапроса, ОператорВыбрать;
////////////////////////////////////////////////////////////­////////////////////
//  ЗАПРОС ПАКЕТА 0
ЗапросПакета 	= РаботаСоСхемойЗапроса.ЗапросПакета(СхемаЗапроса,,, ОператорВыбрать);
РаботаСоСхемойЗапроса.Поле(ЗапросПакета, ОператорВыбрать,, "NULL", "ПустоеПоле");

Код для модели запроса
;//  ЗАПРОС ПАКЕТА.
МодельЗапроса.ЗапросПакета()
	.Выбрать()
		.Поле("NULL", "ПустоеПоле")
;//  Обработка результата
//МодельЗапроса.ВыполнитьЗапрос();

Если "в лоб", то Ваш код выглядит правильным
48. cdiamond 237 23.01.25 17:26 Сейчас в теме
(47) Да, разобрался. Ошибка была в другом и его стоит тут описать для таких же страдальцев:

В типовом ERP есть в реглучете куча запросов, которые успешно загружаются в СхемуЗапроса. Но при выгрузке в текст можно получить полную ерунду, потому что в исходном запросе могут быть в секции ВЫБРАТЬ такие поля как &АналитикиУчета, которое пройдя через СхемуЗапроса превращаются в &АналитикиУчета КАК АналитикиУчета. Что при дальнейшей обработке типовым кодом приводит к лишнему КАКу.
Вторая проблема, которая вообще нерешаемая - если в секции группировки будет аналогичный тег - то при загрузке в СхемуЗапроса и при выгрузке он не выбрасывает исключения. Полученный текст запроса будет ошибочным.
В общем нужно очень внимательно изучить текст запроса, который собрался модифицировать этим средством.
49. kalyaka 1182 23.01.25 18:29 Сейчас в теме
(48) мои решения для работы со схемой запроса рассчитаны не на модификацию, а на сборку. Если нужно добавить отборы в существующий запрос - это нормально, а вот если нужно изменить запрос в середине пакета или поменять источники/соединения - то это уже лучше делать пересборкой схемы запроса
Для отправки сообщения требуется регистрация/авторизация