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

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 Сейчас в теме
после стартового сообщения с вызовом в СКД инвариантного кейса с функциями общего модуля
понял, что тратить время на эту тему глупо.

это будет работать только в песочницах, а в реальной базе все наглухо залипнет
Оставьте свое сообщение
Вакансии
Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

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

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

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

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