Формирование HTML-документа, содержащего ссылки на объекты базы данных - 1С-ИнтеГрация

Формирование HTML-документа, содержащего ссылки на объекты базы данных



 

В данной статье рассматривается способ программного формирования HTML документа, содержащего ссылки на объекты базы данных 1С, такие как справочники, документы и т.д. Показан пример построения обработчика события OnClick ПоляHTMLДокумента, для обработки клика на html-ссылке. 

Предисловие 
Однажды, дописывая обработку, создающую и модифицирующую, не суть важно какие документы, я подумал, что неплохо было бы вывести для пользователя некое резюме: 
“Создан документ такой-то” 
“Изменен документ такой-то” и т.д. 
От обычного, в таких случаях, вывода информации в окно сообщений я сразу отказался, так как не удобно это, сначала читать в окне сообщений “Создан документ … ” а потом запоминать его номер, открывать соответствующий журнал (или форму списка) и искать там этот документ. А если документов много и пользователь хочет посмотреть все документы?(или выборочно) Насколько это неудобно я убедился при отладке обработки … 
То, что в форме есть элемент управления именуемый ПолеHTMLДокумента я конечно знал, но вот представилась возможность познакомиться с ним поближе. Было решено реестр обработанных документов выводить в виде html документа содержащего ссылки на эти самые документы, а по клику на ссылке открывать форму соответствующего документа. Здесь мне многие могут возразить: “А почему бы для этих целей не использовать обычный макет, выводимый в табличный документ, а для открытия документов использовать расшифровку? И чем Ваш способ лучше?” Отвечаю: Конечно можно использовать, и мой способ ничем не лучше. Он просто другой. Ведь у хорошего программиста для решения одной задачи должно быть в арсенале несколько инструментов. 
Итак, перейдем от слов к делу, в рамках данной статьи рассмотрим следующую задачу: Сформировать html-документ, содержащий ссылки на элементы справочника номенклатура, по клику требуется открывать форму соответствующего элемента. Создаем новый отчет, его форму, на форме размещаем элемент управления ПолеHTMLДокумента. 

Текст модуля формы: 

Код 1C v 8.х

  Процедура ДобавитьТекстHTML(ТекстHTML, Элемент);
    // Ссылку будем формировать хитро:
    // Предполагаем что символ "-" не входит в имена объектов метаданных, 
    // учавствующих в формировании html
    // Тогда ссылка будет иметь следующий вид: 
    // Номенклатура-d341d377-b3b1-11dc-a100-0011d85708ff
    // Передавать нашу ссылку будем через атрибут id
    СсылкаНаЭлемент = Элемент.Метаданные().Имя+"-"
    +Элемент.Ссылка.УникальныйИдентификатор();
    ТекстHTML.ДобавитьСтроку("<A id=""" + СсылкаНаЭлемент + """ href= """ 
    + Элемент + """ >"+Элемент+"</A><BR>");
КонецПроцедуры
 
Процедура ДействияФормыСформировать(Кнопка)
    Запрос = Новый Запрос("
    |ВЫБРАТЬ
    |    Номенклатура.Ссылка
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура");
    ТекстHTML = Новый ТекстовыйДокумент;
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        ДобавитьТекстHTML(ТекстHTML, Выборка.Ссылка);
    КонецЦикла;
ЭлементыФормы.ПолеHTMLДокумента.УстановитьТекст(ТекстHTML.ПолучитьТекст());
КонецПроцедуры   


Ну вот html мы сформировали, теперь чтобы ссылки “ожили” надо написать обработчик события OnClick элемента управления ПолеHTMLДокумента. 

Код 1C v 8.х

  // Функция получает элемент - <A> по данному элементу
// Производит поиск элемента <A> среди родительских элементов данного
//
// Параметры:
// Элемент - COMОбъект, элемент HTML документа,
// по которому нужно найти ссылку
//
// Возвращаемое значение:
// COMОбъект - если ссылка обнаружена, иначе - Неопределено
 
Функция НайтиСсылку(Элемент)
    Врем = Элемент;
    Пока Врем <> Неопределено Цикл
        Если НРег(Врем.tagName) = "a" Тогда
            Возврат Врем;
        КонецЕсли;
        Врем = Врем.parentElement;
    КонецЦикла;
    Возврат Неопределено;
КонецФункции    // НайтиСсылку(Элемент)
 
Процедура ПолеHTMLДокументаonclick(Элемент, pEvtObj)
    htmlElement = НайтиСсылку(pEvtObj.srcElement);
    // Анализируем если произошло нажание не ссылку
    Если htmlElement <> Неопределено Тогда
        // Если у ссылки есть идентификатор
        Если СокрЛП(htmlElement.id) <> "" Тогда
            // Получаем адрес ссылки из атрибута id
            СсылкаНаЭлемент = htmlElement.id;
            Разделитель = Найти(СсылкаНаЭлемент,"-");
            Если Разделитель > 0 Тогда
                // Получаем тип элемента
                ТипЭлемента = Лев(СсылкаНаЭлемент,Разделитель-1);
                // Получаем УникальныйИдентификатор
                ГУИД = Сред(СсылкаНаЭлемент,Разделитель+1);
                Справочники[ТипЭлемента].ПолучитьСсылку(
             Новый УникальныйИдентификатор(ГУИД)).ПолучитьФорму().Открыть();
            КонецЕсли;
            // Не отработали нажатие
            pEvtObj.returnValue = Ложь;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры   


Всё можно пробовать! 

Заключение 
Обратите внимание что ссылку я формировал следующим образом: 
<ИмяОбъектаМетаданных>-<УникальныйИдентификатор> это сделано для того, чтобы в обработчике onclick можно было определить к какому объекту метаданных относится данный УникальныйИдентификатор, потому что имея ТОЛЬКО УникальныйИдентификатор невозможно определить к какому объекту метаданных он относиться. Точнее возможно, но уж слишком долго и неудобно – путем перебора всех метаданных в цикле, для каждого объекта метаданных выполнять попытку <ОбъектМетаданных>.ПолучитьСсылку(Новый УникальныйИдентификатор(НашУникальныйИдентификатор)) 
Хотя в нашем примере только один справочник, и указывать его вид было необязательно, и так понятно что это УникальныйИдентификатор элемента справочника Номенклатура, но вдруг Вам потребуется работать с несколькими справочниками, вот тут то мой способ задания ссылки Вам и пригодится.

Источник

 



Назад в раздел