Как настроить хранение присоединенных файлов на диске в 1С:УПП 1.3 и почему не работает стандартная галка?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

В процессе эксплуатации конфигурации «1С:Управление производственным предприятием» редакции 1.3 (или аналогичной ей «1С:Комплексная автоматизация» редакции 1.1) многие компании сталкиваются с лавинообразным ростом размера информационной базы. Основным источником этого роста зачастую становятся прикрепленные файлы: сканы договоров, спецификаций, сертификатов номенклатуры и другие документы. База данных СУБД начинает весить сотни гигабайт, что существенно замедляет создание резервных копий и снижает общее быстродействие системы.

При этом в настройках программы администраторы видят заманчивую галочку «Хранить файлы в томах на диске», включают её, настраивают тома, но файлы все равно продолжают сохраняться непосредственно в базу данных SQL. Разберем по шагам, почему так происходит, как устроен этот механизм в УПП 1.3 и какие существуют способы решения этой проблемы.


Выясняем причину: почему стандартный механизм не работает для обычных файлов

Проанализируем архитектуру конфигурации 1С:УПП 1.3. В настройках программы (меню Сервис -> Настройка программы -> Электронные документы) действительно присутствует опция переноса файлов на диск. Однако, как справедливо отмечают специалисты, эта настройка предназначена исключительно для подсистемы электронного документооборота (ЭДО).

Когда пользователи прикрепляют обычные файлы к документам или элементам справочников через стандартную кнопку «Файлы» (которая присутствует во многих формах документов), система задействует совершенно другой механизм:

  1. Файлы загружаются в справочник ХранилищеДополнительнойИнформации.
  2. Внутри этого справочника бинарные данные упаковываются в реквизит Хранилище с типом данных ХранилищеЗначения.
  3. Физически эти данные записываются в СУБД (например, в формате BLOB в Microsoft SQL Server или в файл 1Cv8.1CD для файловых баз).

Таким образом, стандартная кнопка «Файлы» никак не связана с константой хранения файлов в томах. Чтобы вынести сканы на диск, нам придется доработать этот механизм самостоятельно или использовать альтернативные решения.


Почему интеграция БСП (Библиотеки стандартных подсистем) — это не лучший выбор для УПП 1.3

В современных конфигурациях 1С (таких как ERP 2, КА 2, УТ 11) подсистема работы с файлами из состава БСП решает эту задачу «из коробки». Возникает логичный вопрос: можно ли интегрировать эту часть БСП в УПП 1.3?

Рассмотрим сложности, с которыми мы неизбежно столкнемся при попытке такой интеграции:

Поэтому интеграция БСП в УПП 1.3 признана разработчиками неэффективным и трудоемким путем. Рассмотрим более простые и изящные варианты решения.


Вариант решения А. Кастомизация справочника «ХранилищеДополнительнойИнформации»

Это самый популярный и органичный способ. Его преимущество заключается в том, что интерфейс для конечных пользователей остается прежним. Они точно так же нажимают привычную кнопку «Файлы», прикрепляют сканы, но физически файлы улетают на сетевой диск, а в базе данных сохраняется лишь ссылка.

Разберем по шагам, как реализовать эту доработку:

  1. Добавим в справочник ХранилищеДополнительнойИнформации новые реквизиты:
    • ПутьКФайлу (тип: Строка, длина 250) — для хранения UNC-пути к файлу на сервере.
    • ХранитьНаДиске (тип: Булево) — признак того, что файл физически вынесен из базы данных.
  2. Создадим на сервере общую сетевую папку (например, \\ServerName\1C_Files\) и предоставим к ней полный доступ учетной записи, под которой запущен сервер приложений «1С:Предприятие» (обычно это USR1CV8).
  3. Переопределим обработчик события ПередЗаписью в модуле объекта справочника ХранилищеДополнительнойИнформации.

Рассмотрим пример кода для сохранения файла на диск при записи элемента справочника:


Процедура ПередЗаписью(Отказ)
    
    // Исключаем работу механизма при обмене данными
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    // Проверяем, заполнено ли хранилище и установлен ли признак сохранения на диск
    Если ХранитьНаДиске И ЗначениеЗаполнено(Хранилище) Тогда
        
        ДвоичныеДанныеФайла = Хранилище.Получить();
        Если ТипЗнч(ДвоичныеДанныеФайла) = Тип("ДвоичныеДанные") Тогда
            
            // Задаем базовый каталог хранения файлов
            КаталогХранения = "\\ServerName\1C_Files";
            
            // Генерируем уникальное имя файла на основе GUID ссылки
            УникальноеИмя = Строка(Ссылка.УникальныйИдентификатор());
            Расширение = РасширениеФайла; // Предполагаем, что расширение хранится в реквизите РасширениеФайла
            ИмяФайлаНаДиске = УникальноеИмя + "." + Расширение;
            ПолныйПуть = КаталогХранения + "\" + ИмяФайлаНаДиске;
            
            Попытка
                // Записываем двоичные данные физически на диск
                ДвоичныеДанныеФайла.Записать(ПолныйПуть);
                
                // Записываем путь в реквизит и очищаем хранилище СУБД для экономии места
                ПутьКФайлу = ПолныйПуть;
                Хранилище = Новый ХранилищеЗначения(Неопределено);
            Исключение
                ВызватьИсключение "Не удалось сохранить файл на диск: " + ОписаниеОшибки();
            КонецПопытки;
            
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

Теперь проанализируем, как нам прочитать файл с диска, когда пользователь захочет его открыть. Для этого в модуле объекта справочника создадим экспортную функцию получения пути к файлу для просмотра:


Функция ПолучитьФайлДляПросмотра() Экспорт

    Если ЗначениеЗаполнено(ПутьКФайлу) Тогда
        
        ФайлНаДиске = Новый Файл(ПутьКФайлу);
        Если ФайлНаДиске.Существует() Тогда
            // Копируем файл во временный каталог пользователя для открытия
            ИмяВременногоФайла = КаталогВременныхФайлов() + ИмяФайла + "." + РасширениеФайла;
            Попытка
                КопироватьФайл(ПутьКФайлу, ИмяВременногоФайла);
                Возврат ИмяВременногоФайла;
            Исключение
                ВызватьИсключение "Ошибка при подготовке файла: " + ОписаниеОшибки();
            КонецПопытки;
        Иначе
            ВызватьИсключение "Файл не найден на сервере хранения файлов!";
        EndIf;
        
    ИначеЕсли ЗначениеЗаполнено(Хранилище) Тогда
        // Если файл старый и еще хранится в базе данных, читаем стандартно
        ДвоичныеДанныеФайла = Хранилище.Получить();
        Если ДвоичныеДанныеФайла <> Неопределено Тогда
            ИмяВременногоФайла = КаталогВременныхФайлов() + ИмяФайла + "." + РасширениеФайла;
            ДвоичныеДанныеФайла.Записать(ИмяВременногоФайла);
            Возврат ИмяВременногоФайла;
        КонецЕсли;
    КонецЕсли;
    
    Возврат "";

КонецФункции

Для завершения доработки потребуется слегка изменить код в формах, где открываются файлы, перенаправив вызов на нашу новую функцию ПолучитьФайлДляПросмотра().


Вариант решения Б. Использование готовых расширений и модулей

Если вы не хотите вносить изменения в конфигурацию вручную, оптимальным решением будет использование готовых программных модулей, доступных на профильных сообществах (например, Инфостарт). Такие модули предлагают гибкие возможности:


Вариант решения В. Бесшовная интеграция с «1С:Документооборот»

Если на вашем предприятии развернута система «1С:Документооборот» (любой версии), вы можете использовать стандартный механизм бесшовной интеграции. В этом случае:

  1. Связь между УПП 1.3 и 1С:ДО настраивается с помощью веб-сервисов.
  2. Пользователь нажимает кнопку прикрепления файла в УПП, но физически файл передается в базу данных или тома хранения «1С:Документооборота».
  3. В самой УПП сохраняется лишь навигационная ссылка на объект Документооборота. Таким образом, база УПП не увеличивается в размерах, а файлы хранятся в специализированном и защищенном архиве СЭД.

Критически важные технические нюансы при переносе файлов на диск

Прежде чем внедрять решение по хранению файлов на диске, обязательно проанализируйте и подготовьте инфраструктуру к следующим особенностям:

  1. Права доступа службы сервера 1С: При клиент-серверном варианте работы базы данных код записи файлов на диск выполняется на стороне сервера приложений. Это значит, что права на запись в сетевую папку \\ServerName\1C_Files\ должны быть предоставлены именно той учетной записи ОС Windows, от имени которой запущена служба сервера 1C:Enterprise Server (обычно это локальный пользователь USR1CV8 или доменная техническая запись). Права текущего пользователя, работающего за компьютером, здесь роли не играют.
  2. Ограничения файлового режима работы: Если ваша база данных УПП 1.3 работает в файловом режиме, то код записи выполняется непосредственно на компьютере пользователя. В этом случае права на запись в сетевую папку должны быть предоставлены абсолютно всем пользователям вашей корпоративной сети, которые работают в программе.
  3. Резервное копирование (бэкапы): Это самый критичный момент. После переноса файлов на диск стандартное создание бэкапа базы данных средствами SQL или выгрузка в файл .dt больше не будут содержать прикрепленные сканы и документы. Администраторам необходимо перенастроить расписание резервного копирования:
    • Бэкап базы данных SQL и бэкап сетевой папки с томами должны запускаться синхронно (или максимально близко по времени).
    • Несоответствие времени бэкапов может привести к ситуации, когда база данных «откатилась» на вчерашний день, а на диске уже лежат файлы, прикрепленные сегодня, или наоборот — ссылки в базе ведут на несуществующие файлы на диске.

Подводя итог, можно сказать: несмотря на то, что УПП 1.3 — это устаревающая legacy-система, её архитектура позволяет сравнительно легко решить проблему хранения файлов вне базы данных. Наиболее надежным и прозрачным для пользователей решением остается небольшая доработка справочника ХранилищеДополнительнойИнформации с переносом бинарных данных на защищенный сетевой ресурс.

← На главную