При работе с крупными информационными базами «1С:Бухгалтерия 3.0» или отраслевыми решениями на её основе (например, «Бухгалтерия строительной организации») администраторы часто сталкиваются с необходимостью оптимизации размера базы данных. Одним из наиболее эффективных способов является перенос присоединенных файлов (сканов договоров, актов, счетов) из внутренней таблицы базы данных во внешние тома хранения на диске. Однако в процессе этой операции может возникнуть критическая ошибка: файлы из базы удаляются, а в целевой папке на диске они так и не появляются. В результате при попытке открыть документ пользователь получает сообщение: «Не удалось открыть файл... по причине: двоичные данные файла были удалены».
В этой статье мы подробно разберем, почему это происходит, как работает механизм Библиотеки стандартных подсистем (БСП) в части хранения файлов, и каким образом исправить эту ситуацию, если типовой патч от фирмы «1С» не устанавливается на вашу конфигурацию.
Давайте проанализируем ситуацию, которая приводит к потере данных. Основная проблема кроется в нарушении принципа транзакционности в старых версиях БСП. В норме процесс переноса должен выглядеть следующим образом: система копирует данные из базы на диск, проверяет успешность записи и только после этого очищает поле с двоичными данными в таблице ПрисоединенныеФайлы.
Однако в проблемных версиях программного кода логика была нарушена:
ХранимыйФайл в базе данных (данные удаляются).Результат плачевен: в базе данных ссылка на файл остается, но сами «двоичные данные» уже стерты, а на физическом диске файл не создан. Проанализируем сообщение об ошибке: «Возможно, файл очищен как ненужный». Это стандартная системная заглушка, которая срабатывает, когда объект метаданных существует, но его наполнение (ресурс с данными) равно NULL или пустому значению.
Фирма «1С» признала наличие этой ошибки и выпустила исправление — патч EF_00_00402582. Рассмотрим подробнее, что именно меняет это исправление. Разработчики изменили последовательность действий в модулях управления файлами. Теперь удаление данных из информационной базы происходит строго после подтверждения операционной системой того, что файл успешно записан в том и доступен для чтения.
Но почему пользователи отраслевых решений (например, БСО — Бухгалтерия строительной организации) продолжают сталкиваться с этой проблемой, даже если они обновляют конфигурацию? Разберем по шагам:
Если вы обнаружили, что перенос файлов в тома «убивает» данные, а патч не ставится, рекомендуем выполнить следующие действия. Нам необходимо скорректировать логику в общем модуле РаботаСФайламиСлужебный. Проанализируем, какой именно код отвечает за перемещение данных.
Вам следует создать расширение и перенести в него процедуру, отвечающую за запись файла в том. Логика должна быть обернута в блок Попытка...Исключение, где удаление из БД происходит только в самом конце блока Попытка.
Пример концептуальной схемы исправления в коде:
// В расширении для модуля РаботаСФайламиСлужебный
&Вместо("ПереместитьФайлВТом")
Процедура Расш_ПереместитьФайлВТом(ФайлСсылка, ПутьКТому)
ДвоичныеДанные = ПолучитьДанныеИзБазы(ФайлСсылка);
Попытка
// Сначала пишем на диск
ЗаписатьФайлНаДиск(ДвоичныеДанные, ПутьКТому);
// Проверяем, что файл действительно создался и размер совпадает
Если ФайлСуществуетНаДиске(ПутьКТому) Тогда
// И только теперь очищаем данные в информационной базе
ОчиститьДвоичныеДанныеВБазе(ФайлСсылка);
Иначе
ВызватьИсключение "Файл не был записан на диск, отмена операции";
КонецЕсли;
Исключение
ЗаписатьВЖурналРегистрации("Ошибка переноса файла: " + ОписаниеОшибки());
// Данные в базе не трогаем, они остались целы
КонецПопытки;
КонецПроцедуры
Помимо программной ошибки в БСП, выясним другие причины, по которым перенос может завершиться неудачей:
USR1CV8), имеет права «Полный доступ» к сетевой папке или локальному каталогу тома.\\ServerName\VolumeFolder, даже если папка находится на том же сервере, где установлена 1С. Это минимизирует проблемы с сопоставлением локальных дисков в разных сессиях.К сожалению, если процедура переноса уже отработала и данные в базе очистились, а на диске не появились, программного способа «откатить» это действие внутри 1С не существует. Двоичные данные удаляются безвозвратно из таблицы ХранимыеДанные.
Единственный надежный путь восстановления — развертывание резервной копии базы данных, сделанной до начала переноса. Рассмотрим алгоритм восстановления:
Важный совет: Перед любым массовым переносом файлов в тома на рабочей базе всегда делайте пробный запуск на копии с тем же самым томом (создайте для теста отдельную папку). Это позволит вовремя заметить отсутствие патча или проблемы с правами доступа без риска потери реальных документов компании.