Оптимизация код регламентного задания (УПП 1.3)
Всем привет!
Есть регламентное задание в УПП, которое выполняется два раза в неделю. Суть его в том, чтобы снять галку "RnD".
В карточке ГНК, как и в НК, есть этот реквизит. Регламентное задание отрабатывается корректно.
Сейчас появилась такая проблема, что после выполнение РЗ, элементы НК, по которым была снята галка, не регистрируются к обмену.
Пользователям приходится в ручную перезаписывать каждую позицию.
В запрос я добавил поле "Номенклатура" и добавил цикл по перезаписи тех элементов, по которым были изменения. Хотел спросить мнения экспертов, правильно ли я сделал с точки зрения оптимизации и чистоты кода.
Если есть ошибки или недочеты, поправьте пож-та.
Всем спасибо.
Есть регламентное задание в УПП, которое выполняется два раза в неделю. Суть его в том, чтобы снять галку "RnD".
В карточке ГНК, как и в НК, есть этот реквизит. Регламентное задание отрабатывается корректно.
Сейчас появилась такая проблема, что после выполнение РЗ, элементы НК, по которым была снята галка, не регистрируются к обмену.
Пользователям приходится в ручную перезаписывать каждую позицию.
В запрос я добавил поле "Номенклатура" и добавил цикл по перезаписи тех элементов, по которым были изменения. Хотел спросить мнения экспертов, правильно ли я сделал с точки зрения оптимизации и чистоты кода.
Если есть ошибки или недочеты, поправьте пож-та.
Всем спасибо.
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ДатаПроверки", ТекущаяДата());
Запрос.Текст =
"ВЫБРАТЬ
| БИТ_СТ_ГруппыНоменклатурыВКаталоге.Ссылка КАК ГНК,
| Номенклатура.БИТ_СТ_ГруппаНоменклатуры.ОтветственныйКонструктор КАК ОтветственныйКонструктор,
| Номенклатура.Ссылка КАК Номенклатура // добавил поле
|ИЗ
| Справочник.БИТ_СТ_ГруппыНоменклатурыВКаталоге КАК БИТ_СТ_ГруппыНоменклатурыВКаталоге
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
| ПО (Номенклатура.БИТ_СТ_ГруппаНомеклатурыВКаталоге = БИТ_СТ_ГруппыНоменклатурыВКаталоге.Ссылка)
| И (Номенклатура.БИТ_СТ_ГруппаНоменклатуры.ОтветственныйКонструктор <> ЗНАЧЕНИЕ(Справочник.Пользователи.Пустаяссылка))
|ГДЕ
| НЕ БИТ_СТ_ГруппыНоменклатурыВКаталоге.ПометкаУдаления
| И БИТ_СТ_ГруппыНоменклатурыВКаталоге.СТ_R_AndD
| И БИТ_СТ_ГруппыНоменклатурыВКаталоге.СТ_ПлановаяДатаСнятия <= &ДатаПроверки
|
|СГРУППИРОВАТЬ ПО
| Номенклатура.БИТ_СТ_ГруппаНоменклатуры.ОтветственныйКонструктор,
| БИТ_СТ_ГруппыНоменклатурыВКаталоге.Ссылка,
| Номенклатура.Ссылка
|ИТОГИ ПО
| ГНК,
| Номенклатура";
Шаблон = БИТ_СТ_ПовторноеИспользованиеЗначений.ПолучитьЗначениеКонстанты("СТ_ШаблонСообщенияСнятиеRndГНК");
ВыборкаГНК = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"ГНК");
Пока ВыборкаГНК.Следующий() цикл
СправочникОбъект = ВыборкаГНК.ГНК.ПолучитьОбъект();
СправочникОбъект.СТ_R_AndD = Ложь;
СправочникОбъект.СТ_ДатаУстановкиСтатуса = ТекущаяДата();
// добавил цикл
ВыборкаНоменклатура = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "НК");
Пока ВыборкаНоменклатура.Следующий() Цикл
НоменклатураОбъект = ВыборкаНоменклатура.Номенклатура.ПолучитьОбъект();
НоменклатураОбъект.Записать();
КонецЦикла;
// конец цикла
Успех = Истина;
НачатьТранзакцию();
Попытка
СправочникОбъект.Записать();
СтруктураКонтекст = СформироватьСтруктуруКонтекст(ВыборкаГНК.ГНК);
Если ЗначениеЗаполнено(СправочникОбъект.СТ_ОтветственныйКонструктор) тогда
СтруктураСообщения = бит_фн_ОповещенияСервер.СформироватьСообщениеПоШаблону(Шаблон, СтруктураКонтекст);
КонецЕсли;
БИТ_СТ_Оповещения.ЗаписатьОповещение(ВыборкаГНК.ГНК,СправочникОбъект.СТ_ОтветственныйКонструктор , СтруктураСообщения.Заголовок, СтруктураСообщения.Текст, СтруктураСообщения.Подпись,Неопределено , );
АдресаПолучателей = БИТ_СТ_ПовторноеИспользованиеЗначений.ПолучитьЗначениеКонстанты("АдресаПолучателейДляОповещенияПоИзменениюПараметра_R_AndD");
Если ЗначениеЗаполнено(АдресаПолучателей) Тогда
БИТ_СТ_Оповещения.ЗаписатьОповещение(ВыборкаГНК.ГНК, , СтруктураСообщения.Заголовок, СтруктураСообщения.Текст, СтруктураСообщения.Подпись, АдресаПолучателей , );
КонецЕсли;
Исключение
Успех = Ложь;
КонецПопытки;
Если Успех Тогда
ЗафиксироватьТранзакцию();
Иначе
ОтменитьТранзакцию();
КонецЕсли;
ВыборкаКонструтор = ВыборкаГНК.Выбрать();
Пока ВыборкаКонструтор.Следующий() Цикл
Успех = Истина;
НачатьТранзакцию();
Попытка
БИТ_СТ_Оповещения.ЗаписатьОповещение(ВыборкаГНК.ГНК,ВыборкаКонструтор.ОтветственныйКонструктор , СтруктураСообщения.Заголовок, СтруктураСообщения.Текст, СтруктураСообщения.Подпись,Неопределено , );
Исключение
Успех = Ложь;
КонецПопытки;
Если Успех Тогда
ЗафиксироватьТранзакцию();
Иначе
ОтменитьТранзакцию();
КонецЕсли;
КонецЦикла;
КонецЦикла;
ПоказатьПо теме из базы знаний
- Подсистема "Обмен данными по произвольным правилам КД 2.x"
- Оптимизация расчета себестоимости выпуска продукции (УПП 1.3, Партионный учет)
- Концепция автоматизации многопрофильного Холдинга в системе АУБ на платформе 1С
- Версионирование справочников, документов и регистров сведений на SQL-сервере
- Оптимизация проведения документов списания партий в УПП 1.3
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Номенклатура не регистрируется к обмену потому, что с ней не происходит одно из следующих действий:
1. Программная запись элемента.
2. Программная регистрация элемента к обмену без непосредственно повторной записи элемента.
Цикл, который добавили, на мой взгляд, не очень хорошее решение. Тут лучше использовать п.2, в случае, если у номенклатуры не нужно снимать этот флаг.
Еще заметил после беглого просмотра кода: получение константы АдресаПолучателейДляОповещенияПоИзменениюПараметра_R_AndD, полагаю, можно вынести вне тела цикла.
1. Программная запись элемента.
2. Программная регистрация элемента к обмену без непосредственно повторной записи элемента.
Цикл, который добавили, на мой взгляд, не очень хорошее решение. Тут лучше использовать п.2, в случае, если у номенклатуры не нужно снимать этот флаг.
Еще заметил после беглого просмотра кода: получение константы АдресаПолучателейДляОповещенияПоИзменениюПараметра_R_AndD, полагаю, можно вынести вне тела цикла.
(12) Вот:
Процедура ЗарегистрироватьИзмененияОбъектаДляУзла(Узел, Объект) Экспорт
//ТИГАЙ заменил 20130711-->
//Если Узел <> ПланыОбмена.БИТ_НСИ_ИнформационныеБазы.ЭтотУзел() Тогда
Если ЗначениеЗаполнено(Узел) И Узел <> ПланыОбмена.БИТ_НСИ_ИнформационныеБазы.ЭтотУзел() Тогда
//<--ТИГАЙ заменил 20130711
// + Кордунов М.В. LT (0000007048) (30.07.2015)
//ПланыОбмена.ЗарегистрироватьИзменения(Узел, Объект);
Попытка
ПланыОбмена.ЗарегистрироватьИзменения(Узел, Объект);
Исключение
КонецПопытки;
// - Кордунов М.В. LT (0000007048) (30.07.2015)
КонецЕсли;
КонецПроцедуры
Показать
(20) Проблема в том, что там идет проверка на дополнительные свойства.
Я просто сейчас создал простую внешнюю обработку.
Реквизит (спр Номенклатура) и команду добавил.
Вызвал процедуру по регистрации и вылетела ошибка:
{ОбщийМодуль.СТ_ВыгрузкаRabbitMQ.Модуль(20)}: Поле объекта не обнаружено (ДополнительныеСвойства)
Я просто сейчас создал простую внешнюю обработку.
Реквизит (спр Номенклатура) и команду добавил.
Вызвал процедуру по регистрации и вылетела ошибка:
{ОбщийМодуль.СТ_ВыгрузкаRabbitMQ.Модуль(20)}: Поле объекта не обнаружено (ДополнительныеСвойства)
Отказ = Ложь;
Попытка
СТ_ВыгрузкаRabbitMQ.адаптер_ПриЗаписиЭлементаПриЗаписи(Номенклатура, Отказ);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Показать
(22)
Процедура адаптер_ПриЗаписиЭлементаПриЗаписи(Источник, Отказ) Экспорт
Если Не Источник.ДополнительныеСвойства.Свойство("НеПередаватьОбъектПоRabbitMQ") Тогда
Если СТ_ОбщегоНазначенияПовтИспRMQ.ИспользоватьОчередьФоновогоОбменаRMQ() Тогда
Если Не Источник.ДополнительныеСвойства.Свойство("ОбработкаИзОчередиRabbitMQ") Тогда
ПередаваемыйИсточник = Новый Структура("СтрокаXML, ДополнительныеСвойства",
СТ_ПроверкиСерверRMQ.ВернутьXMLОбразОбъекта(Источник),
Источник.ДополнительныеСвойства);
ПоставитьВОчередьФоновогоОбменаRMQ(ПередаваемыйИсточник, Источник.Метаданные().ПолноеИмя());
Иначе
ПередаваемыйИсточник = Источник;
Если Источник.ДополнительныеСвойства.Свойство("РежимЗаписи") Тогда
Если Источник.ДополнительныеСвойства.РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения тогда
СТ_СинхронизацияДанныхУниверсальный.ПоместитьXMLОбъектаВЛогНедоставленныхСообщений(ПередаваемыйИсточник, "Отмена проведения");
Иначе
СТ_СинхронизацияДанныхУниверсальный.ПоместитьXMLОбъектаВЛогНедоставленныхСообщений(ПередаваемыйИсточник, "Проведение");
КонецЕсли;
Иначе
СТ_СинхронизацияДанныхУниверсальный.ПоместитьXMLОбъектаВЛогНедоставленныхСообщений(ПередаваемыйИсточник);
КонецЕсли;
КонецЕсли;
Иначе
#Если НаСервере Тогда
ПередаваемыйИсточник = Источник;
#Иначе
ПередаваемыйИсточник = Новый Структура("СтрокаXML, ДополнительныеСвойства",
СТ_ПроверкиСерверRMQ.ВернутьXMLОбразОбъекта(Источник),
Источник.ДополнительныеСвойства);
#КонецЕсли
Если Источник.ДополнительныеСвойства.Свойство("РежимЗаписи") Тогда
Если Источник.ДополнительныеСвойства.РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения тогда
СТ_СинхронизацияДанныхУниверсальный.ПоместитьXMLОбъектаВЛогНедоставленныхСообщений(ПередаваемыйИсточник, "Отмена проведения");
Иначе
СТ_СинхронизацияДанныхУниверсальный.ПоместитьXMLОбъектаВЛогНедоставленныхСообщений(ПередаваемыйИсточник, "Проведение");
КонецЕсли;
Иначе
СТ_СинхронизацияДанныхУниверсальный.ПоместитьXMLОбъектаВЛогНедоставленныхСообщений(ПередаваемыйИсточник);
КонецЕсли;
КонецЕсли;
Иначе
Источник.ДополнительныеСвойства.Удалить("НеПередаватьОбъектПоRabbitMQ");
КонецЕсли;
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот