Проверка на неопределено

1. MaximKor 20 15.03.17 08:02 Сейчас в теме
Здравствуйте! Помогите пожалуйста разобраться.
Вот запрос:
ВЫБРАТЬ
	ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
	ЗаказыПокупателейОстаткиИОбороты.СуммаВзаиморасчетовПриход КАК СуммаДоговора
ПОМЕСТИТЬ СуммаДоговораВсего
ИЗ
	РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты КАК ЗаказыПокупателейОстаткиИОбороты
ГДЕ
	ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента = &ДоговорКонтрагента
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
	СУММА(ХозрасчетныйОстаткиИОбороты.СуммаОборотКт) КАК СуммаАвансов,
	СуммаДоговораВсего.СуммаДоговора
ИЗ
	РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, , Регистратор, , Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамПолученным), , ) КАК ХозрасчетныйОстаткиИОбороты,
	СуммаДоговораВсего КАК СуммаДоговораВсего
ГДЕ
	ХозрасчетныйОстаткиИОбороты.Субконто2 = &Субконто2
	И ХозрасчетныйОстаткиИОбороты.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее

СГРУППИРОВАТЬ ПО
	ХозрасчетныйОстаткиИОбороты.Субконто2,
	СуммаДоговораВсего.СуммаДоговора
Показать


Но иной раз авансов нет. И тогда весь запрос не отрабатывает, по всем полям неопределенно, а данные из него нужны дальше в любом случае. Как проверить поле ХозрасчетныйОстаткиИОбороты.СуммаОборотКт на неопределенно и дать ему значение 0.
пробовал уже по разному и ЕСТЬ NULL и неопределенно, выдает ошибку. Спасибо.
По теме из базы знаний
Найденные решения
29. ice-net 19 15.03.17 09:39 Сейчас в теме
(28)
Можно и без..

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

Показать


В любом случае будет работать лучше чем в (0) и быстрее
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
6. ResetAtreides 15.03.17 08:52 Сейчас в теме
(1) Разве таблицы связать по полю "Договор" не нужно? Без связи это полное соединение и бред получается, имхо
8. japopov 68 15.03.17 08:54 Сейчас в теме
(1) Во-первых, у Вас неверно написан запрос. Таблицы не соединены друг с другом.
10. kolya_tlt 86 15.03.17 08:59 Сейчас в теме
(8) первые 3 запроса бесплатно?)
2. YanSergey 145 15.03.17 08:26 Сейчас в теме
ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.СуммаОборотКт, 0)
3. MaximKor 20 15.03.17 08:46 Сейчас в теме
(2) пробовал, все равно все поля возвращают значение неопределенно. причем по первому запросу значение всегда есть.
4. kolya_tlt 86 15.03.17 08:50 Сейчас в теме
(3) у вас результат пустой, вам программа и возвращает пустоту. чего вы удивляетесь? в чем проблема объявить переменную и присвоить ей значение в случае если оно есть?

	Сумма = 0;
	
	Если ВыборкаДетальныеЗаписи.Следующий() Тогда
		Сумма = ВыборкаДетальныеЗаписи.Сумма;
	КонецЕсли;
11. MaximKor 20 15.03.17 09:00 Сейчас в теме
(4)
ВыборкаДетальныеЗаписи.Следующий()
весь запрос в этой случае не работает, а не только поле сумма
5. ice-net 19 15.03.17 08:51 Сейчас в теме
(0) Судя по полям:

ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор, 
СУММА(ХозрасчетныйОстаткиИОбороты.СуммаОборотКт) КАК СуммаАвансов, 
СуммаДоговораВсего.СуммаДоговора


Вам нужен договор, Сумма авансов по нему и Сумма по заказам за ВСЕ время., т.е. 1 строка, Договор/Сумма1/Сумма2. Верно?
7. MaximKor 20 15.03.17 08:52 Сейчас в теме
(5)да верно, сумма по договору за все время точнее.
9. japopov 68 15.03.17 08:56 Сейчас в теме
(7) подождите, я Вам запрос перепишу полностью. У Вас там просто каша.
20. ice-net 19 15.03.17 09:16 Сейчас в теме
(7) Тогда лучше сделать так:

ВЫБРАТЬ
	&ДоговорКонтрагента КАК ДоговорКонтрагента ,
	ЕСТЬNULL(Хозрасчетный.СуммаОборотКт, 0) КАК СуммаАвансов,
	ЕСТЬNULL(Заказы.СуммаВзаиморасчетовПриход, 0) КАК СуммаДоговора
ИЗ
	РегистрНакопления.ЗаказыПокупателей.Обороты(, , , ДоговорКонтрагента = &ДоговорКонтрагента ) КАК Заказы
	ПОЛНОЕ СОЕДИНЕНИЕ 
		(ВЫБРАТЬ СУММА(т.СуммаОборотКт) КАК СуммаОборотКт  ИЗ РегистрБухгалтерии.Хозрасчетный.Обороты(, , Регистратор, ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамПолученным), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ДоговорыКонтрагентов), Субконто1 = &ДоговорКонтрагента , , ) КАК т
		ГДЕ
			т.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее) КАК Хозрасчетный
		ПО (ИСТИНА)

Показать
23. japopov 68 15.03.17 09:17 Сейчас в теме
(20) Вадим, это же будет тормозить жутко!
26. ice-net 19 15.03.17 09:25 Сейчас в теме
12. japopov 68 15.03.17 09:02 Сейчас в теме
Не могу проверить (нет подходящей конфигурации развёрнутой), так что вот, написано вручную - нужно перепроверить:
ВЫБРАТЬ
	ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
	ЗаказыПокупателейОстаткиИОбороты.СуммаВзаиморасчетовПриход КАК СуммаДоговора
ПОМЕСТИТЬ СуммаДоговораВсего
ИЗ
	РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты КАК ЗаказыПокупателейОстаткиИОбороты
ГДЕ
	ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента = &ДоговорКонтрагента
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
	СУММА(ХозрасчетныйОстаткиИОбороты.СуммаОборотКт) КАК СуммаАвансов,
	СУММА(СуммаДоговораВсего.СуммаДоговора) КАК СуммаДоговора
ИЗ
	РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, , Регистратор, , Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамПолученным), , ) КАК ХозрасчетныйОстаткиИОбороты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ СуммаДоговораВсего КАК СуммаДоговораВсего
ПО ХозрасчетныйОстаткиИОбороты.Субконто2 = СуммаДоговораВсего.ДоговорКонтрагента
ГДЕ
ХозрасчетныйОстаткиИОбороты.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее

СГРУППИРОВАТЬ ПО
ХозрасчетныйОстаткиИОбороты.Субконто2
Показать
13. ResetAtreides 15.03.17 09:05 Сейчас в теме
(12) ЕстьNULL забыл добавить )
15. japopov 68 15.03.17 09:08 Сейчас в теме
(13) Не забыл. Какой IsNull при внутреннем соединении? Внутреннее соединение и так отрежет все несовпадающие записи.
17. ResetAtreides 15.03.17 09:10 Сейчас в теме
(15) ага, а я чет решил что ты левое сделал, оно вроде как более подходящее по логике первого поста
14. japopov 68 15.03.17 09:07 Сейчас в теме
(12)
1) Таблицы соединяем внутренним соединением. Тогда и условие по договору на вторую таблицу накладывать не надо: оно и так наложится неявно (просто из первой таблицы придут только записи с нужным договором).
2) Группировка только по группировочному полю, остальные поля - суммировать.
3) У меня этого нет, но Вы можете в первом запросе проиндексировать ещё по полю ДоговорКонтрагента - работать будет шустрее.

Что получится на Ваших данных?
16. MaximKor 20 15.03.17 09:09 Сейчас в теме
спасибо за старания. но пусто снова в запросе. даже если писать естьnull
Прикрепленные файлы:
18. ResetAtreides 15.03.17 09:10 Сейчас в теме
(16) а вот это как раз из-за внутреннего соединения, имхо. Сделай левое
19. japopov 68 15.03.17 09:14 Сейчас в теме
(16) Внутреннее соединение в моём запросе замените на левое.
22. MaximKor 20 15.03.17 09:16 Сейчас в теме
(19) тогда не работает условие по договору из первого запроса, добавил его во второй. и результат также, пусто
24. japopov 68 15.03.17 09:23 Сейчас в теме
(22) Уберите временно таблицу СуммаДоговораВсего. Отладьте данные во втором запросе.
Верните таблицу СуммаДоговораВсего. Настройте соединение таблиц по полю ДоговорКонтрагента.
Проверьте данные. Если появляются Null, вставьте внутрь сумм ЕСТЬNULL(***,0).

Трудно Вам дальше помогать (делать всё за Вас ;-) ), не имея источника для проверки.
27. ResetAtreides 15.03.17 09:25 Сейчас в теме
(24) Ты там правое соединение запулил. Это ж к авансам обороты цепляет, а надо наоборот
25. ResetAtreides 15.03.17 09:23 Сейчас в теме
(22) Покажи текст получившегося запроса-то. И отбор по договору запихни сразу в параметры виртуальных таблиц
P/S/ Смени правое соединение на левое
21. japopov 68 15.03.17 09:16 Сейчас в теме
(16)
ВЫБРАТЬ
	ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
	ЗаказыПокупателейОстаткиИОбороты.СуммаВзаиморасчетовПриход КАК СуммаДоговора
ПОМЕСТИТЬ СуммаДоговораВсего
ИЗ
	РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты КАК ЗаказыПокупателейОстаткиИОбороты
ГДЕ
	ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента = &ДоговорКонтрагента
;

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
	ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
	СУММА(ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.СуммаОборотКт,0)) КАК СуммаАвансов,
	СУММА(ЕСТЬNULL(СуммаДоговораВсего.СуммаДоговора,0)) КАК СуммаДоговора
ИЗ
	РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, , Регистратор, , Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамПолученным), , ) КАК ХозрасчетныйОстаткиИОбороты
ПРАВОЕ СОЕДИНЕНИЕ СуммаДоговораВсего КАК СуммаДоговораВсего
ПО ХозрасчетныйОстаткиИОбороты.Субконто2 = СуммаДоговораВсего.ДоговорКонтрагента
ГДЕ
ХозрасчетныйОстаткиИОбороты.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее

СГРУППИРОВАТЬ ПО
ХозрасчетныйОстаткиИОбороты.Субконто2
Показать
28. ResetAtreides 15.03.17 09:29 Сейчас в теме
зачем по ИСТИНА-то соединять? Оно и так соединится. А вообще, похоже именно что надо покажет и ничего лишнего не тянет. Только больно уж узко специализированно получается, потом фиг этот запрос расширишь
29. ice-net 19 15.03.17 09:39 Сейчас в теме
(28)
Можно и без..

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

Показать


В любом случае будет работать лучше чем в (0) и быстрее
30. japopov 68 15.03.17 09:42 Сейчас в теме
(29) Вот это - хорошо! Особенно хорошо, что обе задействованные виртуальные таблицы фильтруются сразу при получении.
Пожалуй, лучший вариант.
Хотя, вариации на тему (21) будут универсальнее, тут Reset Atreides прав.
32. ice-net 19 15.03.17 09:58 Сейчас в теме
(30)
Есть задача - есть решение)
Это не типовой код с запросом для 5 различных вариантов отчетов или еще что на 150 строк.. Это решение под конкретную задачу. Должно быть просто и оптимально, без излишеств. Что тут может модернизироваться? Добавить отбор за период, сделать по нескольким договорам(Чуть изменить отбор и связь добавить).. не очень понимаю для чего тут универсальность для дальнейших доработок, все итак легко и понятно.

Имхо. Без обид, но на (0) и (21) с такими отборами смотреть больно. =)
33. japopov 68 15.03.17 10:18 Сейчас в теме
(32)
Без обид. Я всегда стараюсь быть объективным. Потому и написал, что решение хорошее, но не масштабируемое.
А завтра понадобится всю эту красоту делать не по одному договору, а по списку, и сгруппировать долги по определённому признаку (ни разу не сталкивались с таким - "для ВОТ ЭТОЙ группы контрагентов считаем чётко, а по остальным - без учёта договоров"? Реально, такая задача была), и...?
А выбрать данные в две ВТ и потом их соединить по любому признаку - всегда проще и потом можно расширить, хоть по признаку длины ног секретарши директора!
34. ice-net 19 15.03.17 11:31 Сейчас в теме
(33)
Согласен, но а что, если надо будет добавить еще сумму приходов (если поставщик и покупатель одно лицо)?
Или разбить все это дело по реквизитам из регистратора определенного типа со сложными группировками по итогам?)

Я это к тому, что когда понадобиться - тогда и надо делать(под конкретные определенные потребности). Обычно такие доработки как минимум требуют переписать часть кода, а сложные - и вовсе иногда всю логику переделать.. Универсальность - не панацея)
31. MaximKor 20 15.03.17 09:57 Сейчас в теме
(29) спасибо за помощь!
Спасибо всем кто принимал участие!
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

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

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

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

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)