Обновление конфигурации 1С — это ответственный процесс, который не всегда проходит гладко. Одной из наиболее трудоемких версий в линейке 1С:Управление торговлей 11.3 стала версия 11.3.4.167. Многие технические специалисты сталкиваются с ситуацией, когда процесс обновления визуально «замирает» на этапе выполнения отложенных обработчиков. В этой статье мы подробно разберем, почему это происходит и как довести обновление до конца, не теряя данные.
Проанализируем ситуацию: при переходе на новые версии системы часто меняется структура хранения данных. Для этого используются механизмы БСП (Библиотеки стандартных подсистем). Проблема, о которой пойдет речь, возникает в процедуре ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию, которая относится к справочнику Номенклатура.
Разберем по шагам, что происходит внутри системы. В процессе обновления конфигурация запускает «отложенные обработчики». Первый этап их работы — регистрация данных. Система должна просканировать весь справочник Номенклатура и пометить объекты, которые требуют трансформации (например, при изменении логики учета характеристик или упаковок). Если в вашей базе данных сотни тысяч позиций номенклатуры, стандартный запрос, написанный разработчиками, может выполняться крайне медленно из-за неоптимального плана запроса на стороне СУБД (особенно часто это встречается на PostgreSQL или старых версиях MS SQL Server).
Выясним причину, по которой запрос «висит». Часто это происходит не из-за ошибки в коде 1С, а из-за того, что СУБД не может быстро обработать огромный объем данных без актуальной статистики. Прежде чем приступать к радикальным мерам, выполним обслуживание базы данных:
_ReferenceNode (соответствующей справочнику Номенклатура) и связанных с ней таблиц существенно ускоряет выборку.Как показывает практика, после проведения этих регламентных операций процедура, которая висела часами, может завершиться за 15–20 минут.
Рассмотрим альтернативный метод, который часто выручает администраторов в тупиковых ситуациях. Если серверная версия базы данных упорно отказывается завершать регистрацию, попробуем «обмануть» систему:
.dt).Важно: этот метод подходит для баз среднего размера. Если ваша база весит несколько сотен гигабайт, выгрузка и загрузка .dt может занять больше времени, чем само обновление.
Посмотрим на стандартные возможности программы. В составе типовых конфигураций на базе БСП есть встроенная обработка для контроля процесса обновления. Найти ее можно через меню «Все функции» (или «Функции для технического специалиста»), введя в поиске Результаты обновления программы или Управление отложенным обновлением.
В этой обработке мы можем:
Если визуально ничего не происходит, проанализируем ситуацию с помощью Технологического журнала. Это самый надежный способ узнать, чем занят сервер 1С в данный момент. Настроим сбор событий DBMSSQL (или DBPOSTGRS) и EXCP. Мы сможем увидеть текст SQL-запроса, который выполняется в данный момент. Если в логах ТЖ мы видим один и тот же бесконечный запрос к таблице номенклатуры, значит, мы имеем дело с неоптимальным планом запроса или блокировкой.
Если вы понимаете, что типовой запрос в процедуре ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию не может отработать на вашем объеме данных, мы можем временно изменить код. Рассмотрим, как выглядит структура такой процедуры в модуле менеджера справочника:
Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт
// Типовой запрос может быть слишком тяжелым
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 10000
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеОчередиОбновления КАК Очередь
|ПО Номенклатура.Ссылка = Очередь.Ссылка
|ГДЕ
| Очередь.Ссылка ЕСТЬ NULL";
РезультатЗапроса = Запрос.Выполнить();
// Логика постановки в очередь порциями
КонецПроцедуры
Разберем этот пример. Если типовой механизм пытается зарегистрировать сразу 500 000 записей, это вызывает переполнение лога транзакций. Мы можем модифицировать код так, чтобы регистрация проходила порциями по 10 000 записей. После завершения обновления крайне важно вернуть объект на полную поддержку, чтобы не возникло проблем при следующих обновлениях.
Проанализируем еще несколько факторов, которые могут влиять на скорость:
Тестирование и исправление.Подведем итог: зависание на справочнике Номенклатура в версии 11.3.4.167 — это известная проблема, связанная с объемом данных и сложностью запросов регистрации. Используя комбинацию методов (обслуживание SQL, контроль через консоль обновлений и, в крайнем случае, порционную регистрацию), вы сможете успешно завершить переход на новую версию программы.