Как управлять форматированным текстом и изображениями в поле форматированного документа веб-клиента 1С до сохранения?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с полем ФорматированныйДокумент в веб-клиенте 1С разработчики часто сталкиваются с уникальными сложностями, особенно когда необходимо манипулировать содержимым текста или контролировать его форматирование еще до того, как документ будет сохранен или сработает стандартное событие ПриИзменении. Рассмотрим эту проблему подробнее, выясним причины ее возникновения и предложим возможные решения.

Суть проблемы: Отсутствие объекта ТекстФорматированногоДокумента в веб-клиенте

Основная сложность заключается в различном поведении ФорматированногоДокумента в толстом/тонком клиенте и веб-клиенте. В толстом клиенте, как только пользователь начинает вводить текст в поле ФорматированныйДокумент, не сохраняя его, сразу же создается и становится доступным для программных манипуляций элемент ТекстФорматированногоДокумента. Это позволяет разработчикам получать доступ к тексту, изменять его или удалять форматирование "на лету", еще до срабатывания события ПриИзменении или явного сохранения.

Однако в веб-клиенте ситуация иная. Объект ТекстФорматированногоДокумента не существует до тех пор, пока документ не будет сохранен. Это означает, что любые попытки получить и обработать текст в процессе его ввода или сразу после вставки (например, через Ctrl+V) окажутся безуспешными, так как просто нечего будет получить. Разработчик не может произвести манипуляции с текстом именно до его сохранения и до вызова события ПриИзменении, что критически важно для некоторых бизнес-требований.

Это ограничение проявляется особенно остро, когда требуется, чтобы поле ФорматированногоДокумента работало как обычное поле ввода, но с возможностью вставлять картинки, и при этом категорически не допускать форматирования текста, вставляемого пользователем. Стандартное решение с удалением командной панели у ФорматированногоДокумента помогает, если текст вводится вручную. Но когда пользователь копирует и вставляет текст (Ctrl+C - Ctrl+V) из внешних источников, таких как Word, вставляется весь спектр форматирования: цветной, гигантский, выделенный текст и т.д. Именно от этого и нужно избавиться. В качестве альтернативы можно использовать расширяемый редактор форматированного текста WYSIWYG для 1С, позволяющий гибко настроить доступные элементы управления и операции.

Почему стандартные события недостаточны?

Попытки решить проблему с помощью стандартных событий, таких как ПриИзменении, оказываются неэффективными. Событие ПриИзменении для ФорматированногоДокумента срабатывает только тогда, когда фокус переключается с поля ввода на другой элемент формы, а не в момент начала редактирования или непосредственной вставки. Фактически, такого события, как ПриНачалеРедактирования, у ФорматированногоДокумента просто нет. Это создает задержку, которая не позволяет оперативно отреагировать на вставку нежелательного форматирования.

Использование ОбработчикаОжидания в веб-клиенте для постоянной проверки изменений и последующего удаления форматирования также сталкивается с проблемой отсутствия элемента ФорматированногоДокумента до сохранения, как уже было сказано ранее. К тому же, ОбработчикОжидания может перезатирать изменения данных в ФорматированномДокументе, а возможности запретить ему это, как в случае с обычным полем ввода, у форматированного документа нет.

Возможные решения и обходные пути

Несмотря на кажущуюся неразрешимость, существуют подходы, которые могут помочь смягчить или решить часть описанных проблем. Рассмотрим их подробнее.

1. Ручная кнопка для очистки форматирования

Один из вариантов, предложенных в обсуждении, — это добавление на форму отдельной кнопки, которая позволит пользователю вручную очистить форматирование после вставки текста. Если пользователь вставил текст с нежелательным форматированием, он может нажать эту кнопку, чтобы привести текст к требуемому виду.

Реализация:

  1. Создайте на форме кнопку, например, с названием "Очистить форматирование".
  2. В обработчике нажатия этой кнопки необходимо получить текущее содержимое ФорматированногоДокумента, преобразовать его в простой текст, а затем снова установить этот простой текст в документ.
  3. Для программного управления содержимым ФорматированногоДокумента мы можем использовать методы объекта ФорматированныйДокумент, такие как ПолучитьТекст() и УстановитьHTML() (или Вставить() с чистым текстом).

Пример (выполняется на сервере, так как манипуляции с содержимым форматированного документа требуют серверного контекста):


&НаСервере
Процедура ОчиститьФорматированиеНаСервере()

    // Предполагаем, что у вас есть реквизит формы типа "ФорматированныйДокумент"
    // Например, ИсходныйДокумент
    Если ТипЗнч(Элементы.ПолеФорматированногоДокумента.Значение) = Тип("ФорматированныйДокумент") Тогда
        
        // Получаем объект ФорматированныйДокумент из реквизита формы
        Перем ФорматированныйДокументОбъект;
        ФорматированныйДокументОбъект = Элементы.ПолеФорматированногоДокумента.Значение;
        
        // Получаем чистый текст из форматированного документа
        // Этот метод удаляет все форматирование
        СтроковыйТекст = ФорматированныйДокументОбъект.ПолучитьТекст();
        
        // Очищаем существующий документ
        ФорматированныйДокументОбъект.Удалить(0, ФорматированныйДокументОбъект.Длина());
        
        // Вставляем чистый текст обратно
        // При этом текст будет вставлен без форматирования, если не указать его явно
        ФорматированныйДокументОбъект.Вставить(0, СтроковыйТекст);
        
        // Если требуется, явно устанавливаем минимальное форматирование (например, шрифт по умолчанию)
        // Пример установки шрифта по умолчанию (если у вас есть такой стиль)
        // ФорматированныйДокументОбъект.УстановитьСтиль(0, ФорматированныйДокументОбъект.Длина(), "ОбычныйТекст");
        // Или вручную:
        ФорматированныйДокументОбъект.УстановитьШрифт(0, ФорматированныйДокументОбъект.Длина(), Новый Шрифт("Arial", 10));
        
    КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура КнопкаОчиститьНажатие(Команда)
    ОчиститьФорматированиеНаСервере();
КонецПроцедуры

Этот подход не является полностью автоматическим, но предоставляет пользователю инструмент для самостоятельного исправления нежелательного форматирования, что соответствует требованию "избавиться от этого".

2. Использование внешних менеджеров буфера обмена для вставки чистого текста

Наиболее эффективное решение проблемы нежелательного форматирования при вставке из буфера обмена (Ctrl+C - Ctrl+V) лежит за пределами функционала 1С. Поскольку веб-клиент и браузеры имеют ограничения на прямой программный доступ к буферу обмена из соображений безопасности (например, Google Chrome и Safari начиная с определенных версий не поддерживают программную вставку из буфера обмена), автоматическая очистка при Ctrl+V становится крайне затруднительной или невозможной.

Вместо того чтобы бороться с ограничениями платформы и браузеров, мы можем использовать внешний инструмент — менеджер буфера обмена.

Принцип работы:

  1. Установите на компьютер пользователя программу-менеджер буфера обмена (например, Clip Angel, Ditto или другие аналоги).
  2. Большинство таких менеджеров позволяют настроить горячие клавиши для вставки текста без форматирования (plain text). Например, можно настроить комбинацию Alt+Ctrl+V или любую другую удобную.
  3. Когда пользователь копирует форматированный текст из Word или другого источника, он по-прежнему будет храниться в буфере обмена с форматированием.
  4. Однако вместо стандартной вставки Ctrl+V пользователь будет использовать настроенную комбинацию клавиш менеджера буфера обмена (например, Alt+Ctrl+V). Менеджер перехватит эту команду, извлечет из буфера обмена только чистый текст и вставит его в поле ФорматированногоДокумента в 1С.

Этот подход перекладывает ответственность за "чистую" вставку на пользователя и его операционную систему, обходя ограничения веб-клиента 1С и браузеров. Это позволяет добиться желаемого результата: текст будет вставляться в поле ФорматированногоДокумента без нежелательного форматирования, при этом сохраняя возможность вставки изображений.

Важные моменты при использовании менеджеров буфера обмена:

Дополнительные аспекты и ограничения

Рассматривая проблему в целом, важно понимать, что объект ФорматированныйДокумент в 1С предназначен для работы с оформленными текстами. Его функционал не полностью совпадает с простым полем ввода. Если основное требование — это

ввод только чистого текста с возможностью вставки картинок

без какого-либо форматирования, то:

Таким образом, хотя платформа 1С предоставляет мощные средства для работы с ФорматированнымДокументом, особенности его реализации в веб-клиенте, а также ограничения браузеров на доступ к буферу обмена, создают препятствия для реализации некоторых специфических требований. В таких случаях приходится прибегать к комбинации ручных действий пользователей и внешних инструментов, чтобы обеспечить требуемую функциональность. Для обхода платформенных ограничений также подойдёт обработка-редактор HTML для управляемого интерфейса.

Заключение

Мы выяснили, что прямых и простых способов заставить поле ФорматированногоДокумента в веб-клиенте 1С работать как обычное поле ввода с картинками и без форматирования, особенно до события ПриИзменении или сохранения, не существует из-за архитектурных ограничений. Объект ТекстФорматированногоДокумента в веб-клиенте появляется только после сохранения, что затрудняет оперативные манипуляции.

Тем не менее, мы рассмотрели два практических подхода к решению основной проблемы с нежелательным форматированием:

  1. Реализация кнопки "Очистить форматирование" на форме, позволяющей пользователю вручную привести текст к желаемому виду.
  2. Использование внешнего менеджера буфера обмена, который позволяет настроить горячие клавиши для вставки чистого текста, обходя ограничения браузеров и платформы 1С.

Выбор конкретного решения будет зависеть от требований к автоматизации, готовности пользователей к освоению новых инструментов и возможностей централизованного развертывания ПО в вашей организации. В конечном итоге, важно найти баланс между желаемой функциональностью и реалистичными возможностями платформы 1С в режиме веб-клиента.

← На главную