1. НовенькийЯ 14.02.20 14:50 Сейчас в теме

Как избавиться от типа NULL в колонках результата запроса?

Добрый день.
Есть запрос:
"ВЫБРАТЬ
	|	ВЫРАЗИТЬ(ШтрихкодыИзменения.Штрихкод КАК СТРОКА(100)) КАК Штрихкод,
	|	ШтрихкодыИзменения.Владелец КАК Владелец_,
	|	ШтрихкодыИзменения.ТипШтрихкода КАК ТипШтрихкода,
	|	ШтрихкодыИзменения.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	|	Штрихкоды.Штрихкод ЕСТЬ NULL
	|		ИЛИ ШтрихкодыИзменения.Владелец ССЫЛКА Справочник.ФизическиеЛица
	|			И ТСДСотрудники.ФизЛицо ЕСТЬ NULL КАК Удаление
	|ИЗ
	|	РегистрСведений.Штрихкоды.Изменения КАК ШтрихкодыИзменения
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
	|		ПО ШтрихкодыИзменения.Штрихкод = Штрихкоды.Штрихкод
	|			И ШтрихкодыИзменения.Владелец = Штрихкоды.Владелец
	|			И ШтрихкодыИзменения.ТипШтрихкода = Штрихкоды.ТипШтрихкода
	|			И ШтрихкодыИзменения.ЕдиницаИзмерения = Штрихкоды.ЕдиницаИзмерения
	|			И ШтрихкодыИзменения.ХарактеристикаНоменклатуры = Штрихкоды.ХарактеристикаНоменклатуры
	|		ЛЕВОЕ СОЕДИНЕНИЕ ПланОбмена.ТСД.Сотрудники КАК ТСДСотрудники
	|		ПО ШтрихкодыИзменения.Узел = ТСДСотрудники.Ссылка
	|			И ШтрихкодыИзменения.Владелец = ТСДСотрудники.ФизЛицо
	|ГДЕ
	|	ШтрихкодыИзменения.Узел = &Узел
	|	И (ШтрихкодыИзменения.Владелец ССЫЛКА Справочник.МестаХранения
	|			ИЛИ ШтрихкодыИзменения.Владелец ССЫЛКА Справочник.ФизическиеЛица
	|			ИЛИ ШтрихкодыИзменения.Владелец ССЫЛКА Справочник.Номенклатура)"
Показать

В результате имею таблицу, в которой все колонки имеют составной тип, один из которых это NULL.
Для меня это критично, так как как я эту табличку сериализую, точнее должен сериализовать, но на этом этапе получаю ошибку из за типа NULL.
Можно ли переписать запрос так, что бы колонки была строго определенного типа?

Единственно, что пока приходит на ум, это создать ТЗ с такими же колонками с простым типом Строка/Белево и т.д. и просто в цикле заполнить эту ТЗ из выборки запроса. Но может есть более простой вариант?
Ответы
Избранное Подписка Сортировка: Древо
5. dhurricane 14.02.20 15:10 Сейчас в теме
(1) Вроде именно запросом на это никак не повлиять. Один из вариантов решения задачи, это удалить ненужную составляющую из типа колонки. Например, так:
Запрос = Новый Запрос;
Таблица = Запрос.Выполнить().Выгрузить();

ИсходныеКолонки = Новый Массив;
Для каждого Колонка Из Таблица.Колонки Цикл
	ИсходныеКолонки.Добавить(Колонка);
КонецЦикла; 

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

	Таблица.Колонки.Удалить("Удалить" + ИмяКолонки);
	
КонецЦикла;
Показать
6. НовенькийЯ 14.02.20 15:12 Сейчас в теме
(5) Пошел именно по этому пути, только код немного другой:

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


В каждом выбираемом поле ставь ВЫРАЗИТЬ(<нужное_поле> КАК <нужный_тип>)

Если всё равно останется проблема с NULL, то оберни <нужное_поле> в ЕСТЬNULL(<нужное_поле>, <пустая_ссылка_нужного_типа>)
9. RustamZz 14.02.20 15:56 Сейчас в теме
(1) Нужно заменить левое соединение на внутреннее и NULL не будет. Удаление ШК сделать отдельным запросом.
11. DmitriyPerevalov 14.02.20 16:34 Сейчас в теме
(9) По запросу NULL будет только в правых таблицах, а выборка (кроме последнего поля) идёт из левой таблицы и там по причине соединения NULL не возникнет. Скорее всего в исходной левой таблице есть значения NULL изначально.
2. OiSorry 14.02.20 14:53 Сейчас в теме
ЕСТЬNULL(<Проверяемое выражение>, <Выражение замены>)
функция в запросе для проверки на null, если null то заменяет выражение
narutouzumaki_13; alex-l19041; +2 Ответить
3. НовенькийЯ 14.02.20 15:02 Сейчас в теме
Пробовал, не помогает, да и к тому же в результате запроса нет ни единого NULL
4. OiSorry 14.02.20 15:05 Сейчас в теме
(3)

(1)
получаю ошибку из за типа NULL

как я понял проблема вот в этом? или нет?
7. gudvin77 14.02.20 15:42 Сейчас в теме
ЕСТЬNULL(<Проверяемое выражение>, <Выражение замены>)
Требуется указать в финальной части запроса, в процессе формирования подзапросов не соединенные записи будут давать NULL.
10. НовенькийЯ 14.02.20 16:32 Сейчас в теме
В общем проблема решилась, не так как я ожидал но все же.
При сериализации 1С ругалась что не могла преобразовать NULL в тип Строка
У меня выгружалось 23К записей. Проверил по 100 раз, ни в одной нет значения NULL но в каждой колонке составной тип с NULL'ом - я на это и согрешил, о решил избавиться от этого типа NULL в колонках.
Избавился, табличка стала красивая, но выгружаться все равно не захотела.
Теперь ошибка при сериализации была другая, что невозможно к типу Строка привести значение : и указывала какое то "конячье" число из 26 символов. Решил поискать в базе такой штрихкод - а его нет.
Пришлось временно переписать выгрузку, сделал сериализацию построчно, что бы найти на какой товар назначен это тштрихкод и почему я его не могу найти.
В общем товар нашел, штрихкоды по нему нашел. Вижу штрихкод, на который ругается 1С. Копирую его в блокнот. и пытаюсь, из блокнота вставляю в строку поиска - не находит такой штрихкод.
Посимвольно сравнил 2 "одинаковых" штрихкода.
СУУУуу....а, вот оно, каким то макаром в середине штрихкода попал символ с кодом 29. Этот символ не отображается в 1С, но при выгрузке в XML выдает ошибку.
Так что тип колонку с NULL не причем, прост 1С не корректно материлась, наткнувшись на символ с кодом 29(↔)
Удалил штрихкод, и выгрузка возобновилась
13. НовенькийЯ 14.02.20 16:57 Сейчас в теме
(12) О, знакомый символ 29 :)
Т.е. он не просто так ко мне попал. Печалька. придется перед сериализацией менять 29 на что то читабельно, а после десериализации это что то менять опять на символ 29.
Спасибо за ссылку. Но вот штрихкод из базы я уже удалил :(
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Санкт-Петербург
зарплата до 150 000 руб.
Полный день

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству

Бизнес-аналитик 1С
Москва
зарплата от 150 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Санкт-Петербург
зарплата до 130 000 руб.
Полный день