+7(499)-938-42-58 Москва
+7(800)-333-37-98 Горячая линия

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

Как форматировать дату, число 1С 8.3, 1С 8.2 Применение функции Формат(), ЧислоПрописью(), НСтр() и т.д. Примеры для разработчика 1С

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

Сегодня мы ответим на эти вопросы и пройдем по основным вариантам использования и применения функции Формат() при разработке в 1С.

Функция Формат() в 1С используется при конвертации логических, строковых, числовых данных, данных в формате даты и времени между собой в нужных программисту 1С комбинациях.

1С описывает функцию Формат() в синтаксис-помощнике , привязывая ее к Глобальному контексту.

В синтаксисе у функции имеется два параметра. Первый параметр — исходное значение, которое необходимо преобразовать, второй — строка, описывающая метод, которым будет выполнено преобразование. Возвращаемое значение — строка.

С текстом синтаксис-помощника Вы можете ознакомиться в низу статьи, под спойлером.

Итак, после ознакомления с официальной теоретической версией, перейдем к реальной ситуации. Будем рассматривать конкретные примеры использования функции.

Как в 1С 8.3 форматировать число

Например, нужно преобразовать число 123456.789 так, чтобы десятичные знаки были округлены до сотых, и общее число знаков было 10. Причем, нужно отметить, что для дробных чисел параметр ЧЦ используется обязательно с ЧДЦ.

ФорматированноеЗначение = Формат(123456.789, “ЧЦ=10; ЧДЦ=2”); ФорматированноеЗначение  = “123 456,79”;

ФорматированноеЗначение = Формат(123456.789, “ЧЦ=10; ЧДЦ=2”);ФорматированноеЗначение  = “123 456,79”;

Замена символа-разделителя десятичной и целой части. В данном случае запятая будет заменена на тире.

ФорматированноеЗначение = Формат(123456.789, “ЧРД='-'”); ФорматированноеЗначение  = “123 456-789”

ФорматированноеЗначение = Формат(123456.789, “ЧРД='-'”);ФорматированноеЗначение  = “123 456-789”

Замена разделителя разрядов

ФорматированноеЗначение = Формат(500500500, “ЧРГ=/”); Сообщить(ФорматированноеЗначение); // Ответ 500/500/500

ФорматированноеЗначение = Формат(500500500, “ЧРГ=/”);Сообщить(ФорматированноеЗначение); // Ответ 500/500/500

Форматирование отрицательного числа.

ФорматированноеЗначение = Формат(-123456.789, “ЧО=0”); Сообщить(“Ответ ” + ФорматированноеЗначение); // Ответ (123 456,789) ФорматированноеЗначение = Формат(-123456.789, “ЧО=1”); Сообщить(“Ответ ” + ФорматированноеЗначение); // Ответ -123 456,789 ФорматированноеЗначение = Формат(-123456.789, “ЧО=2”); Сообщить(“Ответ ” + ФорматированноеЗначение); // Ответ – 123 456,789

ФорматированноеЗначение = Формат(-123456.789, “ЧО=0”);Сообщить(“Ответ ” + ФорматированноеЗначение); // Ответ (123 456,789)ФорматированноеЗначение = Формат(-123456.789, “ЧО=1”);Сообщить(“Ответ ” + ФорматированноеЗначение); // Ответ -123 456,789ФорматированноеЗначение = Формат(-123456.789, “ЧО=2”);Сообщить(“Ответ ” + ФорматированноеЗначение); // Ответ – 123 456,789

Случаи форматирования значений числа, даты в пропись

Здесь мы немного отойдем от функции Формат() и для описания наиболее востребованных вариантов преобразования чисел в строку приведем примеры применения функций ЧислоПрописью(), НСтр() и ПредставлениеПериода() (аналог функции из 1С 7.7 ПериодСтр()). Эти функции позволяют выполнить представление числа прописью в соответствии с форматной строкой

ФорматированноеЗначение = ЧислоПрописью(1234.56); Сообщить(“Ответ ” + ФорматированноеЗначение); // Ответ Одна тысяча двести тридцать четыре 56 ФорматированноеЗначение = ЧислоПрописью(1234.

56,,”рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2″); Сообщить(“Ответ ” + ФорматированноеЗначение); // Ответ Одна тысяча двести тридцать четыре рубля 56 копеек ФорматированноеЗначение = Формат('20160311163005', “ДЛФ=ДД”); Текст = “ru = “”” + ФорматированноеЗначение + ” – дата нашей статьи;””; en = “”Date of our article ” + ФорматированноеЗначение + “”””; Сообщить(НСтр(Текст,”ru”)); Сообщить(НСтр(Текст,”en”)); ФорматированноеЗначение = ПредставлениеПериода(НачалоКвартала(Дата(“20160111”)),КонецКвартала(Дата(“20160411″)),”ФП=Истина”); Сообщить(ФорматированноеЗначение); // Ответ 1 полугодие 2016 г.

ФорматированноеЗначение = ЧислоПрописью(1234.56);Сообщить(“Ответ ” + ФорматированноеЗначение); // Ответ Одна тысяча двести тридцать четыре 56ФорматированноеЗначение = ЧислоПрописью(1234.56,,”рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2″);Сообщить(“Ответ ” + ФорматированноеЗначение); // Ответ Одна тысяча двести тридцать четыре рубля 56 копеекФорматированноеЗначение = Формат('20160311163005', “ДЛФ=ДД”);Текст = “ru = “”” + ФорматированноеЗначение + ” – дата нашей статьи;””; en = “”Date of our article ” + ФорматированноеЗначение + “”””;Сообщить(НСтр(Текст,”ru”));Сообщить(НСтр(Текст,”en”));ФорматированноеЗначение  = ПредставлениеПериода(НачалоКвартала(Дата(“20160111”)),КонецКвартала(Дата(“20160411″)),”ФП=Истина”);Сообщить(ФорматированноеЗначение); // Ответ 1 полугодие 2016 г.

Как в 1С 8.3 форматировать дату

Применяя функцию Формат() в 1С 8.2, 1С 8.3 можно представить дату и время самыми различными комбинациями.

Источник: http://www.advanter.net/kak-formatirovat-datu-chislo-1s-8-3-1s-8-2-primenenie-funkcii-format-primery-dlya-razrabotchika-1s/

Формат в 1С 8.2 и 8.3

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

При работе с 1С постоянно требуется выводить числа или даты в каком-либо особенном, либо просто в пристойном, виде. Для всего этого существует функция Формат(), о ней собственно и пойдет речь.

Общие сведения о функции Формат()

Если упростить, то функция Формат() позволяет превратить число, дату или булево в строку. Функция Формат() принимает два параметра:

  • — это собственно то значения, которому мы хотим придать какой-либо вид, это может быть число, дата или булево. Параметр обязательный.
  • — второй параметр, в котором и заключается весь смысл функции Формат(), об этом параметре поговорим более подробно.

Следует сказать, что форматная строка не является обязательным параметром, и в этом случаем функция Формат() отличается от функции Строка() только тем, что для значений по умолчанию для типов Число и Дата (0 и 01.01.0001 00:00:00 соответственно) функция Формат() вернет пустую строку.

&НаКлиенте Процедура ТестФормат(Команда) Сообщить(Формат(0)); // КонецПроцедуры

Процедура ТестФормат(Команда)

В остальных же случаях форматная строка является строковым значением, которое состоит из одного или нескольких параметров форматирования, которые разделяются символом “;”.

Каждый параметр форматирования состоит из имени, знака “=” и значения параметра. При этом значение параметра можно указывать в одинарных или двойных кавычках, это в тех случаях, когда значение параметра содержит символы используемые в синтаксисе форматной строки (например знак “;”).

&НаКлиенте Процедура ТестФормат(Команда) Сообщить(Формат(3.1234, “ЧДЦ=2; ЧРД=';'”)); //3;12 КонецПроцедуры

Процедура ТестФормат(Команда)    Сообщить(Формат(3.1234, “ЧДЦ=2; ЧРД=';'”)); //3;12

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

&НаКлиенте Процедура ТестФормат(Команда) Сообщить(Формат('20170327', “ДФ=гггг+ММ=дд”)); //2017+03=27 КонецПроцедуры

Процедура ТестФормат(Команда)    Сообщить(Формат('20170327', “ДФ=гггг+ММ=дд”)); //2017+03=27

Параметры форматирования

Л (L) — указание языка и страны для которой будет выполняться стандартное форматирование, полный список доступен в синтаксис-помощнике.

&НаКлиенте Процедура ТестФормат(Команда) Сообщить(Формат('20170327201510', “Л=ru_RU”)); //27.03.2017 20:15:10 Сообщить(Формат('20170327201510', “Л=en_US”)); //3/27/2017 8:15:10 PM КонецПроцедуры

Процедура ТестФормат(Команда)    Сообщить(Формат('20170327201510', “Л=ru_RU”)); //27.03.2017 20:15:10    Сообщить(Формат('20170327201510', “Л=en_US”)); //3/27/2017 8:15:10 PM

Преобразование числа в строку

ЧЦ (ND) — максимальная длина целой части числа. Исходное число при этом округляется по правилу “Окр15как20”. Если указан этот параметр, то для отображения дробной части обязательно использовать параметр «ЧДЦ» о котором ниже.

&НаКлиенте Процедура ТестФормат(Команда) Сообщить(Формат(9.49, “ЧЦ=2”)); //9 Сообщить(Формат(9.51, “ЧЦ=2”)); //10 КонецПроцедуры

Процедура ТестФормат(Команда)    Сообщить(Формат(9.49, “ЧЦ=2”)); //9    Сообщить(Формат(9.51, “ЧЦ=2”)); //10

ЧДЦ (NFD) — максимальная длина дробной части числа. Исходное число при этом округляется по правилу “Окр15как20”.

&НаКлиенте Процедура ТестФормат(Команда) Сообщить(Формат(9.49, “ЧЦ=2; ЧДЦ=1”)); //9,5 Сообщить(Формат(9.51, “ЧЦ=2; ЧДЦ=1”)); //9,5 КонецПроцедуры

Процедура ТестФормат(Команда)    Сообщить(Формат(9.49, “ЧЦ=2; ЧДЦ=1”)); //9,5    Сообщить(Формат(9.51, “ЧЦ=2; ЧДЦ=1”)); //9,5

ЧС (NS) — указывает сдвиг разрядов: положительный — деление, отрицательный — умножение.

&НаКлиенте Процедура ТестФормат(Команда) Сообщить(Формат(3210.0123, “ЧС=2”)); //32,100123 Сообщить(Формат(3210.0123, “ЧС=-2”)); //321001,23 КонецПроцедуры

Процедура ТестФормат(Команда)    Сообщить(Формат(3210.0123, “ЧС=2”)); //32,100123    Сообщить(Формат(3210.0123, “ЧС=-2”)); //321001,23

ЧРД (NDS) — позволяет указать каким символом разделять целую и дробную части числа.

&НаКлиенте Процедура ТестФормат(Команда) Сообщить(Формат(6543210.23, “ЧРД==”)); //6543210=23 КонецПроцедуры

Процедура ТестФормат(Команда)    Сообщить(Формат(6543210.23, “ЧРД==”)); //6543210=23

ЧРГ (NGS) — позволяет указать каким символом разделять группы целой части числа. Если значением параметра будет пустая строка, то группы будут разделены неразрывным пробелом.

&НаКлиенте Процедура ТестФормат(Команда) Сообщить(Формат(6543210.23, “ЧРГ=.”)); //6.543.210,23 КонецПроцедуры

Процедура ТестФормат(Команда)    Сообщить(Формат(6543210.23, “ЧРГ=.”)); //6.543.210,23

ЧН (NZ) — представление нулевого значения. Если параметр отсутствует, то нулевое значение будет представлено пустой строкой. Если параметр указан в виде “ЧН=”, то представлением нулевого значения будет “0”.

&НаКлиенте Процедура ТестФормат(Команда) Сообщить(Формат(0, “ЧН='Ничего нет'”)); //Ничего нет КонецПроцедуры

Процедура ТестФормат(Команда)    Сообщить(Формат(0, “ЧН='Ничего нет'”)); //Ничего нет

ЧВН (NLZ) — вывод лидирующих нулей. Параметр не имеет значения, само наличие “ЧВН=” уже свидетельствует о необходимости выводить лидирующие нули.

&НаКлиенте Процедура ТестФормат(Команда) Сообщить(Формат(12345, “ЧЦ=10; ЧВН=”)); //0000012345 КонецПроцедуры

Процедура ТестФормат(Команда)    Сообщить(Формат(12345, “ЧЦ=10; ЧВН=”)); //0000012345

ЧГ (NG) — позволяет указать способ группировки для целой части числа. В качестве значения, через запятую указываются числа. Смысл имеют только первые два числа, поэтому один из вариантов предлагаемых конструктором форматной строки выглядит странно. Все группировки отсчитываются справа налево.

Конструктор форматной строки

Всего есть несколько основных вариантов значения параметра:

  • “0” — все число представляется одной группой;
  • “x” — создается одна группа размером в “x” символов, остальные числа представляется одной отдельной группой;
  • “x, 0” — все число делится на группы размера “x”;
  • “x, y” — создается одна группа размером “x” символов, остальные числа делятся на группы размеров “y” символов.

&НаКлиенте Процедура ТестФормат(Команда) Сообщить(Формат(987654321, “ЧГ=0”)); //987654321 Сообщить(Формат(987654321, “ЧГ=2”)); //9876543 21 Сообщить(Формат(987654321, “ЧГ=2,0”)); //9 87 65 43 21 Сообщить(Формат(987654321, “ЧГ=4,2”)); //9 87 65 4321 КонецПроцедуры

Процедура ТестФормат(Команда)    Сообщить(Формат(987654321, “ЧГ=0”)); //987654321    Сообщить(Формат(987654321, “ЧГ=2”)); //9876543 21    Сообщить(Формат(987654321, “ЧГ=2,0”)); //9 87 65 43 21    Сообщить(Формат(987654321, “ЧГ=4,2”)); //9 87 65 4321

ЧО (NN) — представление отрицательных чисел:

  • 0 (0) — строка вида «(1,1)»;
  • 1 (1) — строка вида «-1,1»;
  • 2 (2) — строка вида «- 1,1»;
  • 3 (3) — строка вида «1,1-«;
  • 4 (4) — строка вида «1,1 -«.

&НаКлиенте Процедура ТестФормат(Команда) Сообщить(Формат(-123, “ЧО=0”)); //(123) Сообщить(Формат(-123, “ЧО=1”)); //-123 Сообщить(Формат(-123, “ЧО=2”)); //- 123 Сообщить(Формат(-123, “ЧО=3”)); //123- Сообщить(Формат(-123, “ЧО=4”)); //123 – КонецПроцедуры

Процедура ТестФормат(Команда)    Сообщить(Формат(-123, “ЧО=0”)); //(123)    Сообщить(Формат(-123, “ЧО=1”)); //-123    Сообщить(Формат(-123, “ЧО=2”)); //- 123    Сообщить(Формат(-123, “ЧО=3”)); //123-    Сообщить(Формат(-123, “ЧО=4”)); //123 –

Преобразование даты в строку

ДФ (DF) — формат даты:

  • д (d) — день месяца (цифрами) без лидирующего нуля;
  • дд (dd) — день месяца (цифрами) с лидирующим нулем;
  • ддд (ddd) — краткое название дня недели*;
  • дддд (dddd) — полное название дня недели*;
  • М (M) — номер месяца (цифрами) без лидирующего нуля;
  • ММ (MM) — номер месяца (цифрами) с лидирующим нулем;
  • МММ (MMM) — краткое название месяца*;
  • ММММ (MMMM) — полное название месяца*;
  • к (q) — номер квартала в году;
  • г (y) — номер года без века и лидирующего нуля;
  • гг (yy) — номер года без века с лидирующим нулем;
  • гггг (yyyy) — номер года с веком;
  • ч (h) — час в 12 часовом варианте без лидирующих нулей;
  • чч (hh) — час в 12 часовом варианте с лидирующим нулем;
  • Ч (H) — час в 24 часовом варианте без лидирующих нулей;
  • ЧЧ (HH) — час в 24 часовом варианте с лидирующим нулем;
  • м (m) — минута без лидирующего нуля;
  • мм (mm) — минута с лидирующим нулем;
  • с (s) — секунда без лидирующего нуля;
  • сс (ss) — секунда с лидирующим нулем;
  • вв (tt) — отображение половины дня AM/PM (действительно только для языков конфигурирования, поддерживающих 12 часовой вариант представления времени).

* — не используется для форматной строки поля ввода даты.

&НаКлиенте Процедура ТестФормат(Команда) Сообщить(Формат('20170327231510', “ДФ='дддд чч:мм:сс вв'”)); //понедельник 11:15:10 PM Сообщить(Формат('20170327231510', “ДФ='дд ММММ гггг'”)); //27 марта 2017 КонецПроцедуры

Процедура ТестФормат(Команда)    Сообщить(Формат('20170327231510', “ДФ='дддд чч:мм:сс вв'”)); //понедельник 11:15:10 PM    Сообщить(Формат('20170327231510', “ДФ='дд ММММ гггг'”)); //27 марта 2017

ДЛФ (DLF) — локальный формат даты. Указывается вариант отображения частей даты:

  • Д (D) — дата (цифрами);
  • ДД (DD) — длинная дата (месяц прописью);
  • В (T) — полное время, дата может объединяться со временем;
  • ДВ (DT) — дата время.

&НаКлиенте Процедура ТестФормат(Команда) Сообщить(Формат('20170327231510', “ДЛФ=Д”)); //27.03.2017 Сообщить(Формат('20170327231510', “ДЛФ=ДД”)); //27 марта 2017 г. Сообщить(Формат('20170327231510', “ДЛФ=В”)); //23:15:10 Сообщить(Формат('20170327231510', “ДЛФ=ДВ”)); //27.03.2017 23:15:10 КонецПроцедуры

Процедура ТестФормат(Команда)    Сообщить(Формат('20170327231510', “ДЛФ=Д”)); //27.03.2017    Сообщить(Формат('20170327231510', “ДЛФ=ДД”)); //27 марта 2017 г.    Сообщить(Формат('20170327231510', “ДЛФ=В”)); //23:15:10    Сообщить(Формат('20170327231510', “ДЛФ=ДВ”)); //27.03.2017 23:15:10

ДП (DE) — представление пустой даты.

&НаКлиенте Процедура ТестФормат(Команда) Сообщить(Формат('00010101', “ДП='Пустая дата'”)); //Пустая дата КонецПроцедуры

Процедура ТестФормат(Команда)    Сообщить(Формат('00010101', “ДП='Пустая дата'”)); //Пустая дата

Преобразование булево в строку

БЛ (BF) — представление логического значения Ложь.

&НаКлиенте Процедура ТестФормат(Команда) Сообщить(Формат(Ложь, “БЛ='Неправда'”)); //Неправда КонецПроцедуры

Процедура ТестФормат(Команда)    Сообщить(Формат(Ложь, “БЛ='Неправда'”)); //Неправда

БИ (BT) — представление логического значения Истина.

&НаКлиенте Процедура ТестФормат(Команда) Сообщить(Формат(Истина, “БИ='Правда'”)); //Правда КонецПроцедуры

Процедура ТестФормат(Команда)    Сообщить(Формат(Истина, “БИ='Правда'”)); //Правда

Число без пробелов

&НаКлиенте Процедура ЧислоБезПробелов(Команда) Сообщить(Формат(987654321.123, “ЧГ=0”)); //987654321,123 КонецПроцедуры

Процедура ЧислоБезПробелов(Команда)    Сообщить(Формат(987654321.123, “ЧГ=0”)); //987654321,123

Дата без времени

&НаКлиенте Процедура ДатаБезВремени(Команда) Сообщить(Формат('20170327231510', “ДЛФ=Д”)); //27.03.

2017 Сообщить(Формат('20170327231510', “ДФ='дд ММММ гггг'”));//27 марта 2017 КонецПроцедуры

Процедура ДатаБезВремени(Команда)    Сообщить(Формат('20170327231510', “ДЛФ=Д”)); //27.03.2017    Сообщить(Формат('20170327231510', “ДФ='дд ММММ гггг'”));//27 марта 2017

А также еще множество вариантов.

Месяц прописью из даты

&НаКлиенте Процедура ТестФормат(Команда) Сообщить(Формат('20170227231510', “ДФ=МММ”));//февр.

Сообщить(Формат('20170227231510', “ДФ=ММММ”));//Февраль КонецПроцедуры

Процедура ТестФормат(Команда)    Сообщить(Формат('20170227231510', “ДФ=МММ”));//февр.    Сообщить(Формат('20170227231510', “ДФ=ММММ”));//Февраль

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Загрузка…

Источник: https://1c-programmer-blog.ru/yazyk-1s/globalnyj-kontekst/format-v-1s.html

Разбираемся с WebKit в 1С, на примере интеграции TinyMCE в управляемую форму в УТ 11.4

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

Многие уже знают, что в релизе платформы 8.3.14.1565, браузер Internet Explorer был заменен на Web-Kit, это на самом деле большой шаг вперед, но я уверен, многим, как и мне, пока не совсем понятно, что к чему. Возник опыт использования web-kit в 1С, вызова JS из 1С и вызова 1С из JS.

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

Все началось с того, что возникла задача: «Хотим, в УТ, вводить форматированное описание для товара, чтобы оно потом летело в интернет-магазин», потому что стандартное описание для товара прилетает сплошной строкой без переносов и выглядит очень не очень.

Сразу возникло желание использовать форматированный документ, там и редактор простенький есть, и в HTML можно выгрузить. Но как только я показал сформированный форматированным документом HTML веб-разработчикам, они сразу замахали руками и сказал, что так не пойдет.

На сайте уже есть свои стили для отображения нужных блочных элементов и поведение такого рода текста может стать непредсказуемым. Функция ПолучитьHTML, форматированного документа возвращает полностью сформированную страницу HTML, со всей структурой тегов, а что самое неприятное, с inline-стилями. Выглядит это так.

Абзац

жирный текст

красный текст

И если получить содержимое тега body это простая задача, то заниматься парсингом и вырезать атрибуты стиля из тегов совсем не хотелось. TinyMCE же возвращает приятного вида верстку. Позволяя себе inline-стили только в случае с цветом, что уже гораздо лучше.

Абзац

Жирный

Красный

Было принято решение интегрировать сторонний редактор текста TinyMCE. К тому же опыт его интеграции сообществом 1С уже довольно большой. Может быть это было ошибкой тогда, и нужно было просто парсить текст сформированный форматированным документом, но имеем, что имеем.

1.Особенности решения

Так как 1С не разрешает подгружать на страницу в поле HTML локальные файлы из файловой системы, для этого обязательно нужен веб-сервер или хотя бы адрес этого файла во временном хранилище, то положить js-библиотеку Tiny рядышком с 1С и подгружать ее в заголовках HTML документа нельзя — придется сформировать еще и файл с HTML-версткой который внутри себя формирует готовое окно редактора и его уже подключать к HTML документу. Вообще, на самом деле, подгрузить библиотеку, если получить для нее адрес в хранилище, можно, если бы она была скомпилирована в один файл, а Tiny помимо основной библиотеки содержит еще и js-файлы плагинов, менеджер стилей, и сами файлы стилей, русификаторов, иконок и т.д., и как сами понимаете это довольно сильно усложняет задачу. В одно время даже возникла идея скомпилировать все это добро в один файл и не знать проблем, но разбираться в инструментах было долго. Потом был найден TinyMCE Builder на официальном сайте, который компилирует весь js в один файл и это же было бы маленькой победой, если бы он так же поступал с css, но нет, css по-прежнему лежал рядом в нескольких папках. TinyMCE для окна редактирования создает iframe, который сам по себе является встроенным в страницу HTML-документом, так что события возникающие в этом iframe 1С не может отследить, об этом ниже. Конфигурация УТ 11.4 на момент разработки имела режим совместимости 8.3.12, так что по факту сейчас она использовала IE в качестве встроенного браузера, но дальнейшее обновление подразумевало переход на новые версии, которые уже используют web-kit.

2. Первые шаги

Основные отличия в работе с web-kit:

Основной объект ПоляHTML теперь имеет другую структуру и, для того чтобы работать с содержимым страницы нужно использовать свойство defaultView

Элементы.ПолеHTML.Document.DefaultView
раньше для этого использовалось свойство parentWindow Элементы.ПолеHTML.Document.parentWindow Запрет на использование eval, который раньше повсеместно использовался для вызова JS кода. Что-то вроде этого Элементы.ПолеHTML.Document.parentWindow.eval(«alert('Вызов кода из 1С')») Зато можно обращаться к методам напрямую из 1С. Элементы.ОписаниеHTML.Document.DefaultView.НазваниеМетодаJS(); И я быстро соорудил оберточные функции для всех методов Tiny которые мне нужны. function GetText(){ return tinyMCE.activeEditor.getContent({format: “text”});}function SetText(text){ return tinyMCE.activeEditor.setContent(text);}function GetHTML(){ return tinyMCE.activeEditor.getContent();} К которым дальше обращался из 1С так ОбъектHTML = Элементы.ОписаниеHTML.Document.DefaultView; ОписаниеHTMLДляСайта = ОбъектHTML.GetHTML();Описание = ОбъектHTML.GetText(); Хотя можно было бы обойтись и прямыми обращениями к объекту редактора, например так Элементы.ПолеHTML.Документ.defaultView.tinyMCE.activeEditor.getContent() Сразу была скачана обработка из публикации (автору отдельный респект), которая показала мне много интересностей. Она более-менее работала на IE, но на webkit не работал копи-паст, сначала это вызвало ступор, но дальше стало понятно, что это из-за iframe поле HTML не активировалось при нажатии внутри него, так как нажатие фактически происходило во вложенном документе HTML, события которого где-то застревали по пути к 1С. И потому если нажать Ctrl+C в одном месте формы и попытаться вставить внутри поля редактора, то текст вставится в том поле откуда был копирован потому что поле HTML документа не активируется. То же происходит и в обратном случае, сочетания клавиш для копирования и вставки не работают. Сначала возникла мысль, что это косяк Tiny, и он блокирует непосредственную вставку из буфера, как CKEditor, который предлагает отдельное окно для вставки из буфера. Но проверить это было довольно легко, я создал пустой документ с одним полем ввода и попробовал копирования и вставки Как видите все работает. Значит проблема где-то в Tiny или во взаимодействии с 1С.

3. Решение

Для решения проблемы с взаимодействием браузера и 1С был применен обычный прием, я создал невидимую кнопку на странице HTML, и планировал нажимать на нее из JS при возникновении нужных событий внутри страницы, которые 1С перехватывала бы в событии ПриНажатии HTMLДокумента.

Но при каком событии осуществлять программное нажатие? Верстка выглядит примерно так: И функция для вызова события нажатия на кнопку function clickButton() { button1c.

click();} Раньше можно было передать объект формы 1С в поле HTML как объект, и из-за того, что IE подключался к 1С по COM, форма как-то сама конвертировалась в понятный для IE объект и можно было вызывать экспортный функции формы 1С прямо из кода JS. Теперь так нельзя.

Была изучена документация по API Tiny, и найдена конструкция для перехвата обработчиков событий и подходящая комбинация событий, которая должна активировать поле HTML документа tinymce.activeEditor.on('click', function(e){clickButton(e)}); tinymce.activeEditor.

on('KeyDown', function(e){clickButton(e)});
Нужно поместить этот код в том месте, когда Tiny уже проинициализровался. Я сделал это в обработчике onload объекта window. Но можно сделать более красиво и разместить код при инициализации Tiny в параметре: init_instance_callback Теперь все должно быть в порядке.

И форма должна работать как надо… Стало сильно лучше, поле HTML действительно стало активироваться, но не всегда, почему-то некоторые нажатия не вызывали перехода фокуса к полю: На этой записи видно, что если нажать в строку, где мигает курсор, то фокус поля работает как нужно, но если нажать ниже, то активации поля не происходит.

Это был досадный артефакт, и попытки понять, что происходит не давали никакого решения. Я выводил алерты в обработчик и алерты выводились, но 1С не реагировала на событие ПриНажатии

Внезапно пришла в голову идея, а что, если 1С не успевает обработать событие происходящее в поле, что если немного затормозить выполнение JS скрипта, и посмотреть, что получится. Быстро была реализована функция паузы в JS с помощью промисов и async await. Как видите в JS ее тоже нет по умолчанию и ничего, живут люди). function sleep(ms){ return new Promise(resolve => setTimeout(resolve, ms)); } async function clickButton(e){ await sleep(1); button1c.click(); } Здесь я устанавливаю задержку в одну миллисекунду, перед нажатием на кнопку. И вуаля, все заработало. 1С стала вовремя обрабатывать нажатие на кнопку.

4. Допиливаем обмен

Так как для хранения нового описания в формате HTML, был добавлен новый реквизит к справочнику, то нам нужно подменить значение типового поля при выгрузке. Для этого в модуле ОбменССайтомПереопределяемый, добавляем в расширение функцию ПолучитьТекстыЗапросовКаталог, и пишем там: ТекстыЗапросов.

Номенклатура = СтрЗаменить(ТекстыЗапросов.Номенклатура, “Номенклатура.Описание”, “Номенклатура.ОписаниеHTML_ОписаниеHTMLДляСайта”); На этом все. Запускаем обмен и все работает, остается только внести изменения на сайте, если это нужно, чтобы описание товара воспринималось как верстка а не как строка.

Резюме

На данном примере я попробовал взаимодействие JS WebKit и 1С, пособирал грабли и нашел решение. Возможно для решения этой задачи было проще распарсить и очистить HTML-текст из форматированного документа, но было бы не так интересно и возможно получило бы какие-то проблемы при каких-то сложных вариантах форматирования.

Спасибо, что прочитали.

  • 1с:предприятие
  • javascript
  • webkit

Хабы:

Источник: https://habr.com/post/481768/

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.