Мобильная версия

Ускорение формирования консолидированных регламентированных отчетов УПП в 100 раз

Ускорение формирования консолидированных регламентированных отчетов УПП в 100 раз

У Заказчика установлено УПП, РИБ, около 20 распределенных баз, все данные стекаются в одну центральную базу, в которой формируются консолидированные отчеты.

В начале 2011 года пришла пора формировать годовую бухгалтерскую отчетность за 2010 год по всему предприятию в целом.

Проблема оказалась в том, что скорость формирования была очень неудовлетворительной. К примеру, бухгалтерский баланс по 20 филиалам формировался около 5 часов. Размер базы к этому времени вырос до 150 Гб, ее большую часть составляли итоги по бухгалтерским регистрам.

Встала задача ускорить формирование отчетности

При изучении кода типовых отчетов и замере производительности средствами отладчика выяснилось, что везде использовалась типовая обработка БухгалтерскиеИтоги, которая каждый (для каждых развернутых итогов) раз считала все, что только возможно.

От нее решили отказаться, и для каждого развернутого итога написали свои мелкие запросы.

Все конструкции в коде вида

ИтогиРС = "НачальныйРазвернутыйОстатокДт, НачальныйРазвернутыйОстатокКт, КонечныйРазвернутыйОстатокДт, КонечныйРазвернутыйОстатокКт";

  мБухИтогиРС.РассчитатьИтоги("Хозрасчетный", ИтогиРС, "Сумма", "Счет, Субконто1, Субконто2", мДатаНачалаПериодаОтчета, мДатаКонцаПериодаОтчета, , СчетаУчетаРасчетов, ВидыСубконтоДляРасчета, , , "Организация", мОргРасшифровка);

  П010024103_62_01_СНД = мБухИтогиРС.ПолучитьИтог("СуммаНачальныйРазвернутыйОстатокДт", "Счет", Счет62_01);
  П010024104_62_01_СКД = мБухИтогиРС.ПолучитьИтог("СуммаКонечныйРазвернутыйОстатокДт",  "Счет", Счет62_01)

были заменены на три конструкции (в зависимости от количеств разных субконто) в начале модуля:

  Запрос = Новый Запрос;
  Запрос.Текст = "
  |ВЫБРАТЬ
  | Счет,
  | Субконто1,
  | Субконто2,
  | Субконто3,
  | СуммаРазвернутыйОстатокДт КАК СуммаДт,
  | СуммаРазвернутыйОстатокКт КАК СуммаКт
  |ИЗ
  | РегистрБухгалтерии.Хозрасчетный.Остатки(&МоментВремени,
  |  Счет В (&Счета_12324, &Счета_12329, &Счета_15231, &Счета_15232, &Счета_15290),
  |  ,
  |  " + ?(ПоВсемОрганизациям, "", "Организация = &Организация") + "
  | )
  |ИТОГИ
  | СУММА(СуммаРазвернутыйОстатокДт) КАК СуммаДт,
  | СУММА(СуммаРазвернутыйОстатокКт) КАК СуммаКт
  | ПО
  |  Счет
  |";
  Запрос.УстановитьПараметр("МоментВремени", МоментВремени);
  Запрос.УстановитьПараметр("Организация", Организация);
  Запрос.УстановитьПараметр("Счета_12324", Счета_12324);
  Запрос.УстановитьПараметр("Счета_12329", Счета_12329);
  Запрос.УстановитьПараметр("Счета_15231", Счета_15231);
  Запрос.УстановитьПараметр("Счета_15232", Счета_15232);
  Запрос.УстановитьПараметр("Счета_15290", Счета_15290);
  ВыборкаСубконто3 = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

В дальнейшем обращения к данным этих запросов выглядят так:

  П0112324 = 0;
  ВыборкаСубконто3.Сбросить();
  Пока ВыборкаСубконто3.Следующий() Цикл
   Если (Счета_12324.Найти(ВыборкаСубконто3.Счет) <> Неопределено) И (ВыборкаСубконто3.СуммаДт <> 0) Тогда
    П0112324 = П0112324 + ВыборкаСубконто3.СуммаДт;
   КонецЕсли;
  КонецЦикла;

В результате время формирования отчета «Регламентированный отчет баланс» по одной организации сократилось с 5-ти часов до 2-х минут, т.е. в 150 раз.

Следующим шагом стал отказ от использования проверки иерархии счетов (как в параметрах виртуальных таблиц, так и в модуле при обходе результатов запросов), для этого в самом начале модуля было сделалано так:

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

12640 - это номер ячейки, для которой предназначен этот набор счетов. А дальше проверяются счета на простое вхождение в массив как в предыдущем фрагменте модуля.

Следующая проблема была связана с тем, очень долго формировался консолидированный баланс по всем организациям. Код типового отчета был написан таким образом, что происходила выборка итогов для каждой организации в отдельности, а далее суммы складывались и получалось консолидированная. Фактически, отчет строился столько раз, по скольким организациям собирался консолидированный баланс, в нашем случае – 20 раз.

ИЗ    РегистрБухгалтерии.Хозрасчетный.Остатки(, , , Организация = &Организация) КАК ХозрасчетныйОстатки

Простор для оптимизации был в следующем: при формировании отчета по всем организациям в целом, бухгалтерские итоги можно получать без разреза по организации

ИЗ    РегистрБухгалтерии.Хозрасчетный.Остатки(, , ,) КАК ХозрасчетныйОстатки

Это изменение помогло ускорить формирования отчетности по всем организациям в целом в несколько раз. Но платой за эту оптимизацию стала потеря функционала, не нужного в нашем случае (а именно формирования консолидированного отчета по произвольному набору организаций). Теперь отчет формируется только один раз: по одной организации, или вообще без отбора по организациям.

Доп. информация: при анализе неоптимальных запросов может оказаться полезной статья из базы знаний 1С: Типичные причины неоптимальной работы запросов и методы оптимизации (http://its.1c.ru/db/metod81#content:4050:1)

 


Все решения

Лучшая компания занимается автоматизацией управления и учета на базе программных продуктов «1С»
Наша компания также занимается разработкой собственных программных продуктов на платформе «1С:Предприятие 8».
В нашей компании работают сертифицированные фирмой «1С» специалисты, которые постоянно совершенствуют свои знания и навыки. Они помогут качественно и оперативно решить задачи по автоматизации управления и учета на вашем предприятии.
Наша компания опирается в своей работе на знание и повседневное применение стандартов качества, проектных методов в управлении, процессного подхода в организации нашей деятельности.
Наша компания успешно прошла сертификационный аудит на соответствие системы менеджмента качества международному стандарту ISO 9001. Наличие сертификата свидетельствует, что компания хорошо организована, в ней четко распределены обязанности, процедуры, соблюдается технология работы, имеются оперативные инструкции, документированные и известные всему персоналу, существуют отработанные процедуры контроля выполняемых работ и, конечно, профессиональный и хорошо обученный персонал, способный качественно выполнять свою работу.