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

Почему медленно записывается документ

Автор Оксана Мороз, 02 мар 2016, 10:20

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

Оксана Мороз

Здравствуйте ! Наверно избитая тема, но искала и так и не нашла ответа на мой вопрос. Из excel выгружаю в ТаблицуЗначений порядка 8000 строк номенклатуры с артикулом и ценой, после этого программно создаю документ Установка цен номенклатуры (УТ 10.3) и заполняю его из ТЗ!. Все нормально заполняется быстро, НО как только я добавляю условие сравнения цены из тз и цены из запроса сразу начинаются тормоза. Я понимаю что идет сравнение построчно, но не знаю как сделать по другому. :( Помогите пожалуйста.

Док=Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
Док.Дата = ТекущаяДата();
Док.НеПроводитьНулевыеЗначения=Истина;

НоваяЦена = Док.ТипыЦен.Добавить();
НоваяЦена.ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Закупочная");
НоваяЦена = Док.ТипыЦен.Добавить();
НоваяЦена.ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Розничная");
Док.Ответственный = Пользователи.ТекущийПользователь();
Док.Комментарий = "Ввод цен из прайса поставщика";

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

Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("Товары",Товары);
Запрос.УстановитьПараметр("Дата",КонецДня(ТекущаяДата()));
Запрос.УстановитьПараметр("ТипЦены", Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Закупочная"));
       
Для каждого СтрокаТабличной Из Товары Цикл
Запрос.УстановитьПараметр("Артикул",СтрокаТабличной.Артикул);
КонецЦикла;

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтараяЦена = Выборка.СтараяЦена;
КонецЦикла;
//***************************************************************
//Добавляем цену закупки в установку цен номенклатуры

Если Строка(Выборка.Цена) <> Строка(Выборка.СтараяЦена) Тогда //вот если убираю эту строку то все нормально со скоростью
Стр                       =  Док.Товары.Добавить();
Стр.Номенклатура          =  Выборка.Номенклатура;
Стр.ТипЦен                =  Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Закупочная");
Стр.Цена                  =  Выборка.Цена;
Стр.Валюта                =  Форма.ВыбВалюта.Ссылка;
Стр.ЕдиницаИзмерения      =  Выборка.Номенклатура.ЕдиницаХраненияОстатков.Ссылка;

//Добавляем цену продажи в установку цен номенклатуры
Стр                       =  Док.Товары.Добавить();
Стр.Номенклатура          =  Выборка.Номенклатура;
Стр.ТипЦен                =  Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Розничная");
Стр.Валюта                =  Форма.ВыбВалюта.Ссылка;
Стр.ЕдиницаИзмерения      =  Выборка.Номенклатура.ЕдиницаХраненияОстатков.Ссылка;
Стр.ПроцентСкидкиНаценки  =  Выборка.НоменклатураНаценка;
Стр.СпособРасчетаЦены     =  Перечисления.СпособыРасчетаЦены.ПоПроцентнойНаценкеНаБазовыйТип;

КонецЕсли;

//КонецЦикла;
            КонецЦикла;

Luzer1C

Вот тут:
Для каждого СтрокаТабличной Из Товары Цикл
        Запрос.УстановитьПараметр("Артикул",СтрокаТабличной.Артикул);
        КонецЦикла;

Зачем так писать? Каждый раз подставлять Артикул из 8000 позиций таблицы?
Не проще ли сделать в запросе так: "И ЦеныНоменклатурыСрезПоследних.Номенклатура.Артикул В (&Артикул)"
А потом так: Запрос.УстановитьПараметр("Артикул", Товары.ВыгрузитьКолонку("Артикул"));
Халамбалам.

vitasw

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

Luzer1C

vitasw, лучше было бы, если человек сам бы дошёл до данного решения.;)
Халамбалам.

vitasw

Вы серьезно? считаете что ваше мнение "более правильное"?

Luzer1C

Я не говорил, что моё мнение правильное.
Но текст запроса лучше было бы новичку не выдавать.
Халамбалам.

vitasw

Цитата: Luzer1C от 02 мар 2016, 10:49Но текст запроса лучше было бы новичку не выдавать.

:D И на чем же основано такое глубокое заключение?

Оксана Мороз

Спасибо всем, я и не предполагала что в самом запросе можно получить именно ту цену которая нужна, а не сравнивать ее потом из запроса. Так что иногда бывает нужно показать именно правильный запрос! Еще раз СПАСИБО что помогли :zebzdr:
Теперь все заполняется вот так -вжик

Теги:

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

Рейтинг@Mail.ru

Поиск