При обновлении объемных информационных баз (от 50–100 Гб и более) на платформе 1С:Предприятие 8.3 специалисты нередко сталкиваются с аварийным закрытием конфигуратора (APPCRASH) в модуле MSVCR110.dll с кодом исключения 40000015. Процесс реструктуризации может идти несколько часов, после чего конфигуратор внезапно закрывается без внятного сообщения об ошибке во встроенном интерфейсе. Разберем детально, почему это происходит, как выяснить, на каком объекте падает процесс, и какими способами можно успешно завершить обновление.
Код исключения 40000015 (STATUS_FATAL_APP_EXIT) означает аварийный вызов функции abort() средой выполнения Microsoft Visual C++. В подавляющем большинстве случаев это вызвано следующими факторами:
1cv8.exe. Даже если реструктуризация запущена на мощном сервере с десятками гигабайт оперативной памяти, 32-разрядный клиент конфигуратора ограничен 2 Гб виртуального адресного пространства. При анализе огромных таблиц метаданных, кэшировании связей и генерации SQL-скриптов происходит фрагментация адресного пространства, и процесс аварийно завершается при невозможности выделить очередной непрерывный блок памяти.ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные или ПланыСчетов.Хозрасчетный, платформа 1С автоматически запускает реструктуризацию не только самого плана счетов, но и всех связанных таблиц: движений регистра РегистрБухгалтерии.Хозрасчетный, таблицы значений субконто и таблиц итогов. Для базы размером более 100 Гб это приводит к перезаписи десятков или сотен миллионов строк в СУБД.tempdb, что вызывает сетевой тайм-аут или аварийный сброс соединения, на который клиент 1С реагирует вылетом.Когда реструктуризация всей конфигурации падает, необходимо выяснить, какой именно объект провоцирует сбой. Применим метод пошагового обновления метаданных:
ПланыСчетов, ПланыВидовХарактеристик и РегистрыБухгалтерии) оставляем на самый последний этап.Если обновление падает именно на плане счетов, но в типовой поставке изменения в нем некритичны для текущего учета (или требуются только изменения в логике модулей), можно временно снять отметку с плана счетов и обновить конфигурацию без перестройки его таблиц.
Наиболее фундаментальное техническое решение проблемы нехватки памяти — использование 64-разрядного клиента платформы 1С:Предприятие (версии x64). Начиная с платформы 8.3.9, 1С предоставляет полноценный 64-битный исполняемый файл толстого клиента и конфигуратора.
Установим 64-разрядный дистрибутив клиента 1С. Запуск реструктуризации из 64-битного конфигуратора снимает ограничение в 2 Гб адресного пространства процесса, исключая ошибку 40000015 в библиотеке MSVCR110.dll при обработке крупных структур данных.
Если изменения в плане счетов или видах субконто обязательны, сократим объем реструктуризации за счет отключения расчета итогов. При включенных итогах СУБД вынуждена одновременно пересчитывать все агрегаты по счетам и субконто за весь период ведения учета.
Перед запуском реструктуризации выполним во внешней обработке программное отключение итогов:
РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(Ложь);
После этого выполняем обновление конфигурации базы данных. Время перестроения таблиц сократится в несколько раз, а нагрузка на оперативную память и дисковую подсистему существенно снизится. После успешного завершения реструктуризации вернем расчет итогов и выполним их пересчет:
РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(Истина);
РегистрыБухгалтерии.Хозрасчетный.ПересчитатьИтоги();
Для предотвращения зависания интерактивного сеанса запустим фоновое обновление конфигурации базы данных. Этот механизм разбивает процесс на независимые порции и выполняет перенос данных в отдельных фоновых заданиях на стороне сервера 1С.
Запуск можно выполнить из меню конфигуратора: «Конфигурация» → «Конфигурация базы данных» → «Обновить конфигурацию базы данных в фоновом режиме».
Также можно запустить обновление через командную строку пакетного режима с записью подробного лога в файл:
1cv8.exe DESIGNER /IBConnectionString "Srvr=Server1C;Ref=BaseName;" /UpdateDBCfg /Out "C:\update_log.txt"
Параметр /Out позволит зафиксировать точный момент остановки процесса, если произойдет внештатная ситуация.
Чтобы в реальном времени понимать, какая таблица обрабатывается в данный момент, используем системные представления СУБД. При реструктуризации 1С создает новые временные таблицы с постфиксом _NG (например, _AccRgED..._NG) и пачками переносит туда записи.
Для сопоставления технических имен таблиц СУБД с метаданными конфигурации 1С воспользуемся функцией:
СтруктураБазы = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого Стр Из СтруктураБазы Цикл
Если Стр.ИмяТаблицыХранения = "ИмяТаблицыИзSQL" Тогда
Сообщить("Объект 1С: " + Стр.Имя);
КонецЕсли;
КонецЦикла;
С помощью динамических представлений Microsoft SQL Server (например, запроса к sys.dm_exec_requests) можно отслеживать ход выполнения транзакции, процент завершения и объем перенесенных строк, не полагаясь исключительно на окно прогресса конфигуратора.
Нередко в ходе обновлений выясняется, что для многих объектов включена возможность изменения («желтый куб»), хотя сам объект полностью идентичен конфигурации поставщика. Чтобы вернуть таким объектам типовое правило поддержки («не редактируется» / «замок»):
.cf) в точности того же релиза, который сейчас установлен.