Форматированный документ в 1С
Разработка - Работа с интерфейсом
Начиная с версии 8.2.11 в платформе появился новый объект – Форматированный документ. Так как не нашел на Инфостарте ни одного упоминания об этой функциональности, решил опубликовать небольшую статейку о том, что это за объект и какой функционал он добавляет.
Прошу учесть, что это моя первая публикация. Итак, начнем…
Предназначение
Форматированный документ предназначен для оформление текста. Его можно выделить жирным, подчеркнуть, увеличить/уменьшить шрифт, центрировать и т.д. Также можно добавить картинку. Т.е. в 1С теперь можно отформатировать текст, примерно, как в MS Word и др. подобным программам. Это может быть удобно при оформлении различных договоров или, например, при редактировании электронного письма. Таким образом, у нас есть возможность привести текстовый документ в тот вид, который мы пожелаем.

В синтакс-помощнике есть описание.
Объект ФорматированныйДокумент (FormattedDocument) имеет одноименный тип данных, который поддерживает функционирование данного объекта и имеет следующие методы:
Вставить (Insert)
Добавить (Add)
Записать (Write)
ПолучитьHTML (GetHTML)
ПолучитьЗакладкуКонца (GetEndBookmark)
ПолучитьЗакладкуНачала (GetBeginBookmark)
ПолучитьЗакладкуПоПозиции (GetPositionBookmark)
ПолучитьПозициюПоЗакладке (GetBookmarkPosition)
ПолучитьТекст (GetText)
Удалить (Delete)
УстановитьHTML (SetHTML)
Доступен во всех типах приложения: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение. Нельзя указать новый тип данных в качестве типа реквизита.
Есть одна важная особенность этого типа. Нельзя задавать тип «Форматированный документ» для реквизита объекта (справочника, документа и др.). Но есть возможность указывать его для реквизитов формы.


Возникает вопрос, как же нам сохранить те изменения при форматировании текста, которые сделал пользователь? Для этого применяется специальный объект «ХранилищеЗначения», который может содержать в себе любой тип данных, в том числе и «форматированный документ». Таким образом, в базе данных сам объект будет храниться как «Хранилище значения», далее при открытии формы необходимо будет извлечь объект из хранилища, отобразить его на форме используя тип «ФорматированныйДокумент». Если пользователь решит сохранить изменения, то при записи объекта нужно снова взять объект «форматированный документ» и записать его в хранилище.
Пример работы
Возьмем за основу каркасную конфигурацию, создадим в ней справочники «Контрагенты» и «Договоры». Установим справочник «Договоры» подчиненным справочнику «Контрагенты» и создадим реквизит «Текст» с типом ХранилищеЗначения.
Создадим форму элемента справочника «Договоры» и добавим на нее новый реквизит, который назовем «ТекстДоговора», укажем тип данных «ФорматированныйДокумент». Обратите внимание, что реквизит «Текст» с типом «ХранилищеЗначения» на форму поместить нельзя.
Создадим также командную панель (меню) содержащую необходимые кнопки для управления форматированным документом. Для этого надо добавить в форму «Группа – Командная панель» и указать в свойстве «Источник команд» реквизит формы «ТекстДоговора» с типом ФорматированныйДокумент.

Запускаем отладчик, проверяем, что у нас получилось…
Все бы хорошо, но есть некоторые проблемы:
Во-первых, если ввести текст и отформатировать его должным образом, то признак модифицированности для формы не возникает. Таким образом, случайно нажав на кнопку закрытия формы, система не задавая вопросов закрывает ее без всякого сохранения.
Для того чтобы подобные неприятности не случались, необходимо установить флаг у свойства «Сохраняемые данные» реквизита формы «ТекстДоговора». В результате, при любом изменении данных в реквизите «ТекстДоговора», будет устанавливаться признак модифицированности формы, а при ее закрытии система спросит: «Сохранить изменения?».
Во-вторых. Попытаемся закрыть форму и сохранить введенные данные. Заново открыв сохраненный договор, видим что текст введенный в форму договора отсутствует. Почему так происходит?
Все дело в том, что мы делаем изменения в реквизите формы, который у нас никак не связан с реквизитом объекта. Давайте настроим связь между реквизитом формы «Текст договора» с типом данных «ФорматированныйДокумент» и реквизитом объекта «Текст» с типом «ХранилищеЗначения».
Пропишем эту связь программно в модуле формы. Опишем алгоритм.
- При открытии формы, необходимо будет обратиться к реквизиту объекта «Текст», чтобы прочитать из него данные и записать их в форматированный документ «Текст договора».
- При записи объекта, берем содержимое форматированного документа и помещаем его в реквизит объекта «Текст» с типом «ХранилищеЗначения».
Таким образом у нас будет возникать эффект, что все изменения производимые пользователем, будут сохраняться в базе данных.
Нам понадобятся следующие обработчики событий:
- событие ПриЧтенииНаСервере(ТекущийОбъект)
оно удобно тем, что при ошибочном внесении изменений в данные формы, можно нажать кнопку «Перечитать» и вернутся к исходным данным.
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
ТекстДоговора = ТекущийОбъект.Текст.Получить();
КонецПроцедуры
- событие ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
ТекущийОбъект.Текст = Новый ХранилищеЗначения(ТекстДоговора);
КонецПроцедуры
Т.к. реквизит Текст у нас имеет тип «ХранилищеЗначений», надо учесть нюансы работы с ним… В случае чтения объекта используем метод Получить(), а в случае записи используем конструктор объекта Новый ХранилищеЗначения(, ).
На этом пока всё. В следующий раз попробую рассказать про использование шаблонов для вставки параметров в текст форматированного документа, например, вместо %Контрагент% вставлять наименование контрагента.
Благодарю за внимание!
upd
Полезные ссылки указаны товарищем Evg-Lylyk
http://www.1c-pro.ru/index.php?showtopic=21524&st=0&p=92729&#entry92729
http://v8.1c.ru/overview/Term_000000785.htm
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Работа с интерфейсом Анализ учета Мониторинг 1С:Предприятие 8 1С 8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)
Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!
31720 руб.
27.03.2025 92263 69 44
Консолидация данных Работа с интерфейсом Разработчик Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 1C:ERP Узбекистан Беларусь Кыргызстан Россия Казахстан Платные (руб)
Знакомая ситуация? Пользователи, особенно менеджеры, уверены: отборов много не бывает. Идут пожелания добавить в форму списка еще один быстрый фильтр, еще два, еще пять... В итоге интерфейс превращается в нагромождение полей отбора, а потребность в «самом главном» отборе, который «вот прямо сейчас нужен», все равно не закрыта. Универсальное расширение, которое решает эту проблему элегантно и технологично. С его помощью в любую форму списка можно легко добавить панель настраиваемых кнопок-закладок, каждая из которых применяет сложный фильтр-запрос, а так же показывает актуальное количество элементов в реальном времени.
6088 руб.
17.10.2025 3648 3 0
Разработка Инструментарий разработчика Работа с интерфейсом Адаптация типовых решений Нейросети 1C:Бухгалтерия 1C:ERP 1С:ЗУП 1С:КА 1С:УНФ 1С:УТ 1С:Розница 1С:ДО 1С:ERP Управление предприятием 2 Платные (руб)
Разработка "Дизайнер форм 1С" реализована в виде расширения 1С и является универсальным инструментом для разработки прототипа форм с целью демонстраций, технических заданий и т.д. Без участия разработчика с возможностью экспорта в файл внешней обработки и генерации формы используя искусственный интеллект.
36600 руб.
28.08.2025 10331 2 2
Работа с интерфейсом Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)
Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна
20.08.2024 57378 mrXoxot 44
Работа с интерфейсом Разработчик 1С:Предприятие 8 Бесплатно (free)
Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.
27.05.2024 29987 smielka 39
Инструментарий разработчика Работа с интерфейсом Разработчик 1С 8.3 Абонемент ($m)
Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.
1 стартмани
10.04.2023 19458 190 acces969 31
Работа с интерфейсом Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Питничная фантазия на возможности в разработке интерфейсов формы с помощью Платформы 1С - делаем свою подсказку. Публикация содержит готовую библиотеку программного формирования данной подсказки.
12.08.2022 16942 top_1c 39
Работа с интерфейсом Разработчик 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)
"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.
1 стартмани
05.07.2022 17952 kalyaka 8
(5) Программная обработка форматированного документа реализована слабо, согласен...
(8) Ну это врядли! ;)
Замечена некорректная работа с текстом, вставленным из Word - вот пример если его попробовать залить:
Ошибка преобразования данных XDTO:... НачалоСвойства: fmtd Форма: Элемент Тип: {}anyType
по причине: ...
Ошибка отображения типов:...
Отображение типа 'РасширенноеИмяXML' в тип '{}Color'
Важнее то, что скопированный и вставленный текст невозможно корректно править! Это очень плохо, т.к. была цель сохранять некую информацию с документов word и просто с браузера копипастом. Сегодня ещё поэкспериментирую.
Поддерживает ли форматированный документ многомерные списки?
В процессе редактирования не получилось.
Увеличение уровня отступа выполняется, а дальнейшее уменьшение уровня отступа начинает нумерацию сначала.
Что было замечено при программном переносе данных с сайта в форматированный документ.
Получаю html документ с сайта, выбираю нужный кусок. В html-коде присутствует следующее:
"font-size: 10pt; color: black; line-height: 150%; font-family: Arial" Патент №
"font-size: 10pt; color: black; line-height: 150%; font-family: Arial" Дата регистрации
После выполнения у форматированного документа УстановитьHTML()
"line-height: 150%" заменяется на "line-height: 150" (съедается процент) и следовательно очень большие интервалы у меня между строк
Так что лучше использовать "line-height: 1.5".
Да и текст введенный в «ТекстДоговора» не сохраняется. Процедуры в модуль формы добавил. Что может быть не так?
Нашел - было отключено выполнение активных сриптов в настройках безопасности Internet Explorer
Но при включении скриптов в другой форме с HTML документом начинают выскакивать ошибки выполнения сценариев
А показывать HTML страницы в форматированном документе не получается по нормальному - вообще корявит всю страницу до жути.
Т.е. 1Ска опять жутко косячит.
И что делать не могу сообразить, в одном случае мне нужен форматированный документ, так как надо дать пользователю возможность создавать форматированный текст, а в другом случае мне нужен нормальный просмотр веб-страниц с возможностью перехода по ссылкам и без всяких ошибок выполнения скрипта
Но дело оказалось немного в другом.
Если получать данные на клиенте, то картинки не отображаются, если на сервере - все ок.
Например, вот так не работает:
&НаКлиенте
Процедура СписокПриАктивацииСтроки(Элемент)
ФорматированныеДокумент = Элемент.ТекущаяСтрока.ДетальноеОписание.Получить();
КонецПроцедурыИ даже так не работает:
&НаСервере
Функция ПолучитьДетальноеОписаниеНаСервере(Код)
Возврат Справочники.Справочник.НайтиПоКоду(Код).ДетальноеОписание.Получить();
КонецФункции
&НаКлиенте
Процедура СписокПриАктивацииСтроки(Элемент)
ФорматированныеДокумент = ПолучитьДетальноеОписаниеНаСервере(Элемент.ТекущиеДанные.Код);
КонецПроцедуры ПоказатьРаботает только так:
&НаСервере
Процедура ПолучитьДетальноеОписаниеНаСервере(Код)
ФорматированныеДокумент = Справочники.Справочник.НайтиПоКоду(Код).ДетальноеОписание.Получить();
КонецПроцедуры
&НаКлиенте
Процедура СписокПриАктивацииСтроки(Элемент)
ПолучитьДетальноеОписаниеНаСервере(Элемент.ТекущиеДанные.Код);
КонецПроцедуры Показать"В следующий раз попробую рассказать про использование шаблонов для вставки параметров в текст форматированного документа, например, вместо %Контрагент% вставлять наименование контрагента."
идея сначала понравилась, но за 2 года так этот объект и не получил развития...
//на сервере
ФормДок.ПолучитьHTML(HTML, Структура);
//на клиенте
ТекстПоиска = "
|<style type=""text/css"">
|body{margin:0px;padding:8px;overflow:hidden;width:100%;height:100%;}
|p{line-height:1.15;margin:0px;}
|ol,ul{margin-top:0px;margin-bottom:0px;}
|img{border: none;}
|</style>";
HTML = СтрЗаменить(HTML,ТекстПоиска,"");
ЭтаФорма.текст_хтмл = HTML;
ПоказатьВместо "" можете вставить свое определение стилей
Оказалось, что после вставки из Word символы переноса строк в HTML превращались в тэг </br>. При открытии этот тэг удалялся. Очевидно, как закрывающий тэг без открывающего считался ошибочным.
Вылечивается например ПередЗаписью примерно так:
ТекстОригинал.ПолучитьHTML(ТекущийОбъект.ТекстОригинал, мСтруктураОригинал);
ТекущийОбъект.ТекстОригинал = СтрЗаменить(ТекущийОбъект.ТекстОригинал, "</br>", "
");
Большое спасибо! Долго не мог понять в чем дело. Кстати, эту ошибку метода ПолучитьHTML исправили в 8.3.5.1068
В младших релизах вместо вызова
ФорматДок.ПолучитьHTML(Текст, Картинки);надо использовать функцию:
Функция ПолучитьHTML(ФорматДок, Текст, Картинки) Экспорт
ФорматДок.ПолучитьHTML(Текст, Картинки);
Возврат СтрЗаменить(Текст, "</br>", "");
КонецФункции
Поделитесь опытом, как в ФорматированныйДокумент вставить таблицу, например реквизиты контрагента.
Когда в макете вручную прописываю теги таблицы, то в просмотре отображается все отлично -
Но как только запускаю из предприятия - ячейка второго столбца переносится на новую строчку.
На формах вычитал, что 1С работает по стандарту html 1.0 который и обрезает теги таблицы. Может можно как-то его изменить?
На управляемой форме 3 поля: ФорматированныйДокумент и два ПолеВвода. Если активировать ПервоеПолеВвода (установить на нем курсор), и программно сменить фокус Этаформа.ТекущийЭлемент = Элементы.ВтороеПолеВвода;
то фокус меняется, обратно также со второго поля на первое, а вот если курсор в Документе то смена фокуса не происходит.
Это глюк элемента ФорматированныйДокумент или у меня что-то может блокировать смену фокуса?
Например, есть 2 ситуации:
1. Если фокус в полях, вызываем диалоговое окно, закрываем его, тыкаем мышкой в документ, - вылетает ошибка сценария ИЕ, если отключить сценарии в ИЕ то документ вообще не работает на ввод и чтение (кнопки тусклые). Поэтому настройки ИЕ не трогаю, ошибку как-то умудрился обойти путем переключения фокуса ввода программно после закрытия диалогового окна.
2. Если изначально фокус в документе, вызываем диалог, закрываем его, и также ошибка, но обойти уже не получается, так как не сменить программно фокус.
Фокус не меняется независимо от того есть диалог или нет.
Пока не могу понять как сценарии могут влиять на фокус элемента формы 1С. Сможете протестировать как у вас дела с фокусом?))
И доп.реквизиты-сведения тоже нужны.
А нельзя сделать универсальную печать к каждому справочнику или документу с выводом всех полей и связанных реквизитов в читабельном виде (с галочками что выводить а что нет)?
Или все это уже есть в 1С Документооборот? А мне в БП 3 надо..
И чтоб шаблон моего договора сохранить отдельно куда нибудь, а результат - в справочник или документ (чтобы спросило куда это прицепить или сохранить в файл?)
Колонтитулы с нумерацией строк - нашла, в просмотре печати. А можно в колонтитулы добавить имя пользователя/компьютера/базы данных?
А изменить текст в колонтитуле всего страниц на "Листов: 3" вместо 3 (это не по ГОСТ).
Почему его нельзя вызвать из меню создать новый?
Почему в PDF оно сохраняет без картинок и в word не сохраняет совсем.
Почему рисунки показываются на предварительном просмотре но не печатаются (потому что галочка в настройках печатать фон и рисунки не установлена). Предварительный просмотр должен соответствовать распечатке.
Куда-то колонтитулы пропадают при изменении режимов страниц и масштаба.
И пока все.
Огромное спасибо автору за статью.
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
ТекущийОбъект.Описан_Изд = Новый ХранилищеЗначения(ТекстОписание);
КонецПроцедуры
Но сцуко если картинку копипастить то при сохранении и последующем открытии она не отрисовывается.
А если добавлять через Еще/ВставитьКартинку то отрисовывается.
Проверил на КА - та же фигня.
Нет ли у кого идей как это поправить?
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 74958
Создание 02.09.10 03:10
Обновление 02.09.10 13:47
Просмотры 138100
Загрузки 0
Рейтинг
228
Комментарии 68
Код открыт Да
Рубрики Работа с интерфейсом
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)