База знаний (демо-конфигурация браузера по объектам информационной базы)








Если вы пробовали реализовать у себя в программе отображать объекты, содержащиеся в самой базе данных, например встроенную справку (наполняемую пользователями без доступа в конфигуратор), то наверняка сталкивались с тем, что отобразить эту справку для конечных пользователей без генерации предварительно локального html-файла не получается. А если получается, то навигация потом по такой справке — еще тот квест :). Есть решение!

В начале разработки мне совсем не хотелось изобретать очередной велосипед, поэтому я попробовал найти методику организации нужной мне функциональности в сети. К сожалению, найти полностью удовлетворяющее моим запросам решение не удалось. Далее следовала примерно такая цепочка рассуждений:

Т.к. возможность напрямую отдать в поток браузера (ПолеHTMLДокумента) нужный контент вообще отсутсвует, приходится мудрить вокруг события ДокументСформирован. Конечно, поменять содержание страницы после ее загрузки не есть проблема, и все было бы хорошо, если бы такая страница была одна. Во всех встреченных мною решениях предлагалось отлавливать событие в котором анализировать по какой ссылке кликнул пользователь, и если это «одна из наших» — зарубить стандартную обработку и просто сформировать новую страничку. В таком подходе есть несколько минусов. Первый — переход по ссылке не всегда инициализируется кликом мыши, а отлавливать все возможные варианты — слишком громоздкая и неустойчивая конструкция выйдет. Второй — история посещений браузера в этом случае не работает (что неудивительно, т.к. загрузки новых страниц так и не выполняется), и по нажатию на кнопки «Вперед» и «Назад» просто ничего не происходит. Поэтому надо реализовать именно загрузку разных страниц, причем (отвлекаясь от контента) разных с точки зрения браузера. Что есть идентификатор страницы для браузера? Ее адрес, который состоит из следующих составных частей:

1С есть хранящиеся в конфигурации ресурсы, для адресов которых не используются параметры и якоря. И если якорь может использоваться браузером для позиционирования на страничке после ее загрузки, то параметры нам подходят идеально. И в нашем случае адрес будет выглядеть так:

Параметров можно использовать неограниченное количество, и с их помощью можно передать почти любую информацию. Впрочем, на данный момент нам достаточно и одного параметра. На примере — адрес одной из страниц базы знаний (см. вложенные файлы):

v8config://v8cfgHelp/mdobject/id6d8184f5-7d2b-4ccb-b9d0-fa872f5775e6/8eb4fad1-1fa6-403e-970f-2c12dbb43e23?id=c675fa98-0525-11e1-8cff-00195b3e3f45

Часть, выделенная жирным — то, чем будут отличаться все странички в нашей базе знаний. А именно, идентификатором элелемента базы знаний, который надо отобразить в данный момент.

Как это выглядит вживую — прошу смотреть в прилагаемой к статье выгрузке демонстрационной базы данных. В dt файле вы найдете не только саму конфигурацию, но и небольшую базу знаний по ней же самой — чтобы можно было не разбираясь с особенностями реализации и не набивая свой контент, сразу покликать по ссылкам, походить по содержанию базы знаний туда-сюда.

Еще пара слов о требованиях, которые выдвигались при разработке:

  • Конфигурация должна быть реализована с использованием только штатных средств 1С (чтобы минимизировать возможные проблемы в случае использования на различных ОС в качестве платформы, не привязываться к наличию зарегистрированных в системе COM-объектов и т.п.).
  • Конфигурация разрабатывается для использования в режиме обычного приложения (толстый клиент). Причина — конфигурация должна быть как работоспособна сама по себе, так и легко встраиваема в существующие конфигурации (для использования, например, в качестве встроенной справочной системы), ведь не секрет, что большинство ныне существующих конфигураций работают в режиме обычного приложения.
    • А еще — потому, что в управляемом приложении браузер по объектам информационной базы — уже встроенная возможность).
  • По функциональности система должна быть сравнима с Википедией, на мой взгляд наиболее удобной для решения подобных задач.

Что получилось — вам судить).

 

Update 10.12.11: Исправлена ошибка в декодировании локальных путей к файлам при добавлении картинок. Обновлен заменен вложнный к статье dt-файл.

17 Comments

  1. Yasen

    Загрузил, повтыкал и порадовался.

    Спасибо тебе автор, я лет 5 ждал когда сделают более менее 1С:WIKI

    Попытки были, но это — работающая штука, готовая к употреблению.

    Респект. +1

    Reply
  2. bambr1975

    Качественно и красиво!

    Сразу руки тянутся прикрутить хранение файлов и иерархический навигатор по базе знаний с поиском…(мечты-мечты)

    Reply
  3. Yasen
    bambr1975 пишет:

    хранение файлов и иерархический навигатор по базе знаний с поиском

    Иерархический справочник и полнотекстовый поиск делаются легко.

    А вот про хранение файлов я тоже думал — было бы здорово.

    Reply
  4. Foxx

    Спасибо за отзывы!

    Конфигурация в данном виде — выложена в основном для иллюстрации методики навигации (потому и название статьи такое)). Чтобы просто показать эту возможность на примере базы знаний. Конечно, данная демо-конфигурация очень далека от идеала. Для собственных нужд я ее буду постепенно развивать и дорабатывать. Возможно, она доживет до нормального релиза, который можно будет опубликовать).

    Reply
  5. ander_

    (5)

    удачи, полезная штуковина!

    Reply
  6. dimanich70

    Как добавляются картинки в базу (добавить — ошибка, добавить копированием — непонятно как заменить). И как вставить картинку на странице? Спасибо.

    Reply
  7. bambr1975

    (7) у меня получилось в режиме редактирования. В главном меню появляется пункт «Элементы» — в нем выбираешь подпункт Картинка… — так указываешь путь к картинке. Только путь должен содержать только английские буквы, с обработкой пути, содержащего русские буквы обработка выдала сообщение:

    Ошибка при сохранении в базе данных картинки c:usersadmindesktopназвание с русскими буквами2011-10-21_150034.jpg : {ОбщийМодуль.ОперацииСоЗнаниями.Модуль(218)}: Ошибка при вызове конструктора (Картинка): Файл не обнаружен ‘c:usersadmindesktop2011-10-21_150034.jpg’

    Почему-то при поиске файла в пути теряются названия с русскими буквами

    Reply
  8. dimanich70

    С картинками разобрался. Осталось непонятным, как добавить текс в пунктирной рамке, как его сделать красным.

    Невозможно изменить элемент справочника Знания, если в нем есть картинка. Вот такую ошибку выдает программа при открытии на редактирование и нажатии написать элемента «Навигация по базе знаний» —

    Ошибка при сохранении в базе данных картинки c:usersадминappdatalocal empfa88cdb14355b0e4.jpg : {ОбщийМодуль.ОперацииСоЗнаниями.Модуль(218)}: Ошибка при вызове конструктора (Картинка): Каталог не обнаружен ‘c:usersappdatalocal empfa88cdb14355b0e4.jpg’

    Reply
  9. bambr1975

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

    Reply
  10. bambr1975

    (9) во-во:

    Почему-то при поиске файла в пути теряются названия с русскими буквами

    (0)Незачем применять декодирование URL при работе с локальными файлами. URL кодирует браузер — а здесь звено браузера не задействовано. Использование функции глДекодироватьURL в этом случае лишнее, поскольку встроенная функция языка КодСимвола(<символ>) работает с символом русского алфавита, а не с его «процентным эквивалентом».

    Reply
  11. Foxx

    (7), (8), с картинками — так и задумано. Вставить картинку в справочник, и потом вставить ее в знание — два действия. Вместо этого просто вставляем картинку из любого места, где она сейчас есть (с локального диска или из интернет) сразу в знание, и при записи знания она скачается и сохранится в базе.

    (8), (9), мда, с русскими буквами в URL вышла промашка. У IE+Windows и здесь свои нюансы). Вечером выложу релиз с исправлением бага.

    (10), полноценный html-редактор на данном этапе не планировался. Пока можно пользоваться стандартной панелью инструментов «Поле HTML документа».

    Reply
  12. Foxx
    Незачем применять декодирование URL при работе с локальными файлами. URL кодирует браузер — а здесь звено браузера не задействовано. Использование функции глДекодироватьURL в этом случае лишнее, поскольку встроенная функция языка КодСимвола(<символ>) работает с символом русского алфавита, а не с его «процентным эквивалентом».

    Неверно. Декодирование нужно. Как минимум потому, что при вставке в браузер картинки, полный локальный путь к которой содержит пробелы получим в свойстве href тега img путь с «%20» вместо пробелов.

    Найду инфу про кодирование локальных путей в протоколе file:// — внесу исправления в конфу.

    Reply
  13. Foxx

    Исправленная версия глДекодироватьURL() уже выложена здесь — http://infostart.ru/public/101004/. Обновление для Базы знаний будет немного позже — надо обновить описание функции в самой базе и поправить еще один найденный баг :).

    Reply
  14. Foxx

    Выложил релиз Базы знаний с исправленным декодированием локальных путей.

    Reply
  15. BalVlad

    Вот спасибо! Ждем развития этой темы. +

    Reply
  16. Dimasik2007

    Автор, огромное спасибо! За такие вещи так и хочется донейт сделать, не жалко)

    Пример из рабочей базы (id и hash оставил для красоты):



    Кстати, в гиперссылках также можно указывать «якоря», что облегачает навигацию в большой статье.

    Reply
  17. Foxx

    (17) Dimasik2007, не скрою, очень рад, что эта разработка оказалась полезной!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *