Условие для Статуса заказа

1. user1004898 28 07.02.19 20:12 Сейчас в теме +1 $m
Пишу код для Второго Вычисляемого поля в СКД.
Для поля по линии Заказа надо вывести общий статус в колонку СрокПоставки
Для номенклатурных позиций (временно закрасил белым) Срокпоставки подтягивается из общего модуля в Первое вычисляемое поле СКД.

Функция Первого вычисляемого поля СКД к примеру имеет вид ОпределитьСрокПоставки(ЗаказКлиента,КодСтроки). Получаю напротив номенклатурных позиций статусы "Готов к отгрузке", "В резерве" (на фото).

Во втрое вычисляемое поле Пишу такой код, итог которого должен вывестись в поля по линии Заказа.
ВЫБОР
	КОГДА (ОпределитьСрокПоставки(ЗаказКлиента,КодСтроки) ПОДОБНО "Поставка:%"
	И ОпределитьСрокПоставки(ЗаказКлиента,КодСтроки) ПОДОБНО "Всё отгружено")
		ТОГДА "Отгружен частично"
	КОГДА ОпределитьСрокПоставки(ЗаказКлиента,КодСтроки) ПОДОБНО "Всё отгружено"
		ТОГДА "Всё отгружено!"
	КОГДА ОпределитьСрокПоставки(ЗаказКлиента,КодСтроки) ПОДОБНО "Всё в резерве"
		ТОГДА "Готов к отгрузке"
	КОГДА ОпределитьСрокПоставки(ЗаказКлиента,КодСтроки) ПОДОБНО "В%%наличии% резерв%%"
		ТОГДА "В резерве"
	КОГДА ОпределитьСрокПоставки(ЗаказКлиента,КодСтроки) ПОДОБНО "В%резерв%Отгружено:%"
		ТОГДА "Отгружен частично"	
	КОГДА ОпределитьСрокПоставки(ЗаказКлиента,КодСтроки) ПОДОБНО "В%%наличии%%поставк%%резерв%%"
		ТОГДА "В резерве"
	КОГДА ОпределитьСрокПоставки(ЗаказКлиента,КодСтроки) ПОДОБНО "Поставка:%"
		ИЛИ ОпределитьСрокПоставки(ЗаказКлиента,КодСтроки) ПОДОБНО "Поставка %"
		ТОГДА "Поставка " + ФОРМАТ(КоличествоДнейПоставки, "ЧЦ=; ЧДЦ=0")+ " дн."
	ИНАЧЕ ОпределитьСрокПоставки(ЗаказКлиента,КодСтроки)
КОНЕЦ
Показать


Как результат все хорошо, кроме заказа 5. (на фото) его разрывает, не смотря на первое условие в коде (КОГДА ... И .. ТОГДА)

"ИЛИ" срабатывает аналогично.
Какие еще варианты можно, чтобы в итоге получить для Заказа 5 именно "Отгружен частично" ?
Прикрепленные файлы:
+
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. oleg-x 26 08.02.19 11:02 Сейчас в теме
(1) не совсем понятно что Вас не устраивает. Для начала. что бы точно видеть что к чему, выведите колонку по которой определяется статус.
Сейчас я так понял срабатывает 7 условие.
+
3. user1004898 28 08.02.19 12:29 Сейчас в теме
(2)
не устраивает то, что Заказ №5 разорван.
Не срабатывает первое условие, идет дальше и срабатывает второе и седьмое.
+
6. oleg-x 26 08.02.19 13:09 Сейчас в теме
(3) У заказа 5 получаются разные статусы, отсюда и разрыв. Выведите колонку по который определяете статус и все станет понятно. Не надо гадать что не так.
Если срабатывает не то условие, значит значение не то, которое Вы ожидаете. Программа сама ничего придумывать не будет.
+
7. user1004898 28 08.02.19 13:21 Сейчас в теме
(6)
вот эта функция (ОпределитьСрокПоставки(ЗаказКлиента,КодСтроки) определяет статус по отдельным номенклатурным позициям.
Статус по отдельным номенклатурным позициям выводится верным.
Для заказа общего статуса нет.
Я его формирую на основании статусов номенклатурных позиций, во втором вычисляемом поле СКД.
+
4. JohnGalt 57 08.02.19 12:46 Сейчас в теме
текст "Поставка:" в заказе №5 без двоеточия на рисунке
+
5. user1004898 28 08.02.19 12:57 Сейчас в теме
(4)это 7 условие.
если товар (поле белое, закрасил) имеет сатутус Поставка: ...
то статус Заказа Поставка_ ...
+
8. oleg-x 26 08.02.19 13:26 Сейчас в теме
Так и проверяйте этот алгоритм, скорее всего там и кроется ошибка или просто именно этот заказ по разным позициям имеет разный статус.
+
9. user1004898 28 08.02.19 13:28 Сейчас в теме
(8)
так я же прошу помощи, как записать его правильно!
+
10. oleg-x 26 08.02.19 13:30 Сейчас в теме
(9) Выведите значение ОпределитьСрокПоставки(ЗаказКлиента,КодСтроки) этого выражения и сформируйте отчет. И приложите СкринШот.
+
11. user1004898 28 08.02.19 13:34 Сейчас в теме
(10)
на картинке все что на белом фоне - это и есть результат этого выражения (этой функции)
+
12. oleg-x 26 08.02.19 13:40 Сейчас в теме
Я вижу результат условия:
КОГДА (ОпределитьСрокПоставки(ЗаказКлиента,КодСтроки) ПОДОБНО "Поставка:%"
    И ОпределитьСрокПоставки(ЗаказКлиента,КодСтроки) ПОДОБНО "Всё отгружено")
        ТОГДА "Отгружен частично" //Это мы видим
//а сам текст для сравнения не видим
//может выражение (ОпределитьСрокПоставки(ЗаказКлиента,КодСтроки) =" Поставка:%, Поставка: % Поставка %"
+
14. user1004898 28 08.02.19 13:47 Сейчас в теме
(12)
там же видно, в Заказе 5.
В первой части "Все отгружено", вторая часть - что вывелось выражение "Поставка: 90 дн."

Вот хотя бы на основании этих двух статусов двух номенклатурных позиций надо вывести один общий статус для Заказа №5 " "Отгружен частично".
+
13. oleg-x 26 08.02.19 13:46 Сейчас в теме
Вообщем добавьте еще одно поле в запросе ОпределитьСрокПоставки(ЗаказКлиента,КодСтроки) без всяких условий и выведите в таблицу.
+
15. user1004898 28 08.02.19 13:49 Сейчас в теме
(13)
так это поле и есть - "СрокПоставки", оно и так выводится напротив каждой номенклатурной позиции.
+
16. user1004898 28 08.02.19 13:53 Сейчас в теме
(13)
Прикрепленные файлы:
+
17. oleg-x 26 08.02.19 14:07 Сейчас в теме
Выложите сюда отчет, посмотрим. Так долго иначе
+
18. user1004898 28 08.02.19 14:09 Сейчас в теме
(17)
хм, я только прошу помощи. как правильно записать условие, чтобы вывести один статус для Заказа, если в Заказе имеются разные статусы по номенклатурным позициям. что тут не понятно....
+
19. oleg-x 26 08.02.19 14:30 Сейчас в теме
1) Либо сделать в документе статус отгрузки и по нему определять.
Либо сделать отдельную таблицу в которой каждому статусу присваиваете порядковый номер (по нему сортируете) и выбираете из нее 1 только первую запись.
+
20. user1004898 28 08.02.19 14:59 Сейчас в теме
(19)
что вообще никак в вычисляемое поле СКД в выражения Выбор Когда Тогда подать условие с И ИЛИ через ПОДОБНО?

пробовал через циклы, ругается.
+
21. alexgood 7 08.02.19 16:01 Сейчас в теме
(20)
Вам (19) подсказал правильно. При этом 1-й вариант предпочтителен. Призаписи устанавливайте статус и не мучайтесь, а то потребуется ещё один отчет, обработка, запрос - замучаетесь таскать с собой куски запроса.
+
22. user1004898 28 08.02.19 17:47 Сейчас в теме
(21)
не вариант...
не ужели никак не написать функцию с усовием для этого одного случая
+
23. oleg-x 26 08.02.19 17:55 Сейчас в теме
1) Можно выгрузить данные в промежуточную таблицу, обработать её программно и загрузить обратно в СКД.
Можно подготовить таблицу и загрузить в СКД.

Или помучится и "искаверкать" как нить так запрос, что бы брать один статус для всех строк из заказа.
На вскидку, создаете временную таблицу со всеми статусами, из этой таблицы выбираем наш заказ и после правильно сортировки выбираем первую запись. И эта запись и будет статусом для всех строк заказа.
+
24. user1004898 28 08.02.19 17:57 Сейчас в теме
(23)
Можно выгрузить данные в промежуточную таблицу, обработать её программно и загрузить обратно в СКД.
Можно подготовить таблицу и загрузить в СКД.


Как такое можно сделать, если я знаю все статусы номенклатурных позиций?
+
25. oleg-x 26 08.02.19 18:02 Сейчас в теме
Если предварительно подготовить таблицу, то добавить не набор данных запрос, а надор данных объект, описываем все поля из таблицы. И при компоновке подключить таблицу:
СтандартнаяОбработка = Ложь;
	Таблица = ПолучаемНужнуюТаблицу();

	
	СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	
	//Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;  
	// - Если сделать так, как показано выше(рекомендуют на некоторых ресурсах), то при изменении настроек в режиме клиента
	// этих изменений Вы не увидите, потому что настройки всегда будут по умолчанию. Как правильно - вариант ниже
	Настройки = КомпоновщикНастроек.ПолучитьНастройки(); 
 	
	ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; 
    
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;	
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);	
	
	ВнешнийНаборДанных = Новый Структура("Таблица", Таблица); 
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; 
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешнийНаборДанных, ДанныеРасшифровки); 
	
	ДокументРезультат.Очистить();
	
 	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; 
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат); 
	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
Показать
+
26. oleg-x 26 08.02.19 18:04 Сейчас в теме
Если выгрузить в промежуточную, тут сложнее, и с кодом сейчас не подскажу. Но будет два набора данных, один запрос (выгружаем итоги в таблицу), а второй объект (загружаем из таблицы обработанные данные).
+
27. oleg-x 26 08.02.19 18:05 Сейчас в теме
А под обработать таблицу я подразумеваю, что по каждому заказу-номенклатуре проверяем статус и если их больше одного, то во всех "неправильных строках" меняем на нужный.
+
28. oleg-x 26 08.02.19 18:06 Сейчас в теме
В любом случае простого решения не будет.
А почему добавить реквизит статуса в документ это не вариант?
+
29. user1004898 28 08.02.19 18:38 Сейчас в теме
(28)
в документе они есть, но называются иначе. хранятся в Перечисление.СостоянияЗаказовКлиентов.



но связь по ЗаказКлиента.Сслыка = СостоянияЗаказовКлиентов.Ссылка не дает требуемого результата (статуса)
+
30. oleg-x 26 08.02.19 19:06 Сейчас в теме
Перечисление - это не где хранится, а всего лишь ограниченный список значений.
А статус заказа либо в самом заказе (ЗаказКлиента.СтатусЗаказа), либо рассчитывается динамически, либо хранится в регистре сведений. Так сказать в зависимости от того как придумали разработчики.
+
31. user1004898 28 08.02.19 20:02 Сейчас в теме
(30)
а как можно в СКД обратиться к процедуре модуля менеджера документа Заказ Клиента, чтобы вытянуть статус?

функция имеет вид

Функция ТекстЗапросаДляРасчетаСостоянийЗаказов() Экспорт


возвращает текст запроса, который предположительно и будет Статусом
+
32. oleg-x 26 08.02.19 20:35 Сейчас в теме
По простому ни как, найдите там запрос и присобачьте его к своему запросу.
+
33. user1004898 28 08.02.19 22:10 Сейчас в теме
(32)спасибо за "четкий" ответ!
+
34. VmvLer 10.02.19 13:18 Сейчас в теме
после стартового сообщения с вызовом в СКД инвариантного кейса с функциями общего модуля
понял, что тратить время на эту тему глупо.

это будет работать только в песочницах, а в реальной базе все наглухо залипнет
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот