Почему 1С аварийно завершает работу с ошибкой APPCRASH при реструктуризации большой базы и как решить эту проблему?

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

При обновлении объемных информационных баз (от 50–100 Гб и более) на платформе 1С:Предприятие 8.3 специалисты нередко сталкиваются с аварийным закрытием конфигуратора (APPCRASH) в модуле MSVCR110.dll с кодом исключения 40000015. Процесс реструктуризации может идти несколько часов, после чего конфигуратор внезапно закрывается без внятного сообщения об ошибке во встроенном интерфейсе. Разберем детально, почему это происходит, как выяснить, на каком объекте падает процесс, и какими способами можно успешно завершить обновление.

Причины падения конфигуратора при реструктуризации

Код исключения 40000015 (STATUS_FATAL_APP_EXIT) означает аварийный вызов функции abort() средой выполнения Microsoft Visual C++. В подавляющем большинстве случаев это вызвано следующими факторами:

  1. Исчерпание 32-битного адресного пространства процесса 1cv8.exe. Даже если реструктуризация запущена на мощном сервере с десятками гигабайт оперативной памяти, 32-разрядный клиент конфигуратора ограничен 2 Гб виртуального адресного пространства. При анализе огромных таблиц метаданных, кэшировании связей и генерации SQL-скриптов происходит фрагментация адресного пространства, и процесс аварийно завершается при невозможности выделить очередной непрерывный блок памяти.
  2. Каскадная реструктуризация регистра бухгалтерии. Если обновление затрагивает объект ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные или ПланыСчетов.Хозрасчетный, платформа 1С автоматически запускает реструктуризацию не только самого плана счетов, но и всех связанных таблиц: движений регистра РегистрБухгалтерии.Хозрасчетный, таблицы значений субконто и таблиц итогов. Для базы размером более 100 Гб это приводит к перезаписи десятков или сотен миллионов строк в СУБД.
  3. Проблемы на уровне СУБД. Многочасовая непрерывная транзакция переполняет журнал транзакций (LDF) или системную базу tempdb, что вызывает сетевой тайм-аут или аварийный сброс соединения, на который клиент 1С реагирует вылетом.

Способ 1. Локализация проблемного метаданного по частям

Когда реструктуризация всей конфигурации падает, необходимо выяснить, какой именно объект провоцирует сбой. Применим метод пошагового обновления метаданных:

  1. Открываем окно сравнения и объединения с новой конфигурацией поставщика.
  2. Снимаем общий флаг со всех объектов конфигурации.
  3. Накатываем изменения порциями: сначала справочники, затем документы, затем регистры сведений и накопления. После каждого объединения выполняем сохранение конфигурации базы данных (клавиша F7).
  4. Объекты бухгалтерского контура (ПланыСчетов, ПланыВидовХарактеристик и РегистрыБухгалтерии) оставляем на самый последний этап.

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

Способ 2. Переход на 64-разрядный клиент конфигуратора

Наиболее фундаментальное техническое решение проблемы нехватки памяти — использование 64-разрядного клиента платформы 1С:Предприятие (версии x64). Начиная с платформы 8.3.9, 1С предоставляет полноценный 64-битный исполняемый файл толстого клиента и конфигуратора.

Установим 64-разрядный дистрибутив клиента 1С. Запуск реструктуризации из 64-битного конфигуратора снимает ограничение в 2 Гб адресного пространства процесса, исключая ошибку 40000015 в библиотеке MSVCR110.dll при обработке крупных структур данных.

Способ 3. Отключение итогов регистра бухгалтерии перед обновлением

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

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

РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(Ложь);

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


РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(Истина);
РегистрыБухгалтерии.Хозрасчетный.ПересчитатьИтоги();

Способ 4. Использование фоновой реструктуризации и пакетного режима

Для предотвращения зависания интерактивного сеанса запустим фоновое обновление конфигурации базы данных. Этот механизм разбивает процесс на независимые порции и выполняет перенос данных в отдельных фоновых заданиях на стороне сервера 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) можно отслеживать ход выполнения транзакции, процент завершения и объем перенесенных строк, не полагаясь исключительно на окно прогресса конфигуратора.

Как вернуть на поддержку объекты без изменений

Нередко в ходе обновлений выясняется, что для многих объектов включена возможность изменения («желтый куб»), хотя сам объект полностью идентичен конфигурации поставщика. Чтобы вернуть таким объектам типовое правило поддержки («не редактируется» / «замок»):

  1. Открываем операцию «Конфигурация» → «Сравнить, объединить с конфигурацией из файла» и выбираем файл типовой конфигурации поставщика (.cf) в точности того же релиза, который сейчас установлен.
  2. В дереве сравнения снимаем корневой флаг со всех объектов (чтобы исключить перезапись данных и кода).
  3. Нажимаем кнопку «Действия» → «Установить порядок обновления».
  4. В появившемся окне выбираем правило: для объектов, не измененных относительно поставщика — установить «Объект поставщика не редактируется».
  5. Нажимаем «Выполнить». Правила поддержки вернутся к типовым значениям без риска повредить конфигурацию.
← На главную