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

06.09.19

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Процедуры для замены текста запросов через схему запроссов:
.epf 7,69Kb ver:1
17
17 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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

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

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


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

....

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

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

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

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

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

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

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

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

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

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

См. также

SALE! 15%

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

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

10000 руб.

02.09.2020    159736    876    399    

862

SALE! 15%

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

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

8400 7140 руб.

20.08.2024    7911    59    23    

70

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

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

9360 руб.

17.05.2024    23521    68    45    

117

SALE! 15%

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

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

10000 8500 руб.

10.11.2023    10480    36    25    

61

SALE! 15%

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

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

22200 19980 руб.

06.10.2023    15449    35    7    

70

SALE! 35%

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

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

4800 3120 руб.

14.01.2013    188088    1140    0    

912

SALE! 15%

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 12750 руб.

07.10.2021    17321    6    32    

42

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

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

1800 руб.

21.02.2023    7726    8    35    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. cool99 06.09.19 16:30 Сейчас в теме
Заголовок хоть поправьте :) "запроССов"
2. bmk74 240 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 240 07.09.19 14:12 Сейчас в теме
(3)
Результат выполнения такого запроса конечно же не изменится, но такое изменение текста очень больно отзовется, если запрос применяется в динамическом списке. Элементы формы, связанные со стандартными реквизитами справочника, потеряют связь с полями динамического списка, или говоря проще, очистится их свойство "ПутьКДанным". Соответственно в таких колонках перестанут отображаться данные.

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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