gifts2017

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

Опубликовал Тарас Гулеватый (Foxx) в раздел Программирование - Практика программирования

Если вы пробовали реализовать у себя в программе отображать объекты, содержащиеся в самой базе данных, например встроенную справку (наполняемую пользователями без доступа в конфигуратор), то наверняка сталкивались с тем, что отобразить эту справку для конечных пользователей без генерации предварительно локального 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-файл.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
dt файл демо-конфигурации "База знаний" (версия 1.0.6)
.dt 902,48Kb
10.12.11
76
.dt 902,48Kb 76 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

2. Анатолий (Yasen) 09.12.11 18:22
Загрузил, повтыкал и порадовался.
Спасибо тебе автор, я лет 5 ждал когда сделают более менее 1С:WIKI
Попытки были, но это - работающая штука, готовая к употреблению.
Респект. +1
3. Андрей Д. (bambr1975) 09.12.11 22:01
Качественно и красиво!
Сразу руки тянутся прикрутить хранение файлов и иерархический навигатор по базе знаний с поиском...(мечты-мечты)
4. Анатолий (Yasen) 09.12.11 23:11
bambr1975 пишет:
хранение файлов и иерархический навигатор по базе знаний с поиском

Иерархический справочник и полнотекстовый поиск делаются легко.
А вот про хранение файлов я тоже думал - было бы здорово.
5. Тарас Гулеватый (Foxx) 10.12.11 01:21
Спасибо за отзывы!

Конфигурация в данном виде - выложена в основном для иллюстрации методики навигации (потому и название статьи такое)). Чтобы просто показать эту возможность на примере базы знаний. Конечно, данная демо-конфигурация очень далека от идеала. Для собственных нужд я ее буду постепенно развивать и дорабатывать. Возможно, она доживет до нормального релиза, который можно будет опубликовать).
6. Андрей Казанцев (ander_) 10.12.11 09:23
(5) Foxx,
удачи, полезная штуковина!
7. Автоматизация Производства (dimanich70) 10.12.11 10:46
Как добавляются картинки в базу (добавить - ошибка, добавить копированием - непонятно как заменить). И как вставить картинку на странице? Спасибо.
8. Андрей Д. (bambr1975) 10.12.11 11:12
(7) у меня получилось в режиме редактирования. В главном меню появляется пункт "Элементы" - в нем выбираешь подпункт Картинка... - так указываешь путь к картинке. Только путь должен содержать только английские буквы, с обработкой пути, содержащего русские буквы обработка выдала сообщение:
Ошибка при сохранении в базе данных картинки c:\users\admin\desktop\название с русскими буквами\2011-10-21_150034.jpg : {ОбщийМодуль.ОперацииСоЗнаниями.Модуль(218)}: Ошибка при вызове конструктора (Картинка): Файл не обнаружен 'c:\users\admin\desktop\2011-10-21_150034.jpg'
Почему-то при поиске файла в пути теряются названия с русскими буквами
9. Автоматизация Производства (dimanich70) 10.12.11 11:15
С картинками разобрался. Осталось непонятным, как добавить текс в пунктирной рамке, как его сделать красным.

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

Ошибка при сохранении в базе данных картинки c:\users\админ\appdata\local\temp\fa88cdb14355b0e4.jpg : {ОбщийМодуль.ОперацииСоЗнаниями.Модуль(218)}: Ошибка при вызове конструктора (Картинка): Каталог не обнаружен 'c:\users\appdata\local\temp\fa88cdb14355b0e4.jpg'
10. Андрей Д. (bambr1975) 10.12.11 11:25
По моему крайнему мнению, полноценного HTML-редактора в этой базе нет. Я так понял, что просто копируешь нужный текст, оформленный в других HTML редакторах - в той же разукрашке, например.
11. Андрей Д. (bambr1975) 10.12.11 11:43
(9) во-во:
Почему-то при поиске файла в пути теряются названия с русскими буквами

(0)Незачем применять декодирование URL при работе с локальными файлами. URL кодирует браузер - а здесь звено браузера не задействовано. Использование функции глДекодироватьURL в этом случае лишнее, поскольку встроенная функция языка КодСимвола(<символ>) работает с символом русского алфавита, а не с его "процентным эквивалентом".
12. Тарас Гулеватый (Foxx) 10.12.11 15:17
(7), (8), с картинками - так и задумано. Вставить картинку в справочник, и потом вставить ее в знание - два действия. Вместо этого просто вставляем картинку из любого места, где она сейчас есть (с локального диска или из интернет) сразу в знание, и при записи знания она скачается и сохранится в базе.

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

(10), полноценный html-редактор на данном этапе не планировался. Пока можно пользоваться стандартной панелью инструментов "Поле HTML документа".
13. Тарас Гулеватый (Foxx) 10.12.11 15:21
Незачем применять декодирование URL при работе с локальными файлами. URL кодирует браузер - а здесь звено браузера не задействовано. Использование функции глДекодироватьURL в этом случае лишнее, поскольку встроенная функция языка КодСимвола(<символ>) работает с символом русского алфавита, а не с его "процентным эквивалентом".
Неверно. Декодирование нужно. Как минимум потому, что при вставке в браузер картинки, полный локальный путь к которой содержит пробелы получим в свойстве href тега img путь с "%20" вместо пробелов.

Найду инфу про кодирование локальных путей в протоколе file:// - внесу исправления в конфу.
14. Тарас Гулеватый (Foxx) 10.12.11 21:31
Исправленная версия глДекодироватьURL() уже выложена здесь - http://infostart.ru/public/101004/. Обновление для Базы знаний будет немного позже - надо обновить описание функции в самой базе и поправить еще один найденный баг :).
15. Тарас Гулеватый (Foxx) 10.12.11 23:49
Выложил релиз Базы знаний с исправленным декодированием локальных путей.
16. Владимир Водин (BalVlad) 18.01.12 22:58
Вот спасибо! Ждем развития этой темы. +
17. Dmitry Dmitry (Dimasik2007) 22.01.12 21:36
Автор, огромное спасибо! За такие вещи так и хочется донейт сделать, не жалко)
Пример из рабочей базы (id и hash оставил для красоты):

Кстати, в гиперссылках также можно указывать "якоря", что облегачает навигацию в большой статье.
18. Тарас Гулеватый (Foxx) 23.01.12 01:59
(17) Dimasik2007, не скрою, очень рад, что эта разработка оказалась полезной!
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа