Используем партионный учет. Списание партий "по средней".
Как то в очередной раз разбираясь с расчетом себестоимости я заметил такую вещь, что в файловой базе полный расчет выполнялся за 30 секунд, а в серверной порядка 10 минут.
Отладчиком был найден типовой код, выполнение которого занимало большую часть времени. Как это ни удивительно, это оказались запросы по способам распределения статей затрат организации в общем модуле ПроцедурыРасчетаСебестоимостиВыпуска.
Посмотрев текст запроса и просто добавив соответствующие индексы во временные таблицы по способам распределения мы получили ускорение при проведении документа «Расчет себестоимости» в серверной базе почти в 20 раз (10 минут => 30 секунд).
Здесь следует сделать одно замечание: данный способ хорошо работает только в том случае, если в результирующей временной таблице по способам распределения большое число записей. Проверить это просто – выполните запрос из процедуры СформироватьВременнуюТаблицуСпособыРаспределения в консоли. В моем случае в выборке было порядка 100 тыс. записей (90 способов распределения на ~ 1200 подразделений организации (у нас это объекты строительства с этапами)).
Ниже приведены фрагменты кода:
- В процедуру СформироватьВременнуюТаблицуСпособыРаспределения сразу после запроса добавляем строки (см. комментарии //ТВИ):
ТекстЗапросаСКомментариями = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
…(полный текст запроса)...
|";
//
ТекстЗапросаСКомментариями = ТекстЗапросаСКомментариями + "ИНДЕКСИРОВАТЬ ПО
| СтатьяЗатрат,
| Подразделение,
| //ДляБухУчета СчетЗатрат,
| //ДляНалУчета СчетЗатрат,
| //ДляМеждУчета СчетЗатрат,
| Период";
//
- В функцию СформироватьЗапросПоСпособамРаспределенияЗатрат сразу после строки ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//Поместить", ""); добавляем следующие строки (см. комментарии //ТВИ):
Если ФормироватьВременнуюТаблицу Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//Поместить", "");
//
Если ВидОтраженияВУчете = Перечисления.ВидыОтраженияВУчете.ОтражатьВУправленческомУчете Тогда
ТекстЗапроса = ТекстЗапроса + "ИНДЕКСИРОВАТЬ ПО
СпособыРаспределения.СтатьяЗатрат,
СпособыРаспределения.Подразделение";
Иначе
ТекстЗапроса = ТекстЗапроса + "ИНДЕКСИРОВАТЬ ПО
СпособыРаспределения.СтатьяЗатрат,
СпособыРаспределения.Подразделение,
СпособыРаспределения.СчетЗатрат";
КонецЕсли;
//