← На главную
При попытке обновить конфигурацию 1С:Предприятие (например, через файл инкрементного обновления .cfu) администраторы и программисты могут столкнуться со следующим критическим сбоем:
Ошибка при выполнении файловой операции '...\AppData\Local\Temp\v8_XXXX.tmp'. Неожиданный вызов метода 'MemoryMappedFileObject::write'
При этом стандартное тестирование и исправление (ТИИ), утилита chdbfl.exe и даже выгрузка базы в файловый вариант часто не выявляют нарушений. Проанализируем природу этой ошибки и разберем по шагам надежные способы ее устранения.
Причины возникновения ошибки
Механизм MemoryMappedFileObject отвечает за проецирование файлов с диска напрямую в виртуальное адресное пространство процесса (механизм отображения памяти в Windows). Ошибка записи возникает в следующих случаях:
- Повреждение или рассинхронизация конфигурации поставщика. При применении файла
.cfu платформа распаковывает разницу между старым и новым релизом поставщика. Если внутренняя структура метаданных поставщика в таблице Config нарушена, сопоставление блоков завершается аварийно.
- Ограничение виртуального адресного пространства 32-разрядного клиента. 32-битный Конфигуратор (
1cv8.exe) имеет жесткий лимит доступной памяти (до 2–3 ГБ). При распаковке и наложении тяжелых пакетов метаданных операционная система не может выделить непрерывный блок памяти под проецируемый файл.
- Блокировка временных файлов антивирусом или службами индексации. В момент формирования файла
.tmp в каталоге %TEMP% фоновый сканер перехватывает дескриптор файла, из-за чего попытка записи метода write вызывает отказ.
- Повреждение самого файла обновления. Файл
.cfu был скачан с ошибками или поврежден на диске.
- «Зависшие» изменения в таблице ConfigSave. При аварийном завершении предыдущего сеанса обновления во вспомогательных таблицах СУБД остаются несохраненные данные.
Способ 1. Обновление через полный файл конфигурации (.cf)
Наиболее простое и надежное решение — отказаться от инкрементного обновления .cfu и обновиться через полный дистрибутив нужного релиза:
- Создаем резервную копию информационной базы (через выгрузку
.dt или средствами СУБД).
- Скачиваем полный дистрибутив целевого релиза и получаем файл
1cv8.cf.
- В Конфигураторе открываем меню Конфигурация → Поддержка → Обновить конфигурацию.
- Выбираем вариант Выбор файла обновления и указываем путь к файлу
1cv8.cf целевого релиза.
- Выполняем сравнение и объединение, после чего обновляем конфигурацию базы данных (клавиша F7).
Способ 2. Восстановление и перепривязка конфигурации поставщика
Если ошибка вызвана повреждением структуры поддержки в самой базе, восстановим конфигурацию поставщика исходного (текущего) релиза:
- Обязательно сохраняем резервную копию базы данных.
- Если в базу вносились доработки, выгружаем текущую конфигурацию в файл: меню Конфигурация → Сохранить конфигурацию в файл (например,
custom.cf).
- Открываем окно Конфигурация → Поддержка → Настройка поддержки и нажимаем кнопку Снять с поддержки.
- Выбираем пункт меню Конфигурация → Сравнить, объединить с конфигурацией из файла и указываем файл
1cv8.cf текущего (исходного) релиза конфигурации (не нового, а того, на котором база находится сейчас).
- На вопрос системы «Поставить конфигурацию на поддержку?» отвечаем Да.
- В окне сравнения и объединения снимаем все флажки (чтобы не затереть возможные доработки) и нажимаем Выполнить.
- В настройках поддержки переводим объекты в режим «Редактируется с сохранением поддержки».
- Применяем изменения клавишей F7. После восстановления корректной конфигурации поставщика выполняем обновление до нового релиза штатным способом.
Способ 3. Переход на 64-разрядный Конфигуратор
Если проблема вызвана нехваткой адресного пространства при обработке больших объектов метаданных, используем 64-битную платформу:
- Убедимся, что на рабочей станции установлен 64-разрядный клиент 1С:Предприятие (дистрибутив x86-64).
- Запускаем базу через 64-битный исполняемый файл Конфигуратора, расположенный по пути
C:\Program Files\1cv8\версия_платформы\bin\1cv8.exe (а не из папки Program Files (x86)).
- Повторяем операцию обновления через
.cfu или .cf.
Способ 4. Очистка кэша и временных файлов
Файловые операции могут блокироваться остатками старых временных данных:
- Полностью закрываем все запущенные процессы
1cv8.exe и 1cv8c.exe.
- Очищаем содержимое системных папок
%TEMP% и %LOCALAPPDATA%\Temp.
- Очищаем локальный кэш конфигураций 1С, удалив каталоги с длинными буквенно-цифровыми именами по путям:
%LOCALAPPDATA%\1C\1cv8\
%APPDATA%\1C\1cv8\
Способ 5. Добавление исключений в антивирусное ПО
Для предотвращения блокировки файла во время операции MemoryMappedFileObject::write добавим в исключения антивирусного монитора:
- Каталог временных файлов пользователя
%LOCALAPPDATA%\Temp\.
- Рабочий каталог сервера 1С (при работе в клиент-серверном режиме).
- Исполняемые файлы платформы
1cv8.exe и ragent.exe.
Способ 6. Очистка таблицы ConfigSave в клиент-серверном режиме
Если обновление аварийно прервалось на сервере СУБД, в таблице ConfigSave могут остаться поврежденные записи:
- Создаем полную резервную копию базы данных средствами СУБД (например, в MS SQL Server или PostgreSQL).
- Останавливаем службу кластера серверов
1C:Enterprise Server.
- Выполняем запрос на очистку таблицы несохраненной конфигурации:
DELETE FROM dbo.ConfigSave;
- Запускаем службу кластера 1С, открываем базу в Конфигураторе и заново запускаем процесс обновления.