Имя: Пароль:
1C
 
Убрать тип NULL
0 Demasiado
 
27.12.09
15:49
При выполнении неких запросов (к примеру такого
Запрос=новый Запрос;
Запрос.Текст="
|ВЫБРАТЬ
|    Номенклатура.Наименование,
|    Номенклатура.ЭтоГруппа
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|";
Результат = Запрос.Выполнить().выгрузить();
) и выгрузке результата в таблицу, начинаю смотреть типы колонок получившейся таблицы значений. 1с пишет что тип первой колонки "Строка;NULL", второй - "Булево; NULL". Каким образом можно обработать колонки что бы избавиться от NULL? С типами данных до сего момента шибко не работал, гугль тоже ничего внятного не выдал
1 Мутабор
 
27.12.09
15:51
Странно, по смыслк Null тут быть не может, если наименеование не 0 длины по крайней мере, это точно тот запрос который ты выполняешь?
2 eklmn
 
гуру
27.12.09
15:52
(0) судя по запросу такого не может быть
3 Demasiado
 
27.12.09
15:55
Для Каждого ТекущаяКолонка ИЗ Результат.Колонки Цикл
 //посмотреть что выдаст отладчиком ТекущаяКолонка.ТипЗначения
КонецЦикла;

коллеги, не значение NULL, а тип значения колонки. Вот цикл которым можно посмотреть
4 Demasiado
 
27.12.09
15:56
Получается что колонка в ТЗ - составного типа: Строки и NUlla. а мне нужно только строку сделать. Или булево.
5 gr13
 
27.12.09
16:00
is null
6 AndreyLan
 
27.12.09
16:16
Вопрос: а зачем тебе избавляться от типа значения КОЛОНКИ? Значение в колонке, судя по запросу, все равно не будет NULL. Ну если уж очень хочется избавиться от типа null для значения колонки, то создай перед выгрузкой свою таблицу значений, определи для нее колонки с нужным типом и выгружай в нее.
7 NcSteel
 
27.12.09
16:18
(0) Зачем ? Нул это нормально .
8 Defender aka LINN
 
27.12.09
17:11
(1), (2) Садитесь, 2. Во всех колонках ТЗ, получающейся методом "Выгрузить()" имеется тип NULL, т.к. он может там быть - результат запроса не анализируется платформой.
9 Demasiado
 
27.12.09
17:55
Необходимость есть избавиться от нула, я эту таблицу гружу в СКД который создаю программно. Несовсем красивые вещи получаются когда я в режиме конструктора настроек накладываю отборы, каждый раз предлагается выбрать тип.
10 Demasiado
 
27.12.09
17:57
+гружу в смысле как набор - объект данных, получается "а- ля универсальный отчет". На входе ТЗ, на выходе отчет в компоновке
11 Jaap Vduul
 
27.12.09
18:03
(9)Типом поля в СКД рулить можно.
12 Demasiado
 
27.12.09
18:07
(11) знаю, не знаю как вычленить нулл из составного типа, или вопрос по другому "как перебрать типы у переменной?" Хотя в СКД можно попробовать в ролях установить "Игнорировать NULL" в ролях
13 Jaap Vduul
 
27.12.09
18:11
(12)
ОписаниеТипов (TypeDescription)
Типы (Types)
Синтаксис:
Типы()
Возвращаемое значение:
Тип: Массив. Массив значений типа Тип, состоящий из используемых типов.
Описание:
Получает типы, используемые в объекте.
14 Demasiado
 
27.12.09
18:18
похоже то что нужно, попробуем применить:)
15 Мутабор
 
27.12.09
18:38
(8) Я в смысл не вникал, но NULL там быть не может, а тип может быть какой угодно, только что это меняет?
16 NcSteel
 
27.12.09
20:24
(15) А ты проверь , всегда он присуствует.
17 Demasiado
 
28.12.09
09:57
написал такой кусок кода
   МассивТипов = Поле.ТипЗначения.Типы();
   Счетчик = 0;
   СЗ = Новый СписокЗначений;
   Для Каждого ТекущийТип Из МассивТипов Цикл
       Если ТекущийТип = Тип("NULL") Тогда
           СЗ.Добавить(Счетчик);
       КонецЕсли;
       Счетчик = Счетчик +1;

   КонецЦикла;
   Для Каждого ТекущийИндекс Из СЗ Цикл
       МассивТипов.Удалить(ТекущийИндекс.Значение);
   КонецЦикла;

Проверяю, Поле.ТипЗначения - все равно содержит тип "NULL", подскажите куда копнуть дальше?
18 Demasiado
 
28.12.09
10:04
Разобрался сам, помогла вот такая конструкция    ПолеНабораДанных.ТипЗначения = Новый ОписаниеТипов(МассивТипов);

Теперь в отчете компоновки, например в отборах нет необходимости каждый раз выбирать тип, если там подразумевалось поле не составного типа.
19 Demasiado
 
28.12.09
11:23
Окончательное решение:
Функция УдалениеNULLИзТиповКолонокТЗ(ТЗИсточник)
       //избавляемся от Нуллов в тз
   Времянка = Новый ТаблицаЗначений;
   Для Каждого ТекущаяКолонка ИЗ ТЗИсточник.Колонки Цикл
       МассивТипов = ТекущаяКолонка.ТипЗначения.Типы();
       Счетчик = 0;
       СЗ = Новый СписокЗначений;
       Для Каждого ТекущийТип Из МассивТипов Цикл
           Если ТекущийТип = Тип("NULL") Тогда
               СЗ.Добавить(Счетчик);
           КонецЕсли;
           Счетчик = Счетчик +1;
       КонецЦикла;
       Для Каждого ТекущийИндекс Из СЗ Цикл
           МассивТипов.Удалить(ТекущийИндекс.Значение);
       КонецЦикла;
       НоваяКолонка = Времянка.Колонки.Добавить(ТекущаяКолонка.Имя,Новый ОписаниеТипов(МассивТипов),ТекущаяКолонка.Заголовок);
   КонецЦикла;
   Для Каждого СтрокаТЗ Из ТЗИсточник Цикл
       НоваяСтрока = Времянка.Добавить();
       ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаТЗ);
   КонецЦикла;
   
   Возврат Времянка.Скопировать();

КонецФункции
20 НЕА123
 
28.12.09
12:00
Функция УдалениеNULLИзТиповКолонокТЗ(ТЗИсточник)
       //избавляемся от Нуллов в тз
   Времянка = Новый ТаблицаЗначений;
   Для Каждого ТекущаяКолонка ИЗ ТЗИсточник.Колонки Цикл
       МассивТипов = ТекущаяКолонка.ТипЗначения.Типы();
       ПорядковыйНомерNULL = МассивТипов.Найти(Тип("NULL"));
       Если ЗначениеЗаполнено(ПорядковыйНомерNULL) Тогда
           МассивТипов.Удалить(ПорядковыйНомерNULL-1);
       КонецЕсли;
       НоваяКолонка = Времянка.Колонки.Добавить(ТекущаяКолонка.Имя,Новый ОписаниеТипов(МассивТипов),ТекущаяКолонка.Заголовок);
   КонецЦикла;
   Для Каждого СтрокаТЗ Из ТЗИсточник Цикл
       НоваяСтрока = Времянка.Добавить();
       ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаТЗ);
   КонецЦикла;
   
   Возврат Времянка;

КонецФункции
21 Defender aka LINN
 
28.12.09
12:02
Пипец.
22 НЕА123
 
28.12.09
12:09
Функция УдалениеNULLИзТиповКолонокТЗ(ТЗИсточник)
       //избавляемся от Нуллов в тз

   Времянка = Новый ТаблицаЗначений;
   Для Каждого ТекущаяКолонка ИЗ ТЗИсточник.Колонки Цикл
       МассивТипов = ТекущаяКолонка.ТипЗначения.Типы();
       НоваяКолонка = Времянка.Колонки.Добавить(ТекущаяКолонка.Имя,Новый ОписаниеТипов(МассивТипов,,"NULL"),ТекущаяКолонка.Заголовок);
   КонецЦикла;
   Для Каждого СтрокаТЗ Из ТЗИсточник Цикл
       НоваяСтрока = Времянка.Добавить();
       ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаТЗ);
   КонецЦикла;
   
   Возврат Времянка;

КонецФункции
23 Defender aka LINN
 
28.12.09
12:11
(22) Уже лучше, но все равно пипец :)
24 asady
 
28.12.09
12:15
(0) путей много.
навскидку
1. сразу выгрузить в типизированную ТЗ

2. в запросе юзать ЕСТЬNULL
25 Defender aka LINN
 
28.12.09
12:16
(24) Для тех, кто в танке: "Во ВСЕХ колонках ТЗ, получающейся методом "Выгрузить()" имеется тип NULL, т.к. он может там быть - результат запроса не анализируется платформой."
ВСЕХ - это всех. Абсолютно. Без вариантов.
26 Лефмихалыч
 
28.12.09
12:19
(25) забыл добавить: "Живи с этим" :)
27 Fester Adams
 
28.12.09
12:19
какой ужас. Точно понедельник - не Ваш выбор.
Дюже много бреда из (0). Ситуация, что в указанном запросе вернется хоть какое-то поле с типом NULL невозможна если справочник иерархический и имеет наименование, бишь поля такие вообще есть.
28 asady
 
28.12.09
12:21
(25)
так пробовал?

ТипизированнаяТЗ.Загрузить(РезультатЗапрос.Выгрузить());
29 eklmn
 
гуру
28.12.09
12:21
(25) да ладно, умник, не нервничай ты так :)
30 eklmn
 
гуру
28.12.09
12:23
Просто изначально чел из (0) неправильно подошел к задаче, из-за чего и получается изврат ИМХО
31 Fester Adams
 
28.12.09
12:26
(30) Не... Нифига, кг/ам!
Думать надо, а не просто по клавишам жмакать.
И (21) прав. 100 %. Курите дальше и выдыхайте почаще.
32 Fester Adams
 
28.12.09
12:27
(25) А в КЗ зачем добавил? Креатив что ли?
33 НЕА123
 
28.12.09
12:43
Функция УдалениеNULLИзТиповКолонокТЗ(ТЗИсточник)
       //избавляемся от Нуллов в тз

   Времянка = Новый ТаблицаЗначений;
   Для Каждого ТекущаяКолонка ИЗ ТЗИсточник.Колонки Цикл
       МассивТипов = ТекущаяКолонка.ТипЗначения.Типы();
       НоваяКолонка = Времянка.Колонки.Добавить(ТекущаяКолонка.Имя,Новый ОписаниеТипов(МассивТипов,,"NULL"),ТекущаяКолонка.Заголовок);
   КонецЦикла;

   Для Каждого СтрокаТЗ Из ТЗИсточник Цикл
       НоваяСтрока = Времянка.Добавить();
       ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаТЗ);
   КонецЦикла;

   
   Возврат Времянка;

КонецФункции

понедельник
34 Defender aka LINN
 
28.12.09
12:55
(32) Добавил не я, я состав постов пытался изменить.
(33) Изучи уже конструктор типов, а?
35 Fester Adams
 
28.12.09
12:59
(34) Откуда их сегодня столько повылезало-то?
Аль не похмелились с утреца?
36 НЕА123
 
28.12.09
13:03
Функция УдалениеNULLИзТиповКолонокТЗ(ТЗИсточник)
       //избавляемся от Нуллов в тз

   Времянка = Новый ТаблицаЗначений;
   Для Каждого ТекущаяКолонка ИЗ ТЗИсточник.Колонки Цикл
       НоваяКолонка = Времянка.Колонки.Добавить(ТекущаяКолонка.Имя,Новый ОписаниеТипов(ТекущаяКолонка.ТипЗначения,,"NULL"),ТекущаяКолонка.Заголовок);
   КонецЦикла;

   Для Каждого СтрокаТЗ Из ТЗИсточник Цикл
       НоваяСтрока = Времянка.Добавить();
       ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаТЗ);
   КонецЦикла;
   
   Возврат Времянка;

КонецФункции

понедельник
37 Defender aka LINN
 
28.12.09
13:06
(36) Сойдет :)
38 TheNewOne
 
28.12.09
13:51
Имхо так быстрее будит:


Процедура УбратьНуллыНафих(Табл)
   Для к = 1 По Табл.Колонки.Количество() Цикл
       ИмяКолонки = Табл.Колонки[0].Имя;
       Табл.Колонки.Добавить("___", Новый ОписаниеТипов(Табл.Колонки[0].ТипЗначения,,"NULL"), Табл.Колонки[0].Заголовок);
       Табл.ЗагрузитьКолонку(Табл.ВыгрузитьКолонку(ИмяКолонки), "___");
       Табл.Колонки.Удалить(0);
       Табл.Колонки.___.Имя = ИмяКолонки;
   КонецЦикла;
КонецПроцедуры


ЗЫ, Defender aka LINN, ты ведешь себя как 70летний старик :)
39 Defender aka LINN
 
28.12.09
13:57
(38) А что поделать...
40 Demasiado
 
28.12.09
14:09
Ого как тема раздулась. А добавили в базу - потому что такой темы не было, фактически здесь обсуждается тонкая работа с типами данных. Fester Adams, может быть я и неправильно описал задачу, но она абсолютно реальная и потому...пройдите пожалуйста, в сад.