Как исправить ошибки при обновлении 1С:Управление торговлей 11 (конфликт общей картинки БИП и зависание ТИИ на регистре ЗамерыВремени)?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет IT и автоматизация бизнеса
← На главную

Переход между неосновными версиями конфигураций 1С (например, масштабное обновление «1С:Управление торговлей» с ветки 11.3 на 11.4) часто сопровождается техническими сложностями. Ситуация усугубляется, если конфигурация находится в режиме «Редактируется с сохранением поддержки» (снята с замка). В процессе обновления базы данных мы можем столкнуться с блокирующими ошибками реструктуризации метаданных или с критическим зависанием утилиты тестирования и исправления (ТИИ).

В этой статье мы подробно разберем две типичные проблемы, возникающие при переходе на новые релизы УТ 11.4:

  1. Блокировка обновления из-за удаления объекта ОбщаяКартинка.ИнтернетПоддержкаПользователейИнформация, на который ссылаются доработанные объекты конфигурации.
  2. Зависание процесса «Тестирование и исправление» (ТИИ) на этапе проверки логической целостности регистра сведений ЗамерыВремени.

---

Часть 1. Ошибка удаления картинки «ИнтернетПоддержкаПользователейИнформация»

При попытке обновить измененную конфигурацию УТ 11 платформа может выдать следующее сообщение об ошибке:

«На удаляемый объект ОбщаяКартинка.ИнтернетПоддержкаПользователейИнформация есть ссылки в объектах основной конфигурации: Отчет.ОтчетПоЧекам.Форма.ФормаОтчета.Форма»

Выясним причину этой ошибки. При переходе на новые релизы УТ 11.4 разработчики 1С обновляют встроенную подсистему БИП (Библиотека интернет-поддержки пользователей). В новых версиях библиотеки объект метаданных ОбщаяКартинка.ИнтернетПоддержкаПользователейИнформация был удален за ненадобностью в ходе рефакторинга кода. Поставщик убирает эту картинку из конфигурации. Но поскольку наша база была доработана, и в измененной форме отчета ОтчетПоЧекам осталась ссылка на эту картинку (например, в качестве иконки на кнопке или декоративного элемента), платформа блокирует обновление. Она защищает базу от появления «битых» ссылок (так называемых объектов «Объект не найден»).

Рассмотрим два способа обхода и решения этой проблемы.

Способ 1. Быстрое решение через окно сравнения-объединения

Если нам необходимо завершить обновление в сжатые сроки, мы можем временно сохранить этот объект в нашей конфигурации, чтобы не нарушать связи:

  1. Запустим процесс обновления конфигурации через файл обновления (.cfu или .cf).
  2. В открывшемся окне сравнения и объединения конфигураций найдем ветку Общие -> Общие картинки.
  3. Найдем в списке объект ИнтернетПоддержкаПользователейИнформация.
  4. Снимем флаг объединения напротив этой картинки. Это укажет платформе, что при обновлении удалять данный объект из нашей основной конфигурации не нужно.
  5. Выполним объединение и обновим конфигурацию базы данных (клавиша F7).

Важное замечание: данный способ является временным «костылем». Объект останется в нашей конфигурации, но он перейдет в категорию «не на поддержке», создавая лишний «мусор» в дереве метаданных. В дальнейшем рекомендуется выполнить полную чистку.

Способ 2. Правильное решение (чистка конфигурации)

Для того чтобы сделать все правильно и не оставлять в базе устаревшие объекты, выполним следующие шаги перед запуском обновления:

  1. Откроем конфигуратор нашей рабочей базы (или копии) до начала обновления.
  2. Перейдем к объекту, указанному в ошибке: Отчет.ОтчетПоЧекам.Форма.ФормаОтчета.Форма.
  3. Откроем редактор формы и найдем элементы управления (кнопки, декорации, поля), которые ссылаются на картинку ИнтернетПоддержкаПользователейИнформация.
  4. В палитре свойств этих элементов очистим свойство «Картинка» или заменим его на стандартную системную картинку (например, ОбщаяКартинка.Информация).
  5. Если доработки в отчете ОтчетПоЧекам нам больше не требуются, мы можем просто вернуть этот отчет на полную поддержку поставщика (поставить «замок» обратно) в окне настройки поддержки. Тогда платформа обновит его автоматически без возникновения конфликтов.
  6. Сохраним изменения (F7) и запустим процесс обновления конфигурации заново. Ошибка больше не появится.

---

Часть 2. Зависание Тестирования и Исправления на регистре «ЗамерыВремени»

Перед любым обновлением (особенно измененных конфигураций) хорошей практикой является выполнение процедуры «Тестирование и исправление» (ТИИ). Однако часто администраторы сталкиваются с тем, что процесс ТИИ намертво зависает на этапе:

«Проверка логической целостности Регистры сведений ЗамерыВремени (50%)»

Проанализируем причину такого поведения системы. Регистр сведений ЗамерыВремени (а также сопутствующий ему регистр ЗамерыВремениТехнологические) является частью встроенного механизма оценки производительности системы по методике APDEX. Если в пользовательском режиме (1С:Предприятие) в разделе администрирования включена галочка «Оценка производительности», система при выполнении любых ключевых операций пользователями непрерывно записывает логи в этот регистр.

В работающих базах за несколько месяцев или лет эксплуатации этот регистр может разрастись до десятков миллионов записей, занимая до 80% всего физического объема базы данных. При запуске тестирования и исправления (особенно проверки логической целостности) платформа пытается прочитать, проанализировать и перестроить индексы для этой гигантской таблицы. В файловом варианте базы данных это приводит к исчерпанию оперативной памяти, перегрузке дисковой подсистемы и зависанию процесса на многие часы или даже сутки.

Рассмотрим по шагам, как решить проблему с зависанием ТИИ и безопасно очистить этот регистр.

Шаг 1. Отключение оценки производительности в пользовательском режиме

Прежде чем приступать к очистке, необходимо остановить запись новых данных. Для этого:

  1. Запустим базу в режиме «1С:Предприятие» под правами администратора.
  2. Перейдем в раздел НСИ и администрирование -> Администрирование -> Общие настройки (или сразу найдем через функции для технического специалиста регистры и настройки оценки производительности).
  3. Найдем флаг «Оценка производительности» и снимем его.

Шаг 2. Очистка регистра сведений «ЗамерыВремени»

Поскольку регистр содержит исключительно служебную техническую информацию, его очистка никак не повлияет на ведение управленческого, бухгалтерского или налогового учета. Данные замеры можно смело удалять.

Ни в коем случае нельзя пытаться очистить таблицу объемом в несколько миллионов записей одним простым запросом или стандартным набором записей без отборов в транзакции — это приведет к переполнению транзакционного лога СУБД или оперативной памяти в файловом варианте. Очистку нужно производить порциями.

Рассмотрим три альтернативных варианта очистки регистра:

Вариант А. Программное удаление записей порциями (рекомендуемый для рабочих баз)

Мы можем написать простую внешнюю обработку, которая будет удалять записи пакетами. Напишем пример кода для удаления записей порциями:


Процедура ОчиститьРегистрЗамеровПорциями() Экспорт
    РазмерПорции = 50000;
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗЛИЧНЫЕ ТОП " + Формат(РазмерПорции, "ЧГ=0") + "
        |	ЗамерыВремени.ДатаЗамера КАК ДатаЗамера,
        |	ЗамерыВремени.КлючеваяОперация КАК КлючеваяОперация
        |ИЗ
        |	РегистрСведений.ЗамерыВремени КАК ЗамерыВремени";
    
    Пока Истина Цикл
        РезультатЗапроса = Запрос.Выполнить();
        Если РезультатЗапроса.Пустой() Тогда
            Прервать;
        КонецЕсли;
        
        Выборка = РезультатЗапроса.Выбрать();
        
        НачатьТранзакцию();
        Попытка
            Пока Выборка.Следующий() Цикл
                Набор = РегистрыСведений.ЗамерыВремени.СоздатьНаборЗаписей();
                Набор.Отбор.ДатаЗамера.Установить(Выборка.ДатаЗамера);
                Набор.Отбор.КлючеваяОперация.Установить(Выборка.КлючеваяОперация);
                Набор.Записать(); // Записываем пустой набор, удаляя записи
            КонецЦикла;
            ЗафиксироватьТранзакцию();
        Исключение
            ОтменитьТранзакцию();
            ЗаписьЖурналаРегистрации("ОчисткаРегистра", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
            ВызватьИсключение "Ошибка при очистке порции данных: " + ОписаниеОшибки();
        КонецПопытки;
        
        #Если Клиент Тогда
            ОбработкаПрерыванияПользователя();
            Состояние("Удалено очередных " + РазмерПорции + " записей...");
        #КонецЕсли
    КонецЦикла;
    ПоказатьПредупреждение(, "Очистка регистра ЗамерыВремени успешно завершена!");
КонецПроцедуры
Вариант Б. Радикальный метод через конфигуратор (для файловых баз и копий)

Если база файловая и нам нужно максимально быстро избавиться от данных регистра перед тестированием на копии, мы можем прибегнуть к реструктуризации метаданных:

  1. Обязательно сделаем резервную копию базы данных (файл 1Cv8.1CD или выгрузка .dt).
  2. Откроем конфигурацию, найдем регистр сведений ЗамерыВремени (и при необходимости ЗамерыВремениТехнологические).
  3. Нажмем клавишу Del и удалим этот регистр из метаданных.
  4. Применим изменения конфигурации (клавиша F7). Платформа предупредит об удалении таблиц базы данных — соглашаемся. В этот момент физическая таблица регистра с миллионами записей будет мгновенно уничтожена.
  5. Теперь нам нужно вернуть регистр в структуру для последующего корректного обновления. Для этого выберем пункт меню Конфигурация -> Загрузить конфигурацию из файла и выберем предварительно сохраненный файл конфигурации (.cf) нашей исходной версии.
  6. Снова применим изменения (F7). Платформа заново создаст таблицы регистра ЗамерыВремени, но они будут абсолютно пустыми. Физический размер файла базы данных при этом существенно уменьшится.
Вариант В. Прямая очистка через SQL-запрос (для клиент-серверного варианта)

Если база работает под управлением СУБД (например, MS SQL Server или PostgreSQL), мы можем мгновенно очистить таблицу через запрос TRUNCATE. Внимание: любые прямые манипуляции с таблицами СУБД в обход платформы 1С выполняются только на свой страх и риск после создания резервной копии базы данных!

  1. Определим имя таблицы регистра сведений в СУБД. Для этого можно воспользоваться обработкой «ПолучитьИменаТаблицБД» или выполнить программный метод платформы ПолучитьСтруктуруХраненияБазыДанных(). Как правило, таблица будет иметь имя вида _InfoRgXXXX.
  2. Запустим среду управления СУБД (например, SQL Server Management Studio).
  3. Выполним следующий запрос к нашей базе данных:

TRUNCATE TABLE _InfoRgXXXX;

После этого таблица очистится мгновенно без записи транзакционных логов, и размер базы сократится.

---

Часть 3. Повторный запуск ТИИ и завершение обновления

После того как мы успешно решили проблему с блокирующей картинкой и очистили перегруженный регистр замеров производительности, вернемся к процессу обновления:

  1. Снова запустим процедуру Тестирование и исправление в Конфигураторе через меню Администрирование -> Тестирование и исправление.
  2. Выберем необходимые пункты (рекомендуется отметить «Реиндексация таблиц», «Проверка логической целостности» и обязательно «Сжатие таблиц информационной базы» для уменьшения размера файла БД на диске после удаления данных).
  3. Запустим процесс. Теперь тестирование регистра ЗамерыВремени пройдет за доли секунды, а вся процедура ТИИ займет считанные минуты.
  4. После успешного завершения ТИИ запустим обновление конфигурации до версии УТ 11.4.7.150 в стандартном режиме. Обновление пройдет корректно и без ошибок.

Таким образом, мы детально разобрали причины возникновения ошибок при переходе между релизами УТ и научились правильно администрировать базу данных при возникновении критических зависаний процедур обслуживания.

← На главную