При администрировании и оптимизации баз данных 1С:ERP часто возникает задача выноса накопленных файлов из информационной базы на жесткий диск или сетевое хранилище (в тома хранения). Однако при попытке воспользоваться стандартной командой Перенести все файлы в тома в разделе администрирования система нередко выдает сообщение о том, что файлов для переноса нет, хотя к документам и справочникам прикреплены гигабайты документов. Разберем, почему возникает эта ситуация, как устроена архитектура хранения файлов в Библиотеке стандартных подсистем (БСП) и какими способами можно перенести данные.
Проанализируем структуру подсистем БСП, на которой построена 1С:ERP. В конфигурации параллельно сосуществуют две разные модели хранения:
Версии файлов, а карточки — в справочнике Файлы.Номенклатура, документам Заказ клиента, Поступление товаров и услуг и др. Для каждого вида объекта в конфигурации создан свой справочник, например НоменклатураПрисоединенныеФайлы или ЗаказКлиентаПрисоединенныеФайлы. Двоичные данные таких файлов размещаются либо непосредственно в реквизите справочника, либо в специальном регистре сведений (ДвоичныеДанныеФайлов или ПрисоединенныеФайлы).Штатная кнопка Перенести все файлы в тома в старых версиях формы настроек работы с файлами обращается исключительно к справочнику Версии файлов. Если общий каталог файлов не использовался, а файлы прикреплялись к документам и справочникам, справочник Версии файлов остается абсолютно пустым. В результате обработка сообщает об отсутствии данных для переноса.
Рассмотрим штатные средства переноса присоединенных файлов, предусмотренные разработчиками конфигурации. В современных редакциях БСП для распределения файлов документов и справочников используются фоновые механизмы:
Если штатное регламентное задание по какой-либо причине недоступно, не срабатывает или требуется выполнить разовый контролируемый перенос с подробным логированием, разработаем программный алгоритм. Проанализируем логику его работы:
ПрисоединенныйФайл или переберем все объекты конфигурации с постфиксом ПрисоединенныеФайлы.ТипХраненияФайла имеет значение хранения в базе данных, а реквизит Том не заполнен.Том и ПутьКФайлу, очистим тело файла в базе и переключим ТипХраненияФайла.Посмотрим на пример структуры такого обхода на встроенном языке:
ВыборкаТипов = Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип.Типы();
Для Каждого ТекущийТип Из ВыборкаТипов Цикл
МетаданныеСправочника = Метаданные.НайтиПоТипу(ТекущийТип);
Если МетаданныеСправочника = Неопределено Тогда
Продолжить;
КонецЕсли;
ИмяСправочника = МетаданныеСправочника.Имя;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка
|ИЗ
| Справочник." + ИмяСправочника + " КАК Файлы
|ГДЕ
| Файлы.Том = ЗНАЧЕНИЕ(Справочник.ТомаХраненияФайлов.ПустаяСсылка)
| И Файлы.ПометкаУдаления = ЛОЖЬ";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
// Вызов штатной процедуры БСП для перемещения в том
РаботаСФайлами.ПереместитьФайлВТом(Результат.Ссылка, ВыбранныйТом);
КонецЦикла;
КонецЦикла;
При переносе файлов на внешние дисковые ресурсы обязательно учтем ключевые системные особенности:
rphost. Права на запись в сетевую папку или локальный каталог тома необходимо выдавать учетной записи операционной системы, под которой запущена служба сервера 1С (как правило, это usr1cv8), а не локальному пользователю базы или администратору домена.\\server\share). Сетевой ресурс должен быть предварительно примонтирован в файловую систему ОС Linux через протоколы CIFS или NFS, а в карточке тома хранения 1С должен быть корректно заполнен путь для Linux..mdf в Microsoft SQL Server или таблицы базы в PostgreSQL) автоматически не уменьшится. Чтобы вернуть высвободившееся место операционной системе, необходимо выполнить сжатие базы данных (процедура Shrink в MS SQL Server или операция VACUUM FULL для PostgreSQL)..dt или резервная копия средствами СУБД больше не содержат сами вложения. Настроим согласованное по времени резервное копирование базы данных и сетевых томов на диске, чтобы исключить риск потери файлов при восстановлении.