Процедуры для замены текста запросов через схему запросов

06.09.19

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

Модуль с процедурами по работе с текстами запросов через схему запросов.

Скачать исходный код

Наименование Файл Версия Размер
Процедуры для замены текста запросов через схему запроссов:
.epf 7,69Kb
15
.epf 1 7,69Kb 15 Скачать

   Предлагаю вашему вниманию несколько процедур для изменения текста запроса, замена(добавление) полей в ВЫБРАТЬ, добавление (замена) условия в запрос. Так же можно заменить исходную таблицу в запросе.

Ограничение одно он не может править вложенные запросы, зато все остальные, будь то пакет или объединение можно исправить, добавить.

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

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

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

Процедуры с комментариями, поэтому не должно доставить много проблем. Так же ниже пример изменения запроса и процедуры которые есть в данном модуле.


// заменить поля в колноках
// in( out ) ТекстЗапроса - Текст заменяемого запроса
// in ПараметрыЗамены - Структура 
// 	ДанныеЗамены - Структура, ключ Имя колонки, Значение Новое выражение поля
//  ДоступныеПоля Структура Ключ ИмяИсточника, Значение - Массив строки с добавляемыми досупными полями( эта хрень нужня для выборки из временной таблицы, без них добавленные поля выдадут ошибку)
// 	НомерПакета - Номер пакета в пакете запросов, (для пакета, по умолчанию 0)
// 	Номераполей - Массив с номерами полей для замены, если неопределено то все поля, по умолчанию неопределено
Процедура ЗаменитьПоляЗапроса(ТекстЗапроса,ПараметрыЗамены) Экспорт

....

Процедура ЗаменитьИсходныеДанные(ТекстЗапроса,ПараметрыЗамены) Экспорт

Процедура ДобавитьПоляВЗапрос(ТекстЗапроса,ПараметрыДобавления)

Процедура ДобавитьУсловиеВЗапрос(ТекстЗапроса,ПараметрыУсловия) Экспорт

Процедура ЗаменитьУсловиеВЗапросе(ТекстЗапроса,ПараметрыУсловия)

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

	
	
	//МассивПолей = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("Партнер,Контрагент");
	NF_РаботаСЗапросамиСлужебный.ЗаменитьПоляЗапроса(Результат,ПараметрыЗамены);
	ТекстыЗапроса.Добавить(Результат,"Закупки");
	Возврат Результат;
КонецФункции

Все тестировалось на платформе 8.3.13.1865  конфигурация ЕРП 2.4.6.207

Но должно работать везде, где есть Схема Запросов.

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

Запросы изменениетекстаЗапроса

См. также

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

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

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

10000 руб.

02.09.2020    124936    682    389    

732

Infostart PrintWizard - создание и редактирование печатных форм в 1С 8.3

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

18000 руб.

06.10.2023    7770    24    6    

42

Infostart УДиФ: Управление данными и формами

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

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

10000 руб.

10.11.2023    4283    12    2    

36

SALE! %

PowerTools

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

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

3600 2280 руб.

14.01.2013    178645    1083    0    

861

Многопоточность. Универсальный «Менеджер потоков» 2.1

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

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99623    239    97    

298

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

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

3000 руб.

27.08.2019    18389    6    8    

40

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

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

2400 руб.

24.09.2019    23856    16    15    

33

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28322    3    10    

16
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. cool99 06.09.19 16:30 Сейчас в теме
Заголовок хоть поправьте :) "запроССов"
+
2. bmk74 234 06.09.19 16:47 Сейчас в теме
(1) Спасибо поправил :)...но с с двумя сс как то загадочнее было :)
+
3. dhurricane 06.09.19 23:12 Сейчас в теме
Небольшая заметка.

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

Как это может проявляться? Вот несколько примеров.
Платформа 8.3.15.1489
Конфигурация 1С:ERP Управление предприятием 2 (2.4.7.141)

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

2) Добавление псевдонимов выражениям расширения языка запросов для СКД. Вполне рабочий запрос набора данных:
ВЫБРАТЬ
	Валюты.Ссылка,
	Валюты.Код,
	Валюты.Наименование
ИЗ
	Справочник.Валюты КАК Валюты
{ГДЕ
	Валюты.Код = &Код}
Здесь параметр "Код" является опциональным. Если пользователь включит использование параметра, отбор по коду сработает, если не включит - будут выбраны все элементы справочника. Однако после работы со схемой запроса получаем следующий текст запроса:
ВЫБРАТЬ
	Валюты.Ссылка КАК Ссылка,
	Валюты.Код КАК Код,
	Валюты.Наименование КАК Наименование
ИЗ
	Справочник.Валюты КАК Валюты
{ГДЕ
	(Валюты.Код = &Код) КАК Поле2}
Теперь бесполезно включать и выключать использование параметра "Код". Он не повлияет на результат запроса до тех пор, пока мы дополнительно не установим отбор по полю "Поле2".

3) Автогенерация связей таблиц. Для интерактивной работы с конструктором запроса это не проблема. Но когда работаешь с запросом программно, используя схему запроса, отсутсвие полного контроля над связями таблиц может раздражать.
Пусть у нас есть исходный запрос данных справочника Номенклатуры:
ВЫБРАТЬ
	Номенклатура.Ссылка КАК Ссылка
ИЗ
	Справочник.Номенклатура КАК Номенклатура
Попробуем добавить левое соединение с таблицей "Товары" документа "РеализацияТоваровУслуг":
Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса(ТекстЗапроса);

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

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

Оператор.Источники[Оператор.Источники.Количество()-1].Соединения.Очистить();
Дмитрий74Чел; Рамзес; Cmapnep; Dmitryiv; K_A_O; Batman; +6
4. bmk74 234 07.09.19 14:12 Сейчас в теме
(3)
Результат выполнения такого запроса конечно же не изменится, но такое изменение текста очень больно отзовется, если запрос применяется в динамическом списке. Элементы формы, связанные со стандартными реквизитами справочника, потеряют связь с полями динамического списка, или говоря проще, очистится их свойство "ПутьКДанным". Соответственно в таких колонках перестанут отображаться данные.

Это почему они должны потерять связь у вас путь к данным что в первом случае что во втором будет один и тот же "Список.Ссылка", для ссылки ??? так что не должен потерять ничего..кстати применял и к запросу динамического списка, все отрабатывало...

2) Добавление псевдонимов выражениям

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

3) Автогенерация связей таблиц

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

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

P.S. А вообще данные функции использовал для замены запросов в основном для замены таблиц для проведения и пока ошибок там не было найдено, что бы что то не так сделал...
+
5. dhurricane 07.09.19 14:42 Сейчас в теме
(4) Прошу прощения, если я ввел Вас в заблуждение своими рассуждениями, и Вам показалось, что это критика данной публикации. Я действительно не тестировал Вашу разработку. Зацепившись глазом за СхемуЗапроса, я лишь хотел поделиться своими наблюдениями относительно этого объекта встроенного языка, ну и поинтересоваться, решали ли Вы подобные проблемы. И не более того.

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

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

По поводу лишних связи, как я уже сказал, я не тестировал Вашу разработку. Я лишь поделился своими наблюдениями. Еще раз приношу свои извинения, если мои рассуждения на тему схемы запроса оказались неуместными.
+
6. bmk74 234 07.09.19 16:19 Сейчас в теме
(5)Ну почему по второму пункту кстати правильное замечание.

1с рекомендует замену запроса динамического списка делать такой конструкцией

СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка();
СвойстваСписка.ОсновнаяТаблица = "Документ.ЗаказКлиента";
СвойстваСписка.ДинамическоеСчитываниеДанных = Истина;
СвойстваСписка.ТекстЗапроса = ТекстИсходногоЗапроса;
ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.Список, СвойстваСписка);


Может быть так получиться, хотя честно говоря не пробовал менять текст запроса по команде..всегда при создании делал...
+
7. cool99 09.09.19 12:00 Сейчас в теме
Вот как появилась возможность использовать схему, ни одной реальной задачи такой не было, где бы потребовалось.
И кстати оно довольно тормознутое, кто-то из знакомых юзал и сказал по итогам.
+
8. bmk74 234 09.09.19 13:11 Сейчас в теме
(7)
И кстати оно довольно тормознутое, кто-то из знакомых юзал и сказал по итогам.

Тормозов замечено не было от слова вовсе.
А задачи я написал, замена запросов при проведении документов, в основном..что бы потом при обновлении конфы меньше проблем было.
+
9. cool99 09.09.19 13:18 Сейчас в теме
(8)Ну хз... это в 16 году было... мож щас подтянули производительность... Ну пожалуй да, разве что для изменения типовых может пригодится, а так чтобы в самописном коде использовать польза отнюдь не очевидна
+
10. NoRazum 29 29.07.20 10:18 Сейчас в теме
ВЫБРАТЬ
    Валюты.Ссылка КАК Ссылка,
    Валюты.Код КАК Код,
    Валюты.Наименование КАК Наименование
ИЗ
    Справочник.Валюты КАК Валюты
{ГДЕ
    (Валюты.Код = &Код) КАК Поле2}


В динамическом списке столкнулся с таким БАГОМ. Долго не мог понять. ПОЧЕМУ.

Слишком умным это СхемаЗапроса себя считает.
+
Оставьте свое сообщение