Форматований документ в 1с

Прошу врахувати, що це моя перша публікація. Тож почнемо…

Форматований документ призначений для оформлення тексту. Його можна виділити жирним. підкреслити. збільшити / зменшити шрифт, центрувати і т.д. Також можна додати картинку. Тобто в 1С тепер можна відформатувати текст, приблизно, як в MS Word і ін. подібних програм. Це може бути зручно при оформленні різних договорів або, наприклад, при редагуванні електронного листа. Таким чином, у нас є можливість привести текстовий документ в той вид, який ми побажаємо.

У синтаксис-помічника є опис.
Об'єкт ФорматірованнийДокумент (FormattedDocument) має однойменний тип даних, який підтримує функціонування даного об'єкта і має наступні методи:

Вставити (Insert)
Додати (Add)
Записати (Write)
ПолучітьHTML (GetHTML)
ПолучітьЗакладкуКонца (GetEndBookmark)
ПолучітьЗакладкуНачала (GetBeginBookmark)
ПолучітьЗакладкуПоПозіціі (GetPositionBookmark)
ПолучітьПозіціюПоЗакладке (GetBookmarkPosition)
ПолучітьТекст (GetText)
Видалити (Delete)
УстановітьHTML (SetHTML)

Доступний у всіх типах програми: Тонкий клієнт, веб-клієнт, сервер, товстий клієнт, зовнішнє з'єднання. Не можна вказати новий тип даних в якості типу реквізиту.

Є одна важлива особливість цього типу. Не можна ставити тип «Форматований документ» для реквізиту об'єкта (довідника, документа і ін.). Але є можливість вказувати його для реквізитів форми.

Виникає питання, як же нам зберегти ті зміни при форматуванні тексту, які зробив користувач? Для цього застосовується спеціальний об'єкт «ХраніліщеЗначенія», який може містити в собі будь-який тип даних, в тому числі і «форматований документ». Таким чином, в базі даних сам об'єкт буде зберігатися як «Сховище значення», далі при відкритті форми необхідно буде отримати об'єкт зі сховища, відобразити його на формі використовуючи тип «ФорматірованнийДокумент». Якщо користувач вирішить зберегти зміни, то при записі об'єкта потрібно знову взяти об'єкт «форматований документ» і записати його в сховище.

Візьмемо за основу каркасну конфігурацію, створимо в ній довідники «Контрагенти» і «Договори». Встановимо довідник «Договори» підпорядкованим довіднику «Контрагенти» і створимо реквізит «Текст» з типом ХраніліщеЗначенія.

Створимо форму елемента довідника «Договори» і додамо на неї новий реквізит, який назвемо «ТекстДоговора», вкажемо тип даних «ФорматірованнийДокумент». Зверніть увагу, що реквізит «Текст» з типом «ХраніліщеЗначенія» на форму помістити не можна.
Створимо також командну панель (меню) містить необхідні кнопки для управління форматованим документом. Для цього треба додати в форму «Група - Командна панель» і вказати у властивості «Джерело команд» реквізит форми «ТекстДоговора» з типом ФорматірованнийДокумент.

Запускаємо відладчик, перевіряємо, що у нас вийшло ...

Все б добре, але є деякі проблеми:

По-перше, якщо ввести текст і відформатувати його належним чином, то ознака модифікування для форми не виникає. Таким чином, випадково натиснувши на кнопку закриття форми, система не задаючи питань закриває її без всякого збереження.
Для того щоб подібні неприємності не траплялися, необхідно встановити прапор у властивості «Зберігаються дані» реквізиту форми «ТекстДоговора». В результаті, при будь-якій зміні даних в реквізиті «ТекстДоговора», буде встановлюватися ознака модифікування форми, а при її закритті система запитає: «Зберегти зміни?».

По-друге. Спробуємо закрити форму і зберегти введені дані. Заново відкривши збережений договір, бачимо що текст введений в форму договору відсутній. Чому так відбувається?

Вся справа в тому, що ми робимо зміни в реквізиті форми, який у нас ніяк не пов'язаний з реквізитом об'єкта. Давайте налаштуємо зв'язок між реквізитом форми «Текст договору» з типом даних «ФорматірованнийДокумент» і реквізитом об'єкта «Текст» з типом «ХраніліщеЗначенія».

Пропишемо цей зв'язок програмно в модулі форми. Наведемо алгоритм.

1. При відкритті форми, необхідно буде звернутися до реквізиту об'єкта «Текст», щоб прочитати з нього дані і записати їх в форматований документ «Текст договору».
2. При записи об'єкта, беремо вміст форматированного документа і поміщаємо його в реквізит об'єкта «Текст» з типом «ХраніліщеЗначенія».

Таким чином у нас буде виникати ефект, що всі зміни вироблені користувачем, будуть зберігатися в базі даних.

Нам знадобляться наступні обробники подій:

- подія ПріЧтенііНаСервере (ТекущійОб'ект)

воно зручно тим, що при помилковому внесення змін до даних форми, можна натиснути кнопку «Перечитать» і повернуться до вихідних даних.

На сервері
Процедура ПріЧтенііНаСервере (ТекущійОб'ект)
ТекстДоговора = ТекущійОб'ект. Текст. Отримати ();
КонецПроцедури

- подія ПередЗапісьюНаСервере (Відмова. ТекущійОб'ект. ПараметриЗапісі)

На сервері
Процедура ПередЗапісьюНаСервере (Відмова. ТекущійОб'ект. ПараметриЗапісі)
ТекущійОб'ект. Текст = Новий ХраніліщеЗначенія (ТекстДоговора);
КонецПроцедури


Оскільки реквізит Текст у нас має тип «ХраніліщеЗначеній», треба врахувати нюанси роботи з ним ... У випадку читання об'єкта використовуємо метод Отримати (), а в разі запису використовуємо конструктор об'єкта Новий ХраніліщеЗначенія (,).

На цьому поки все. Наступного разу спробую розповісти про використання шаблонів для вставки параметрів в текст форматированного документа, наприклад, замість% Контрагент% вставляти найменування контрагента.

Дякую за увагу!

Корисні посилання вказані товаришем Evg-Lylyk

Схожі статті