При переходе с тонкого или толстого клиента на работу через браузер (веб-клиент), разработчики часто сталкиваются с проблемой: HTML-документы, которые раньше исправно отображали картинки или вставки, перестают работать. Это происходит потому, что браузер не имеет прямого доступа к файловой системе сервера или клиентского компьютера по путям вида C:\Temp\.... Рассмотрим подробнее, как решить эту задачу и сделать ваши файлы доступными внутри веб-интерфейса.
Проанализируем ситуацию, описанную в сообщениях форума. В толстом клиенте метод ПолучитьИмяВременногоФайла() возвращает путь к локальному диску, который легко подставляется в тег <img src="...">. В веб-клиенте этот механизм ломается по двум причинам:
Разберем самый надежный способ, который не требует настройки дополнительных прав на веб-сервере или поднятия FTP. Суть метода заключается в том, чтобы передать содержимое картинки непосредственно внутри текста HTML-документа.
Для реализации этого метода мы преобразуем файл в строку. Посмотрим на пример кода:
// Получаем двоичные данные файла (например, из картинки в справочнике или с диска)
ДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
// Преобразуем в строку Base64
СтрокаBase64 = Base64Строка(ДанныеФайла);
// Удаляем лишние переносы строк, которые может добавить платформа
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ВК, "");
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ПС, "");
// Формируем тег для HTML
ТекстДляHTML = "<img src=""data:image/png;base64," + СтрокаBase64 + """ />";
Преимущества: файл «вшит» в документ, не нужно заботиться о его удалении с диска или правах доступа. Недостаток: при очень большом количестве тяжелых изображений объем HTML-документа значительно вырастет, что может замедлить работу веб-клиента.
Как справедливо отмечено в сообщении №4, при выполнении кода на стороне веб-клиента метод ПолучитьИмяВременногоФайла() может вести себя непредсказуемо или быть недоступным. Проанализируем правильный подход к генерации имен временных файлов для веб-инфраструктуры.
Вместо стандартного метода рекомендуется использовать комбинацию функции КаталогВременныхФайлов() и объекта УникальныйИдентификатор. Это гарантирует отсутствие конфликтов между сессиями разных пользователей.
Каталог = КаталогВременныхФайлов();
ИмяФайла = Строка(Новый УникальныйИдентификатор) + ".png";
ПутьКФайлу = Каталог + ИмяФайла;
// После записи файла его необходимо передать во временное хранилище,
// чтобы получить навигационную ссылку
АдресХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ПутьКФайлу));
Если вам нужно отображать много файлов или они имеют большой объем, рассмотрим профессиональный метод — создание внутреннего HTTP-сервиса в вашей конфигурации 1С. Это позволит браузеру запрашивать файлы по «настоящему» URL, который понимает веб-сервер.
Разберем шаги реализации:
HTTP-сервис с шаблоном /get_file/{FileID}.GET пишем код, который извлекает файл из базы данных или временного хранилища по переданному FileID.HTTPСервисОтвет, где в теле ответа лежат двоичные данные файла, а в заголовках указан правильный Content-Type (например, image/jpeg).В этом случае ваш HTML-код будет выглядеть очень лаконично:
<img src="http://адрес_сервера/имя_базы/hs/my_service/get_file/уникальный_код_картинки" />
Если в сообщении №10 автор спрашивал про «папку апача», то это вполне рабочий вариант для определенных задач. Выясним причину, почему это может быть удобно: веб-сервер уже настроен на отдачу статического контента (картинок, стилей).
Чтобы реализовать этот подход, необходимо:
/var/www/html/my_base/ или C:\inetpub\wwwroot\my_base\).img.Важный момент: убедитесь, что пользователь ОС, от имени которого запущен веб-сервер (www-data, usr1cv8 или IUSR), имеет права на запись и чтение в этой папке.
Проанализируем вопрос из первого сообщения: нужно ли удалять файлы? Это критически важно для стабильности сервера.
КаталогВременныхФайлов(), файлы необходимо удалять принудительно.Рекомендуем создать РегламентноеЗадание, которое раз в сутки будет проверять дату создания файлов в целевой папке и удалять те, что старше 24 часов. Это предотвратит переполнение дискового пространства сервера.
Подводя итог, можно сказать, что для веб-клиента 1С наиболее универсальным и простым в реализации является метод Base64 (для небольших вставок) или HTTP-сервисы (для полноценных веб-решений). Прямая работа с файловыми путями в браузере невозможна, и понимание этого — первый шаг к созданию стабильного приложения.