Перенос файлов из томов в информационную базу для 1С Документооборот

Изменение способа хранения вложений (из файлов в БД) и копирование всей информации

После года работы с конфигурацией было принято политическое решение перенести накопленные гигабайты внутрь БД. Поиском нашлись лишь стандартные входящие в поставку Документооборота обработки ПереносФайловВТома_ХХХ.epf.
По фразе «смена способа хранения файлов» ничего ценного найдено не было. При простом переключении в настройках варианта хранения переноса файлов из одного места в другое не происходит. Пришлось писать свою обработку.

К счастью в Документообороте хранение организовано просто без заморочек. Задействованы лишь несколько объектов: справочник ВерсииФайлов, регистр сведений ХранимыеФайлыВерсий и перечисление ТипыХраненияФайлов.

Суть переноса: копирование содержимого файла и запись в хранилище значения в регистре с заменой нескольких реквизитов в справочнике. Ниже код для переноса под Windows.

 // идем по все элементам справочника ВерсииФайлов  
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ
                | ВерсииФайлов.Ссылка,
                | ВерсииФайлов.ПутьКФайлу,
                | ВерсииФайлов.Размер,
                | ВерсииФайлов.Том.ПолныйПутьWindows Как ПолныйПутьWindows
                |ИЗ
                | Справочник.ВерсииФайлов КАК ВерсииФайлов
                |УПОРЯДОЧИТЬ ПО
                | ВерсииФайлов.ДатаСоздания"
; РезультатЗапроса = Запрос.Выполнить(); ВДЗ = РезультатЗапроса.Выбрать(); Пока ВДЗ.Следующий() Цикл Если ВДЗ.ПутьКФайлу="" Тогда
                       
Продолжить;
                КонецЕсли; ПолныйПуть = ВДЗ.ПолныйПутьWindows+ВДЗ.ПутьКФайлу; Попытка
Файл = Новый ДвоичныеДанные(ПолныйПуть); ХЗ = Новый ХранилищеЗначения(Файл); Исключение
Сообщить(ВДЗ.ПутьКФайлу + " считывание и помещение в ХЗ породило ошибку: "+ОписаниеОшибки()); Продолжить; КонецПопытки; // обновим запись РС
Попытка
 
        МенеджерЗаписи = РегистрыСведений.ХранимыеФайлыВерсий.СоздатьМенеджерЗаписи(); МенеджерЗаписи.ВерсияФайла = ВДЗ.Ссылка; МенеджерЗаписи.ХранимыйФайл = ХЗ; МенеджерЗаписи.Записать(Истина); Исключение
Сообщить(ВДЗ.Ссылка + " попытка записи в РС не удалась: "+ОписаниеОшибки()); Продолжить; КонецПопытки; // обновили Об = ВДЗ.Ссылка.ПолучитьОбъект(); Об.ПутьКФайлу = ""; Об.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; Об.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); Об.Записать(); КонецЦикла;


Перед выполнением обработки нужно в настройках документооборота убрать галку «Хранить файлы в томах на диске» (Настройки программы — Файлы).

На время выполнения обработки на всякий случай запретил сеансы и регламентные задания, выгнал всех из базы. Объем 2.2Гб переносился около 15 минут. Из 3500+ файлов не перенеслось три (физически отсутствовали файлы на диске по неизвестной пока причине). Но на целостность и работоспособность Документооборота они не влияют.
После успешного переноса файловое хранилище больше не потребуется, можно снести или убрать в архив.

p.s. В приложении готовая обработка по описанному алгоритму, сдобренная кнопочками и рюшечками.

20 Comments

  1. higs

    Здорово! Полезный механизм. Были мысли поступить с хранением файлов также.

    Однако, у нас не за год 2 гига, а за месяц после начала работы уже гиг файлов. С одной стороны, бекап скульной базы все вытерпит, с другой, эти файлы и так лежат в рейдовом массиве.

    Но возможность все же вернуть в базу — очень хорошо! Спасибо!

    Reply
  2. kraynev-navi

    Один из доводов в пользу переезда в ИБ — все в одном месте. Тем более опыт с хранением внутри базы у нас положительный: на другой конфе в день +100 мегов и все нормально работает.

    Reply
  3. FractonKireyev

    Я достаточно давно нечто подобное делал. На практике целостность хранения внутри БД выше, чем в томах на диске, если-бы изначально всё хранилось в БД — то не было-бы 3-х потерянных файлов…

    Единственный совет, который хочется дать по поводу данного модуля — документы лучше хранить в сжатом виде. Т.е. в тексте модуля написать:

    ХЗ = Новый ХранилищеЗначения(Файл, Новый СжатиеДанных( 9 ) );

    // 9 — это максимальное сжатие. которое поддерживает платформа

    Это никак не повлияет на выделение текста и индексирование (в документообороте это происходит при записи файла в БД), а вот размер базы сократится существенно. На быстродействие в процессе работы это так-же практически не влияет.

    Reply
  4. kraynev-navi

    (3) Попробовал на тестовой базе вашу идею с максимальным сжатием. Занимаемый объем уменьшился на 8%. Быстродействие не измерял.

    Reply
  5. ChasovskiH

    После переноса файлов в БД База работает медленнее((((

    Reply
  6. ChasovskiH

    А есть ли в этой обработке возможность переноса файлов наоборот из БД в тома???

    Reply
  7. kraynev-navi

    (6) В данной обработке нет. Но, если мне не изменяет память что-то было в комплект поставки самого ДО. Сейчас нет под рукой данной конфигурации, проверить не могу.

    Reply
  8. kraynev-navi

    (5) На сколько медленнее? По ощущениям? 🙂 Большая база?

    Reply
  9. ansh15
  10. ChasovskiH

    (8) заметно медленнее «тормозит по страшному» база 80 Гб Лучше хранить файлы отдельно.ну это из моего опыта

    Reply
  11. ChasovskiH

    (9) ansh15, а к чему мне эта статья? Я исхожу из своего опыта в работе с Документооборотом1с

    Reply
  12. ChasovskiH

    Если говорить проще, Лучше когда в базе хранятся прямые ссылки на файлы в томах. Т.е. при открытии файла не переворачивается вся база в поисках нужного, а открывает его по прямой ссылке.Если же все файлы хранятся в базе, при обращении к файлу система начинает его искать так как ссылки то прямой нет.!!!Как считаете при каком способе хранения база быстрей работать будет???

    Reply
  13. ansh15

    (11) Там ответ на ваш вопрос.

    Reply
  14. stas1kbob

    не работает в документообороте 2.0

    Reply
  15. vasa444

    kraynev-navi хочу обсудить с вами работу свяжитесь со мной пожалуйста по почте sergeykmk2@yandex.ru

    Reply
  16. Cybersant

    Подойдёт ли обработка для бухгалтерии 3.0?

    Reply
  17. kraynev-navi

    (16) Увы, БП3 с файлами у нас нет, проверить не могу.

    Reply
  18. kraynev-navi

    (14) Да. Когда обработка писалась ДО 2.0 в проекте не было )))

    Reply
  19. Cybersant

    (17)

    можно попросить поделитесь обработкой, прислав на почту? Как раз смогу потестировать

    Reply
  20. Cybersant

    Протестировал с БП, ред. 3.0; увы, не работает(

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *