Кодирование и конвертирование данных в 1С:Предприятие 8.x

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

Приведение простых типов к типу Строка

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

Функция Формат

Штатное приведение числового значения к строковому функцией Строка(...) выполняется быстрее всего, но оно выполняется в соответствии с региональными настройками представления чисел (в частности с разделителем разрядов непереносимым пробелом и локальным разделителем дробной части). Если подобные "вольности" преобразования числа недопустимы, следует использовать функцию Формат(<Значение>,<ФорматнаяСтрока>). Таблица содержит правила форматирования для типа Число:

вид Форматной Строки Формат(<Параметры>) = Описание
- (1234567.89)
(0)
1 234 567,89 Отсутствие строки форматирования эквивалентно функции Строка(...)
ЧЦ (ND)
(число цифр)
(1234567.89,"ЧЦ=10;")
(1234567.89,"ЧЦ=7;")
(1234567.89,"ЧЦ=6;")
1 234 568
1 234 568
999 999
общее число отображаемых десятичных разрядов целой и дробной частей. Исходное число округляется при этом в соответствии с правилами округления Окр15как20. Если указан этот параметр, то для отображения дробной части числа обязательно указание параметра ЧДЦ, иначе дробная часть отображаться не будет.
ЧВН ()
(число вывод нуля)
(1234567.89,"ЧЦ=9;ЧВН=;")
(1234567.89,"ЧЦ=6;ЧВН=;")
001 234 568
999 999
если параметр указан, лидирующие нули выводятся. Если не указан - лидирующие нули не выводятся. Значение параметра игнорируется.
ЧН (NZ)
(число ноль)
(0,"ЧН=;")
(0,"ЧН=;ЧЦ=9;")
(0,"ЧЦ=9;ЧН=;ЧВН=;")
0
0
000 000 000
строка, представляющая нулевое значение числа. Если не задано, то представление в виде пустой строки. Если задано "ЧН=", то в виде "0". Не используется для числовых полей ввода.
ЧРГ (NGS)
(число разделитель групп)
(1234567.89,"ЧРГ=;")
(1234567.89,"ЧРГ=")
(1234567.89,"ЧРГ=+;")
(1234567.89,"ЧРГ=0;")
1 234 567,89
1234`567,89
1+234+567,89
102340567,89
символ-разделитель групп целой части числа. Если в качестве разделителя использовать пустую строку, то в этом случае разделителем будет символ неразрывного пробела.
ЧГ (NG)
число группа
(1234567.89,"ЧГ=;")
(1234567.89,"ЧГ=0;")
(1234567.89,"ЧГ=3;")
(1234567.89,"ЧГ=3,2;")
1234567,89
1234567,89
1234 567,89
12 34 567,89
порядок группировки разрядов числа. В качестве значения указываются числа, через запятую, обозначающие количество группируемых разрядов справа налево. Имеют смысл только два первых числа. Первое из них указывает первичную группировку, то есть ту, которая будет использована для наименее значимых разрядов целой части числа. Если второе число не указано, то будут сгруппированы только наименее значимые разряды. Если в качестве второго числа задан 0, то для всех разрядов целой части числа будет применено значение указанное для первичной группировки. Если в качестве второго числа используется значение, отличное от 0, то это значение будет использовано для группировки всех разрядов, кроме уже сгруппированных наименее значимых.
ЧРД (NDS)
число разделитель дробной части
(1234567.89,"ЧРД=;")
(1234567.89,"ЧРД=.;")
(1234567.89,"ЧРД=:;")
1 234 567,89
1 234 567.89
1 234 567:89
символ-разделитель целой и дробной части.
ЧДЦ (NFD)
число десятичные цифры
(1234567.89,"ЧДЦ=0;")
(1234567.89,"ЧДЦ=1;")
(1234567.89,"ЧДЦ=3;")
1 234 567
1 234 567,9
1 234 567,890
число десятичных разрядов в дробной части. Исходное число округляется при этом в соответствии с правилами округления Окр15как20.
ЧО (NN)
число отрицательные
(-1234567.89,"ЧО=0")
(-1234567.89,"ЧО=1")
(-1234567.89,"ЧО=2")
(-1234567.89,"ЧО=3")
(-1234567.89,"ЧО=4")
(1 234 567,89)
-1 234 567,89
- 1 234 567,89
1 234 567,89-
1 234 567,89 -
представление отрицательных чисел.
ЧС (NS)
число сдвиг
(1234567.89,"ЧС=0;")
(1234567.89,"ЧС=1;")
(1234567.89,"ЧС=9;")
(1234567.89,"ЧС=-6;")
1 234 567,89
123 456,789
0,00123456789
1 234 567 890 000
сдвиг разрядов: положительный - деление, отрицательный - умножение. Другими словами, это означает, что исходное число будет умножено или поделено на 10*С, где С - значение параметра по модулю.
ЧФ (NF)
число формат
(1234567.89,"ЧФ='Ч штук';")
(12345.89,"ЧФ='Вес: Ч';")
(123,"ЧФ='ЧЧЧ';")
1 234 567,89 штук
Вес: 12 345,89
123123123
шаблон форматирования числа. В строке можно использовать символ Ч(N) для указания позиции, в которую нужно вывести число. Число выводится с учетом остальных параметров, заданных в форматной строке. Остальные символы выводятся как есть. Символы, находящиеся между двойными или одинарными кавычками выводятся как есть. Шаблон форматирования не применяется к числу 0 (за исключением случая наличия в формате строки параметра "ЧН=").
Форматирование типа Булево
БЛ (BF)
булево Ложь
(Истина,"БЛ=Неправда;")
(Ложь,"БЛ=Неправда;")
Да
Неправда
строка, представляющая логическое значение Ложь.
БИ (BT)
булево Истина
(Истина,"БИ=Правда;")
(Ложь,"БИ=Правда;")
Правда
Нет
строка, представляющая логическое значение Истина.
БИ=;БЛ=;
булево Истина и Ложь
(Истина,"БИ=Свет;БЛ=Тьма")
(Ложь,"БИ=Свет;БЛ=Тьма")
Свет
Тьма
комбинированная форматная строка для типа Булево
Полезные комбинированные форматные строки
ЧГ=;ЧН=;
ноль и числа без групп
(0,"ЧГ=;ЧН=;")
(1234567,89,"ЧГ=;ЧН=;")
0
-1234567,89
отменяет числовые группы и выводит "0"
для обычного отображения и экспорта в Ecxel
ЧРД=.;ЧГ=0;ЧН=;
точка, ноль, без групп
(0,"ЧРД=.;ЧГ=0;ЧН=;")
(1234567.89,"ЧРД=.;ЧГ=0;ЧН=;")
0
1234567.89
использует десятичную точку, отменяет числовые группы и выводит "0"
для вычисления в формулах, для обмена данными и сериализации

Для преобразования к строке типа Дата используют другие виды форматных строк:

вид Форматной Строки Формат(<Параметры>) = Описание
- ('00010101000000')
('20060504010203')
01.02.2003 4:05:06 Отсутствие строки форматирования эквивалентно функции Строка(...)
ДФ (DF)
(дата формат)
('20030201040506', "ДФ='дддд дд.ММ.гггг ЧЧ:мм:сс'")
('20030201040506', "ДФ=""ддд дд ММММ гггг'г.'""")
('20030201040506', "ДФ='д.М.г Ч:м:с'")
суббота 01.02.2003 04:05:06
Сб 01 февраля 2003г.
1.2.3 4:5:6
формат даты позволяет задать произвольный способ преобразоания

  • числа дня
    • д (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 часовой вариант представления времени)
ДЛФ (DLF)
(дата локальный формат)
('20030201040506',"ДЛФ=Д")('20030201040506',"ДЛФ=ДД")
('20030201040506',"ДЛФ=В")
('20030201040506',"ДЛФ=ДДВ")
01.02.2003
1 февраля 2003 г.
4:05:06
1 февраля 2003 г. 4:05:06
локальный формат даты. Указывается вариант отображения частей даты.

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

Важно! Порядок следования опций форматной строки для ДЛФ <дата + время> (ДВ или ДДВ) не может быть изменен. При комбинировании ДФ и ДЛФ, приоритет получает ДФ, а ДЛФ игнорируется.

ДП (DE)
(дата пустая)
('00010101000000', "ДЛФ=Д;ДП='без даты'")
('20030201040506', "ДЛФ=Д;ДП='без даты'")
без даты
01.02.2003
формат пустой даты устанавливает текст представления пустой даты

///

Сериализация и десериализация

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

Сериализация 1С

Платформа 1С реализует собственный формат сериализации, который может быть использован в модулях с компиляцией &НаСервере парой функций прямого и обратного преобразования:

  • ЗначениеВСтрокуВнутр(<Значение>)
  • ЗначениеИзСтрокиВнутр(<Строка>)

Пример сериализации реквизита типа СписокЗначений:

Значение сериализации при этом будет строкой вида:

Сериализовать можно все простые типы, включая Массив, Структура и Соответствие, все типы коллекций. Поскольку прикладные типы могут включать каскады других прикладный типов непредсказуемой глубины, их сериализация выполняется только для ссылочного типа. Удивительным знаниям и трюкам, которые позволяет получить внутреннее строковое представление посвящена специальная публикация Внутри объектов 1С:Предприятие 8.х, которая основана на достаточно подробном описании формата публикации в источнике: Описание формата внутреннего представления данных 1С в контексте обмена данными //infostart.ru.

XML

Способ представления данных в формате XML можно назвать основным и нативным для 1С, поскольку он используется для внутреннего обмена через механизм XDTO между Клиентом и Сервером, он применим при любом типе компиляции метода и ко всем типам. Простейший способ сериализации произвольных данных использует метод глобального контекста  ЗаписатьXML():

Простейший способ десериализации использует метод глобального контекста ПрочитатьXML():

Описанные методы глобального контекста доступны только на Сервере. Более совершенным способом сериализации, который доступен и на Клиенте, и который позволяет использовать сериализацию в неидентичных конфигурациях использует объект типа СериализаторXDTO, использующий описание собственных типов конфигурации:

Десериализация использует методы объектов типа СериализаторXDTO и ЧтениеXML:

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

  • .УстановитьСтроку() - для использования сериализации типа Строка
  • .ОткрытьФайл() - для использования сериализации в файле
  • .ОткрытьПоток() - для использования сериализации типа Поток, ПотокВПамяти, ФайловыйПоток

FastInfoset

Способ является частным случаем XML, который используется при обновление классификатора КЛАДР в формате FastInfoSet в файлах .FI. Способ использует XML формат, но записанный в бинарном формате Fast Infoset (Recommendation X.891), поэтому сериализация не имеет строкового представления, а только файл или поток. Применяется совершенно аналогично способу XML, с той разницей, что типы ЧтениеFastInfoset и ЗаписьFastInfoset доступны только для компиляции на Сервере.

Пример кода преобразования бинарных данных FastInfoSet в xml-сериализацию:

JSON

Способ представления очень популярен и важен, поскольку является нативным для Java, поэтому платформа 1С поддерживает этот формат, подробно описанный тут //www.json.org и в Вики //ru.wikipedia.org.

Сериализация и десериализация JSON выполняется аналогично XML. Методы JSON также доступны в глобальном контексте при любом типе компиляции, но применимы не ко всем типам данных:

  • Неопределено - обратимо преобразуется в json-литерал null
  • Булево - обратимо преобразуется в json-литералы true или false
  • Число - обратимо преобразуется в число неограниченной длины с точностью до 27
  • Строка - обратимо преобразуется в строку в двойных кавычках (там где это необходимо используются escape-последовательности \', \", \\, \/, \t, \n, \r, \f, \b или записываются шестнадцатеричные коды в кодировке Unicode в виде \uFFFF)
  • Дата - необратимо преобразуется в строку формата YYYY-MM-DDTHH:MM:SS, при десериализации будет получена Строка.
  • Массив - обратимо преобразуется в json-массив вида [значение 0, значение 1,..., значение N]
  • Структура - обратимо преобразуется в json-запись вида { "ключ а": значение а, "ключ b": значение b, ...}
  • Соответствие - необратимо преобразуется в json-запись как Структура, в которой пары с ключом нарушающим правила идентификаторов полностью исключаются из преобразования, при десериализации вместо Соответствия будет получена Структура.

Попытка сериализации других типов приведет к исключению Передано значение недопустимого типа.

//

//

Base64

Этот широко распространенный стандарт кодирования преобразует двоичные данных в строковую последовательность, использующую только 64 символа ASCII, что позволяет упаковать любые двоичные данные в текст пригодный для внедрения в HTML или иной канал текстового обмена. Подробно стандарт Base64 описан на //ru.wikipedia.org

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

  • ДвоичныеДанные <<>> Строка
    • Base64Строка(<ДвоичныеДанные>) - возвращает строку сериализации base64
    • Base64Значение(<Строка>) - возвращает исходное значение типа ДвоичныеДанные
  • ДвоичныеДанные <<>> ДвоичныеДанные
    • ПолучитьBase64ДвоичныеДанныеИзДвоичныхДанных(<ДвоичныеДанные>)
    • ПолучитьДвоичныеДанныеИзBase64ДвоичныхДанных(<ДвоичныеДанные>)
  • БуферДвоичныхДанных <<>> БуферДвоичныхДанных
    • ПолучитьBase64БуферДвоичныхДанныхИзБуфераДвоичныхДанных(<Буфер>)
    • ПолучитьБуферДвоичныхДанныхИзBase64БуфераДвоичныхДанных(<Буфер>)


При использовании Base64 для упаковки тестовых данных большое значение имеет используемая кодировка текста. Платформа 1С предоставляет более 200 видов кодировки текста, по умолчанию использует кодировку UTF-8, а системной кодировкой Windows является ANSI. Для правильного декодирования данных необходимо точно знать и указать кодировку:

///

PHP

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

///

Кодирование UTF-8, UTF-16, ANSI/CP1251, OEM/CP866, KOI8-R

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

  • КодироватьСтроку(<Строка>, <СпособКодированияСтроки>, <КодировкаСтроки>)
  • РаскодироватьСтроку(<Строка>, <СпособКодированияСтроки>, <КодировкаСтроки>)

Параметр КодировкаСтроки, по умолчанию равный "UTF8", может быть установлен в "UTF16". При использовании "ANSI" или "OEM", вопреки справке, возникает исключение, однако нужный результат для русской кириллической кодировки можно получить используя значения "CP1251" и "CP866" соответственно, кроме того возможно использование значения "KOI8" или "KOI8-R".

Используя каскад Кодировать>>Раскодировать с отличающимися значениями параметра КодировкаСтроки удается даже реализовать перекодировку строк с исходной ошибкой в кодировке:

MD5

Штатный механизм платформы позволяет хешировать строки и файлы при помощи алгоритмов MD5, SHA1, SHA256 и CRC32. Хеширование выполняется методами объекта типа ХешированиеДанных, доступного для компиляции на Сервере:

Источник описывает еще три способа получения хэш-кода MD5: //1c-programmer-blog.ru

Двоичные данные

В релизе платформы 8.3.16 были добавлены операции для работы с двоичными данными и буфером двоичных данных

  • тип ДвоичныеДанные
  • тип БуферДвоичныхДанных

функции

  • ПолучитьДвоичныеДанныеИзHexСтроки()
  • ПолучитьHexСтрокуИзДвоичныхДанных

Побитовые операции с целыми числами

В релизе платформы 8.3.11.2867 были добавлены побитовые операции с x32 числами без знака.

  • ПобитовоеИ()
  • ПобитовоеИли()
  • ПобитовоеНе()
  • ПобитовоеИНе()
  • ПобитовоеИсключительноеИли()
  • ПобитовыйСдвигВлево()
  • ПобитовыйСдвигВправо()
  • ПроверитьБит()
  • ПроверитьПоБитовойМаске()
  • УстановитьБит()

 

 

.

Leave a Reply