Часто в корпоративной разработке возникает задача — автоматически получить визуальную копию веб-страницы (сохранить ее в PDF или в виде изображения) напрямую из 1С. Разберем ситуацию, когда нам необходимо сделать это «в фоновом режиме», не открывая само окно браузера перед пользователем, чтобы не прерывать его работу.
Казалось бы, почему просто не выполнить HTTP-запрос по нужному адресу и не сохранить полученный HTML? Проанализируем этот подход. Если мы воспользуемся объектом HTTPСоединение и выполним GET-запрос, сервер отдаст нам лишь исходный HTML-код. Однако большинство современных веб-сайтов представляют собой SPA-приложения (Single Page Application), построенные на фреймворках (например, Vue, React, Quasar). В исходном коде такой страницы мы увидим лишь пустой блок div и вызов скриптов.
Чтобы получить реальную картину, скрипты должны быть выполнены. Поэтому нам необходим полноценный браузерный движок, который отрисует страницу так, как ее видит живой пользователь. Рассмотрим несколько проверенных способов решения этой задачи.
Современные браузеры поддерживают специальный режим работы из командной строки — Headless (без графического интерфейса). Разберем по шагам, как использовать этот функционал. Chrome может принять URL, отрендерить его скрыто от пользователя и выгрузить результат в файл.
Базовые ключи запуска, которые нам понадобятся:
Для создания PDF-копии команда выглядит так:
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --headless --disable-gpu --print-to-pdf="C:\temp\fileName.pdf" https://example.com/
Для создания картинки обязательно нужно указать путь к файлу после знака равенства, иначе файл не будет создан:
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --headless --disable-gpu --screenshot="C:\temp\fileName.png" --window-size=1920,3000 https://example.com/
Если мы воспользуемся стандартной функцией КомандаСистемы, на экране на долю секунды мелькнет черное окно командной строки. Чтобы запуск произошел абсолютно незаметно, воспользуемся COM-объектом WScript.Shell. Посмотрим на пример кода:
Процедура ПолучитьСкриншотЧерезChrome(URL, ПутьКФайлу)
Шелл = Новый COMОбъект("WScript.Shell");
ПутьКХрому = """C:\Program Files\Google\Chrome\Application\chrome.exe""";
// Указываем таймаут для ожидания загрузки скриптов сайта
Параметры = " --headless --disable-gpu --virtual-time-budget=5000 --window-size=1920,1080 --screenshot=""" + ПутьКФайлу + """ ";
Команда = ПутьКХрому + Параметры + URL;
// Параметр 0 скрывает окно, Истина - заставляет 1С дождаться завершения команды
Шелл.Run(Команда, 0, Истина);
КонецПроцедуры
Важный нюанс: Обратите внимание на параметр --virtual-time-budget=5000. Он заставляет браузер подождать 5 секунд (5000 мс) после базовой загрузки. Это необходимо для того, чтобы все асинхронные скрипты и анимации успели отработать.
Если вы не хотите устанавливать полноценный браузер на сервер 1С, рассмотрим классические легковесные утилиты командной строки, работающие на движке WebKit. Они созданы специально для консольной конвертации HTML в файлы.
Алгоритм работы из 1С аналогичен: мы формируем строку команды и вызываем её скрыто.
Процедура СоздатьPDFЧерезУтилиту(URL, ПутьКФайлу)
Шелл = Новый COMОбъект("WScript.Shell");
ПутьКУтилите = """C:\wkhtmltopdf\bin\wkhtmltopdf.exe""";
// Вызов утилиты с передачей источника и файла назначения
Команда = ПутьКУтилите + " " + URL + " """ + ПутьКФайлу + """";
Шелл.Run(Команда, 0, Истина);
КонецПроцедуры
Этот способ отлично работает для классических сайтов, но иногда может хуже справляться со сложными SPA-приложениями, использующими самые свежие стандарты JavaScript, по сравнению с Chrome.
В случае, когда сервер 1С находится в облаке или у вас нет прав на запуск исполняемых файлов (ограничения безопасности), проанализируем использование сторонних REST API. Существуют сервисы, которым вы отправляете URL, а в ответ получаете готовый бинарный файл.
Посмотрим на пример реализации с помощью штатных объектов 1С:
Процедура ПолучитьКопиюЧерезAPI(URLЦели, ПутьСохраненияНаДиске)
// Подключаемся к сервису генерации скриншотов по HTTPS
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
HTTP = Новый HTTPСоединение("api.screenshot-service.com", 443,,,,, ЗащищенноеСоединение);
// Формируем GET запрос, передавая URL сайта параметром
ПараметрыЗапроса = "/capture?url=" + СтрЗаменить(URLЦели, ":", "%3A") + "&format=pdf";
Запрос = Новый HTTPЗапрос(ПараметрыЗапроса);
// Выполняем запрос и сразу сохраняем ответ в файл
Ответ = HTTP.Получить(Запрос, ПутьСохраненияНаДиске);
Если Ответ.КодСостояния <> 200 Тогда
Сообщить("Ошибка получения файла. Код: " + Ответ.КодСостояния);
КонецЕсли;
КонецПроцедуры
Этот метод не требует никакого дополнительного ПО на сервере 1С. Вы просто отправляете данные через HTTPСоединение и получаете результат.
Выясним причину, по которой иногда недостаточно простых параметров командной строки. Если целевая страница требует предварительной авторизации (ввод логина и пароля), либо нужный контент подгружается только при прокрутке страницы вниз (lazy-loading), ни один из вышеописанных способов напрямую не сработает.
В таких случаях мы пишем промежуточный скрипт на Node.js или Python. Используя библиотеки управления браузером (Puppeteer или Playwright), скрипт выполняет нужные действия: нажимает кнопки, вводит текст, скроллит страницу, ждет появления определенных элементов, и только потом сохраняет копию. А из 1С мы просто вызываем этот скрипт, передавая ему необходимые аргументы (учетные данные или ID документа) через тот же WScript.Shell.
Применяя описанные подходы, вы сможете надежно и скрыто получать копии любых веб-ресурсов для их прикрепления к карточкам контрагентов, документам или для отправки по электронной почте прямо из интерфейса 1С.