При активном использовании систем электронного документооборота в 1С (например, в 1С:УПП 1.3 или 1С:Документооборот) разработчики часто сталкиваются с техническим ограничением почтовых серверов на максимальный размер вложения (обычно это 10–25 МБ). Когда объем прикрепляемых файлов превышает этот лимит, письмо просто не доходит до адресата. Самым эффективным решением является отказ от прямой пересылки файлов в пользу отправки уникальных ссылок. В этой статье мы подробно разберем, как автоматизировать процесс генерации ссылок, где лучше хранить файлы и как обеспечить безопасность корпоративных данных.
Разберем ситуацию, когда файлы хранятся на жестком диске сервера. Чтобы пользователь извне мог получить к ним доступ, проще всего развернуть FTP-сервер (например, FileZilla Server или стандартную роль IIS). Рассмотрим механику процесса: программа 1С при формировании события отправки письма должна скопировать файл из локальной папки на FTP-ресурс и сформировать текстовую ссылку для вставки в тело письма.
Для реализации этого в коде 1С мы можем использовать объект ФайловоеХранилище или напрямую работать с FTPСоединение. Проанализируем пример кода для выгрузки файла:
// Создаем соединение с сервером
ТекСоединение = Новый FTPСоединение("ftp.company.ru", 21, "user", "password");
// Определяем пути
ЛокальныйПуть = "C:\Docs\Contract_123.pdf";
ИмяФайлаНаСервере = "public/links/" + СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "") + ".pdf";
// Отправляем файл
ТекСоединение.Записать(ЛокальныйПуть, ИмяФайлаНаСервере);
// Формируем ссылку для письма
СсылкаДляПисьма = "ftp://ftp.company.ru/" + ИмяФайлаНаСервере;
Важный нюанс: использование FTP в чистом виде (без SSL/TLS) считается небезопасным. Кроме того, современные браузеры постепенно отказываются от поддержки протокола ftp://. Поэтому данный метод лучше использовать только внутри защищенного периметра сети или через специализированные FTP-клиенты.
Если ваша база 1С уже опубликована на веб-сервере (Apache или IIS), вы можете создать собственный HTTP-сервис для раздачи файлов. Это самый гибкий и безопасный метод. Выясним причину, почему это лучше: вы не открываете прямой доступ к файловой системе сервера. Запрос на скачивание обрабатывает сама 1С, проверяя права доступа или срок действия ссылки.
Разберем по шагам, как это реализовать:
GetFile)./download/{ID}.GET пишем код, который находит файл по идентификатору в базе (или в томе хранения) и возвращает его в теле ответа.Рассмотрим пример реализации метода GET в HTTP-сервисе:
Функция downloadGET(Запрос)
ИдентификаторФайла = Запрос.ПараметрыURL.Получить("ID");
// Ищем путь к файлу в регистре сведений или справочнике
ПутьКФайлу = ПолучитьПутьКФайлуПоID(ИдентификаторФайла);
ФайлНаДиске = Новый Файл(ПутьКФайлу);
Если ФайлНаДиске.Существует() Тогда
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанные);
Ответ.Заголовки.Вставить("Content-Type", "application/octet-stream");
Ответ.Заголовки.Вставить("Content-Disposition", "attachment; filename=" + ФайлНаДиске.Имя);
Возврат Ответ;
Иначе
Возврат Новый HTTPСервисОтвет(404);
КонецЕсли;
КонецФункции
В письме ссылка будет выглядеть так: https://1c.company.ru/base/hs/GetFile/download/5e3b12.... Это решение позволяет полностью контролировать безопасность данных.
Как упоминалось в обсуждении (сообщение 7 и 15), 1С поддерживает хранение файлов во внешних томах на диске. Это стандартная функциональность БСП (Библиотеки стандартных подсистем), которая доступна и для интеграции в старые конфигурации типа УПП 1.3.
Проанализируем ситуацию: сами по себе тома не делают файлы доступными по ссылке. Однако, если папка с томами находится внутри каталога, который обслуживается веб-сервером (например, /var/www/files/ для Apache), вы можете генерировать прямые HTTP-ссылки. Разберем алгоритм действий:
Внимание: при таком подходе любой, кто знает ссылку, сможет скачать файл. Чтобы защититься от перебора имен, используйте в качестве имен файлов сложные GUID, а не порядковые номера.
Для крупных систем и высоких нагрузок рекомендуется использовать S3-совместимые хранилища (MinIO, Yandex Object Storage). Это решает проблему нагрузки на основной сервер 1С. Рассмотрим подробнее преимущества подписанных ссылок (Presigned URLs):
Вы загружаете файл в облако, которое недоступно из интернета. В момент отправки письма 1С генерирует специальную ссылку, в которую зашит токен доступа с ограниченным сроком жизни (например, 2 часа). После этого ссылка становится невалидной.
Это идеальное решение для обеспечения безопасности, так как админу не нужно открывать «дыры» в корпоративной сети, а файлы автоматически удаляются или архивируются средствами самого хранилища.
Независимо от выбранного способа (FTP или HTTP), необходимо продумать механизм «уборки». Если вы будете вечно хранить файлы, на которые отправили ссылки, дисковое пространство быстро закончится. Посмотрим на пример регламентного задания:
Процедура ОчиститьСтарыеФайлыСсылок()
ПорогДаты = ТекущаяДата() - (30 * 24 * 3600); // Удаляем файлы старше 30 дней
МассивФайловДляУдаления = НайтиФайлыНаСервереПоДате(ПорогДаты);
Для Каждого Файл Из МассивФайловДляУдаления Цикл
Попытка
УдалитьФайлы(Файл.ПолноеИмя);
Исключение
ЗаписьЖурналаРегистрации("ОчисткаФайлов", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Резюмируем рекомендации по безопасности:
Таким образом, переход от вложений к ссылкам не только решает проблему размера писем, но и позволяет отслеживать факт скачивания документа пользователем, что добавляет прозрачности в документооборот компании.