Запрос к объекту типа ХранилищеЗначений

Дайнеко

Well-known member
19.11.2009
951
0
#1
Делаю запрос по документу. В нем одно из полей типа ХрЗн, содержит в себе файл. Как проверить, что оно не пустое, т.е. не равно Неопределено.
Есть в языке запросов слово ВЫРАЗИТЬ. Но не знаю как им пользоваться.
 

Zab

Well-known member
07.08.2006
583
0
#2
Как проверить, что оно не пустое, т.е. не равно Неопределено.
Использование литерала Неопределено в запросе допустимо, работает так-же как и везде в коде.

Есть в языке запросов слово ВЫРАЗИТЬ. Но не знаю как им пользоваться.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Описание оператора ВЫРАЗИТЬ</div></div><div class="sp-body"><div class="sp-content">
Поля исходных таблиц могут иметь составной тип. Для таких полей возникает необходимость привести значения поля к какому-либо определенному типу.

<Приведение типа>
|
ВЫРАЗИТЬ ( <Выражение> КАК <Тип значения> )
|
БУЛЕВО |
ЧИСЛО [(Длина[, Точность])] |
СТРОКА [(Длина)] |
ДАТА |
<Имя таблицы>
<Длина> - ЧИСЛО; <Точность> - ЧИСЛО


<Выражение> приводится к одному из примитивных типов, или к ссылочному типу данных; в последнем случае <Имя таблицы> указывает на соответствующую таблицу информационной базы.

Если <Выражение> содержит в составном типе требуемый <Тип значения>, то приведение типа считается осуществимым, и для каждого значения указанного типа результатом будет это самое значение. Для значений других типов результатом приведения типа будет значение NULL.

Если <Выражение> не содержит в составном типе требуемый <Тип значения>, то выполнение данного запроса завершится ошибкой из-за принципиальной невозможности совершить приведение типов.

Для <Тип значения> СТРОКА с указанием длины максимальный размер строки составляет 1024.

Ну, и по сути вопроса: http://forum.mista.ru/topic.php?id=442734 ;)
 

Дайнеко

Well-known member
19.11.2009
951
0
#3
Использование литерала Неопределено в запросе допустимо, работает так-же как и везде в коде.
Не, друже, не прокатило.

Написал в запросе:
|ГДЕ
| Док.Содержимое <> Неопределено

Выдал гадость:
Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.

Ссылкой тоже непонятно. Там вопрос задан а ответа нет.
 
A

alxrie

#4
ХранилищеЗначения - это ХранилищеЗначения, а не Неопределено. И сравнивать XЗ с Неопределено нельзя.
Неопределено может содержаться в хранилище значения, то есть, ХЗ.Получить() может выдать Неопределено.

Насколько я знаю, средств получить значение из хранилища значения в запросе нет. И ВЫРАЗИТЬ здесь, увы!, не поможет.
 

Zab

Well-known member
07.08.2006
583
0
#5
Пардон, по ссылке во втором сообщении ответ: "Никак"
С неопределено в запросе работать можно, но не с ХранилищеЗначений.
Этот тип данных для работы с запросами хуже строки неограниченной длины.
 

Allexei

Well-known member
02.05.2008
322
1
#7
А с помощью СКД сделать нельзя? Скд может работать с функциями общих модулей в которых будет идти проверка является ли Док.Содержимое .Получить()= Неопределено?
 

Дайнеко

Well-known member
19.11.2009
951
0
#8
А с помощью СКД сделать нельзя
А как? Мне же нужен не просто отчет, а результаты запроса пихнуть в ТЗ и с ней работать на диалоге обработки.
Сейчас сделал, что результаты запроса обхожу и отсеиваю строки, где Хранилище пустое.

Абыдно, да?
- Было такое красивое выражение:
ЭтотОбъект.ТаблицаДокументов.Загрузить(Запрос.Выполнить().Выгрузить());
Пришлось переделать в цикл по запросу и добавлять в Таблицу каждую строчечку.
- Запрос из тысячи документов отсеял штук 100. Но из этих 100 заполненными могут оказаться только 10. Выходит лишняя куча передается в клиент.
- А еще обидно, что мне же не нужен анализ содержимого. Только наличие/отсутствие информации.
 

Allexei

Well-known member
02.05.2008
322
1
#9
Может конечно и ошибаюсь но примерно так(код проверял - работает):
В общем модуле создал глобальную функцию
Код:
Функция ОпределитьЗаполненостьХранилища(Хранилище) Экспорт
Если Хранилище.Получить()= Неопределено Тогда Возврат Ложь; Иначе Возврат Истина; КонецЕсли;
КонецФункции
Далее создал справочник "Номенклатура" с одним реквизитом "Хранилище" - тип Хранилище значений;
Добавил в справочник несколько элементов. Далее создал отчет.
В отчете создал макет СКД с именем "Макет".В макете скд в качестве набора данных запрос, текст запроса:
Код:
ВЫБРАТЬ
Номенклатура.Ссылка,
Номенклатура.Хранилище
ИЗ
Справочник.Номенклатура КАК Номенклатура
В вычисляемых полях добавил переменную "ПустотаХранилища" у которой выражение ОпределитьЗаполненостьХранилища(Хранилище);
В настройках выбрал все поля для вывода, детальные записи.
Создал форму обработки, на нее кинул ПолеТабличногоДокумента с именем "Результат". Обработчик кнопки выполнить следующий:

Код:
Процедура КнопкаВыполнитьНажатие(Кнопка)

ЭлементыФормы.Результат.Очистить();

// Сгенерируем макет компоновки данных при помощи компоновщика макета 
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

// В качестве схемы компоновки будет выступать схема самого отчета 
// В качестве настроек отчета - текущие настройки отчета 
// Данные расшифровки будем помещать в свойство расширения формы - ДанныеРасшифровки 
СхемаКомпоновкиДанных= ПолучитьМакет("Макет");
ДанныеРасшифровки	= "";
МакетКомпоновки	 = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

// Создадим и инициализируем процессор компоновки 
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,, Истина);

// Создадим и инициализируем процессор вывода результата 
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ЭлементыФормы.Результат);

// Обозначим начало вывода 
ПроцессорВывода.НачатьВывод(); 
//ПроцессорВывода.Вывести(ЭлементыФормы.Результат);

// Основной цикл вывода отчета 
Пока Истина Цикл

// Получим следующий элемент результата компоновки 
ЭлементРезультата = ПроцессорКомпоновки.Следующий();

Если ЭлементРезультата = Неопределено Тогда
// Следующий элемент не получен - заканчиваем цикл вывода 
Прервать;

Иначе
// Элемент получен - выведем его при помощи процессора вывода 
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
ЭлементыФормы.Результат.ПоказатьУровеньГруппировокСтрок(1) // уровень сорачивания
КонецЕсли;

КонецЦикла;

// Обозначем завершение вывода 
ПроцессорВывода.ЗакончитьВывод();
КонецПроцедуры
В результате отобразил все записи в указанием какая содержит полное, а какая пустое хранилище. В нашем случае можно все это дело было бы вывести в ТЗ и сделать НайтиСтроки по нужному составу хранилища. Как то так ;))
 

Дайнеко

Well-known member
19.11.2009
951
0
#10
Могуч! Я пока не замахивался на СКД как на больший инструмент, чем отчеты с двиганьем мышки.

Выходит, это отличная лазейка для задания собственных сложных функций в условия запроса. В 7-ке с этим не было проблем в запросе. А в 8-ке рано или поздно в такую нужду уперся бы.

Бацаю +
Вот, зараза! Плюсик застрял!