Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
12 дек 2024, 23:24

(Оптимизация процедуры проведения документа)

Автор GanG031, 01 июн 2020, 20:05

0 Пользователей и 1 гость просматривают эту тему.

GanG031

Всем привет!
Документ ПоступлениеТоваров при проведении делает движения по 2 регистрам:

приход по регистру накопления ТоварыНаСкладах
расход по регистру накопления ЗаказыПоставщикам

Запись в регистр накопления ТоварыНаСкладах делается в рублях (Сумма) и в долларах (СуммаВал). Курс берется на дату партии.
Документ может содержать в табличной части Товары тысячи строк с различными партиями.
Ниже представлена обработка проведения документа ПоступлениеТоваров:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)



Запрос = Новый Запрос;

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Если не Выборка.ПревышаетОстатокПоЗаказам Тогда

СуммаВал = Выборка.Сумма * Выборка.Курс;

Движение = РегистрыНакопления.ЗаказыПоставщикам.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Количество = Выборка.Количество;
Движение.Партия = Выборка.Партия;


Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Количество = Выборка.Количество;
Движение.Сумма = Выборка.Сумма;
Движение.СуммаВал = СуммаВал;

Иначе

Сообщить("Количество в поступлении "
+Выборка.Количество
+ " " + Выборка.ЕдиницаИзмерения
+ " превышает остаток по заказам "
+Выборка.КоличествоОстаток
+ " " + Выборка.ЕдиницаИзмерения);

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


подскажите,что тут можно еще оптимизировать?
Вроде попытался все сделать норм, но незнаю, как получилось.
Заранее спасибо за помошь!

LexaK

а почему вы выкладываете не рабочий Код?
какая оптимизация, когда нет команды конца цикла?
если помогло нажмите: Спасибо!

GanG031

Цитата: GanG031 от 01 июн 2020, 20:05
Всем привет!
Документ ПоступлениеТоваров при проведении делает движения по 2 регистрам:

приход по регистру накопления ТоварыНаСкладах
расход по регистру накопления ЗаказыПоставщикам

Запись в регистр накопления ТоварыНаСкладах делается в рублях (Сумма) и в долларах (СуммаВал). Курс берется на дату партии.
Документ может содержать в табличной части Товары тысячи строк с различными партиями.
Ниже представлена обработка проведения документа ПоступлениеТоваров:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)



Запрос = Новый Запрос;

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Если не Выборка.ПревышаетОстатокПоЗаказам Тогда

СуммаВал = Выборка.Сумма * Выборка.Курс;

Движение = РегистрыНакопления.ЗаказыПоставщикам.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Количество = Выборка.Количество;
Движение.Партия = Выборка.Партия;


Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Количество = Выборка.Количество;
Движение.Сумма = Выборка.Сумма;
Движение.СуммаВал = СуммаВал;

Иначе

Сообщить("Количество в поступлении "
+Выборка.Количество
+ " " + Выборка.ЕдиницаИзмерения
+ " превышает остаток по заказам "
+Выборка.КоличествоОстаток
+ " " + Выборка.ЕдиницаИзмерения);

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


подскажите,что тут можно еще оптимизировать?
Вроде попытался все сделать норм, но незнаю, как получилось.
Заранее спасибо за помошь!

LexaK

и Необходимо задать параметры запросу &Ссылка и &Валюта!
Запрос.УстановитьПараметр("Ссылка",Ссылка);
и т.д.
Добавлено: 01 июн 2020, 20:39


и еще очень удобно для отладки использовать Консоль Запросов!!!
если помогло нажмите: Спасибо!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск