vandalsvq
ПрямойЗапрос версия 1.8.5 23.05.2012
Класс эксплуатируется все больше и все шире.. Вещь хорошая и полезная. Спасибо. )
Есть запрос, в котором нужно получить остатки товара с ценами реализации. В запросе используются ВТ $БИОстатки и $ПоследнееЗначение
ПрямойЗапрос = СоздатьОбъект("ПрямойЗапрос");
...
ТекстЗапроса = "
|ВЫБРАТЬ
...
|, $ПоследнееЗначение.Серии.ЦенаОпт(Субконто3, :ДатаПериодических~) КАК [ЦенаОпт $Число.15.2]
...
|ИЗ $БИОстатки.Основной(:КонДата~,,(МОЛ,Номенклатура,Серии), (Количество, Сумма), (Счет В (:ЗапросСчет)),) КАК Би
...
Понадобилось (чтыбы не сказать "приспичило") дополнительно получить здесь же дату установки периодического значения ЦенаОпт. Руки интуитивно потянулись к ВТ $ПоследнееЗначение, чтобы в ней получить дату установки значения, но исследования ВТ показали, что кроме собственно периодического значения она ничего другого не возвращает. Возможным решением выглядит разворачивание ВТ $ПоследнееЗначение в запросе таким образом:
ПрямойЗапрос = СоздатьОбъект("ПрямойЗапрос");
...
ких+1);
мдв = СоздатьОбъект("MetaDataWork");
Серии_ЦенаОпт_ИдРеквизита = мдв.ИДРеквизитаСправочника("Серии", "ЦенаОпт");
пт_ИдРеквизита);
ТекстЗапроса = "
|ВЫБРАТЬ
...
|, $ПоследнееЗначение.Серии.ЦенаОпт(Субконто3, :ДатаПериодических~) КАК [ЦенаОпт $Число.15.2]
|, (SELECT TOP 1 const_vt.DATE
| FROM _1SCONST const_vt (nolock)
| WHERE const_vt.ID = :Серии_ЦенаОпт_ИдРеквизита
| AND const_vt.OBJID = Субконто3
| AND const_vt.DATE < :ДатаПериодических_Служ
| ORDER BY const_vt.DATE DESC,const_vt.TIME DESC,const_vt.DOCID DESC,const_vt.ROW_ID DESC) AS [ЦенаОптДатаУстановки $Дата]
...
|ИЗ $БИОстатки.Основной(:КонДата~,,(МОЛ,Номенклатура,Серии), (Количество, Сумма), (Счет В (:ЗапросСчет)),) КАК Би
...
Результат дает нужный, но решение выглядит непривлекательно.. Чуя, что это мне нужно будет не в одном месте, решил попробовать заставить ВТ $ПоследнееЗначение возвращать не только пер. значение, но и прочие данные из таблицы констант. Сделал временно мод функции ПарсингВТПоследнееЗначение в классе: добавил третий параметр, в котором указывается возвращаемое значение из таблицы констант (VALUE при опущенном параметре):
Функция ПарсингВТПоследнееЗначение(ТекстДляОбработки)
...
//[+]sv 180313
спВозвращаемоеЗначение = СоздатьОбъект("СписокЗначений");
спВозвращаемоеЗначение.Установить("ТЕКУЩИЙОБЪЕКТ", "OBJID"); //9 (0-const)
спВозвращаемоеЗначение.Установить("ТЕКУЩИЙРЕКВИЗИТ", "ID"); //4
спВозвращаемоеЗначение.Установить("ДАТАЗНАЧ", "DATE"); //8
спВозвращаемоеЗначение.Установить("ЗНАЧЕНИЕ", "VALUE"); //DBF: 23 SQL: 255
спВозвращаемоеЗначение.Установить("ТЕКУЩИЙДОКУМЕНТ", "DOCID"); //9 (При ручной установке значений равен « 0 »)
спВозвращаемоеЗначение.Установить("ВРЕМЯ", "TIME"); //DBF: string 6 SQL: int 4
спВозвращаемоеЗначение.Установить("НОМЕРДВИЖЕНИЯ", "ACTNO"); //DBF: numeric 6 SQL: int 4 (номер движения документа по изменению периодического реквизита, который сделал запись.)
спВозвращаемоеЗначение.Установить("ТИПЗНАЧЕНИЯ", "TVALUE"); //3 (Заполняется в случае, если периодический реквизит неопределенного типа. В нем хранится ID типа значения из поля VALUE)
Если ЭтоSQL = 1 Тогда
//спВозвращаемоеЗначение.Установить("СЧЕТЧИК", "ROW_ID"); //4 (Автоинкрементное поле типа INT. Служит для поддержки уникальности)
спВозвращаемоеЗначение.Установить("НОМЕРСТРОКИ", "LINENO_"); //2
Иначе
//спВозвращаемоеЗначение.Установить("НОМЕРЧАСТИ", "PARTNO"); //3 (номер части порезанного значения длиннее 23)
спВозвращаемоеЗначение.Установить("НОМЕРСТРОКИ", "LINENO"); //4
КонецЕсли;
// Параметры = ПолучитьСтрокуПараметров(2); //[-]sv 180313
Параметры = ПолучитьСтрокуПараметров(3); //[+]sv 180313
...
Для НомерЗначения = 0 По Вектор.Количество()-1 Цикл
...
ВозвращаемоеЗначение = Врег(ПодготовитьПараметр(ВекторВыражения.Подвыражения.Получить(4))); //[+]sv 180313
...
// ИдентификаторКолонки = ПреобразоватьЗначение(МетаРеквизит,"const_vt"); //[-]sv 180313
//[+]sv 180313
Если (ВозвращаемоеЗначение = "ЗНАЧЕНИЕ") или (ВозвращаемоеЗначение = "VALUE") или (ПустаяСтрока(ВозвращаемоеЗначение) = 1) Тогда
ИдентификаторКолонки = ПреобразоватьЗначение(МетаРеквизит,"const_vt");
Иначе
ИдентификаторКолонки = спВозвращаемоеЗначение.Получить(ВозвращаемоеЗначение);
Если ПустаяСтрока(ИдентификаторКолонки) = 0 Тогда
ИдентификаторКолонки = "const_vt."+ИдентификаторКолонки;
Иначе
ИдентификаторКолонки = "const_vt."+ВозвращаемоеЗначение;
КонецЕсли;
КонецЕсли;
...
КонецЦикла;
...
КонецФункции
Использование:
|ВЫБРАТЬ
...
|, $ПоследнееЗначение.Серии.ЦенаОпт(Субконто3, :ДатаПериодических~) КАК [ЦенаОпт $Число.15.2]
|, $ПоследнееЗначение.Серии.ЦенаОпт(Субконто3, :ДатаПериодических~, ДатаЗнач) КАК [ЦенаОптДатаУстановки $Дата]
...
Так, используя $ПоследнееЗначение можно получить и пер.значение, и дату установки, и документ...
Вопрос: Есть ли надежда, что нечто подобное будет реализовано в официальном классе? Если да, то то же хотелось бы и в $СрезПервых, $СрезПоследних при РазворачиватьПериоды = 0