При работе с распределенными информационными базами (РИБ) в среде 1С:Предприятие 8.1 или 8.2 системные администраторы и программисты часто сталкиваются с досадной ошибкой: «Ошибка при распаковке данных из архива: Ошибка создания файла». Ситуация осложняется тем, что проблема носит плавающий характер — обмен может успешно проходить несколько дней, а затем внезапно «спотыкаться» на одной или нескольких базах. Проанализируем причины этой неисправности и разберем пошаговые инструкции по ее устранению.
Давайте рассмотрим типичную архитектуру, в которой проявляется этот сбой. Имеется центральная база на MSSQL и несколько периферийных узлов. Обмен настроен через регламентные задания, которые выполняются в фоновом режиме на сервере. В определенный момент в журнале регистрации фиксируется запись следующего вида:
{ОбщийМодуль.ПроцедурыОбменаДанными(1893)}: Ошибка при вызове метода контекста (Извлечь): Ошибка создания файла: C:\Users\USR1CV81\AppData\Local\Temp\Message_001_000.xml
Проанализируем ситуацию: сервер 1С под управлением учетной записи USR1CV81 пытается извлечь XML-файл сообщения из ZIP-архива во временную папку. Несмотря на наличие прав администратора у пользователя и достаточное место на диске, операционная система отказывает в создании файла. Выясним, почему это происходит.
Это наиболее распространенная причина в компаниях, где рядом с рабочей базой развернута тестовая база или копия для другого юридического лица. Рассмотрим подробнее, как это работает:
Message_<КодОтправителя>_<КодПолучателя>.xml.USR1CV81.КаталогВременныхФайлов() для обеих баз вернет один и тот же путь: C:\Users\USR1CV81\AppData\Local\Temp.Когда расписания обменов в оригинальной базе и ее клоне пересекаются, оба процесса rphost пытаются создать файл с абсолютно одинаковым именем в одной и той же директории. Возникает состояние Sharing Violation (нарушение прав совместного доступа), и одна из баз получает ошибку создания файла.
Посмотрим на ситуацию со стороны операционной системы. Если файл обмена пришел поврежденным или процесс распаковки был прерван (например, из-за сбоя сети или нехватки памяти), дескриптор файла во временной папке может остаться открытым процессом rphost. Пока служба сервера 1С удерживает этот дескриптор, любая попытка перезаписать или создать файл с таким же именем будет блокироваться Windows. Именно поэтому в таких случаях часто помогает только перезапуск службы 1С.
Проанализируем самый надежный способ устранения конфликта между основной базой и ее копиями. Если вам необходимо держать на одном сервере несколько баз с одинаковой структурой РИБ, обязательно измените код центрального узла в копии. Например, если в основной базе код 001, в копии измените его на 001_T. Это приведет к тому, что файлы во временной папке будут иметь разные имена (Message_001_000.xml и Message_001_T_000.xml), и конфликт доступа будет исчерпан.
Если вы не хотите менять программный код обмена, можно пойти по пути системного администрирования. Разберем, как изолировать временные файлы разных баз:
C:\Exchange\Base_Work и C:\Exchange\Base_Test.USR1CV81 есть полные права на чтение и запись в эти директории.Temp.Рассмотрим, как можно модифицировать код в общем модуле ПроцедурыОбменаДанными, чтобы сделать процесс более отказоустойчивым. Вместо использования стандартного пути, мы можем генерировать уникальное имя папки для каждой сессии обмена. Посмотрим на пример кода:
ИмяВременнойПапки = КаталогВременныхФайлов() + "Exchange_" + Строка(Новый УникальныйИдентификатор) + "\";
СоздатьКаталог(ИмяВременнойПапки);
Попытка
Архив = Новый ЧтениеZipФайла(ПутьКФайлуАрхива);
Архив.ИзвлечьВсе(ИмяВременнойПапки, РежимВосстановленияПутейФайловZip.НеВосстанавливать);
Архив.Закрыть();
Исключение
Сообщить("Ошибка при распаковке: " + ОписаниеОшибки());
КонецПопытки;
Использование УникальныйИдентификатор гарантирует, что даже если два обмена запустятся в одну миллисекунду, они будут работать в разных физических папках, что полностью исключает ошибку «Ошибка создания файла».
Выясним, какие еще факторы могут влиять на стабильность обмена в фоновом режиме:
C:\Users\USR1CV81\AppData\Local\Temp и расширения .xml, .zip, .tmp в список исключений антивирусного сканера. Антивирус часто блокирует файл в момент создания для проверки, что вызывает конфликт доступа у 1С.USR1CV81_Prod и USR1CV81_Test). Это обеспечит полную изоляцию временных папок профилей пользователей.Temp, которые не были удалены системой автоматически из-за сбоев.Таким образом, мы выяснили, что ошибка создания файла — это не проблема прав доступа, а результат конкуренции процессов за один и тот же ресурс. Использование уникальных кодов узлов и разнесение временных каталогов позволит вам навсегда забыть об этой проблеме и обеспечить стабильную работу распределенной информационной системы.