Как обеспечить доступ к произвольному файлу в HTML-документе внутри веб-клиента 1С

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

При переходе с тонкого или толстого клиента на работу через браузер (веб-клиент), разработчики часто сталкиваются с проблемой: HTML-документы, которые раньше исправно отображали картинки или вставки, перестают работать. Это происходит потому, что браузер не имеет прямого доступа к файловой системе сервера или клиентского компьютера по путям вида C:\Temp\.... Рассмотрим подробнее, как решить эту задачу и сделать ваши файлы доступными внутри веб-интерфейса.

Причина возникновения проблемы: ограничения веб-клиента

Проанализируем ситуацию, описанную в сообщениях форума. В толстом клиенте метод ПолучитьИмяВременногоФайла() возвращает путь к локальному диску, который легко подставляется в тег <img src="...">. В веб-клиенте этот механизм ломается по двум причинам:

  1. Безопасность (Sandbox): Браузер из соображений безопасности блокирует доступ к локальным файлам пользователя.
  2. Контекст выполнения: Веб-сервер (Apache или IIS) не знает о существовании файлов в папке временных файлов пользователя 1С, если они не опубликованы специальным образом.

Способ 1. Использование Data URI (кодирование в Base64)

Разберем самый надежный способ, который не требует настройки дополнительных прав на веб-сервере или поднятия FTP. Суть метода заключается в том, чтобы передать содержимое картинки непосредственно внутри текста HTML-документа.

Для реализации этого метода мы преобразуем файл в строку. Посмотрим на пример кода:


// Получаем двоичные данные файла (например, из картинки в справочнике или с диска)
ДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);

// Преобразуем в строку Base64
СтрокаBase64 = Base64Строка(ДанныеФайла);

// Удаляем лишние переносы строк, которые может добавить платформа
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ВК, "");
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ПС, "");

// Формируем тег для HTML
ТекстДляHTML = "<img src=""data:image/png;base64," + СтрокаBase64 + """ />";

Преимущества: файл «вшит» в документ, не нужно заботиться о его удалении с диска или правах доступа. Недостаток: при очень большом количестве тяжелых изображений объем HTML-документа значительно вырастет, что может замедлить работу веб-клиента.

Способ 2. Работа с временными файлами в веб-клиенте

Как справедливо отмечено в сообщении №4, при выполнении кода на стороне веб-клиента метод ПолучитьИмяВременногоФайла() может вести себя непредсказуемо или быть недоступным. Проанализируем правильный подход к генерации имен временных файлов для веб-инфраструктуры.

Вместо стандартного метода рекомендуется использовать комбинацию функции КаталогВременныхФайлов() и объекта УникальныйИдентификатор. Это гарантирует отсутствие конфликтов между сессиями разных пользователей.


Каталог = КаталогВременныхФайлов();
ИмяФайла = Строка(Новый УникальныйИдентификатор) + ".png";
ПутьКФайлу = Каталог + ИмяФайла;

// После записи файла его необходимо передать во временное хранилище, 
// чтобы получить навигационную ссылку
АдресХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ПутьКФайлу));

Способ 3. Создание HTTP-сервиса для отдачи файлов

Если вам нужно отображать много файлов или они имеют большой объем, рассмотрим профессиональный метод — создание внутреннего HTTP-сервиса в вашей конфигурации 1С. Это позволит браузеру запрашивать файлы по «настоящему» URL, который понимает веб-сервер.

Разберем шаги реализации:

  1. Создаем в метаданных новый HTTP-сервис с шаблоном /get_file/{FileID}.
  2. В методе GET пишем код, который извлекает файл из базы данных или временного хранилища по переданному FileID.
  3. Возвращаем объект HTTPСервисОтвет, где в теле ответа лежат двоичные данные файла, а в заголовках указан правильный Content-Type (например, image/jpeg).

В этом случае ваш HTML-код будет выглядеть очень лаконично:


<img src="http://адрес_сервера/имя_базы/hs/my_service/get_file/уникальный_код_картинки" />

Способ 4. Публикация в каталог веб-сервера (Apache/IIS)

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

Чтобы реализовать этот подход, необходимо:

Важный момент: убедитесь, что пользователь ОС, от имени которого запущен веб-сервер (www-data, usr1cv8 или IUSR), имеет права на запись и чтение в этой папке.

Очистка временных данных

Проанализируем вопрос из первого сообщения: нужно ли удалять файлы? Это критически важно для стабильности сервера.

  1. Временное хранилище 1С: данные удаляются автоматически при завершении сеанса пользователя. Это самый безопасный вариант.
  2. Физические файлы на диске: если вы используете способ с папкой веб-сервера или КаталогВременныхФайлов(), файлы необходимо удалять принудительно.

Рекомендуем создать РегламентноеЗадание, которое раз в сутки будет проверять дату создания файлов в целевой папке и удалять те, что старше 24 часов. Это предотвратит переполнение дискового пространства сервера.

Подводя итог, можно сказать, что для веб-клиента 1С наиболее универсальным и простым в реализации является метод Base64 (для небольших вставок) или HTTP-сервисы (для полноценных веб-решений). Прямая работа с файловыми путями в браузере невозможна, и понимание этого — первый шаг к созданию стабильного приложения.

← На главную