Утюмов Владисав

65
Рейтинг

utyv
Владисав Утюмов



  •   Регистрация: 09.04.2011 (13 лет назад)

  •   Был(а) на сайте: 22.04.2024

Подписчики 2

Группы

Профессиональный разработчик

Рейтинг 65

Оптимизация кода 1С: простые приемы

Статья Программист Платформа 1С v8.3 Бесплатно (free) Нет файла HighLoad оптимизация

Речь пойдет о проблемах с производительностью, которые могут возникнуть из-за кода наподобие этого: Для каждого СтрокаТовары из Товары Цикл Количество = СтрокаТовары.Количество * СтрокаТовары.Коэффициент / СтрокаТовары.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент; КонецЦикла; Дело в том, что этот, с виду ни чем не примечательный код, содержит запрос в цикле.

20.09.2016    30288    utyv    41       

65

Комментарии

ПубликацииФСБУ 6/2020. Шпаргалка. Видео примеры в Бухгалтерии 3.0#13 20.12.21 8:58
Возникает вопрос. Если предприятие установило лимит в бухгалтерском учете не 100 т.р. а к примеру 500 т.р. То возникает необходимость часть ОС перевести в бух учете на забаланс, а в налоговом учете продолжать учитывать как ОС. В статье этот случай не рассмотрен. На практике столкнулись с тем что программа не дает провести документ, ругается на налоговый учет.
HighLoadОптимизация кода 1С: простые приемы#16 21.09.16 16:27
pbazeliuk, эта статья конечно для новичков, я даже не собирался ставить тег hiload - это модератор мне прицепил. Хардкор с ручным прикручиванием индекса и терабайтными базами 24*7 не рассматриваю.
УчетПринципы учета номенклатуры в конфигурациях УТ11 и ERP. Ошибки расчета себестоимости#24 21.09.16 7:39
Я не работал с УТ11 и подобными конфигурациями. Хочется лучше понять специфику партионного учета в этих решениях. В статье написано, что движения по регистру ПартииТоваровОрганизаций формируются при проведении документов. Если документы проводились не по-порядку, как это обычно бывает, что нужно сделать для восстановления последовательности? Перепроводить все документы? Или есть специальная обработка, которая проводит только по партиям? Или это автоматически происходит в фоновом режиме?

Если мы запустили проведение по партиям, получат ли другие пользователи ошибку "Конфликт блокировок"? А если запустили расчет себестоимости?

Если мы проводим документ задним числом и товара по партиям не хватает, проведет ли программа документ? При проведении в минус, формируются ли движения в количестве по регистру ПартииТоваровОрганизаций, или возникает неустранимое расхождение в регистрах?
HighLoadОптимизация кода 1С: простые приемы#2 20.09.16 22:17
Решения о том что нужно оптимизировать, а что нет лучше принимать на основании замеров. Я набросал несколько искусственных примеров, которые демонстрирую суть проблемы.

Код с микро-запросами в цикле:
Код
   Для каждого СтрокаТЧ из ЗаказПокупателя.СтруктураИзделияТЧ Цикл
      Артикул = СтрокаТЧ.Номенклатура.Артикул;
   КонецЦикла;

Замер - 6,2 сек после прогрева на документе с примерно 2000 строк.

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

Замер 200 мс.

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

Замер 70 мс.

Так что, в данном случае, в первую очередь надо убирать микрозапросы, потом думать о способе фильтрации, если разница в 130 мс нас еще беспокоит.
Индексы тут не помогут, потому что поле Ссылка и так всегда проиндексировано. Повторное использование возвращаемых значений - далеко не всегда подойдет. Это надо чтобы значения на самом деле повторно вычислялись, и была на готове функция, которую можно туда записать.

Сравнивать по скорости умножение в запросе и во встроенном языке нет особого желания. Я бы стал этим заниматься, если бы на замере увидел, что умножение у меня - самая медленная операция. Но такого пока не было, поэтому я не стесняюсь умножать там где мне удобнее.
HighLoadОптимизация кода 1С: простые приемы#0 20.09.16 13:16
Речь пойдет о проблемах с производительностью, которые могут возникнуть из-за кода наподобие этого:
Для каждого СтрокаТовары из Товары Цикл
Количество = СтрокаТовары.Количество * СтрокаТовары.Коэффициент / СтрокаТовары.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент;
КонецЦикла;
Дело в том, что этот, с виду ни чем не примечательный код, содержит запрос в цикле.