Как исправить ошибку «MemoryMappedFileObject::write» при обновлении конфигурации 1С?

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

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

Ошибка при выполнении файловой операции '...\AppData\Local\Temp\v8_XXXX.tmp'. Неожиданный вызов метода 'MemoryMappedFileObject::write'

При этом стандартное тестирование и исправление (ТИИ), утилита chdbfl.exe и даже выгрузка базы в файловый вариант часто не выявляют нарушений. Проанализируем природу этой ошибки и разберем по шагам надежные способы ее устранения.

Причины возникновения ошибки

Механизм MemoryMappedFileObject отвечает за проецирование файлов с диска напрямую в виртуальное адресное пространство процесса (механизм отображения памяти в Windows). Ошибка записи возникает в следующих случаях:

  1. Повреждение или рассинхронизация конфигурации поставщика. При применении файла .cfu платформа распаковывает разницу между старым и новым релизом поставщика. Если внутренняя структура метаданных поставщика в таблице Config нарушена, сопоставление блоков завершается аварийно.
  2. Ограничение виртуального адресного пространства 32-разрядного клиента. 32-битный Конфигуратор (1cv8.exe) имеет жесткий лимит доступной памяти (до 2–3 ГБ). При распаковке и наложении тяжелых пакетов метаданных операционная система не может выделить непрерывный блок памяти под проецируемый файл.
  3. Блокировка временных файлов антивирусом или службами индексации. В момент формирования файла .tmp в каталоге %TEMP% фоновый сканер перехватывает дескриптор файла, из-за чего попытка записи метода write вызывает отказ.
  4. Повреждение самого файла обновления. Файл .cfu был скачан с ошибками или поврежден на диске.
  5. «Зависшие» изменения в таблице ConfigSave. При аварийном завершении предыдущего сеанса обновления во вспомогательных таблицах СУБД остаются несохраненные данные.

Способ 1. Обновление через полный файл конфигурации (.cf)

Наиболее простое и надежное решение — отказаться от инкрементного обновления .cfu и обновиться через полный дистрибутив нужного релиза:

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

Способ 2. Восстановление и перепривязка конфигурации поставщика

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

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

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

Если проблема вызвана нехваткой адресного пространства при обработке больших объектов метаданных, используем 64-битную платформу:

  1. Убедимся, что на рабочей станции установлен 64-разрядный клиент 1С:Предприятие (дистрибутив x86-64).
  2. Запускаем базу через 64-битный исполняемый файл Конфигуратора, расположенный по пути C:\Program Files\1cv8\версия_платформы\bin\1cv8.exe (а не из папки Program Files (x86)).
  3. Повторяем операцию обновления через .cfu или .cf.

Способ 4. Очистка кэша и временных файлов

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

  1. Полностью закрываем все запущенные процессы 1cv8.exe и 1cv8c.exe.
  2. Очищаем содержимое системных папок %TEMP% и %LOCALAPPDATA%\Temp.
  3. Очищаем локальный кэш конфигураций 1С, удалив каталоги с длинными буквенно-цифровыми именами по путям:
    • %LOCALAPPDATA%\1C\1cv8\
    • %APPDATA%\1C\1cv8\

Способ 5. Добавление исключений в антивирусное ПО

Для предотвращения блокировки файла во время операции MemoryMappedFileObject::write добавим в исключения антивирусного монитора:

  1. Каталог временных файлов пользователя %LOCALAPPDATA%\Temp\.
  2. Рабочий каталог сервера 1С (при работе в клиент-серверном режиме).
  3. Исполняемые файлы платформы 1cv8.exe и ragent.exe.

Способ 6. Очистка таблицы ConfigSave в клиент-серверном режиме

Если обновление аварийно прервалось на сервере СУБД, в таблице ConfigSave могут остаться поврежденные записи:

  1. Создаем полную резервную копию базы данных средствами СУБД (например, в MS SQL Server или PostgreSQL).
  2. Останавливаем службу кластера серверов 1C:Enterprise Server.
  3. Выполняем запрос на очистку таблицы несохраненной конфигурации: DELETE FROM dbo.ConfigSave;
  4. Запускаем службу кластера 1С, открываем базу в Конфигураторе и заново запускаем процесс обновления.
← На главную