Мастер-группа. Тема №2. Форматированный документ

Новый объект платформы появился в релизе 8.2.11. Его мы рассмотрим в текущей сессии.

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —
напишите нам на e-mail поддержки.

комментариев 27 на “Мастер-группа. Тема №2. Форматированный документ”

  1. Добрый день, хотелось бы узнать как организован механизм печати форматированного документа.

    • Все довольно просто.
      Во-первых, работает Ctrl+P.
      Во-вторых, если хочется сделать кнопку “Печать”, то этого можно добиться. В редакторе управляемой формы переходим на Команды – Стандартные команды – Разворачиваем реквизит соответствующий форматированному документу – Находим Печать. Далее ее можно переносить как независимую кнопку, либо кнопку командной панели.

      • Добрый день, прошу прощенья что не указала как именно печатать. Имелась ввиду программная печать форматированного документа, ведь его можно хранить например в справочнике “ШаблоныДоговоров” в хранилище значений и при необходимости обратиться к элементу справочника получить форматированный документ, а после хотелось бы его отправить на печать. Возможен ли такой вариант? и если да то как? За ранее благодарен, спасибо.

        • Хороший вопрос.
          Полностью программной печати форматированного документа нельзя реализовать.
          Тем не менее в большинстве случаев печать должен инициировать сам пользователь. Вот такая возможность есть.
          То есть форм. док можно не отображать, но при нажатии на кнопку распечатать.
          При этом кнопка будет ассоциирована со стандартной командой, характерной форматированному документу.
          То есть сам форм. документ нужно будет создавать в форме, но не визуализировать его..

          • Замечу что для варианта печать формат.документа при установлении реквизита видимость = ложь для это реквизита, кнопка тоже становится невидимой и самым разумных действием будет использование реквизита доступность = ложь, в этом случае формат.документ будет виден, но не доступен для редактирования и его можно будет печатать.

  2. Виталий Межаков 07.04.2011 в 11:25

    Есть ли возможность работать с таблицами в поле форматированного документа? По аналогии с ПолеHTMLДокумента. Или какие-то возможности по форматированию текста/картинок в несколько колонок?

    • На текущий момент такой возможности нет.
      Однако объект относительно новый, и скорее всего его функционал будет расширяться.

  3. Есть вопрос по поводу 4 фрагмента.
    Был создан  следующий обработчик события, впринципе в дальнейшем он не использовался
     
    <Code>&НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
     ФорматированныйДокумент = Объект.Текст.Получить();
    КонецПроцедуры</Code>

    при проверке данного куска кода выдается ошибка связано это  с тем что Объект имеет тип “ДанныеФормыСтрутура”, в фрагменте нашел объяснее этому, форма не может содержать Хранилище значение (что то вроде этого  помойму). Решил эту проблему через “Ссылку”
    <Code> ФорматированныйДокумент = Объект.Ссылка.Текст.Получить();
    </Code>.
    И тут собственно возник вопрос правильно ли я все понял?, может где то что то не указал чтобы “Объект” мог видеть мой реквезит “Тескт”. Если понял правильно, то правильное ли нашел решение этой проблемки?

    • Вы поняли правильно.
      Текст у Объекта не доступен, так как данные формы не могут содержать реквизиты типа ХранилищеЗначения.
      Однако, более правильно получить Текст не от ссылки, а от объекта.
      Код должен выглядеть так:

      СправочникОбъект = РеквизитФормыВЗначение("Объект");
      ФорматированныйДокумент = СправочникОбъект.Текст.Получить();

      То есть вначале мы получаем полноценный тип данных СправочникОбъект от данных формы. Затем обращаемся к хранилищу значения.

      Чем такое обращение лучше получения данных от ссылки?

      При получении через ссылку значение будет выбираться из базы данных.
      Но возможно оно было уже изменено и не записано. Таким образом есть шанс обратиться к неактуальным данным.
      Конечно это не касается события “ПриСозданииНаСервере”, ведь в нем форма только создается.

      Однако, к “хорошему” коду нужно привыкать сразу :)

      ps. Более подробно о данных формы и их преобразовании мы будем говорить во втором блоке курса.

  4. Для “заполнения” ФорматированногоДокумента Вы использовали метод Получить(). Для сохранения Вы использовали конструктор Новый. При этом старое значение в хранилище сохраниться?

    • Естественно старое значение удаляется.
      То есть последовательность действий такова:
      1. Читаем старое значение из хранилища.
      2. Сохраняем его в реквизит формы (форматированный документ).
      3. Пользователь работает с формой (при этом форматированный документ возможно и не меняется).
      4. Выполняется запись.
      5. На основании форматированного документа формируем нового значение хранилища.

      • Так в Вашей цепочки где удаление?
        Кто его делает? Система или программист?

        • Немного не понял. Удаление чего?
          Старого значения? Оно просто перезатирается..

          • В Вашем примере мы :
            читаем из хранилища:
            ТекОбъект.Реквизит.Получить();
            а потом сохраняем:
            ТекОбъект.Реквизит = Новый Хранилище(“Нечто”);
            Но ведь перед присвоением в “Реквизит” в нем, я полагаю, лежит ссылка на то что мы уже получали. И это “старое значение” кто и как удалит из хранилища?

            • Я, кажется, понял. Объект называется “ХранилищеЗначениЯ“. А я его воспринимал во множественном числе и как объект хранящийся в БД. Видимо этот Объект существует только в ОП. И тогда становится все понятно. Это верно?

              • >Это верно?
                Практически.
                Для начала рассмотрим пример.
                Допустим в справочнике есть реквизит Производитель, тип данных Строка.
                Изначально был создан элемент, указали свойство Производитель = “Альфа”.
                Далее открыли элемент на редактирование и указали “Бетта”, записали элемент.
                Куда делось значение “Альфа” после второй записи?
                Естественно оно было замещено значением “Бетта”.
                Здесь все понятно?
                С хранилищем значения та же ситуация. Старое значение замещается новым.

                На самом деле в хранилище можно хранить и множество объектов. Например, массив картинок (бинарных данных). Сути это не меняет.

  5. S. Bashutin 05.04.2011 в 14:37

    После строки:
     <code>ТекстДоговора.Вставить(ЗакладкаНачало, Объект.Наименование);</code>
    Добавил три строчки кода:
    <code>ПозицияПереводаСтроки=ПозицияНачало+СтрДлина(Объект.Наименование);
    ЗакладкаПереводаСтроки=ТекстДоговора.ПолучитьЗакладкуПоПозиции(ПозицияПереводаСтроки);
    ТекстДоговора.Вставить(ЗакладкаПереводаСтроки,Символы.ПС);</code>
    Теперь результат ожидаемый:)
    Если заменить последнюю строчку на:
    <code>ТекстДоговора.Вставить(ЗакладкаПереводаСтроки,, ТипЭлементаФорматированногоДокумента.ПереводСтроки);</code>
    То эффект будет совершенно другой, хотя казалось бы мы вставлем перевод строки и в одном и в другом случаии:) Вот такие вот особенности:)

    • Спасибо, за информацию, в будущем учтем это, и сделаем доп. урок.

      Также кажется, что если использовать вместо Символы.ПС – Символы.ВК, то все должно быть правильно и в исходном коде.
      Но это нужно проверить.

      А есть еще рецепт по замене шаблонных символов.
      Можно формированный документ перевести в HTML (ПолучитьHTML), воспользоваться функцией СтрЗаменить и вызывать метод УстановитьHTML.

      • “Символы.ВК” не помогло
        а вот преобразование HTML помогло … вот как это получилось у меня может кому понадобится
        создал еще одну команду “Команда2” и к ней подцепил, только вот есть одно но УстановитьHTML() на клиенте не работает пришлось создавать отдельную процедуру на сервере
        <code>
         
        &НаКлиенте
        Процедура Команда2(Команда)

        ТекстHTML = “”;
        СтрукКартинок = Новый Структура;

        ТекстДокумента.ПолучитьHTML(ТекстHTML,СтрукКартинок);

        ТекстДокHTML = СтрЗаменить(ТекстHTML,”%клиент%”,”ИмяКонтр”);

        УстановитьХТМЛ(ТекстДокумента,ТекстДокHTML,СтрукКартинок);
        КонецПроцедуры
        &НаСервере
        Процедура УстановитьХТМЛ(ТД,ТекстХТМЛ,СтруктураК)
        ТД.УстановитьHTML(ТекстХТМЛ,СтруктураК);
        КонецПроцедуры
        &НаКлиенте
        Процедура Команда2(Команда) ТекстHTML = “”;
         
        СтрукКартинок = Новый Структура;
        ТекстДокумента.ПолучитьHTML(ТекстHTML,СтрукКартинок);
        ТекстДокHTML = СтрЗаменить(ТекстHTML,”%клиент%”,”ИмяКонтр”);
        УстановитьХТМЛ(ТекстДокумента,ТекстДокHTML,СтрукКартинок);
        КонецПроцедуры
        &НаСервере
        Процедура УстановитьХТМЛ(ТД,ТекстХТМЛ,СтруктураК)
        ТД.УстановитьHTML(ТекстХТМЛ,СтруктураК);
        КонецПроцедуры
        </code>

        • извиняюсь два раза вставил

          • Такая проблема наблюдается при вставке из буфера и дальнейшей корректировки текста…

        • Хорошее решение!

  6. Светлана 05.04.2011 в 14:02

    Материал очень понравился.
    Пример дополнила циклом на поиск во всем тексте

  7. P.S. Тематические сессии идут по циклу. То есть на следующей неделе будет сессия №3 и так далее до 17. После этого будет выложена сессия №1.