Введение
Думаю, проблема «тормозов» в 1С знакома каждому, кто хоть раз работал в бухгалтерии или на производстве. Это какая-то эпидемия: на каждом предприятии, где я бывал, обязательно есть жалобы на быстродействие. И вот совсем недавно и до нас добралась эта беда.
Поступила конкретная жалоба от главбуха: документы стали перепроводиться «по чайной ложке» — особенно в период закрытия месяца.
Закрытие месяца в бухгалтерии превратилось в квест: нажимаешь кнопку и идёшь пить чай, потому что «летает» там только время, потраченное впустую.
Пришлось включать голову и думать, что можно сделать.
Написали на листе все возможные варианты по ускорению.
Из них были такие варианты как:
- Оптимизация кода - (Изменение "тяжелого" кода при проведении документов)
- Пересчет итогов - (Чистка регистров итогов. Может происходить из предприятия и конфигурации)
- Оптимизация базы данных (не бралась как вариант оптимизации так как на предприятии происходит регулярно)
Ну вот и получилось что оптимизацию базы данных отбросили, так как DBA сами регулярно ее оптимизируют, оптимизация кода заняла бы существенное количество времени. Решено было сначала провести эксперимент с пересчетом итогов.
Так и начали с пересчета итогов. Восстановили рабочую базу в тестовую базу на текущее состояние рабочей базы и начали эксперименты по оптимизации работы пользователей.
Эксперименты над пересчетом итогов (до пересчета итогов)
После восстановления базы можно было бы, конечно, сразу попробовать протестировать пересчет итогов из предприятия 1С, но, как было известно, такой пересчет каждый месяц происходит при закрытии месяца, но и также регулярно выполняется вручную.
Поэтому сразу мы начали эксперимент с конфигурации.
Для достоверности эксперимента, чтобы понять, действительно ли пересчет итогов из конфигурации сможет ускорить проведение документов, решили сделать так:
Далее будет описана последовательность действий эксперимента.
Цель: Доказать эмпирически, что способ оптимизации для "Пересчет Итогов" из конфигурации сможет ускорить работу пользователей при закрытии месяца.
В самом начале что нам необходимо сделать так:
- Выбрать "пучок" документов, которые имеют самое долгое по времени проведение (в моем случае - это реализация).
- Найти самый оптимальный способ для фиксации времени проведения документов. При этом фиксировать нужно время для каждой итерации проведения.
То есть проводим "пучок" документов, фиксируем время, потом проводим еще раз этот же пучок и также фиксируем его время, так делаем минимум 3 раза и находим среднее время для каждой итерации проведения. Так нужно чтобы отбросить то что не относится к записи в регистр.
Для проведения и фиксации времени, есть два известные мне способа: с помощью кода какой-нибудь внешней обработки или можно воспользоваться замером времени.
Замером времени мы не стали пользоваться, так как кто-то сказал что для использования замера времени из конфигуратора 1С также может тратить ресурсы.
Таким образом проведение и фиксация времени проводились с помощью внешней обработки, с кодом:
ДатаНачалаЗамера = ТекущаяДатаСеанса();
РеализацииДляПроверки = Новый Запрос;
РеализацииДляПроверки.Текст = "ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
| И РеализацияТоваровУслуг.Проведен";
РеализацииДляПроверки.УстановитьПараметр("ДатаНачала", Период.ДатаНачала);
РеализацииДляПроверки.УстановитьПараметр("ДатаКонца", Период.ДатаОкончания);
ТЗ = РеализацииДляПроверки.Выполнить().Выгрузить();
Для каждого Строка Из ТЗ Цикл
Реализация = Строка.Ссылка.ПолучитьОбъект();
Реализация.Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;
ДатаКонцаЗамера = ТекущаяДатаСеанса();
Сообщить("Начало: " + ДатаНачалаЗамера);
Сообщить("Конец: " + ДатаКонцаЗамера);
Что мы делаем с помощью кода:
Зафиксируем время начала выполнения проверки
ДатаНачалаЗамера = ТекущаяДатаСеанса();
Выберем "пучок" документов с помощью запроса
РеализацииДляПроверки = Новый Запрос;
РеализацииДляПроверки.Текст = "ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
| И РеализацияТоваровУслуг.Проведен";
На форме есть реквизит "период" с типом "Стандартная дата". С помощью него устанавливаем ограничение выборки документов, вводим параметры.
РеализацииДляПроверки.УстановитьПараметр("ДатаНачала", Период.ДатаНачала);
РеализацииДляПроверки.УстановитьПараметр("ДатаКонца", Период.ДатаОкончания);
И выполняем запрос.
ТЗ = РеализацииДляПроверки.Выполнить().Выгрузить();
Теперь "пробегаемся" по полученным документам и проводим их по очереди.
Для каждого Строка Из ТЗ Цикл
Реализация = Строка.Ссылка.ПолучитьОбъект();
Реализация.Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;
Операции закончены, нужно получить время окончания их выполнения.
ДатаКонцаЗамера = ТекущаяДатаСеанса();
Далее просто выводим начало и конец выполнения операций.
Сообщить("Начало: " + ДатаНачалаЗамера);
Сообщить("Конец: " + ДатаКонцаЗамера);
Теперь после получения данных о перепроведении документов до пересчета итогов, нужно выполнить пересчет итогов.
Пересчет итогов в предприятии выполняется с помощью обработки "Управление итогами", но чтобы выполнить через конфигуратор нужно выполнить действия ниже.
Чтобы пересчет итогов выполнить через конфигуратор, нужно в конфигураторе зайти в раздел "администрирование" и нажать пункт "Тестирование и исправление".

Высветится окно, в котором платформа будет просить сохранить резервную копию. Здесь сама платформа предупреждает вас о том что действия происходящие в "Тестировании и исправлении" должны быть обдуманными, поэтому если нужно, сделайте сохранение пользовательских данных обязательно, если на сервере не делается резервная копия. Так как в некоторых случаях при выполнении действий в "тестировании и исправлении" результат может привести к неисправимым ошибкам.

После сохранения пользовательских данных (если делали) нажимаем "Продолжить". И перед нами откроется окно с настройками "тестирования и исправления", нам нужен только пересчет итогов, поэтому обратимся к списку посередине.
Здесь отключаем все галки кроме галки "Пересчет итогов", она должна быть включена. Так мы установили "Пересчет итогов" и отключили все лишнее.
![]()
После того как мы все сделали, нажимаем кнопку "Выполнить".
Теперь ждем выполнение пересчета итогов и продолжаем эксперимент. Для выполнения операции пересчета мне пришлось ждать примерно 30 минут, время выполнения зависит от того насколько давно чистились итоги.
Что должно происходить при пересчете итогов?
При выполнении действия пересчета итогов, в базе данных в таблицах, которые принадлежат регистрам и которые содержат их итоги очищаются записи, таблица становится абсолютно пустой. Такое необходимо делать для того чтобы очистить таблицу итогов от старых неактуальных записей и сократить выборку данных при взаимодействии с этими таблицами, например получение данных и перезапись. А как известно при сокращении выборки, сокращается время выполнения запроса.
Откуда берутся неактуальные записи?
При проведении документа в этих таблицах создаются записи с проводками (итогами) этого документа. При повторном проведении записи с итогами в этих таблицах перезаписываются. Но если документ был распроведен, запись в таблице никуда не исчезнет. Подобное явление связано с тем, что создание записи для базы данных происходит тяжелее, чем перезапись уже существующей записи. Со временем таких записей становится очень много и многие из них становятся неактуальными, так как предприятие функционирует, а таблица не чистится, время выполнения запросов к этой таблице растет. Поэтому пересчет итогов важен для каждого предприятия работающего с 1С и лучше проводить его регулярно, чтобы не допускать замедления работы пользователей.
Продолжим эксперимент после пересчета итогов
Теперь когда мы выполнили пересчет итогов, повторяем первую часть эксперимента. То есть, перепроводим тот же самый "пучок" документов, который мы проводили до пересчета, чтобы убедиться в том, что время выполнения проведения сократилось.
Но не будем торопить события, здесь необходимо обратить внимание на то что было описано выше:
Создание записи для базы данных происходит тяжелее, чем перезапись уже существующей записи.
Что происходит во время пересчета итогов? Мы очищаем таблицу итогов. А значит сразу после пересчета она пустая и эксперимент не будет достоверным если мы зачтем первое перепроведение в расчеты.
Выполняем первое перепроведение после пересчета итогов. Далее еще три раза перепроводим.
В результате получилась такая таблица. (Результаты округлены в меньшую сторону)
Итоговая таблица расчетов
| Номер итерации | Время проведения до пересчета (мин) | Время первого перепроведения после пересчета | Время проведения после пересчета (мин.) | ||
|---|---|---|---|---|---|
| 1 | 13 | 13 | 12 | ||
| 2 | 14 | 11 | |||
| 3 | 15 | 10 | |||
| Среднее | 14 | -\\- | 11 |
Выводы проведенного эксперимента
Эксперимент использовал проведение примерно в 10 документов. Результат эксперимента дал очевидный ответ в ускорении 1С.
Пересчет итогов из конфигурации дал результат прироста скорости примерно в 3 минуты. Если рассматривать это в контексте закрытия месяца, время выполнения может сократится в часы, так как количество перепроводимых документов при закрытии месяца намного больше.
Выводы для себя: раньше была уверенность, что пересчет итогов из предприятия и конфигурации - это одно и то же действие, но теперь есть сомнения, так как пересчет из предприятия не давал таких результатов как пересчет из конфигурации.
Вступайте в нашу телеграмм-группу Инфостарт