Переход между неосновными версиями конфигураций 1С (например, масштабное обновление «1С:Управление торговлей» с ветки 11.3 на 11.4) часто сопровождается техническими сложностями. Ситуация усугубляется, если конфигурация находится в режиме «Редактируется с сохранением поддержки» (снята с замка). В процессе обновления базы данных мы можем столкнуться с блокирующими ошибками реструктуризации метаданных или с критическим зависанием утилиты тестирования и исправления (ТИИ).
В этой статье мы подробно разберем две типичные проблемы, возникающие при переходе на новые релизы УТ 11.4:
ОбщаяКартинка.ИнтернетПоддержкаПользователейИнформация, на который ссылаются доработанные объекты конфигурации.ЗамерыВремени.---
При попытке обновить измененную конфигурацию УТ 11 платформа может выдать следующее сообщение об ошибке:
«На удаляемый объект ОбщаяКартинка.ИнтернетПоддержкаПользователейИнформация есть ссылки в объектах основной конфигурации: Отчет.ОтчетПоЧекам.Форма.ФормаОтчета.Форма»
Выясним причину этой ошибки. При переходе на новые релизы УТ 11.4 разработчики 1С обновляют встроенную подсистему БИП (Библиотека интернет-поддержки пользователей). В новых версиях библиотеки объект метаданных ОбщаяКартинка.ИнтернетПоддержкаПользователейИнформация был удален за ненадобностью в ходе рефакторинга кода. Поставщик убирает эту картинку из конфигурации. Но поскольку наша база была доработана, и в измененной форме отчета ОтчетПоЧекам осталась ссылка на эту картинку (например, в качестве иконки на кнопке или декоративного элемента), платформа блокирует обновление. Она защищает базу от появления «битых» ссылок (так называемых объектов «Объект не найден»).
Рассмотрим два способа обхода и решения этой проблемы.
Если нам необходимо завершить обновление в сжатые сроки, мы можем временно сохранить этот объект в нашей конфигурации, чтобы не нарушать связи:
.cfu или .cf).ИнтернетПоддержкаПользователейИнформация.Важное замечание: данный способ является временным «костылем». Объект останется в нашей конфигурации, но он перейдет в категорию «не на поддержке», создавая лишний «мусор» в дереве метаданных. В дальнейшем рекомендуется выполнить полную чистку.
Для того чтобы сделать все правильно и не оставлять в базе устаревшие объекты, выполним следующие шаги перед запуском обновления:
Отчет.ОтчетПоЧекам.Форма.ФормаОтчета.Форма.ИнтернетПоддержкаПользователейИнформация.ОбщаяКартинка.Информация).ОтчетПоЧекам нам больше не требуются, мы можем просто вернуть этот отчет на полную поддержку поставщика (поставить «замок» обратно) в окне настройки поддержки. Тогда платформа обновит его автоматически без возникновения конфликтов.---
Перед любым обновлением (особенно измененных конфигураций) хорошей практикой является выполнение процедуры «Тестирование и исправление» (ТИИ). Однако часто администраторы сталкиваются с тем, что процесс ТИИ намертво зависает на этапе:
«Проверка логической целостности Регистры сведений ЗамерыВремени (50%)»
Проанализируем причину такого поведения системы. Регистр сведений ЗамерыВремени (а также сопутствующий ему регистр ЗамерыВремениТехнологические) является частью встроенного механизма оценки производительности системы по методике APDEX. Если в пользовательском режиме (1С:Предприятие) в разделе администрирования включена галочка «Оценка производительности», система при выполнении любых ключевых операций пользователями непрерывно записывает логи в этот регистр.
В работающих базах за несколько месяцев или лет эксплуатации этот регистр может разрастись до десятков миллионов записей, занимая до 80% всего физического объема базы данных. При запуске тестирования и исправления (особенно проверки логической целостности) платформа пытается прочитать, проанализировать и перестроить индексы для этой гигантской таблицы. В файловом варианте базы данных это приводит к исчерпанию оперативной памяти, перегрузке дисковой подсистемы и зависанию процесса на многие часы или даже сутки.
Рассмотрим по шагам, как решить проблему с зависанием ТИИ и безопасно очистить этот регистр.
Прежде чем приступать к очистке, необходимо остановить запись новых данных. Для этого:
Поскольку регистр содержит исключительно служебную техническую информацию, его очистка никак не повлияет на ведение управленческого, бухгалтерского или налогового учета. Данные замеры можно смело удалять.
Ни в коем случае нельзя пытаться очистить таблицу объемом в несколько миллионов записей одним простым запросом или стандартным набором записей без отборов в транзакции — это приведет к переполнению транзакционного лога СУБД или оперативной памяти в файловом варианте. Очистку нужно производить порциями.
Рассмотрим три альтернативных варианта очистки регистра:
Мы можем написать простую внешнюю обработку, которая будет удалять записи пакетами. Напишем пример кода для удаления записей порциями:
Процедура ОчиститьРегистрЗамеровПорциями() Экспорт
РазмерПорции = 50000;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ ТОП " + Формат(РазмерПорции, "ЧГ=0") + "
| ЗамерыВремени.ДатаЗамера КАК ДатаЗамера,
| ЗамерыВремени.КлючеваяОперация КАК КлючеваяОперация
|ИЗ
| РегистрСведений.ЗамерыВремени КАК ЗамерыВремени";
Пока Истина Цикл
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Прервать;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
НачатьТранзакцию();
Попытка
Пока Выборка.Следующий() Цикл
Набор = РегистрыСведений.ЗамерыВремени.СоздатьНаборЗаписей();
Набор.Отбор.ДатаЗамера.Установить(Выборка.ДатаЗамера);
Набор.Отбор.КлючеваяОперация.Установить(Выборка.КлючеваяОперация);
Набор.Записать(); // Записываем пустой набор, удаляя записи
КонецЦикла;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ЗаписьЖурналаРегистрации("ОчисткаРегистра", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
ВызватьИсключение "Ошибка при очистке порции данных: " + ОписаниеОшибки();
КонецПопытки;
#Если Клиент Тогда
ОбработкаПрерыванияПользователя();
Состояние("Удалено очередных " + РазмерПорции + " записей...");
#КонецЕсли
КонецЦикла;
ПоказатьПредупреждение(, "Очистка регистра ЗамерыВремени успешно завершена!");
КонецПроцедуры
Если база файловая и нам нужно максимально быстро избавиться от данных регистра перед тестированием на копии, мы можем прибегнуть к реструктуризации метаданных:
1Cv8.1CD или выгрузка .dt).ЗамерыВремени (и при необходимости ЗамерыВремениТехнологические)..cf) нашей исходной версии.ЗамерыВремени, но они будут абсолютно пустыми. Физический размер файла базы данных при этом существенно уменьшится.Если база работает под управлением СУБД (например, MS SQL Server или PostgreSQL), мы можем мгновенно очистить таблицу через запрос TRUNCATE. Внимание: любые прямые манипуляции с таблицами СУБД в обход платформы 1С выполняются только на свой страх и риск после создания резервной копии базы данных!
ПолучитьСтруктуруХраненияБазыДанных(). Как правило, таблица будет иметь имя вида _InfoRgXXXX.
TRUNCATE TABLE _InfoRgXXXX;
После этого таблица очистится мгновенно без записи транзакционных логов, и размер базы сократится.
---
После того как мы успешно решили проблему с блокирующей картинкой и очистили перегруженный регистр замеров производительности, вернемся к процессу обновления:
ЗамерыВремени пройдет за доли секунды, а вся процедура ТИИ займет считанные минуты.Таким образом, мы детально разобрали причины возникновения ошибок при переходе между релизами УТ и научились правильно администрировать базу данных при возникновении критических зависаний процедур обслуживания.