Имя: Пароль:
1C
 
Можно ли в построителе установить отбор по значению NULL?
0 TormozIT
 
гуру
16.12.06
13:20
В платформе 8.0 построитель не умеет устанавливать отбор по Null.
Периодически натыкаюсь на этот камень и каждый раз приходится хромая его обходить. Особенно неприятно спотыкаться расшифровках в отчетах, когда нужно запускать новый отчет и в него передавать все текущие значения группировок.
1 Advan
 
16.12.06
13:22
Не Null
2 TormozIT
 
гуру
16.12.06
13:26
(1) Не понял.
3 Kalambur
 
16.12.06
13:33
(0) не понял
4 Buran
 
16.12.06
14:02
(0) NULL - это совсем ничего, то есть в данном поле запроса нет данных
отбор нужно устанавливать по пустым значениям ссылок соответствующий типов.
Притом, если тип составной, то сначала приводить к одному
Или я не понял вопроса? Пример можно?
5 TormozIT
 
гуру
16.12.06
14:03
Пример.
Есть отчет. В нем есть группировка по одному измерению.
Я делаю расшифровку по значению измерения NULL.
В результате получаю пустой результат, т.к. отбор устанавливается по значению NULL, приведенному к типу значения элемента отбора этого измерения.
6 TormozIT
 
гуру
16.12.06
14:04
Неужели нельзя было реализовать специальное значение элемента отбора, чтобы оно построителем заменялось на "Измерение1 ЕСТЬ NULL"?
7 megalodon
 
16.12.06
14:04
сделай еще одно поле в запросе
естьnull(ТвоеПоле,"null мля")
и в построителе делай отбор на это поле со значением "null мля"
8 TormozIT
 
гуру
16.12.06
14:14
(7) Спасибо. Я так и делаю, но НастроитьРасшифровку в таком случае уже не получится автоматом, не говоря уже об универсальных отчетах. Опять придется писать код... =)
9 TormozIT
 
гуру
16.12.06
14:18
(7) Пардон! Ты прав, расшифровка будет настраиваться. Стормозил.
10 TormozIT
 
гуру
16.12.06
14:28
(9) Просто для иерархических измерений будет устанавливаться тип сравнения "В иерархии". После вызова НастроитьРасшифровку нужно просто заменить его на "Равно".
11 TormozIT
 
гуру
16.12.06
14:51
ИТАК, в очередной раз благодаря старожилам форума и настоящим профессионалам нашего дела (в данном случае megalodon) родилось решение описанной проблемы.

В тексте запроса для измерений, которые могут содержать NULL, всегда писать

ЕСТЬNULL(ПутьКДаннымИзмерения, "<Отсутствует>") КАК ИмяИзмерения,

И после вызова НастроитьРасшифровку() для нужного построителя отчета вызывать эту функцию:

// Устанавливает вид сравнения "Равно" у всех элементов отбора со значением "<Отсутствует>".
// Значенение "NULL" в запросах следует заменять на значение "<Отсутствует>" для корректной работы отбора:
// ЕСТЬNULL(ПутьКДаннымИзмерения, "<Отсутствует>") КАК ИмяИзмерения.
//
// Параметры:
// пПостроительОтчета – ПостроительОтчета – чей отбор обрабатываем.
//
Процедура ЛксУстановитьВидыОтбораПостроителяДляЗначенияОтсутствует(пПостроительОтчета) Экспорт

   Для каждого ЭлементОтбора Из пПостроительОтчета.Отбор Цикл
       Если ЭлементОтбора.Значение = "<Отсутствует>" Тогда
           ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;
       КонецЕсли;
   КонецЦикла;

КонецПроцедуры // ЛксУстановитьВидыОтбораПостроителяДляЗначенияОтсутствует()
12 Neco
 
16.12.06
15:38
Предложу решение. Добавить в запрос такую конструкцию:

{ГДЕ
 ВЫБОР
   КОГДА Реквизит ЕСТЬ NULL
   ТОГДА ИСТИНА
   ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК РеквизитЕстьNull}

Если в отборе РеквизитЕстьNull = Истина, то построитель отберет только те строки у которых Реквизит = Null
Например, запрос с отбором контрагентов у которых введена/не введена контактная информация:

ВЫБРАТЬ
   Контрагенты.Ссылка,
   КонтактнаяИнформация.Тип,
   КонтактнаяИнформация.Вид
ИЗ
   Справочник.Контрагенты КАК Контрагенты
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
       ПО КонтактнаяИнформация.Объект = Контрагенты.Ссылка
{ГДЕ
   ВЫБОР
           КОГДА КонтактнаяИнформация.Объект ЕСТЬ NULL
               ТОГДА ИСТИНА
           ИНАЧЕ ЛОЖЬ
       КОНЕЦ КАК КонтактнаяИнформацияЕстьNull}
13 TormozIT
 
гуру
16.12.06
16:36
(12) Такое решение не подходит, потому автоматическая расшифровка такого отчета выдаст пустой результат.
Я уже применил решение (11) в универсальном отчете и консоли отчетов. Оно прекрасно работает.
Только нужно не забыть

ЕСТЬNULL(ПутьКДаннымИзмерения, "<Отсутствует>") КАК ИмяИзмерения,

написать не только в секции выбранных полей, но и в секции условий.
14 TormozIT
 
гуру
16.12.06
16:39
(13) + имелись в виду секции построителя отчета
15 TormozIT
 
гуру
20.12.06
17:16
Немного исправил (11).

// Устанавливает вид сравнения "Равно" у всех элементов отбора со значением "<Отсутствует>" и видом сравнения "ВИерархии".
// Значенение "NULL" в запросах следует заменять на значение "<Отсутствует>" для корректной работы отбора:
// ЕСТЬNULL(ПутьКДаннымИзмерения, "<Отсутствует>") КАК ИмяИзмерения.
//
// Параметры:
// пПостроительОтчета – ПостроительОтчета – чей отбор обрабатываем.
//
Процедура ЛксУстановитьВидыОтбораПостроителяДляЗначенияОтсутствует(пПостроительОтчета) Экспорт

   Для каждого ЭлементОтбора Из пПостроительОтчета.Отбор Цикл
       Если ЭлементОтбора.Значение = "<Отсутствует>" Тогда
           Если ЭлементОтбора.ВидСравнения = ВидСравнения.ВИерархии Тогда
               ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;

КонецПроцедуры // ЛксУстановитьВидыОтбораПостроителяДляЗначенияОтсутствует()
16 dimoff
 
20.12.06
17:19
отбор к расшифровке отношения не имеет, в отборе можно ставить ЕСТЬNULL
17 TormozIT
 
гуру
20.12.06
17:41
(16) Разъясни пожалуйста, в каком это отборе у тебя можно ставить ЕСТЬ NULL, а не ЕСТЬNULL кстати.
18 dimoff
 
20.12.06
17:49
ПостроительОтчетаОтчет.Текст =
   "ВЫБРАТЬ
   |    Контрагенты.Ссылка,
   |    Контрагенты.Представление,
   |    Счет.Пользователь,
   |    ПРЕДСТАВЛЕНИЕ(Счет.Пользователь)
   |{ВЫБРАТЬ
   |    Ссылка.*,
   |    Пользователь.*}
   |ИЗ
   |    Справочник.Контрагенты КАК Контрагенты
   |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.Счет КАК Счет
   |        ПО Счет.Контрагент = Контрагенты.Ссылка
   |{ГДЕ
   |    ЕСТЬNULL(Счет.Пользователь, 0) КАК Пользователь}";

В условии ты можешь выбрать 0, и расшифровка от этого не пострадает
19 TormozIT
 
гуру
20.12.06
17:53
(18) Проверь сначала =)
Ты предложил практически то же самое, что и (11). Прочитай внимательнее.
К тому же "0" менее наглядное значение, чем "<Отсутствует>". И проблема установки вида сравнения Виерархии для иерархических группировок при расшифровке в твоем случае тоже возникает.
20 TormozIT
 
гуру
20.12.06
17:58
(18) Кстати расшифровка по отсутсвующему пользователю в твоем случае не получится, т.к. значение поля Пользователь=NULL и отбор установится такой -
"ЕСТЬNULL(Счет.Пользователь, 0) = NULL"/
21 dimoff
 
20.12.06
18:01
я наверное вопрос неправильно понял, извиняюсь если что
22 TormozIT
 
гуру
21.12.06
20:29
dimoff, беру свои слова назад. В (18) ты был прав. Грустно, но v8: Не выводится иерархия элементов в построителе.
Придется писать свою настройку построителя по расшифровке.
23 TormozIT
 
гуру
21.12.06
21:04
Вот новое решение.

// Устанавливает отбор построителя по расшифровке, содержащей NULL'ы.
// Устанавливает значение каждого NULL элемента отбора в "<Отсутствует>" и вид сравнения в "Равно".
// Для измерений, которые могут содержать значенение "NULL" в запросах в секции условий построителя следует
// писать "(ЕСТЬNULL(ПутьКДаннымИзмерения, "<Отсутствует>")).* КАК ИмяИзмерения".
//
// Параметры:
//  пПостроительОтчета – ПостроительОтчета – чей отбор обрабатываем;
//  пРасшифровка - Структура - расшифровка.
//
Процедура ЛксУстановитьОтборПостроителяПриРасшифровке(пПостроительОтчета, пРасшифровка) Экспорт

   Для каждого ЭлементРасшифровки Из пРасшифровка Цикл
       Если ЭлементРасшифровки.Значение = NULL Тогда
           ЭлементОтбора = пПостроительОтчета.Отбор[ЭлементРасшифровки.Ключ];
           ЭлементОтбора.Значение = "<Отсутствует>";
           Если ЭлементОтбора.ВидСравнения = ВидСравнения.ВИерархии Тогда
               ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;

КонецПроцедуры // ЛксУстановитьОтборПостроителяПриРасшифровке()