0. kalyaka 488 05.04.18 22:45 Сейчас в теме

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

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

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. Steelvan 24.04.18 10:09 Сейчас в теме
Попозже подробнее ознакомлюсь.
2. BigB 179 24.04.18 15:01 Сейчас в теме
3. kalyaka 488 24.04.18 15:11 Сейчас в теме
В этой подсистеме не используется БСП. Это я ввел в заблуждение.

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

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

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


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

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

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

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


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

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

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

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

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

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

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

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

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

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

***Справочники***
Справочник.БанковскиеСчета
Справочник.БанковскиеСчета.Изменения
Справочник.Валюты
Справочник.Валюты.Изменения
Справочник.ВариантыОтчетов
Справочник.ВариантыОтчетов.Изменения
20. Boneman 221 15.10.18 10:13 Сейчас в теме
Баловство это все )) Когда только появилась схема запроса, я ее немного повтыкал в разных разработках..так, ради интереса, и расширения познаний. А потом забил на это, все-таки запрос поудобнее да и попривычнее будет.
В типовых конфигурациях, тоже, пока не встречал применения схемы запроса. Пусть сначала сами 1С-овцы начнут ее применять у себя, а там посмотрим.
Достаточно просто знать, что да, есть такой конструктор, можно текст запроса и по другому формировать.
А так, как в анекдоте,- " и нафига нам эти навороты в зоопарке."
21. trustasia 12 19.11.18 05:45 Сейчас в теме
(20)однако, надо поддерживать новое, качну пожалуй, вкурюсь
22. trustasia 12 19.11.18 06:02 Сейчас в теме
а вкуривать надо пожалуй начиная еще отсюда
https://infostart.ru/public/307045/
23. AllexSoft 06.02.19 00:24 Сейчас в теме
Нужная библеотека, пока в платформе не придумали подобных методов у схемы запроса.
ПС: архив для скачивания под макосью что ли собирался? Какая то проблема с кодировкой имен файлов в архиве. Не дело.. Открываю через 7zip
24. kalyaka 488 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 488 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 488 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 17.04.19 21:16 Сейчас в теме
1С попыталась сделать аналог Hibernate Criteria но из-за куцего языка всё это превратилось в унылое громоздкое нечто
В JavaScript для node есть knex.js , вот это реально удобно использовать
32. MuI_I_Ika 648 07.06.19 16:22 Сейчас в теме
А условия распространения какие?
33. kalyaka 488 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 488 19.06.19 10:32 Сейчас в теме
(34) Можно стандартным способом, используя свойство соединения
Соединение.ОбязательноеСоединение = Ложь;

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

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

А практическое применение такое: доработка форм списка и журнала в типовых, доработка динамического запроса в переопределяемых модулях. Все чисто и красиво.
37. kalyaka 488 19.06.19 11:45 Сейчас в теме
(36) для доработки запроса динамического списка в формах выбора у меня есть решение Работа с данными выбора, которое базируется на использовании схемы запроса
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Москва
Полный день

Консультант-аналитик 1С
Москва
Полный день

Консультант ERP-систем
Москва
Временный (на проект)

Бизнес-аналитик 1С
Москва
зарплата от 90 000 руб. до 150 000 руб.
Полный день

Программист 1С
Москва
зарплата от 140 000 руб.
Полный день