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

Тема в разделе "1C и всё что с ней связано", создана пользователем Дайнеко, 22 июл 2011.

  1. Дайнеко

    Дайнеко Well-Known Member
    1C Team

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

    Zab Well-Known Member
    1C Team

    Регистрация:
    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
    1C Team

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

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

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

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

    alxrie Гость

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

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

    Zab Well-Known Member
    1C Team

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

    Дайнеко Well-Known Member
    1C Team

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

    Allexei Well-Known Member

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

    Дайнеко Well-Known Member
    1C Team

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

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

    Allexei Well-Known Member

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

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

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

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

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

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

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

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

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

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

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

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

    КонецЦикла;

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

    Дайнеко Well-Known Member
    1C Team

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

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

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

    Zab Well-Known Member
    1C Team

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

    unknown181538 НеГуру
    1C Team

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

    unknown181538 НеГуру
    1C Team

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

    Allexei Well-Known Member

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

    vbs Well-Known Member

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

    unknown181538 НеГуру
    1C Team

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

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