Есть такой кусок в обработке проведения документа "Заказ покупателя":
Нормально ли вообще перебирать позиции номенклатуры так в обработке проведения или можно как то лучше сделать ? Не нравится как выглядит.
Для Каждого Стр ИЗ Товары Цикл
Результат = ОбщийМодуль.Проверка(Дата,номенклатура,контрагент)
Если Результат Тогда
Отказ = Истина
Конецесли
конеццикла
Нормально ли вообще перебирать позиции номенклатуры так в обработке проведения или можно как то лучше сделать ? Не нравится как выглядит.
По теме из базы знаний
- Средство поиска "узких мест" при проведении документов
- Обработки для проведения сценарного нагрузочного тестирования на примере конфигурации ЗУП версии 3.1.1.91
- Методика оптимизации программного кода 1С: проведение документов
- Задача на ошибки и неоптимальности при проведении приходной накладной
- Варианты отладки и оптимизации запросов в 1С
Найденные решения
(21) попробуйте такую процедуру, не идеал конечно,
//в модуле документа
Процедура ОбработкаПроведения(Отказ, Режим)
...
ПроверкаЦен(Отказ);
...
КонецПроцедуры;
Процедура ПроверкаЦен(Отказ)
Если Отказ Тогда Возврат; КонецЕсли;
//Запрос - шаблон
лкЗапрос = Новый Запрос;
лкЗапрос.Текст = "
|Выбрать
| Док.НомерСтроки,
| Представление(Док.Номенклатура) как Номенклатура,
| Док.Цена,
| РегЦен.Цена кк ЦенаРег
|из
| Документ.ЗаказПокупателя.Товары Док
|левое соединение
| РегиствеСведении.Рег.СрезПоследних(&Дата,ТипЦен = &ТипЦен) КАК РегЦен //пока сократил И Номенклатура в (&СписокНоменклатура) КАК РегЦен
| по Док.Номенклатура = РегЦен.Номенклатура
|где
| Док.Ссылка = &Ссылка
|и Док.Цена <> ЕстьNull(РегЦен.Цена,0)//или какое другое условие
|Упорядочить по
| Док.НомерСтроки
|";
лкЗапрос.УстановитьПараметр("Дата", Дата);
лкЗапрос.УстановитьПараметр("ТипЦен", ТипЦен);
лкЗапрос.УстановитьПараметр("Ссылка", Ссылка);
лкРезультат = лкЗапрос.Выполнить();
Если Не лкРезультат.Пустой() Тогда
//есть расхождения цен
Отказ = Истина;
//очень полезно вывести эту информацию при испольждовании в групповых операциях
Сообщить("Есть ошибки по ценам в документе: " + Ссылка);
лкВыборка = лкРезультат.Выбрать();
Пока лкВыборка.Следующий() Цикл
Сообщить("Строка: " + лкВыборка.НомерСтроки
+ " товар: " + лкВыборка.Номенклатура
+ " цена док: " + лкВыборка.Цена
+ " цена рег: " + лкВыборка.ЦенаРег
);
КонецЦикла;
КонецЕсли;
КонецПроцедуры;
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(4)
ни чего необычного, типичный гов-но код
вот это
тоже,
так как в момент обработки проведения, документ уже записан в базу и достаточно передать его ссылку в запрос,
а не выгружать все товары из ТЧ и передавать из в виде параметра
потом предвижу ваш код дальше, когда вы захотите вывести сообщение по той строчке, в которой номенклатура не соответствует цене
Строка: ННН, товар: Стол - не соответствие цен. (ну или чего там)
Вот вот !) Я же его и добавил :)
ни чего необычного, типичный гов-но код
вот это
Запрос.установитьПараметр("СписокНоменклатура",Товары.Выгрузить("Номенклатура"));
тоже,
так как в момент обработки проведения, документ уже записан в базу и достаточно передать его ссылку в запрос,
а не выгружать все товары из ТЧ и передавать из в виде параметра
потом предвижу ваш код дальше, когда вы захотите вывести сообщение по той строчке, в которой номенклатура не соответствует цене
Строка: ННН, товар: Стол - не соответствие цен. (ну или чего там)
(21) попробуйте такую процедуру, не идеал конечно,
//в модуле документа
Процедура ОбработкаПроведения(Отказ, Режим)
...
ПроверкаЦен(Отказ);
...
КонецПроцедуры;
Процедура ПроверкаЦен(Отказ)
Если Отказ Тогда Возврат; КонецЕсли;
//Запрос - шаблон
лкЗапрос = Новый Запрос;
лкЗапрос.Текст = "
|Выбрать
| Док.НомерСтроки,
| Представление(Док.Номенклатура) как Номенклатура,
| Док.Цена,
| РегЦен.Цена кк ЦенаРег
|из
| Документ.ЗаказПокупателя.Товары Док
|левое соединение
| РегиствеСведении.Рег.СрезПоследних(&Дата,ТипЦен = &ТипЦен) КАК РегЦен //пока сократил И Номенклатура в (&СписокНоменклатура) КАК РегЦен
| по Док.Номенклатура = РегЦен.Номенклатура
|где
| Док.Ссылка = &Ссылка
|и Док.Цена <> ЕстьNull(РегЦен.Цена,0)//или какое другое условие
|Упорядочить по
| Док.НомерСтроки
|";
лкЗапрос.УстановитьПараметр("Дата", Дата);
лкЗапрос.УстановитьПараметр("ТипЦен", ТипЦен);
лкЗапрос.УстановитьПараметр("Ссылка", Ссылка);
лкРезультат = лкЗапрос.Выполнить();
Если Не лкРезультат.Пустой() Тогда
//есть расхождения цен
Отказ = Истина;
//очень полезно вывести эту информацию при испольждовании в групповых операциях
Сообщить("Есть ошибки по ценам в документе: " + Ссылка);
лкВыборка = лкРезультат.Выбрать();
Пока лкВыборка.Следующий() Цикл
Сообщить("Строка: " + лкВыборка.НомерСтроки
+ " товар: " + лкВыборка.Номенклатура
+ " цена док: " + лкВыборка.Цена
+ " цена рег: " + лкВыборка.ЦенаРег
);
КонецЦикла;
КонецЕсли;
КонецПроцедуры;
Показать
(10)Примерно такой
ВЫБРАТЬ
Рег.Цен
Рег.ТипЦен
Рег.номенклатура
ИЗ РегиствеСведении.Рег.СрезПоследних(&ДатаЦен,ТипЦен = &ТипЦен И Номенклатура = &Номенклатура)
КАК РегСрезПоследних
Запрос.установитьПараметр("ДатаЦен",Дата);
Запрос.установитьПараметр("ТипЦен ",ТипЦен );
Запрос.установитьПараметр("Номенклатура ",Номенклатура );
ПоказатьВЫБРАТЬ
Рег.Цен
Рег.ТипЦен
Рег.номенклатура
ИЗ РегиствеСведении.Рег.СрезПоследних(&ДатаЦен,ТипЦен = &ТипЦен И Номенклатура в (&СписокНоменклатура)
КАК РегСрезПоследних
Запрос.установитьПараметр("ДатаЦен",Дата);
Запрос.установитьПараметр("ТипЦен ",ТипЦен );
Запрос.установитьПараметр("СписокНоменклатура",Товары.Выгрузить("Номенклатура"));
Показать
(12)А Как сравнивать каждую позицию цены ?
Ну тоесть мне надо после запроса сравнить
Если Цена Номенклатуры из ТЧ Товары < Выборка Цена Тогда не ПРОВОДИМ.
Просто в обходе выборки Сделать Цена = Товары.ВЫгрузитьКОлонку("Цена")
И
Как сделать корректнее ?!
Ну тоесть мне надо после запроса сравнить
Если Цена Номенклатуры из ТЧ Товары < Выборка Цена Тогда не ПРОВОДИМ.
Просто в обходе выборки Сделать Цена = Товары.ВЫгрузитьКОлонку("Цена")
И
Пока ВЫборка.Следующий() Цикл
Цена = Товары.ВЫгрузитьКОлонку("Цена")
]для каждого Стр Из Цена Цикл
Если Цена < Выборка. Цена Тогда
"НЕПРОВОДИМ"
конецЦикла
конеццикла
ПоказатьКак сделать корректнее ?!
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот