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