При активном документообороте прикрепление сканов документов напрямую в базу данных быстро приводит к неконтролируемому росту размера информационной базы и снижению производительности СУБД. Поэтому часто возникает задача вынести хранение файлов на внешний файловый сервер или локальный диск, оставив в 1С только привязку к документу и кнопку для быстрого просмотра.
Разберем различные подходы к реализации этой задачи: от простого вызова внешнего просмотрщика до использования типовых механизмов БСП и внешних архивов, а также проанализируем ключевые подводные камни.
Рассмотрим самый простой и быстрый способ решения задачи. Если файлы документов сканируются в определенную сетевую папку или на диск сервера терминалов, в документ 1С (например, РеализацияТоваровУслуг) можно добавить строковый реквизит, в котором будет храниться полный путь к файлу скана.
Для открытия документа стандартной программой просмотра изображений Windows используем метод ЗапуститьПриложение. Посмотрим на пример кода обработчика нажатия кнопки:
Процедура КнопкаОткрытьСканНажатие(Кнопка)
Если ПустаяСтрока(ЭтотОбъект.ПутьКФайлуСкана) Тогда
Предупреждение("Файл скана не прикреплен к документу!");
Возврат;
КонецЕсли;
// Запуск стандартного средства просмотра через проводник
КомандаЗапуска = "explorer """ + ЭтотОбъект.ПутьКФайлуСкана + """";
ЗапуститьПриложение(КомандаЗапуска);
КонецПроцедуры
Разберем особенности этого метода:
explorer вызывает зарегистрированное в операционной системе Windows приложение по умолчанию для данного типа файлов (JPG, PNG, PDF).Хранить полный путь в реквизите документа не всегда удобно: пользователи могут ошибиться при вводе, переименовать файл или случайно перезаписать данные. Более надежным решением является генерация уникального имени файла на основе УникальныйИдентификатор ссылки документа.
Проанализируем алгоритм работы:
ИмяФайла = Строка(Ссылка.УникальныйИдентификатор()) + ".jpg".Посмотрим на пример процедуры открытия с проверкой наличия файла:
Процедура ОткрытьСканПоИдентификатору(СсылкаНаДокумент)
КаталогХранения = "E:\ScansArchive\";
ИмяФайла = КаталогХранения + Строка(СсылкаНаДокумент.УникальныйИдентификатор()) + ".jpg";
// Проверяем физическое наличие файла на диске
ФайлНаДиске = Новый Файл(ИмяФайла);
Если ФайлНаДиске.Существует() Тогда
ЗапуститьПриложение("explorer """ + ИмяФайла + """");
Иначе
Предупреждение("Скан-копия документа не найдена в хранилище!");
КонецЕсли;
КонецПроцедуры
При реализации собственного файлового хранилища важно учитывать неочевидные технические проблемы:
ПередУдалением следует реализовать удаление привязанного файла с диска.usr1cv8) и учетные записи пользователей терминалов/клиентов должны иметь одинаковый уровень доступа на чтение/запись к целевой сетевой папке.Если конфигурация разработана на базе Библиотеки Стандартных Подсистем (БСП), нет необходимости создавать механизм с нуля. В БСП встроен механизм «Присоединенные файлы» с поддержкой хранения на томах на диске.
Преимущества типового механизма:
ДвоичныеДанные и временное хранилище без прямого доступа к диску на клиенте.Для крупных предприятий с большими объемами первичной документации целесообразно использовать готовые архитектурные решения: