Оптимизация обработки проведения

1. Intercititude 01.04.20 12:49 Сейчас в теме
Есть такой кусок в обработке проведения документа "Заказ покупателя":

Для Каждого Стр ИЗ Товары Цикл
Результат = ОбщийМодуль.Проверка(Дата,номенклатура,контрагент)
Если Результат Тогда
Отказ = Истина
Конецесли
конеццикла


Нормально ли вообще перебирать позиции номенклатуры так в обработке проведения или можно как то лучше сделать ? Не нравится как выглядит.
По теме из базы знаний
Найденные решения
23. soft_wind 01.04.20 17:27 Сейчас в теме
(21) попробуйте такую процедуру, не идеал конечно,
//в модуле документа
Процедура ОбработкаПроведения(Отказ, Режим)
    ...
    ПроверкаЦен(Отказ);
    ...
КонецПроцедуры;

Процедура ПроверкаЦен(Отказ)

	Если Отказ Тогда Возврат; КонецЕсли;
	
	//Запрос - шаблон
	лкЗапрос = Новый Запрос;
	лкЗапрос.Текст = "
	    |Выбрать
		|	Док.НомерСтроки,
		|	Представление(Док.Номенклатура) как Номенклатура,
		|	Док.Цена,
		|	РегЦен.Цена кк ЦенаРег
		|из
		|	Документ.ЗаказПокупателя.Товары Док
		|левое соединение
		|	РегиствеСведении.Рег.СрезПоследних(&Дата,ТипЦен = &ТипЦен) КАК РегЦен //пока сократил И Номенклатура в (&СписокНоменклатура) КАК РегЦен
		|		по Док.Номенклатура = РегЦен.Номенклатура
		|где
		|	Док.Ссылка = &Ссылка
		|и	Док.Цена <> ЕстьNull(РегЦен.Цена,0)//или какое другое условие
		|Упорядочить по
		|	Док.НомерСтроки
		|";
	лкЗапрос.УстановитьПараметр("Дата", Дата);
	лкЗапрос.УстановитьПараметр("ТипЦен", ТипЦен);
	лкЗапрос.УстановитьПараметр("Ссылка", Ссылка);
	
	лкРезультат = лкЗапрос.Выполнить();
	Если Не лкРезультат.Пустой() Тогда
		//есть расхождения цен
		Отказ = Истина;
		//очень полезно вывести эту информацию при испольждовании в групповых операциях
		Сообщить("Есть ошибки по ценам в документе: " + Ссылка); 
		лкВыборка = лкРезультат.Выбрать();
		Пока лкВыборка.Следующий() Цикл
			Сообщить("Строка: " + лкВыборка.НомерСтроки 
					+ " товар: " + лкВыборка.Номенклатура
					+ " цена док: " + лкВыборка.Цена
					+ " цена рег: " + лкВыборка.ЦенаРег
			);
			
		КонецЦикла; 
	КонецЕсли; 
	
КонецПроцедуры;
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. alex-l19041 8 01.04.20 12:55 Сейчас в теме
(1) а что в
ОбщийМодуль.Проверка(
?
5. Intercititude 01.04.20 13:04 Сейчас в теме
(2) Запрос,куда передаются дата,ном и контрагент.
В итоге оттуда берётся сумма и происходит проверка,которая возвращает истину или ложь
Думал перебирать циклом на Запрос.УстановитьПараметр("Номенклатура",Номенклатура) , но по-моему это ещё хуже :)
3. Torin 747 01.04.20 12:56 Сейчас в теме
(1)Какой то левый код.." не типовой" :)
4. Intercititude 01.04.20 13:02 Сейчас в теме
(3) Вот вот !) Я же его и добавил :)
20. soft_wind 01.04.20 14:24 Сейчас в теме
(4)
Вот вот !) Я же его и добавил :)

ни чего необычного, типичный гов-но код
вот это
Запрос.установитьПараметр("СписокНоменклатура",Товары.Выгрузить("Номенклатура"));

тоже,
так как в момент обработки проведения, документ уже записан в базу и достаточно передать его ссылку в запрос,
а не выгружать все товары из ТЧ и передавать из в виде параметра

потом предвижу ваш код дальше, когда вы захотите вывести сообщение по той строчке, в которой номенклатура не соответствует цене
Строка: ННН, товар: Стол - не соответствие цен. (ну или чего там)
21. Vladimir-R 167 01.04.20 14:30 Сейчас в теме
(20) напишите, как сделать правильно
Intercititude; +1 Ответить
23. soft_wind 01.04.20 17:27 Сейчас в теме
(21) попробуйте такую процедуру, не идеал конечно,
//в модуле документа
Процедура ОбработкаПроведения(Отказ, Режим)
    ...
    ПроверкаЦен(Отказ);
    ...
КонецПроцедуры;

Процедура ПроверкаЦен(Отказ)

	Если Отказ Тогда Возврат; КонецЕсли;
	
	//Запрос - шаблон
	лкЗапрос = Новый Запрос;
	лкЗапрос.Текст = "
	    |Выбрать
		|	Док.НомерСтроки,
		|	Представление(Док.Номенклатура) как Номенклатура,
		|	Док.Цена,
		|	РегЦен.Цена кк ЦенаРег
		|из
		|	Документ.ЗаказПокупателя.Товары Док
		|левое соединение
		|	РегиствеСведении.Рег.СрезПоследних(&Дата,ТипЦен = &ТипЦен) КАК РегЦен //пока сократил И Номенклатура в (&СписокНоменклатура) КАК РегЦен
		|		по Док.Номенклатура = РегЦен.Номенклатура
		|где
		|	Док.Ссылка = &Ссылка
		|и	Док.Цена <> ЕстьNull(РегЦен.Цена,0)//или какое другое условие
		|Упорядочить по
		|	Док.НомерСтроки
		|";
	лкЗапрос.УстановитьПараметр("Дата", Дата);
	лкЗапрос.УстановитьПараметр("ТипЦен", ТипЦен);
	лкЗапрос.УстановитьПараметр("Ссылка", Ссылка);
	
	лкРезультат = лкЗапрос.Выполнить();
	Если Не лкРезультат.Пустой() Тогда
		//есть расхождения цен
		Отказ = Истина;
		//очень полезно вывести эту информацию при испольждовании в групповых операциях
		Сообщить("Есть ошибки по ценам в документе: " + Ссылка); 
		лкВыборка = лкРезультат.Выбрать();
		Пока лкВыборка.Следующий() Цикл
			Сообщить("Строка: " + лкВыборка.НомерСтроки 
					+ " товар: " + лкВыборка.Номенклатура
					+ " цена док: " + лкВыборка.Цена
					+ " цена рег: " + лкВыборка.ЦенаРег
			);
			
		КонецЦикла; 
	КонецЕсли; 
	
КонецПроцедуры;
Показать
26. Intercititude 01.04.20 21:50 Сейчас в теме
(23) Единственное данные не корректны.
Мне нужно Если Цена из ТЧ Товары < Цена из Регистра Тогда Не проводим!
В вашем случае не так.
27. soft_wind 03.04.20 12:45 Сейчас в теме
(26) э-э-э, а у вас что пальчик отсох, что бы подправить условие запроса?

вместо "<>" сделать "<"

там даже коммент есть: //или какое другое условие
Intercititude; +1 Ответить
7. Fox-trot 158 01.04.20 13:10 Сейчас в теме
по мне так достаточно только ссылку предавать
9. Intercititude 01.04.20 13:11 Сейчас в теме
(7) И как перебирать в запросе несколько позиции номенклатура после ?
18. Fox-trot 158 01.04.20 13:57 Сейчас в теме
6. Vladimir-R 167 01.04.20 13:05 Сейчас в теме
запрос в цикле
да еще и серверный вызов в цикле
почему в запрос не обработать сразу все данные?
8. Intercititude 01.04.20 13:10 Сейчас в теме
(6)А как передать несколько позиции номенклатура поочередно в запрос ?
Лучше чем
Для Каждого СТр ИЗ Товары Цикл
Запрос.УстановпитьПараметр("Номенклатура",Стр):
конеццикла


не придумал.
10. alex-l19041 8 01.04.20 13:15 Сейчас в теме
11. Intercititude 01.04.20 13:21 Сейчас в теме
(10)Примерно такой
ВЫБРАТЬ
Рег.Цен
Рег.ТипЦен
Рег.номенклатура
ИЗ РегиствеСведении.Рег.СрезПоследних(&ДатаЦен,ТипЦен = &ТипЦен И Номенклатура = &Номенклатура)
КАК РегСрезПоследних

Запрос.установитьПараметр("ДатаЦен",Дата);
Запрос.установитьПараметр("ТипЦен ",ТипЦен );
Запрос.установитьПараметр("Номенклатура ",Номенклатура );
Показать
12. Vladimir-R 167 01.04.20 13:43 Сейчас в теме
ВЫБРАТЬ
Рег.Цен
Рег.ТипЦен
Рег.номенклатура
ИЗ РегиствеСведении.Рег.СрезПоследних(&ДатаЦен,ТипЦен = &ТипЦен И Номенклатура в (&СписокНоменклатура)
КАК РегСрезПоследних

Запрос.установитьПараметр("ДатаЦен",Дата);
Запрос.установитьПараметр("ТипЦен ",ТипЦен );
Запрос.установитьПараметр("СписокНоменклатура",Товары.Выгрузить("Номенклатура"));
Показать
Intercititude; DADemishkevich; +2 Ответить
13. Intercititude 01.04.20 13:46 Сейчас в теме
(12)И выходит после выгрузить в выборку и перебирать Для Каждого... каждую номенклатуру и уже там проверять ?
14. Vladimir-R 167 01.04.20 13:47 Сейчас в теме
(13)Смотря что надо проверять
15. Intercititude 01.04.20 13:51 Сейчас в теме
(14)Цену номенклатуры из регистра с ценой номенклатуры из объекта.
16. DADemishkevich 01.04.20 13:53 Сейчас в теме
(15) Соединить таблицу данных регистра с таблицей товары заказа по номенклатуре
выбрать те где цены не совпадают
alex-l19041; Fox-trot; +2 Ответить
17. Intercititude 01.04.20 13:57 Сейчас в теме
19. DADemishkevich 01.04.20 14:12 Сейчас в теме
22. Intercititude 01.04.20 17:10 Сейчас в теме
(12) Проблема возникла. Товары не Выгрузить,мол это Массив.
Так как это тип ДокументТабличнаяЧасть.ЗаказПокупателя.Товары
как быть ?
24. Intercititude 01.04.20 17:59 Сейчас в теме
(12)А Как сравнивать каждую позицию цены ?

Ну тоесть мне надо после запроса сравнить

Если Цена Номенклатуры из ТЧ Товары < Выборка Цена Тогда не ПРОВОДИМ.
Просто в обходе выборки Сделать Цена = Товары.ВЫгрузитьКОлонку("Цена")
И
Пока ВЫборка.Следующий() Цикл
 Цена = Товары.ВЫгрузитьКОлонку("Цена") 
]для каждого Стр Из Цена Цикл
   Если Цена < Выборка. Цена Тогда 
"НЕПРОВОДИМ"
конецЦикла

конеццикла
Показать


Как сделать корректнее ?!
25. sergathome 4 01.04.20 18:02 Сейчас в теме
Оставьте свое сообщение

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