NotesDocument
NotesDocument — это основной объект данных в платформе IBM Lotus Notes и IBM Domino, представляющий собой контейнер для хранения структурированной и неструктурированной информации в базе данных документного типа. Каждый документ является самостоятельной единицей, содержащей набор полей (items) с данными различных типов, а также может включать форматированный текст, вложения файлов и объекты (OLE). NotesDocument является аналогом записи в реляционной базе данных, но в отличие от неё обладает гибкой, нефиксированной схемой: поля могут добавляться, удаляться или изменяться динамически для каждого отдельного документа.
История и происхождение
Концепция NotesDocument возникла в середине 1980-х годов в компании Iris Associates, разрабатывавшей систему Lotus Notes под руководством Рэя Оззи. Первая версия Lotus Notes (1.0) была выпущена в 1989 году и уже тогда использовала документно-ориентированную модель данных, где NotesDocument служил базовой единицей хранения. В отличие от реляционных СУБД того времени, Notes не требовал предварительного определения схемы таблиц, что позволяло пользователям быстро создавать приложения для совместной работы, такие как дискуссионные базы, базы знаний и системы документооборота.
С приобретением Lotus Development Corporation компанией IBM в 1995 году платформа получила название IBM Lotus Notes, а серверная часть — IBM Lotus Domino. Модель NotesDocument оставалась неизменной по своей сути на протяжении всех версий — от Lotus Notes 4.x до IBM Notes 9.x и HCL Notes (после передачи продукта компании HCL Technologies в 2019 году). Несмотря на появление альтернативных технологий (веб-приложения, NoSQL-базы), NotesDocument продолжает использоваться в корпоративных решениях, особенно в государственных учреждениях и крупных организациях России, где накоплены значительные архивы баз Lotus Notes/Domino.
Структура NotesDocument
NotesDocument состоит из следующих ключевых компонентов:
- Поля (Items) — именованные элементы данных, каждый из которых имеет определённый тип (текст, число, дата, список значений, Rich Text и другие). Поля могут быть как единичными, так и многозначными (содержать массив значений). Например, поле «Автор» может содержать одно имя, а поле «Участники» — список имён.
- Уникальный идентификатор (Note ID и Universal ID) — каждый документ получает два идентификатора: Note ID (уникальный в пределах одной базы) и Universal ID (глобально уникальный, сохраняемый при репликации между серверами). Universal ID позволяет отслеживать один и тот же документ в разных копиях базы.
- Форматированный текст (Rich Text) — специальный тип поля, позволяющий хранить текст с форматированием (шрифты, цвета, таблицы, встроенные изображения), а также внедрённые объекты и вложения файлов. Rich Text является одной из ключевых особенностей NotesDocument, отличающей его от простых текстовых полей.
- Вложения (File Attachments) — файлы произвольного формата, прикреплённые к документу. Вложения хранятся внутри поля типа Rich Text или в отдельном поле типа Attachment. Размер вложения ограничен только размером базы данных (обычно до 4 ГБ для одного документа).
- Объекты OLE — поддержка внедрения объектов из других приложений (например, таблиц Microsoft Excel или документов Word) через механизм OLE (Object Linking and Embedding). Однако в современных версиях HCL Notes эта возможность используется редко.
Типы полей NotesDocument
| Тип поля | Описание | Пример использования |
|---|---|---|
| Text | Строка символов (до 32 КБ) | Название документа |
| Number | Числовое значение (целое или с плавающей точкой) | Сумма, количество |
| Date/Time | Дата и время | Дата создания, срок исполнения |
| Rich Text | Форматированный текст с возможностью вложений | Тело письма, отчёт |
| Names | Имена пользователей или групп Notes | Список получателей |
| Keywords | Выбор из заданного списка значений | Статус: «В работе», «Завершён» |
| Formula | Вычисляемое поле на основе формулы | Сумма полей |
| Attachment | Ссылка на вложенный файл | Скан документа |
Жизненный цикл NotesDocument
- Создание — документ создаётся через клиент Lotus Notes (или HCL Notes), веб-интерфейс, программу на языке LotusScript, Java или через REST API. При создании автоматически заполняются служебные поля: дата создания, автор (LastModifiedBy), уникальный идентификатор.
- Редактирование — пользователь открывает документ в режиме редактирования, изменяет поля и сохраняет. Notes ведёт историю изменений (при включённой опции «Document History»), но не хранит все версии автоматически — разработчик должен реализовать механизм версионирования.
- Сохранение — при сохранении документ записывается в базу данных (NSF-файл) на сервере Domino. Если документ открыт несколькими пользователями, возникает конфликт сохранения — Notes создаёт две копии (основной документ и документ-конфликт), которые администратор или разработчик должен разрешить.
- Репликация — NotesDocument может реплицироваться между несколькими серверами Domino. При репликации учитывается Universal ID: если документ с таким же ID существует на целевом сервере, происходит слияние изменений на уровне полей. Репликация позволяет работать с документами в офлайн-режиме (локальная реплика на клиенте).
- Удаление — при удалении документ не исчезает физически, а помечается как удалённый (deletion stub). Окончательное удаление происходит при компактизации (compact) базы данных или по истечении срока хранения удалённых документов, заданного в настройках базы.
Применение NotesDocument
NotesDocument используется в различных корпоративных приложениях, построенных на платформе Lotus Notes/Domino:
- Системы электронного документооборота (СЭД) — документы выступают в роли карточек с реквизитами (входящие/исходящие номера, даты, резолюции) и вложениями (скан-копии, файлы). Примеры: «Дело», «БОСС-Референт» (российские разработки на базе Domino).
- Дискуссионные базы и форумы — каждый ответ или тема — отдельный NotesDocument с полями «Тема», «Автор», «Дата», «Текст».
- Почтовые ящики — в Lotus Notes каждое письмо (мемо) является NotesDocument с полями «Отправитель», «Получатели», «Тема», «Тело» (Rich Text), «Вложения».
- Базы знаний и справочные системы — документы содержат структурированные данные (статьи, инструкции, нормативные акты) с возможностью полнотекстового поиска.
- Учётные системы — например, учёт оборудования, заявок, договоров, где каждый документ представляет собой запись с набором полей.
Преимущества NotesDocument
- Гибкость схемы — не требуется заранее задавать структуру; поля могут различаться у разных документов в одной базе.
- Встроенная поддержка репликации — возможность работы в распределённой среде с синхронизацией данных.
- Богатый текстовый формат — Rich Text позволяет хранить сложные документы с таблицами, изображениями и вложениями без внешних файлов.
- Безопасность на уровне документов — доступ к каждому документу можно ограничить списками контроля доступа (ACL) и полями «Читатели»/«Редакторы».
Недостатки и ограничения
- Отсутствие строгой схемы — затрудняет контроль целостности данных; ошибки в приложении могут привести к появлению документов с неполными или некорректными полями.
- Производительность при больших объёмах — базы NSF (Notes Storage Facility) могут замедляться при хранении миллионов документов или документов с большими вложениями.
- Сложность интеграции — NotesDocument использует собственный формат хранения (NSF), что требует специальных драйверов или API (LotusScript, Java, REST) для взаимодействия с внешними системами.
- Ограниченная поддержка современных стандартов — встроенные механизмы веб-сервисов и JSON-сериализации появились только в поздних версиях (8.x и 9.x) и не всегда полноценны.
Программный доступ к NotesDocument
Разработчики могут работать с NotesDocument через несколько интерфейсов:
- LotusScript — встроенный язык программирования, объектная модель NotesDocument включает методы (Save, Remove, GetItemValue, ReplaceItemValue) и свойства (UniversalID, LastModified, IsDeleted). Пример на LotusScript:
``lotusscript Dim session As New NotesSession Dim db As NotesDatabase Dim doc As NotesDocument Set db = session.CurrentDatabase Set doc = db.CreateDocument doc.Form = "Заявка" doc.Subject = "Тестовая заявка" Call doc.Save(True, False) ``
- Java (Domino Designer) — класс lotus.domino.Document предоставляет аналогичные методы. Используется для серверных агентов, сервлетов и веб-приложений.
- REST API (Domino Data Service) — начиная с IBM Domino 9.0.1, доступен RESTful API, позволяющий читать, создавать и обновлять NotesDocument через HTTP-запросы с JSON-сериализацией. Пример GET-запроса:
GET /api/data/documents?form=Заявка. - ODBC/JDBC — через драйвер NotesSQL можно выполнять SQL-запросы к базам Domino, но поддерживаются только простые поля (не Rich Text), и производительность ограничена.
Интересные факты
- Максимальный размер одного NotesDocument в базе NSF составляет 4 ГБ (ограничение версии 8.x и выше; в более ранних версиях — 1 ГБ).
- Universal ID (32-символьная шестнадцатеричная строка) генерируется на основе времени создания и идентификатора сервера, что обеспечивает глобальную уникальность даже при репликации между разными доменами.
- В российских государственных учреждениях, особенно в судебной системе и налоговых органах, до сих пор эксплуатируются системы на базе Lotus Notes/Domino, где NotesDocument является основным носителем информации (например, автоматизированная система «Правосудие»).
- При удалении документа Notes не освобождает дисковое пространство немедленно — необходимо выполнить компактизацию базы (compact) или дождаться автоматического сжатия (в HCL Notes 12 и выше появился механизм фоновой компактизации).
Источники
- IBM Lotus Notes and Domino 8.5.1 Developer’s Guide, IBM Redbooks, 2010.
- HCL Notes and Domino Application Development Guide, HCL Technologies, 2020.
- LotusScript Programmer’s Reference, Lotus Development Corporation, 1996.
- Документация HCL Domino REST API, HCL Software, 2023.
- Материалы конференций «Lotus Notes/Domino в России» (2005–2020).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →