Ускоренный полный пересчет итогов регистров


Обработка для быстрого полного пересчета итогов по выбранным регистрам, ускорение достигается за счет предварительной очистки таблиц итогов средствами MS-SQL.

Идея ускорения взята из публикации Зачем в 1С нужно периодически пересчитывать итоги по регистрам?. Смысл в том, что основное время при пересчете итогов тратится платформой на удаление итогов с помощью DELETE. Предварительная очистка итогов с помощью TRUNCATE TABLE существенно ускоряет пересчет итогов.

Подключение к MS-SQL реализовано через ADO. Код открыт.

Функционал

  • Настраиваемый список регистров для пересчета.
  • Работа в обычном и управляемом режиме.
  • В управляемом режиме подключение к MS-SQL может выполняться на клиенте и на сервере.
  • При использовании платформы 8.3.1 и выше есть возможность пересчитать итоги регистров сведений, для которых установлен признак "Разрешить итоги".

Требования

  • Платформа 8.2 и выше.
  • СУБД MS-SQL
  • Четкое понимание зачем пересчитывать итоги, и к каким последствиям это может привести.

Установка

Установка не требуется, обработка запускается как внешняя.

15 Comments

  1. Fragster

    У стандартного метода есть неоспоримый плюс — пересчет идет транзакциями помесячно. И если срубить процесс в середине — ничего страшного не произойдет. И даже отчеты могут работать. А если предварительно делать транкейт, то работа встанет до конца пересчета, а если еще и ошибка произойдет…

    Reply ↓
  2. echo77

    Задумка хорошая, но зачем пересчитывать итоги за весь период? Я не думаю, что в предыдущие периоды кто-то активно вносит изменения.

    Честно, говоря, я вообще сейчас склоняюсь к тому, что в большинстве случаев для регистрв остатков нужны только Актуальные итоги

    Reply ↓
  3. nvv1970

    (1) нужен транкейт + * даты итогов на 010101. Тогда все будет быстро и корректно с запросами.

    PS: пойду напишу статью про оператор truncate, чтобы таких обработок не создавали. ((( Неужели гугл и ssms более страшен, чем чужие обработки??

    Reply ↓
  4. nvv1970

    (2)

    для регистрв остатков нужны только Актуальные итоги

    это как??? )))

    Reply ↓
  5. tirli41

    Монопольный доступ нужен или нет?

    Reply ↓
  6. Bazil

    (5) Нет.

    Reply ↓
  7. fedor40

    SQL 2014. Аутентификация SQL. Запуская на сервере. В SQL спокойно захожу, а обработка пишет недоступен.

    {ВнешняяОбработка.УскоренныйПолныйПересчетИтоговРегистров.Форма.ФормаУправляемая.Форма(219)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): [DBNETLIB][ConnectionOpen (Connect()).]SQL Server не существует, или доступ запрещен.

    Хотя я разобрался. Из имени сервера надо удалить номер порта 1С.

    Reply ↓
  8. jefjef

    (1) Стал юзать эту обработку именно из-за «неоспоримых плюсов» стандартного метода. Дело в том, что для стандартного пересчета надо именно наглухо остановить работу, так как он делается монопольно, а у нас весовая работает круглосуточно. А если срубить этот процесс в середине — наступит полная и беспросветная жопа. Оборотки просто перестают работать. Наглухо зависают и все. Банда юзеров кричит караул.

    Reply ↓
  9. jefjef

    Колбасит, профайлер циклично показывает begin, select, insert, truncate, commit. Все ок, при этом проц нагружает порядочно. Даже параллельно работать можно в базе. Чего не хватает обработке — так это прогресс бар прикрутить бы.

    Обработкой пришлось воспользоваться, так как стандартный метод расчета итогов через предприятие зависал намертво и висел в таком виде до 8 часов, потом я просто убивал это дело. В конфигураторе тестирование-исправление-пересчет вел себя точно так же.

    Обработка сделала все за 2 часа.

    Респект и плюс в карму.

    Reply ↓
  10. Fragster

    (8) я имею ввиду не стандартный диалог из «все функции», а выполнение метода РегистрНакопленияМенеджер.<Имя регистра накопления>.ПересчитатьИтогиЗаПериод() и ~.ПересчитатьТекущиеИтоги() которые выполняются относительно быстро (если делать в цикле по месяцам), не требуют монопольного доступа и не блокируют базу (если не трогать итоги за обновляемый период, т.е. оперативную работу вообще никак не затрагивает). Только последний этап — пересчет текущих итогов может сделать небольшую паузу в работе, но как правило эта пауза измеряется максимум в минутах.

    Reply ↓
  11. Bazil

    (9) Прикрутить прогресс-бар можно. Кроме как, считать количество рассчитанных регистров от общего числа, ничего не могу придумать.

    Такой прогресс будет очень примерным.

    Reply ↓
  12. jefjef

    (11)Вопрос появился. Не по работе обработки, а может было что-то подобное в личном опыте. На копии базы отработала нормально, все пересчитало четко. А вот на рабочей базе не сработала. Зависла и все. В профайлере отслеживал работу — просто в какой то момент перестали поступать запросы. Был последний BatchCompleted и потом все остановилось. Точно так же себя ведет конфигуратор на пересчете итогов и в режиме предприятия тоже. Зависают пересчеты регистра бухгалтерии. Не доводилось с таким сталкиваться? Не знаю на что и думать, на платформу или на скуль. Платформа 8.3.10.2299, скуль 2008R2 10.50.1600.1

    Reply ↓
  13. Bazil

    (12) Не подскажу.

    Reply ↓
  14. jefjef

    (13)

    Удалось полечить вашей обработкой в два прохода. Сначала удалить итоги, потом пересчитать. Вещь годная. Спасибо.

    Reply ↓
  15. Атеист33

    Добрый день коллеги !

    прошу знающих дать совет практический :

    Порядок действий при пересчете итого по регистру каков ?

    имею ввиду сам код в произвольном алгоритме — а не обработки готовые — предпочитаю все же понимать что делаю

    1. отключаем расчет итогов :

    Регистр<Имя>.УстановитьИспользованиеТекущихИтогов(Ложь)

    2. включаем использование итогов :

    Регистр<Имя>.УстановитьИспользованиеТекущихИтогов(Истина)

    3.Регистры<Имя>.ПересчитатьИтогиЗаПериод(НачалоМесяца(Дата() )

    или же иной порядок ?

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *