1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

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

Тема в разделе "Базы данных и администрирование", создана пользователем Дайнеко, 22 июл 2011.

  1. Дайнеко

    Дайнеко Well-Known Member

    Репутация:
    0
    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Делаю запрос по документу. В нем одно из полей типа ХрЗн, содержит в себе файл. Как проверить, что оно не пустое, т.е. не равно Неопределено.
    Есть в языке запросов слово ВЫРАЗИТЬ. Но не знаю как им пользоваться.
     
  2. Zab

    Zab Well-Known Member

    Репутация:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    583
    Симпатии:
    0
    Использование литерала Неопределено в запросе допустимо, работает так-же как и везде в коде.

    <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 ;)
     
  3. Дайнеко

    Дайнеко Well-Known Member

    Репутация:
    0
    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Не, друже, не прокатило.

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

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

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

    alxrie Гость

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

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

    Zab Well-Known Member

    Репутация:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    583
    Симпатии:
    0
    Пардон, по ссылке во втором сообщении ответ: "Никак"
    С неопределено в запросе работать можно, но не с ХранилищеЗначений.
    Этот тип данных для работы с запросами хуже строки неограниченной длины.
     
  6. Дайнеко

    Дайнеко Well-Known Member

    Репутация:
    0
    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Теперь увидел - буквы слишком маленькие. Кирилл, так бы и сказал! А то там далее всякая чушь отвлекла внимание.
     
  7. Allexei

    Allexei Well-Known Member

    Репутация:
    0
    Регистрация:
    2 май 2008
    Сообщения:
    322
    Симпатии:
    1
    А с помощью СКД сделать нельзя? Скд может работать с функциями общих модулей в которых будет идти проверка является ли Док.Содержимое .Получить()= Неопределено?
     
  8. Дайнеко

    Дайнеко Well-Known Member

    Репутация:
    0
    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    А как? Мне же нужен не просто отчет, а результаты запроса пихнуть в ТЗ и с ней работать на диалоге обработки.
    Сейчас сделал, что результаты запроса обхожу и отсеиваю строки, где Хранилище пустое.

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

    Allexei Well-Known Member

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

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

    Дайнеко Well-Known Member

    Репутация:
    0
    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Могуч! Я пока не замахивался на СКД как на больший инструмент, чем отчеты с двиганьем мышки.

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

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

    Zab Well-Known Member

    Репутация:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    583
    Симпатии:
    0
    Получай плюс от меня, респект.
     
  12. unknown181538

    unknown181538 НеГуру

    Репутация:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    1.417
    Симпатии:
    0
    А решение с помощью СКД будет ли быстрее, нежели тупой обход выборки?
     
  13. unknown181538

    unknown181538 НеГуру

    Репутация:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    1.417
    Симпатии:
    0
    Требую долива после отстоя пены замера производительности!
     
  14. Allexei

    Allexei Well-Known Member

    Репутация:
    0
    Регистрация:
    2 май 2008
    Сообщения:
    322
    Симпатии:
    1
    Решение будет красивее :rolleyes:)
     
  15. vbs

    vbs Well-Known Member

    Репутация:
    0
    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    А это зачеркивать не надо - святое же дело :rolleyes:
     
  16. unknown181538

    unknown181538 НеГуру

    Репутация:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    1.417
    Симпатии:
    0
    Красивое в плане показать свою крутизну - да.
    А по читабельности кода и т.п. - не согласен:rolleyes:
    Сделайте же замер!
     
Загрузка...

Поделиться этой страницей