В процессе эксплуатации конфигурации «1С:Управление производственным предприятием» редакции 1.3 (или аналогичной ей «1С:Комплексная автоматизация» редакции 1.1) многие компании сталкиваются с лавинообразным ростом размера информационной базы. Основным источником этого роста зачастую становятся прикрепленные файлы: сканы договоров, спецификаций, сертификатов номенклатуры и другие документы. База данных СУБД начинает весить сотни гигабайт, что существенно замедляет создание резервных копий и снижает общее быстродействие системы.
При этом в настройках программы администраторы видят заманчивую галочку «Хранить файлы в томах на диске», включают её, настраивают тома, но файлы все равно продолжают сохраняться непосредственно в базу данных SQL. Разберем по шагам, почему так происходит, как устроен этот механизм в УПП 1.3 и какие существуют способы решения этой проблемы.
Проанализируем архитектуру конфигурации 1С:УПП 1.3. В настройках программы (меню Сервис -> Настройка программы -> Электронные документы) действительно присутствует опция переноса файлов на диск. Однако, как справедливо отмечают специалисты, эта настройка предназначена исключительно для подсистемы электронного документооборота (ЭДО).
Когда пользователи прикрепляют обычные файлы к документам или элементам справочников через стандартную кнопку «Файлы» (которая присутствует во многих формах документов), система задействует совершенно другой механизм:
ХранилищеДополнительнойИнформации.Хранилище с типом данных ХранилищеЗначения.Таким образом, стандартная кнопка «Файлы» никак не связана с константой хранения файлов в томах. Чтобы вынести сканы на диск, нам придется доработать этот механизм самостоятельно или использовать альтернативные решения.
В современных конфигурациях 1С (таких как ERP 2, КА 2, УТ 11) подсистема работы с файлами из состава БСП решает эту задачу «из коробки». Возникает логичный вопрос: можно ли интегрировать эту часть БСП в УПП 1.3?
Рассмотрим сложности, с которыми мы неизбежно столкнемся при попытке такой интеграции:
Поэтому интеграция БСП в УПП 1.3 признана разработчиками неэффективным и трудоемким путем. Рассмотрим более простые и изящные варианты решения.
Это самый популярный и органичный способ. Его преимущество заключается в том, что интерфейс для конечных пользователей остается прежним. Они точно так же нажимают привычную кнопку «Файлы», прикрепляют сканы, но физически файлы улетают на сетевой диск, а в базе данных сохраняется лишь ссылка.
Разберем по шагам, как реализовать эту доработку:
ХранилищеДополнительнойИнформации новые реквизиты:
ПутьКФайлу (тип: Строка, длина 250) — для хранения UNC-пути к файлу на сервере.ХранитьНаДиске (тип: Булево) — признак того, что файл физически вынесен из базы данных.\\ServerName\1C_Files\) и предоставим к ней полный доступ учетной записи, под которой запущен сервер приложений «1С:Предприятие» (обычно это USR1CV8).ПередЗаписью в модуле объекта справочника ХранилищеДополнительнойИнформации.Рассмотрим пример кода для сохранения файла на диск при записи элемента справочника:
Процедура ПередЗаписью(Отказ)
// Исключаем работу механизма при обмене данными
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Проверяем, заполнено ли хранилище и установлен ли признак сохранения на диск
Если ХранитьНаДиске И ЗначениеЗаполнено(Хранилище) Тогда
ДвоичныеДанныеФайла = Хранилище.Получить();
Если ТипЗнч(ДвоичныеДанныеФайла) = Тип("ДвоичныеДанные") Тогда
// Задаем базовый каталог хранения файлов
КаталогХранения = "\\ServerName\1C_Files";
// Генерируем уникальное имя файла на основе GUID ссылки
УникальноеИмя = Строка(Ссылка.УникальныйИдентификатор());
Расширение = РасширениеФайла; // Предполагаем, что расширение хранится в реквизите РасширениеФайла
ИмяФайлаНаДиске = УникальноеИмя + "." + Расширение;
ПолныйПуть = КаталогХранения + "\" + ИмяФайлаНаДиске;
Попытка
// Записываем двоичные данные физически на диск
ДвоичныеДанныеФайла.Записать(ПолныйПуть);
// Записываем путь в реквизит и очищаем хранилище СУБД для экономии места
ПутьКФайлу = ПолныйПуть;
Хранилище = Новый ХранилищеЗначения(Неопределено);
Исключение
ВызватьИсключение "Не удалось сохранить файл на диск: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Теперь проанализируем, как нам прочитать файл с диска, когда пользователь захочет его открыть. Для этого в модуле объекта справочника создадим экспортную функцию получения пути к файлу для просмотра:
Функция ПолучитьФайлДляПросмотра() Экспорт
Если ЗначениеЗаполнено(ПутьКФайлу) Тогда
ФайлНаДиске = Новый Файл(ПутьКФайлу);
Если ФайлНаДиске.Существует() Тогда
// Копируем файл во временный каталог пользователя для открытия
ИмяВременногоФайла = КаталогВременныхФайлов() + ИмяФайла + "." + РасширениеФайла;
Попытка
КопироватьФайл(ПутьКФайлу, ИмяВременногоФайла);
Возврат ИмяВременногоФайла;
Исключение
ВызватьИсключение "Ошибка при подготовке файла: " + ОписаниеОшибки();
КонецПопытки;
Иначе
ВызватьИсключение "Файл не найден на сервере хранения файлов!";
EndIf;
ИначеЕсли ЗначениеЗаполнено(Хранилище) Тогда
// Если файл старый и еще хранится в базе данных, читаем стандартно
ДвоичныеДанныеФайла = Хранилище.Получить();
Если ДвоичныеДанныеФайла <> Неопределено Тогда
ИмяВременногоФайла = КаталогВременныхФайлов() + ИмяФайла + "." + РасширениеФайла;
ДвоичныеДанныеФайла.Записать(ИмяВременногоФайла);
Возврат ИмяВременногоФайла;
КонецЕсли;
КонецЕсли;
Возврат "";
КонецФункции
Для завершения доработки потребуется слегка изменить код в формах, где открываются файлы, перенаправив вызов на нашу новую функцию ПолучитьФайлДляПросмотра().
Если вы не хотите вносить изменения в конфигурацию вручную, оптимальным решением будет использование готовых программных модулей, доступных на профильных сообществах (например, Инфостарт). Такие модули предлагают гибкие возможности:
\\Server\Files\ДоговорыКонтрагентов\2023\).Если на вашем предприятии развернута система «1С:Документооборот» (любой версии), вы можете использовать стандартный механизм бесшовной интеграции. В этом случае:
Прежде чем внедрять решение по хранению файлов на диске, обязательно проанализируйте и подготовьте инфраструктуру к следующим особенностям:
\\ServerName\1C_Files\ должны быть предоставлены именно той учетной записи ОС Windows, от имени которой запущена служба сервера 1C:Enterprise Server (обычно это локальный пользователь USR1CV8 или доменная техническая запись). Права текущего пользователя, работающего за компьютером, здесь роли не играют.
.dt больше не будут содержать прикрепленные сканы и документы. Администраторам необходимо перенастроить расписание резервного копирования:
Подводя итог, можно сказать: несмотря на то, что УПП 1.3 — это устаревающая legacy-система, её архитектура позволяет сравнительно легко решить проблему хранения файлов вне базы данных. Наиболее надежным и прозрачным для пользователей решением остается небольшая доработка справочника ХранилищеДополнительнойИнформации с переносом бинарных данных на защищенный сетевой ресурс.