Оптимизация код регламентного задания (УПП 1.3)

1. user1304317 28.09.20 13:27 Сейчас в теме
Всем привет!
Есть регламентное задание в УПП, которое выполняется два раза в неделю. Суть его в том, чтобы снять галку "RnD".
В карточке ГНК, как и в НК, есть этот реквизит. Регламентное задание отрабатывается корректно.
Сейчас появилась такая проблема, что после выполнение РЗ, элементы НК, по которым была снята галка, не регистрируются к обмену.
Пользователям приходится в ручную перезаписывать каждую позицию.

В запрос я добавил поле "Номенклатура" и добавил цикл по перезаписи тех элементов, по которым были изменения. Хотел спросить мнения экспертов, правильно ли я сделал с точки зрения оптимизации и чистоты кода.
Если есть ошибки или недочеты, поправьте пож-та.
Всем спасибо.

	УстановитьПривилегированныйРежим(Истина);
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("ДатаПроверки", ТекущаяДата());
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	БИТ_СТ_ГруппыНоменклатурыВКаталоге.Ссылка КАК ГНК,
	|	Номенклатура.БИТ_СТ_ГруппаНоменклатуры.ОтветственныйКонструктор КАК ОтветственныйКонструктор,
	|	Номенклатура.Ссылка КАК Номенклатура // добавил поле
	|ИЗ
	|	Справочник.БИТ_СТ_ГруппыНоменклатурыВКаталоге КАК БИТ_СТ_ГруппыНоменклатурыВКаталоге
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
	|		ПО (Номенклатура.БИТ_СТ_ГруппаНомеклатурыВКаталоге = БИТ_СТ_ГруппыНоменклатурыВКаталоге.Ссылка)
	|			И (Номенклатура.БИТ_СТ_ГруппаНоменклатуры.ОтветственныйКонструктор <> ЗНАЧЕНИЕ(Справочник.Пользователи.Пустаяссылка))
	|ГДЕ
	|	НЕ БИТ_СТ_ГруппыНоменклатурыВКаталоге.ПометкаУдаления
	|	И БИТ_СТ_ГруппыНоменклатурыВКаталоге.СТ_R_AndD
	|	И БИТ_СТ_ГруппыНоменклатурыВКаталоге.СТ_ПлановаяДатаСнятия <= &ДатаПроверки
	|
	|СГРУППИРОВАТЬ ПО
	|	Номенклатура.БИТ_СТ_ГруппаНоменклатуры.ОтветственныйКонструктор,
	|	БИТ_СТ_ГруппыНоменклатурыВКаталоге.Ссылка,
	|	Номенклатура.Ссылка
	|ИТОГИ ПО
	|	ГНК,
	|	Номенклатура";
	
	Шаблон = БИТ_СТ_ПовторноеИспользованиеЗначений.ПолучитьЗначениеКонстанты("СТ_ШаблонСообщенияСнятиеRndГНК");
	
	ВыборкаГНК = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"ГНК");
	Пока ВыборкаГНК.Следующий() цикл
		СправочникОбъект = ВыборкаГНК.ГНК.ПолучитьОбъект();
		СправочникОбъект.СТ_R_AndD = Ложь;   
		СправочникОбъект.СТ_ДатаУстановкиСтатуса =  ТекущаяДата();
		
                // добавил цикл
		ВыборкаНоменклатура = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "НК");
		Пока ВыборкаНоменклатура.Следующий() Цикл
			НоменклатураОбъект = ВыборкаНоменклатура.Номенклатура.ПолучитьОбъект();
			НоменклатураОбъект.Записать();
		КонецЦикла;
		// конец цикла


		Успех = Истина;
		НачатьТранзакцию();
        Попытка
			СправочникОбъект.Записать();
			СтруктураКонтекст = СформироватьСтруктуруКонтекст(ВыборкаГНК.ГНК);
			Если ЗначениеЗаполнено(СправочникОбъект.СТ_ОтветственныйКонструктор) тогда
				СтруктураСообщения	= бит_фн_ОповещенияСервер.СформироватьСообщениеПоШаблону(Шаблон, СтруктураКонтекст);
			КонецЕсли;
			БИТ_СТ_Оповещения.ЗаписатьОповещение(ВыборкаГНК.ГНК,СправочникОбъект.СТ_ОтветственныйКонструктор , СтруктураСообщения.Заголовок, СтруктураСообщения.Текст, СтруктураСообщения.Подпись,Неопределено , );
			АдресаПолучателей = БИТ_СТ_ПовторноеИспользованиеЗначений.ПолучитьЗначениеКонстанты("АдресаПолучателейДляОповещенияПоИзменениюПараметра_R_AndD");
			Если ЗначениеЗаполнено(АдресаПолучателей) Тогда 
				БИТ_СТ_Оповещения.ЗаписатьОповещение(ВыборкаГНК.ГНК, , СтруктураСообщения.Заголовок, СтруктураСообщения.Текст, СтруктураСообщения.Подпись, АдресаПолучателей , );
    		КонецЕсли;

		Исключение
			Успех = Ложь;
		КонецПопытки;
		
		Если Успех Тогда
			ЗафиксироватьТранзакцию();
		Иначе
			ОтменитьТранзакцию();
		КонецЕсли;
		ВыборкаКонструтор = ВыборкаГНК.Выбрать();
		Пока ВыборкаКонструтор.Следующий() Цикл
			Успех = Истина;
			НачатьТранзакцию();
	        Попытка
				БИТ_СТ_Оповещения.ЗаписатьОповещение(ВыборкаГНК.ГНК,ВыборкаКонструтор.ОтветственныйКонструктор , СтруктураСообщения.Заголовок, СтруктураСообщения.Текст, СтруктураСообщения.Подпись,Неопределено , );
			Исключение
				Успех = Ложь;
			КонецПопытки;
			
			Если Успех Тогда
				ЗафиксироватьТранзакцию();
			Иначе
				ОтменитьТранзакцию();
			КонецЕсли;
		КонецЦикла; 
	КонецЦикла;
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
15. Sashares 34 28.09.20 17:00 Сейчас в теме
(1)Какую же дичь вы написали между строчками
// добавил цикл и
// конец цикла

При обходе каждой строки верхнего цикла вы заново выполняете запрос и обходите его.
Так делать точно не нужно.
19. user1304317 28.09.20 17:08 Сейчас в теме
2. Степной 27 28.09.20 14:51 Сейчас в теме
(1) Номенклатура не регистрируется к обмену потому, что с ней не происходит одно из следующих действий:

1. Программная запись элемента.
2. Программная регистрация элемента к обмену без непосредственно повторной записи элемента.

Цикл, который добавили, на мой взгляд, не очень хорошее решение. Тут лучше использовать п.2, в случае, если у номенклатуры не нужно снимать этот флаг.

Еще заметил после беглого просмотра кода: получение константы АдресаПолучателейДляОповещенияПоИзменениюПараметра_R_AndD, полагаю, можно вынести вне тела цикла.
3. user1304317 28.09.20 14:53 Сейчас в теме
4. Степной 27 28.09.20 14:56 Сейчас в теме
(3) Рано отправил сообщение.
5. user1304317 28.09.20 14:57 Сейчас в теме
(4) Так какие же действия? Цикл, который я добавил - по оптимизации норм?
6. Степной 27 28.09.20 14:59 Сейчас в теме
(5) В 1-м сообщении добавлены пункты, у Вас не отображаются?
7. user1304317 28.09.20 15:08 Сейчас в теме
(6) Теперь увидел)
А что значит второй пункт?
8. Степной 27 28.09.20 15:12 Сейчас в теме
(7) Подробнее можно посмотреть здесь.
9. user1304317 28.09.20 15:15 Сейчас в теме
(8) Забыл сказать, что у меня обмен RabbitRMQ
10. TODD22 18 28.09.20 15:20 Сейчас в теме
(9)
Забыл сказать, что у меня обмен RabbitRMQ

Регистрация у вас в плане обмена, брокер тут не причём.
11. user1304317 28.09.20 15:38 Сейчас в теме
(10)
(8) Тогда получается вот так
		ВыборкаНаправленияОбмена = РегистрыСведений.БИТ_НСИ_НаправленияОбмена.Выбрать(Новый Структура("Объект", ВыборкаГНК.Номенклатура));
		БИТ_НСИ_ОбщегоНазначения.ЗарегистрироватьИзмененияОбъектаДляУзла(ВыборкаНаправленияОбмена, ВыборкаГНК.Номенклатура);



Верно?
12. TODD22 18 28.09.20 15:45 Сейчас в теме
(11)
Верно?

Если регистрирует значит верно. А так не знаю что делают функции из модулей БИТ_НСИ_....
13. user1304317 28.09.20 15:47 Сейчас в теме
(12) Вот:
Процедура ЗарегистрироватьИзмененияОбъектаДляУзла(Узел, Объект) Экспорт
	//ТИГАЙ заменил 20130711-->
	//Если Узел <> ПланыОбмена.БИТ_НСИ_ИнформационныеБазы.ЭтотУзел() Тогда
	Если ЗначениеЗаполнено(Узел) И Узел <> ПланыОбмена.БИТ_НСИ_ИнформационныеБазы.ЭтотУзел() Тогда
	//<--ТИГАЙ заменил 20130711 
	    // + Кордунов М.В. LT (0000007048) (30.07.2015)
        //ПланыОбмена.ЗарегистрироватьИзменения(Узел, Объект);
		Попытка
			ПланыОбмена.ЗарегистрироватьИзменения(Узел, Объект);
		Исключение
		КонецПопытки;	
		// - Кордунов М.В. LT (0000007048) (30.07.2015)

	КонецЕсли; 
	
КонецПроцедуры

Показать
14. Степной 27 28.09.20 16:06 Сейчас в теме
(13) Похоже на правду. Единственное, нужно проконтролировать корректность передаваемых параметров.
16. user1304317 28.09.20 17:01 Сейчас в теме
(14) Проверил, не регистрирует.
17. Степной 27 28.09.20 17:04 Сейчас в теме
(16) Думаю, нужно проверить типы передаваемых параметров, потом точку останова на строке
ПланыОбмена.ЗарегистрироватьИзменения(Узел, Объект);

и проверить, что там все корректно. Есть ощущение, что исключение возникает.
18. user1304317 28.09.20 17:08 Сейчас в теме
(17)
ПланыОбмена.ЗарегистрироватьИзменения(Узел, Объект);

Проверил также, нет исключения.

У нас на работе регистрации К обмену идут через кролик, а не через типовой механизм.
20. Степной 27 28.09.20 17:10 Сейчас в теме
(18) Тогда посмотрите, как регистрируется элемент при его записи и переиспользуйте этот механизм.
21. user1304317 28.09.20 17:15 Сейчас в теме
(20) Проблема в том, что там идет проверка на дополнительные свойства.
Я просто сейчас создал простую внешнюю обработку.
Реквизит (спр Номенклатура) и команду добавил.
Вызвал процедуру по регистрации и вылетела ошибка:
{ОбщийМодуль.СТ_ВыгрузкаRabbitMQ.Модуль(20)}: Поле объекта не обнаружено (ДополнительныеСвойства)

	Отказ = Ложь;
	Попытка
		СТ_ВыгрузкаRabbitMQ.адаптер_ПриЗаписиЭлементаПриЗаписи(Номенклатура, Отказ);
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;

Показать
22. Степной 27 28.09.20 17:41 Сейчас в теме
(21) Трудно что-то сказать. Нужно смотреть что там внутри процедуры.
23. user1304317 28.09.20 17:44 Сейчас в теме
(22)
Процедура адаптер_ПриЗаписиЭлементаПриЗаписи(Источник, Отказ) Экспорт
	
	Если Не Источник.ДополнительныеСвойства.Свойство("НеПередаватьОбъектПоRabbitMQ") Тогда
		
		Если СТ_ОбщегоНазначенияПовтИспRMQ.ИспользоватьОчередьФоновогоОбменаRMQ() Тогда 
			
			Если Не Источник.ДополнительныеСвойства.Свойство("ОбработкаИзОчередиRabbitMQ") Тогда		
			
				ПередаваемыйИсточник = Новый Структура("СтрокаXML, ДополнительныеСвойства", 
														СТ_ПроверкиСерверRMQ.ВернутьXMLОбразОбъекта(Источник), 
														Источник.ДополнительныеСвойства);
				ПоставитьВОчередьФоновогоОбменаRMQ(ПередаваемыйИсточник, Источник.Метаданные().ПолноеИмя());
				
			Иначе
				
				ПередаваемыйИсточник = Источник;
				
				Если Источник.ДополнительныеСвойства.Свойство("РежимЗаписи") Тогда
					Если Источник.ДополнительныеСвойства.РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения тогда 
						СТ_СинхронизацияДанныхУниверсальный.ПоместитьXMLОбъектаВЛогНедоставленныхСообщений(ПередаваемыйИсточник, "Отмена проведения");
					Иначе
						СТ_СинхронизацияДанныхУниверсальный.ПоместитьXMLОбъектаВЛогНедоставленныхСообщений(ПередаваемыйИсточник, "Проведение");
					КонецЕсли;
				Иначе 
					СТ_СинхронизацияДанныхУниверсальный.ПоместитьXMLОбъектаВЛогНедоставленныхСообщений(ПередаваемыйИсточник);
				КонецЕсли;
				
			КонецЕсли;	
			
		Иначе
		
		
			#Если НаСервере Тогда
				ПередаваемыйИсточник = Источник;
			#Иначе
				ПередаваемыйИсточник = Новый Структура("СтрокаXML, ДополнительныеСвойства", 
														СТ_ПроверкиСерверRMQ.ВернутьXMLОбразОбъекта(Источник), 
														Источник.ДополнительныеСвойства);
			#КонецЕсли

			Если Источник.ДополнительныеСвойства.Свойство("РежимЗаписи") Тогда
				Если Источник.ДополнительныеСвойства.РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения тогда 
					СТ_СинхронизацияДанныхУниверсальный.ПоместитьXMLОбъектаВЛогНедоставленныхСообщений(ПередаваемыйИсточник, "Отмена проведения");
				Иначе
					СТ_СинхронизацияДанныхУниверсальный.ПоместитьXMLОбъектаВЛогНедоставленныхСообщений(ПередаваемыйИсточник, "Проведение");
				КонецЕсли;
			Иначе 
				СТ_СинхронизацияДанныхУниверсальный.ПоместитьXMLОбъектаВЛогНедоставленныхСообщений(ПередаваемыйИсточник);
			КонецЕсли;
			
		КонецЕсли;	
	Иначе
		Источник.ДополнительныеСвойства.Удалить("НеПередаватьОбъектПоRabbitMQ");
	КонецЕсли;
	
КонецПроцедуры



Показать
24. Степной 27 29.09.20 14:58 Сейчас в теме
(23) Думаю, Вы передаете в качестве источника тип СправочникСсылка, а процедура ожидает СправочникОбъект.
25. user1304317 29.09.20 17:01 Сейчас в теме
(24) Да, вы правы. Утром дошло до этого. Все работает. Спасибо за советы.
Оставьте свое сообщение

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