1. user1004898 4 07.02.19 20:12 Сейчас в теме +1 $m

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

Пишу код для Второго Вычисляемого поля в СКД.
Для поля по линии Заказа надо вывести общий статус в колонку СрокПоставки
Для номенклатурных позиций (временно закрасил белым) Срокпоставки подтягивается из общего модуля в Первое вычисляемое поле СКД.

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

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


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

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

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

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

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


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

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



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

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

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


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

это будет работать только в песочницах, а в реальной базе все наглухо залипнет
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

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

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

Программист 1С ЗУП
Уфа
зарплата от 60 000 руб. до 90 000 руб.
Полный день

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

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