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

05.09.24

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

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

Однажды столкнулся с задачей, когда нужно было в динамическом в колонке "Количество (доступно)" вместо нулевого количества товара выводить, к примеру "дату поступления товара".

Чтобы решить данную задачу, нужно было в запросе, формирующем данные для динамического списка, найти фрагмент текста запроса, который выбирает данные для получения доступного остатка. И если остаток = 0, тогда подставлять значение "даты поступления". Для выполнения этих действий сначала нужно было: 

  1. Получить выходной текст запроса динамического списка;
  2. Найти вычисляемое поле, которое формирует доступный остаток и в запросе делать подмену на свое значение.

С первым пунктом все было просто, поскольку получить текст запроса на выходе очень просто:

ТекстЗапроса = Список.ТекстЗапроса; //у динамического списка есть свойство "ТекстЗапроса"

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

  1. С помощью функции встроенного языка "СтрНайти" получить номер последнего символа вычисляемого поля запроса зная его псевдоним который постоянен: ПоследнийСимвол = СтрНайти(Строка(ТекстЗапроса), "КАК Доступно");
  2. С помощью функции встроенного языка "СтрНайти" получить номер первого символа вычисляемого поля, зная какое поле предшествует нашему. В моем случае это было поле с псевдонимом "КАК БазовыеЕдиницыИзмерения". Пример получения первого символа: ПервыйСимвол = СтрНайти(Строка(ТекстЗапроса),"КАК БазовыеЕдиницыИзмерения");
  3. Зная первый и последний символ в строке запроса, можно с помощью функции встроенного языка "Сред" вырезать из запроса текст вычисляемого поля. В моем случае было так: ТекстПоля = Сред(Строка(ТекстЗапроса), ПервыйСимвол, ЧислоСимволов);. Число срезаемых символов перед этим необходимо получить обычным арифметическим вычислением: ЧислоСимволов = ПоследнийСимвол - ПервыйСимвол;
  4. Так как текст поля, который мы получили, содержит в себе псевдоним предыдущего поля, нужно еще воспользоваться функцией встроенного языка "СтрЗаменить", чтобы избавиться от этого псевдонима и получить текст вычисляемого поля в чистом виде. В моем случае это было так: ИтоговыйТекстПоля = СтрЗаменить(ТекстПоля,"КАК БазовыеЕдиницыИзмерения");
  5. После всех проделанных манипуляций мы имеем итоговый текст запроса динамического списка и итоговый текст запроса вычисляемого поля. И чтобы в запросе сделать подмену этого вычисляемого поля на свое снова воспользуемся функцией "СтрЗаменить".
Список.ТекстЗапроса = СтрЗаменить(Список.ТекстЗапроса, ИтоговыйТекстПоля, СвоеПоле);

"СвоеПоле" я формировал следующим образом:

"ВЫБОР КОГДА НЕ " + ИтоговыйТекстПоля + " = 0 ТОГДА " + ИтоговыйТекстПоля + " ИНАЧЕ СТРОКА(РегистрыСведений.ДополнительныеСведения.Значение) КОНЕЦ ";

Получившийся текст прилагаю. Возможно, кому-нибудь будет полезна эта статья.

Текст = Строка(СписокНоменклатура.ТекстЗапроса);
НачНомер = СтрНайти(Текст,"КАК ВНаличииВБазовыхЕдиницах,",НаправлениеПоиска.СНачала);
КонНомер = СтрНайти(Текст,"КАК Доступно",НаправлениеПоиска.СНачала);
ЧислоСимволов = КонНомер - НачНомер - 1;

ЗаменяемыйТекст1 = Сред(Текст, НачНомер, ЧислоСимволов);
ЗаменяемыйТекст = СтрЗаменить(ЗаменяемыйТекст1, "КАК ВНаличииВБазовыхЕдиницах,", "");
ПодстрокаЗамены = " ВЫБОР КОГДА НЕ " + ЗаменяемыйТекст + " = 0 ТОГДА " + ЗаменяемыйТекст + " ИНАЧЕ СТРОКА(РегистрыСведений.ДополнительныеСведения.Значение) КОНЕЦ ";

СписокНоменклатура.ТекстЗапроса = СтрЗаменить(Текст, ЗаменяемыйТекст, ПодстрокаЗамены);

 

Как получить текст вычисляемого поля запроса зная его псевдоним получить вычисляемое поле из запроса

См. также

SALE! 15%

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

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

10000 руб.

02.09.2020    159392    872    399    

861

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

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

18.10.2024    9870    sergey279    18    

64

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

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

11.10.2024    5164    XilDen    36    

80

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

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

16.08.2024    7898    user1840182    5    

28

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

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

08.07.2024    2393    ivanov660    9    

22

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

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

15.05.2024    8684    implecs_team    6    

47

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

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

11.04.2024    3391    andrey_sag    10    

36
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. корум 288 05.09.24 17:22 Сейчас в теме
А можно и конструктором.

У поля знаем псевдоним (Поле1).
Динамический список- настройки - условное оформление - Добавить.
Ставим нужный текст (или выбираем поле компоновки данных, в данном случае дату).
Условие Поле1 = 0.

Оформляемые поля - нужное поле (Поле1).

Вуаля, если 0, видим текст (или дату).
Прикрепленные файлы:
ixijixi; TbIKBA; +2 Ответить
2. protonfoton 13 06.09.24 10:06 Сейчас в теме
В типовых механизмах такие вещи лучше делать программно
5. JohnyDeath 302 08.09.24 20:11 Сейчас в теме
(2) Внезапно: условное оформление можно делать программно
3. alexey_kurdyukov 165 06.09.24 10:50 Сейчас в теме
А СхемаЗапроса не работает?
kasper076; triviumfan; itmind; +3 Ответить
4. protonfoton 13 07.09.24 20:13 Сейчас в теме
6. eufes 10.09.24 11:09 Сейчас в теме
(4)
Например такой код не пробовал?

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


На выходе получишь

вместо поля
	ВЫБОР
	               	КОГДА Контрагенты.Код = """"
	               		ТОГДА ИСТИНА
	              	ИНАЧЕ ЛОЖЬ
	КОНЕЦ КАК ЭтоПустойКодЭлемента

поле
	ЛОЖЬ КАК ЭтоПустойКодЭлемента
7. protonfoton 13 11.09.24 11:00 Сейчас в теме
Ваш вариант имеет место быть, но не в этом случае. В моем случае оно посложнее вычислялось и в моем случае всего 7 строчек кода, а в вашем варианте 12 строчек. Но за предложенный вариант - Спасибо!!!
Оставьте свое сообщение