При обновлении сильно устаревших баз на платформе 1С:Предприятие 8.3 специалисты часто сталкиваются с ситуацией, когда обновление в конфигураторе проходит за считанные минуты, но после запуска базы в режиме «Предприятие» процесс затягивается на часы или даже дни. Особенно часто это проявляется в отраслевых решениях, таких как «Бухгалтерия сельскохозяйственного предприятия 3.0». Проанализируем ситуацию: основное время тратится не на изменение структуры таблиц, а на работу внутренних обработчиков обновления Библиотеки стандартных подсистем (БСП). Одной из наиболее «тяжелых» подсистем в этом плане является механизм новостей. Разберем по шагам, как диагностировать и устранить эту проблему.
Первым делом проанализируем, на чем именно «зависает» система. Для этого необходимо заглянуть в Журнал регистрации. Если мы видим бесконечные записи, связанные со справочником Справочник.Новости или соответствующими регистрами, значит, мы столкнулись с избыточностью данных в маркетинговых механизмах системы. В конфигурациях на базе БП 3.0 справочник новостей может разрастаться до огромных размеров, и при каждом промежуточном обновлении система пытается пересчитать индексы, проверить актуальность или изменить структуру этих записей. Для учетной системы эти данные чаще всего не несут ценности, поэтому мы можем смело применять радикальные методы оптимизации.
Самый эффективный способ ускорить процесс — полностью очистить данные подсистемы новостей. Рассмотрим, как это сделать правильно. Если база позволяет зайти в нее (например, на копии до начала обновления или в перерыве между релизами), воспользуемся обработкой УниверсальныеПодборИОбработкаОбъектов или напишем простой скрипт.
Проанализируем программный способ очистки. Нам необходимо удалить данные не только из справочника, но и из регистров сведений, которые зачастую тормозят процесс гораздо сильнее. Рассмотрим пример кода для очистки:
НаборНовостей = Справочники.Новости.Выбрать();
Пока НаборНовостей.Следующий() Цикл
ОбъектНовости = НаборНовостей.ПолучитьОбъект();
ОбъектНовости.Удалить();
КонецЦикла;
// Очистка регистров сведений, связанных с новостями
РегистрыДляОчистки = Новый Массив;
РегистрыДляОчистки.Добавить(РегистрыСведений.НовостиСостоянияЧтения);
РегистрыДляОчистки.Добавить(РегистрыСведений.ДатыОбновленияНовостей);
РегистрыДляОчистки.Добавить(РегистрыСведений.РассылкиНовостей);
Для Каждого МенеджерРегистра Из РегистрыДляОчистки Цикл
Набор = МенеджерРегистра.СоздатьНаборЗаписей();
Набор.Записать(); // Записываем пустой набор для удаления всех записей
КонецЦикла;
Важно помнить, что удаление элементов справочника через Удалить() может быть долгим, если включен контроль ссылочной целостности. В случае с новостями на копии базы допустимо использование непосредственного удаления.
Чтобы система перестала обращаться к внешним серверам и обрабатывать новости в фоновом режиме, мы можем отключить эту возможность в настройках. Перейдем в раздел Администрирование — Настройки программы — Интернет-поддержка и сервисы. Развернем группу Новости и снимем флаг Включить получение новостей. Это действие отключит регламентные задания, которые могут конфликтовать с процессом обновления конфигурации.
Начиная с определенных версий БСП, в платформе 8.3 реализована возможность выполнять обработчики обновления в несколько потоков. Это значительно сокращает время ожидания на мощных серверах. Выясним, как это настроить:
Часто «зависание» происходит из-за того, что параллельно с обновлением начинают запускаться другие фоновые процессы: полнотекстовый поиск, загрузка классификаторов или расчет итогов. Чтобы избежать коллизий, перед запуском процесса обновления в режиме «Предприятие» рекомендуется выполнить следующие действия:
Если база серверная, зайдем в Консоль администрирования серверов 1С, откроем свойства нашей информационной базы и установим галочку Блокировка регламентных заданий включена. Не забудьте снять её после успешного завершения всех этапов обновления.
Посмотрим на стратегию обновления. Ошибка многих пользователей заключается в последовательном накатывании каждого вышедшего релиза. Для «Бухгалтерии предприятия» и её отраслевых вариаций существуют «контрольные точки». Проанализируем таблицу обновлений на сайте поддержки пользователей. Если текущая версия позволяет обновиться сразу на версию, которая выше на 5-10 пунктов, лучше делать именно так. Это уменьшит общее количество запусков обработчиков обновления данных в режиме «Предприятие».
Если обновление все же «зависло» на 99% и Журнал регистрации молчит, возможно, произошел сбой в кэше метаданных. Остановим службу сервера 1С и очистим содержимое папок snccntx в каталоге описания базы на сервере.
В исключительных случаях, если мы уверены, что зависший обработчик отвечает только за новости или другие некритичные данные, мы можем программно пометить его как выполненный. Для этого используется объект РегистрСведений.ОбновлениеИнформационнойБазы. Посмотрим на логику: мы находим запись с состоянием «Выполняется» и принудительно меняем его на «Выполнено». Внимание: этот метод крайне опасен и должен применяться только на копии базы опытным программистом!
Проанализировав проблему медленного обновления в «Бухгалтерии сельскохозяйственного предприятия 3.0», мы пришли к выводу, что основным виновником является избыточный объем сервисных данных. Очистка справочника новостей, отключение регламентных заданий и использование многопоточности позволяют сократить время обновления с нескольких дней до нескольких часов. Всегда выполняйте подобные операции сначала на тестовой копии, чтобы убедиться в сохранности учетных данных.