Одной из самых неприятных проблем в работе с платформой 1С:Предприятие 8.3 является внезапное закрытие приложения с дампом памяти. Особенно часто системные администраторы и программисты сталкиваются с ошибкой доступа к памяти по адресу 0xc0000005 в модуле frame.dll. Данная ошибка возникает в момент выбора номенклатуры в табличную часть документов (например, в «Заказе покупателя» или «Отчете производства за смену»). Рассмотрим подробнее, почему это происходит и как мы можем решить данную проблему, используя программные и системные методы.
Модуль frame.dll отвечает за отрисовку программного интерфейса (форм, списков, окон сообщений). Ошибка 0xc0000005 сигнализирует о том, что приложение попыталось обратиться к защищенному участку оперативной памяти, к которому у него нет прав доступа, либо этот адрес памяти поврежден. Разберем ситуацию: когда пользователь нажимает кнопку выбора или начинает вводить текст в поле «Номенклатура», система инициирует сложный процесс отрисовки выпадающего списка или формы подбора. Если в этот момент происходит программное исключение, которое 1С пытается обработать выводом окна ошибки, может возникнуть «зацикливание» или конфликт отрисовки, приводящий к падению всего приложения.
Проанализируем ситуацию на примере конфигурации «Управление производственным предприятием» (УПП). В некоторых релизах наблюдается ошибка в логике заполнения единиц измерения. Если в карточке номенклатуры не заполнена единица измерения мест, платформа может войти в критический конфликт при попытке отобразить предупреждение.
Для исправления нам необходимо найти общий модуль ОбработкаТабличныхЧастей и процедуру ЗаполнитьЕдиницуЦенуПокупкиТабЧасти. В исходном коде вызовы могут располагаться так, что ошибка инициализируется до того, как форма готова её отобразить. Попробуем поменять строки местами, чтобы сначала отрабатывала базовая логика заполнения мест.
Разберем пример кода, который помогает устранить падение:
// В процедуре ЗаполнитьЕдиницуЦенуПокупкиТабЧасти
// Находим строки:
РассчитатьКоличествоТабЧасти(СтрокаТабличнойЧасти, ДокументОбъект);
ЗаполнитьЕдиницуМестТабЧасти(СтрокаТабличнойЧасти, ДокументОбъект);
// Поменяем их местами для обеспечения корректной последовательности:
ЗаполнитьЕдиницуМестТабЧасти(СтрокаТабличнойЧасти, ДокументОбъект);
РассчитатьКоличествоТабЧасти(СтрокаТабличнойЧасти, ДокументОбъект);
Такая простая перестановка позволяет системе корректно инициализировать структуру данных строки до того, как начнутся расчеты, вызывающие исключение. Это предотвращает аварийное завершение работы 1cv8.exe.
Если проблема проявляется только у отдельных пользователей, первым делом проанализируем состояние их локального кэша. В папках профиля пользователя скапливаются временные файлы и отчеты о предыдущих падениях (дампы), которые могут мешать стабильной работе. Выясним причину, удалив старые данные.
%AppData%\Local\1C\1cv8\ и %AppData%\Roaming\1C\1cv8\.2859537f-8d22...).dumps. Если она содержит много файлов .dmp, обязательно очистим её, так как при старте 1С может пытаться анализировать или отправлять эти данные, что создает нагрузку на frame.dll.Важный нюанс: Иногда простой очистки папок недостаточно. Рекомендуется удалить информационную базу из списка в стартовом окне и добавить её заново. Это принудительно создаст новый идентификатор папки кэша и исключит влияние «битых» файлов SysHistory.xml (история выбора номенклатуры).
На терминальных серверах Windows часто включена функция DEP, которая блокирует выполнение кода в сегментах памяти, помеченных как «только для данных». Модуль frame.dll при динамическом построении форм может распознаваться системой безопасности как угроза. Разберем шаги по настройке исключений:
C:\Program Files (x86)\1cv8\8.3.X.XXXX\bin\1cv8.exe).Практика эксплуатации 1С на ОС Windows 7 и Windows Server 2008 R2 показала, что определенные пакеты обновлений вызывают ошибки обращения к памяти в приложениях x86. Если вы столкнулись с ошибкой 0xc0000005, проверим наличие следующих обновлений и попробуем их деинсталлировать:
kb2859537kb2872339kb2882822kb971033Для быстрого удаления можно использовать командную строку с правами администратора:
wusa.exe /uninstall /kb:2859537
Выясним связь между выбором номенклатуры и оборудованием. 1С в момент открытия формы выбора обращается к принтеру по умолчанию, чтобы рассчитать параметры шрифтов и размеры элементов управления. Если драйвер принтера (особенно часто это случается с HP или сетевыми принтерами) «завис» или работает некорректно, frame.dll падает при попытке получить контекст устройства.
Попробуем установить «Microsoft XPS Document Writer» принтером по умолчанию в терминальной сессии. Если вылеты прекратятся — проблему стоит искать в драйверах печати или в настройках перенаправления принтеров RDP.
Также на современных ОС Windows Server стоит отключить аппаратное ускорение графики в реестре, так как виртуализированные видеоадаптеры могут некорректно обрабатывать запросы платформы 1С на отрисовку сложных градиентов или прозрачности в управляемых формах.
Если при выборе номенклатуры включен «Поиск при наборе», 1С обращается к индексам полнотекстового поиска (ППД). Повреждение этих индексов гарантированно ведет к падению платформы. Проанализируем состояние индексов:
После перестроения индекса работа со списками выбора должна стабилизироваться. Помните, что регулярное регламентное задание ОбновлениеИндексаППД предотвращает подобные проблемы в будущем.