При интеграции систем 1С с интернет-магазинами разработчики часто сталкиваются с проблемой форматирования текстовых данных. В карточке номенклатуры 1С менеджеры заполняют описание товара, используя привычные переносы строк (клавиша Enter). Однако при выгрузке этого текста на сайт все переносы пропадают, и описание сливается в одну трудночитаемую строку. Это происходит потому, что веб-браузеры игнорируют стандартные символы перевода строки и требуют использования специальных HTML-тегов, таких как <p> или <br>.
В этой статье мы подробно разберем, как решить эту задачу в среде «1С:Предприятие». Мы изучим несколько практических подходов: от простого текстового парсинга (подходящего для устаревших конфигураций на обычных формах, таких как УПП) до современных профессиональных инструментов платформы.
Рассмотрим классический сценарий, когда в конфигурации (например, в УПП или УТ 10.3) описание хранится в виде обычного многострочного текста, и нам нужно по нажатию кнопки преобразовать его в простейший HTML. Для этого мы напишем функцию, которая обходит каждую строку текста, оборачивает её в теги абзаца <p>...</p> и собирает итоговую HTML-строку.
Проанализируем пошагово программный код, реализующий эту логику:
Функция СформироватьОписаниеHTML(Знач ИсходныйТекст) Экспорт
// Если текст пустой, возвращаем пустую строку HTML
Если ПустаяСтрока(ИсходныйТекст) Тогда
Возврат "";
КонецЕсли;
РезультатHTML = "";
ТегОткрывающий = "<p>";
ТегЗакрывающий = "</p>";
// Определяем количество строк в исходном тексте
ВсегоСтрок = СтрЧислоСтрок(ИсходныйТекст);
Для Индекс = 1 По ВсегоСтрок Цикл
ТекущаяСтрока = СтрПолучитьСтроку(ИсходныйТекст, Индекс);
// Пропускаем абсолютно пустые строки, чтобы не плодить пустые абзацы
Если ПустаяСтрока(СокрЛП(ТекущаяСтрока)) Тогда
Продолжить;
КонецЕсли;
// Оборачиваем текущую строку в HTML-теги абзаца
ФорматированнаяСтрока = ТегОткрывающий + ТекущаяСтрока + ТегЗакрывающий;
// Добавляем строку к общему результату с переносом строки для читаемости кода
РезультатHTML = РезультатHTML + ФорматированнаяСтрока + Символы.ПС;
КонецЦикла;
// Оборачиваем весь полученный блок в базовый контейнер div или body
РезультатHTML = "<div class=""product-description"">" + Символы.ПС + РезультатHTML + "</div>";
Возврат РезультатHTML;
КонецФункции
Разберем, как подключить этот алгоритм к экранной форме карточки номенклатуры в обычных формах. Добавим на форму кнопку «Сформировать HTML» и свяжем её с обработчиком события:
Процедура КнопкаСформироватьHTMLНажатие(Элемент)
// Предположим, что исходный текст хранится в реквизите "Описание"
// А результат мы будем записывать в реквизит "ОписаниеДляСайта"
Если ПустаяСтрока(ЭтотОбъект.Описание) Тогда
Предупреждение("Исходное описание номенклатуры не заполнено!");
Возврат;
КонецЕсли;
ЭтотОбъект.ОписаниеДляСайта = СформироватьОписаниеHTML(ЭтотОбъект.Описание);
// Информируем пользователя об успешном преобразовании
ПоказатьПредупреждение(, "HTML-описание успешно сформировано и подготовлено к выгрузке!");
КонецПроцедуры
Важный нюанс: Данный метод отлично работает, если исходный текст представляет собой «чистый» текст без ранее внесенных HTML-тегов. Если менеджеры могут случайно скопировать текст с тегами, перед обработкой его необходимо очистить от спецсимволов во избежание нарушения верстки на сайте.
Если вы работаете на современных управляемых формах (платформа 1С 8.3), лучшим решением будет использование штатного объекта платформы ФорматированныйДокумент. Он позволяет пользователю редактировать описание в визуальном WYSIWYG-режиме (выделять текст жирным, курсивом, создавать списки, менять цвета), а платформа сама генерирует валидный HTML-код.
Выясним, как реализовать этот подход на практике:
ФорматированныйДокумент (например, с именем ОписаниеДокумент).ХранилищеЗначения (для сохранения самого форматированного документа в бинарном виде) и текстовый реквизит неограниченной длины для хранения готового HTML-кода.Проанализируем процедуру сохранения данных формы в объект базы данных:
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// 1. Сохраняем структуру форматированного документа в ХранилищеЗначения для последующего редактирования
ТекущийОбъект.ДополнительноеОписаниеХранилище = Новый ХранилищеЗначения(ОписаниеДокумент);
// 2. Генерируем HTML-код для выгрузки на сайт
ТекстHTML = "";
СтруктураКартинок = Новый Структура;
// Метод ПолучитьHTML преобразует форматированный документ в код HTML5
ОписаниеДокумент.ПолучитьHTML(ТекстHTML, СтруктураКартинок);
// Очищаем полученный HTML-код от системных заголовков 1С (подробнее в Методе 3)
ТекущийОбъект.ОписаниеДляСайта = ОчиститьСистемныйHTML(ТекстHTML);
КонецПроцедуры
Для того чтобы при открытии карточки товара форматированный документ корректно отображался, добавим следующий код в обработчик чтения данных:
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
// Извлекаем форматированный документ из хранилища значений
ДвоичныеДанныеОписания = ТекущийОбъект.ДополнительноеОписаниеХранилище.Получить();
Если ТипЗнч(ДвоичныеДанныеОписания) = Тип("ФорматированныйДокумент") Тогда
ОписаниеДокумент = ДвоичныеДанныеОписания;
Иначе
ОписаниеДокумент = Новый ФорматированныйДокумент;
КонецЕсли;
КонецПроцедуры
При использовании метода ПолучитьHTML() платформа 1С генерирует избыточную разметку, включающую служебные теги <html>, <head>, <style> и <body>. Если отправить такой код на сайт напрямую, он внедрится в карточку товара и может «сломать» дизайн страницы интернет-магазина из-за конфликта стилей CSS.
Разберем по шагам функцию очистки, которая извлекает только полезное содержимое, находящееся внутри тегов <body>:
Функция ОчиститьСистемныйHTML(Знач ИсходныйHTML) Экспорт
// Ищем границы тега body
ПозицияНачала = Найти(ИсходныйHTML, "<body>");
ПозицияКонца = Найти(ИсходныйHTML, "</body>");
Если ПозицияНачала = 0 Или ПозицияКонца = 0 Тогда
// Если тегов body нет, возвращаем текст как есть
Возврат ИсходныйHTML;
КонецЕсли;
// Вырезаем содержимое между <body> и </body>
// Длина тега <body> равна 6 символам
ЧистыйHTML = Сред(ИсходныйHTML, ПозицияНачала + 6, ПозицияКонца - (ПозицияНачала + 6));
// Дополнительно можно удалить системные inline-стили 1С, если они не нужны
ЧистыйHTML = СтрЗаменить(ЧистыйHTML, "style=""font-family: Arial; font-size: 10pt;""", "");
Возврат СокрЛП(ЧистыйHTML);
КонецФункции
Если менеджеры вставляют картинки непосредственно в поле форматированного документа в 1С, то при конвертации в HTML-код они преобразуются во временные локальные адреса (например, src="image001"). Сайт не сможет отобразить такие изображения, так как физически файлов картинок на веб-сервере нет.
Проанализируем схему решения этой проблемы:
ПолучитьHTML(ТекстHTML, СтруктураКартинок) платформа помещает все картинки в переданный вторым параметром объект Структура. Ключом структуры является локальное имя картинки (например, "image001"), а значением — объект Картинка.Посмотрим на пример реализации обработки картинок:
Процедура ОбработатьИЗагрузитьКартинки(ТекстHTML, СтруктураКартинок)
КаталогВременныхФайлов = КаталогВременныхФайлов();
Для Каждого ЭлементСтруктуры Из СтруктураКартинок Цикл
ИмяЛокальногоФайла = ЭлементСтруктуры.Ключ;
ОбъектКартинка = ЭлементСтруктуры.Значение;
// Формируем путь для сохранения на диске
ПутьКФайлу = КаталогВременныхФайлов + ИмяЛокальногоФайла + ".png";
ОбъектКартинка.Записать(ПутьКФайлу);
// Здесь должен быть ваш код загрузки файла на FTP/API сайта
// Например: URLНаСайте = ВыгрузитьНаВебСервер(ПутьКФайлу);
URLНаСайте = "https://mysite.com/uploads/" + ИмяЛокальногоФайла + ".png";
// Заменяем локальный адрес картинки в HTML на рабочий веб-адрес
ТекстHTML = СтрЗаменить(ТекстHTML, "src=""" + ИмяЛокальногоФайла + """", "src=""" + URLНаСайте + """");
// Удаляем временный файл с диска
Попытка
УдалитьФайлы(ПутьКФайлу);
Исключение
// Запись в журнал регистрации при ошибке удаления
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Подводя итоги, дадим несколько практических советов по организации работы с HTML-описаниями в 1С: