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

23.12.24

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

См. также

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

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

15500 руб.

02.09.2020    183664    1023    403    

966

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

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

2 стартмани

06.02.2025    2147    17    XilDen    26    

36

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

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

03.12.2024    5621    artemusII    11    

23

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

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

18.10.2024    13035    sergey279    18    

65

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

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

11.10.2024    8126    XilDen    36    

90

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

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

20.08.2024    3133    PROSTO-1C    0    

23

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

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

16.08.2024    10711    user1840182    5    

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

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

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

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

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


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

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

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