В начале разработки мне совсем не хотелось изобретать очередной велосипед, поэтому я попробовал найти методику организации нужной мне функциональности в сети. К сожалению, найти полностью удовлетворяющее моим запросам решение не удалось. Далее следовала примерно такая цепочка рассуждений:
Т.к. возможность напрямую отдать в поток браузера (Поле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-файл.