Приведение простых типов к типу Строка
Приведение простого типа к строке происходит неявным вызовом функции Строка(), которая использует текущие региональные настройки среды пользователя ОС, и поэтому в различных системах и различных сеансах может возвращать различные результаты, что самом по себе не приемлемо во многих задачах. Приведение к строке сложных типов вообще не дает представление о содержании, а содержит только краткое имя типа.
Функция Формат
Штатное приведение числового значения к строковому функцией Строка(…) выполняется быстрее всего, но оно выполняется в соответствии с региональными настройками представления чисел (в частности с разделителем разрядов непереносимым пробелом и локальным разделителем дробной части). Если подобные «вольности» преобразования числа недопустимы, следует использовать функцию Формат(<Значение>,<ФорматнаяСтрока>). Таблица содержит правила форматирования для типа Число:
ВИД ФОРМАТНОЙ СТРОКИ | ФОРМАТ(<ПАРАМЕТРЫ>) | = | ОПИСАНИЕ | |
— | (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 |
формат даты позволяет задать произвольный способ преобразоания
|
ДЛФ (DLF)
(дата локальный формат) |
(‘20030201040506’,»ДЛФ=Д»)(‘20030201040506’,»ДЛФ=ДД»)
(‘20030201040506’,»ДЛФ=В») (‘20030201040506’,»ДЛФ=ДДВ») |
01.02.2003
1 февраля 2003 г. 4:05:06 1 февраля 2003 г. 4:05:06 |
локальный формат даты. Указывается вариант отображения частей даты.
Важно! Порядок следования опций форматной строки для ДЛФ <дата + время> (ДВ или ДДВ) не может быть изменен. При комбинировании ДФ и ДЛФ, приоритет получает ДФ, а ДЛФ игнорируется. |
ДП (DE)
(дата пустая) |
(‘00010101000000’, «ДЛФ=Д;ДП=’без даты'»)
(‘20030201040506’, «ДЛФ=Д;ДП=’без даты'») |
без даты
01.02.2003 |
формат пустой даты устанавливает текст представления пустой даты |
///
Сериализация и десериализация
Понятие сериализации данных применяется, когда некоторые данные некоторого типа необходимо преобразовать в строковую последовательность, но не с целью представления, а для передачи средствами какого-либо потока. После прохождения сериализованной строковой последовательностью потока она должна быть точно преобразована к первоначальному или эквивалентному типу с эквивалентным значением.
Сериализация 1С
Платформа 1С реализует собственный формат сериализации, который может быть использован в модулях с компиляцией &НаСервере парой функций прямого и обратного преобразования:
- ЗначениеВСтрокуВнутр(<Значение>)
- ЗначениеИзСтрокиВнутр(<Строка>)
Пример сериализации реквизита типа СписокЗначений:
1
2 3 4 5 |
&НаСервере
… СериализованныйСписок = ЗначениеВСтрокуВнутр(НачальныйСписок); … КонечныйСписок = ЗначениеИзСтрокиВнутр(СериализованныйСписок); |
Значение сериализации при этом будет строкой вида:
1
2 3 4 5 6 |
{«#»,4772b3b4-f4a3-49c0-a1a5-8cb5961511a3,
{6,1e512aab-1b41-4ef6-9375-f0137be9dd91,0,0, {2, { 1e512aab-1b41-4ef6-9375-f0137be9dd91, {«Сотня», 0, {«N»,100}, {4,0,{0},«»,—1,—1,0,0,«»} } |
Сериализовать можно все простые типы, включая Массив, Структура и Соответствие, все типы коллекций. Поскольку прикладные типы могут включать каскады других прикладный типов непредсказуемой глубины, их сериализация выполняется только для ссылочного типа. Описание формата внутреннего представления данных 1С в контексте обмена данными //infostart.ru.
XML
Способ представления данных в формате XML можно назвать основным и нативным для 1С, поскольку он используется для внутреннего обмена через механизм XDTO между Клиентом и Сервером, он применим при любом типе компиляции метода и ко всем типам. Простейший способ сериализации произвольных данных использует метод глобального контекста ЗаписатьXML():
1
2 3 4 5 6 |
&НаСервере
… ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.УстановитьСтроку(); ЗаписатьXML(ЗаписьXML, МоиДанные); МояСериализация = ЗаписьXML.Закрыть(); |
Простейший способ десериализации использует метод глобального контекста ПрочитатьXML():
1
2 3 4 5 |
&НаСервере
… ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.УстановитьСтроку(МояСериализация); МоиДанные = ПрочитатьXML(ЧтениеXML); |
Описанные методы глобального контекста доступны только на Сервере. Более совершенным способом сериализации, который доступен и на Клиенте, и который позволяет использовать сериализацию в неидентичных конфигурациях использует объект типа СериализаторXDTO, использующий описание собственных типов конфигурации:
1
2 3 4 5 6 7 |
&НаКлиентеНаСервере
… СериализаторXDTO = Новый СериализаторXDTO(ФабрикаXDTO); ЗаписьXML = Новый ЗаписьXML(); ЗаписьXML.УстановитьСтроку(); СериализаторXDTO.ЗаписатьXML(ЗаписьXML, МоиДанные, НазначениеТипаXML.Явное); МояСериализация = ЗаписьXML.Закрыть(); |
Десериализация использует методы объектов типа СериализаторXDTO и ЧтениеXML:
1
2 3 4 5 6 |
&НаКлиентеНаСервере
… СериализаторXDTO = Новый СериализаторXDTO(ФабрикаXDTO); ЧтениеXML = Новый ЧтениеXML(); ЧтениеXML.УстановитьСтроку(МояСериализация); МоиДанные = СериализаторXDTO.ПрочитатьXML(ЧтениеXML); |
Существует возможность использовать для сериализации не только тип Строка, но также файлы и потоки:
- .УстановитьСтроку() — для использования сериализации типа Строка
- .ОткрытьФайл() — для использования сериализации в файле
- .ОткрытьПоток() — для использования сериализации типа Поток, ПотокВПамяти, ФайловыйПоток
FastInfoset
Способ является частным случаем XML, который используется при обновление классификатора КЛАДР в формате FastInfoSet в файлах .FI. Способ использует XML формат, но записанный в бинарном формате Fast Infoset (Recommendation X.891), поэтому сериализация не имеет строкового представления, а только файл или поток. Применяется совершенно аналогично способу XML, с той разницей, что типы ЧтениеFastInfoset и ЗаписьFastInfoset доступны только для компиляции на Сервере.
Пример кода преобразования бинарных данных FastInfoSet в xml-сериализацию:
1
2 3 4 5 6 7 8 9 10 |
&НаСервере
… ЧтениеXML = Новый ЧтениеFastInfoSet; ЧтениеXML.УстановитьДвоичныеДанные(МоиДвоичныеДанные); ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.УстановитьСтроку(); Пока ЧтениеXML.Прочитать() Цикл ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); КонецЦикла; МояСериализация = Запись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-запись как Структура, в которой пары с ключом нарушающим правила идентификаторов полностью исключаются из преобразования, при десериализации вместо Соответствия будет получена Структура.
Попытка сериализации других типов приведет к исключению Передано значение недопустимого типа.
1
2 3 4 5 6 7 8 9 10 11 |
&НаКлиентеНаСервере
… ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(,Символы.Таб)); ЗаписатьJSON(ЗаписьJSON, МоиДанные); МояСериализация = ЗаписьJSON.Закрыть(); … ЧтениеJSON = Новый ЧтениеJSON; УстановитьСтроку(МояСериализация); МоиДанные = ПрочитатьJSON(ЧтениеJSON); ЧтениеJSON.Закрыть(); |
//
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
&AtClient
Function JsonDump(Value)
JSONWriter = New JSONWriter; JSONWriter.SetString(); WriteJSON(JSONWriter, Value); Return JSONWriter.Close();
EndFunction
&AtClient Function JsonLoad(Json)
JSONReader = New JSONReader; JSONReader.SetString(Json); Value = ReadJSON(JSONReader); JSONReader.Close(); Return Value;
EndFunction |
//
Base64
Этот широко распространенный стандарт кодирования преобразует двоичные данных в строковую последовательность, использующую только 64 символа ASCII, что позволяет упаковать любые двоичные данные в текст пригодный для внедрения в HTML или иной канал текстового обмена. Подробно стандарт Base64 описан на //ru.wikipedia.org
Для кодирования и обратного декодирование применяются три пары функций глобального контекста, доступных для любого типа компиляции, отличающиеся типом преобразуемых данных:
- ДвоичныеДанные <<>> Строка
- Base64Строка(<ДвоичныеДанные>) — возвращает строку сериализации base64
- Base64Значение(<Строка>) — возвращает исходное значение типа ДвоичныеДанные
- ДвоичныеДанные <<>> ДвоичныеДанные
- ПолучитьBase64ДвоичныеДанныеИзДвоичныхДанных(<ДвоичныеДанные>)
- ПолучитьДвоичныеДанныеИзBase64ДвоичныхДанных(<ДвоичныеДанные>)
- БуферДвоичныхДанных <<>> БуферДвоичныхДанных
- ПолучитьBase64БуферДвоичныхДанныхИзБуфераДвоичныхДанных(<Буфер>)
- ПолучитьБуферДвоичныхДанныхИзBase64БуфераДвоичныхДанных(<Буфер>)
При использовании Base64 для упаковки тестовых данных большое значение имеет используемая кодировка текста. Платформа 1С предоставляет более 200 видов кодировки текста, по умолчанию использует кодировку UTF-8, а системной кодировкой Windows является ANSI. Для правильного декодирования данных необходимо точно знать и указать кодировку:
1
2 3 4 5 6 7 8 9 10 |
&НаКлиентеНаСервере
… // кодирование в Base64 МоиДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(МояСтрока, «UTF-8»); МойBase64 = Base64Строка(МоиДвоичныеДанные); … // декодирование из Base64 МоиДвоичныеДанные = Base64Значение(МойBase64); МояСтрока = ПолучитьСтрокуИзДвоичныхДанных(МоиДвоичныеДанные, «UTF-8»); … |
///
PHP
Способ сериализации используемый в PHP не поддерживается платформой 1С,
1 | a:3:{i:1;a:0:{}i:2;a:2:{s:5:«title»;s:67:«(C) 2022. Управление тендерным отделом 2.0»;s:8:«nav_menu»;i:2;}s:12: t»;i:1;} |
///
Кодирование UTF-8, UTF-16, ANSI/CP1251, OEM/CP866, KOI8-R
Внутреннее кодирование строк 1С использует UNICODE. Для представление строк в различных кодировках и обратного преобразования применяется пара функций глобального контекста, доступных для компиляции на Сервере:
- КодироватьСтроку(<Строка>, <СпособКодированияСтроки>, <КодировкаСтроки>)
- РаскодироватьСтроку(<Строка>, <СпособКодированияСтроки>, <КодировкаСтроки>)
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
&НаСервере
… //=»https://enter-it.ru/?s=code» КодироватьСтроку(«https://enter-it.ru/?s=code», СпособКодированияСтроки.URLВКодировкеURL);
//=»https://enter-it.ru/?s=%D0%BA%D0%BE%D0%B4%D1%8B» КодироватьСтроку(«https://enter-it.ru/?s=коды», СпособКодированияСтроки.URLВКодировкеURL);
//=»https%3A%2F%2Freks.biz%2F%3Fs%3Dcode» КодироватьСтроку(«https://enter-it.ru/?s=code», СпособКодированияСтроки.КодировкаURL);
//=»https%3A%2F%2Freks.biz%2F%3Fs%3D%D0%BA%D0%BE%D0%B4%D1%8B» КодироватьСтроку(«https://enter-it.ru/?s=коды», СпособКодированияСтроки.КодировкаURL);
//=»https://enter-it.ru/?s=%FF%FE%3A%04%FF%FE%3E%04%FF%FE%34%04%FF%FE%4B%04″ КодироватьСтроку(«https://enter-it.ru/?s=коды», СпособКодированияСтроки.URLВКодировкеURL,«UTF16»); |
Параметр КодировкаСтроки, по умолчанию равный «UTF8», может быть установлен в «UTF16». При использовании «ANSI» или «OEM», вопреки справке, возникает исключение, однако нужный результат для русской кириллической кодировки можно получить используя значения «CP1251» и «CP866» соответственно, кроме того возможно использование значения «KOI8» или «KOI8-R».
Используя каскад Кодировать>>Раскодировать с отличающимися значениями параметра КодировкаСтроки удается даже реализовать перекодировку строк с исходной ошибкой в кодировке:
1
2 3 4 |
// «Є®¤л» кодировка cp866 ошибочно представленная как cp1251
РаскодироватьСтроку( КодироватьСтроку(«Є®¤л», СпособКодированияСтроки.КодировкаURL,«cp1251»), СпособКодированияСтроки.КодировкаURL,«cp866»); //=»коды» |
1
2 3 4 |
// «ъюф√» — кодировка cp1251 ошибочно представленная как cp866
РаскодироватьСтроку( КодироватьСтроку(«ъюф√», СпособКодированияСтроки.КодировкаURL,«cp866»), СпособКодированияСтроки.КодировкаURL,«cp1251»); //=»коды» |
MD5
Штатный механизм платформы позволяет хешировать строки и файлы при помощи алгоритмов MD5, SHA1, SHA256 и CRC32. Хеширование выполняется методами объекта типа ХешированиеДанных, доступного для компиляции на Сервере:
1
2 3 4 5 6 7 8 9 |
&НаСервере
… ХешированиеСтроки = Новый ХешированиеДанных(ХешФункция.MD5); ХешированиеСтроки.Добавить(МояСтрока); ХешСтроки = ХешированиеСтроки.ХешСумма; … ХешированиеФайла = Новый ХешированиеДанных(ХешФункция.MD5); ХешированиеФайла.ДобавитьФайл(МойФайл); ХешФайла = ХешированиеФайла.ХешСумма; |
Двоичные данные
В релизе платформы 8.3.16 были добавлены операции для работы с двоичными данными и буфером двоичных данных
- тип ДвоичныеДанные
- тип БуферДвоичныхДанных
функции
- ПолучитьДвоичныеДанныеИзHexСтроки()
- ПолучитьHexСтрокуИзДвоичныхДанных
Побитовые операции с целыми числами
В релизе платформы 8.3.11.2867 были добавлены побитовые операции с x32 числами без знака.
- ПобитовоеИ()
- ПобитовоеИли()
- ПобитовоеНе()
- ПобитовоеИНе()
- ПобитовоеИсключительноеИли()
- ПобитовыйСдвигВлево()
- ПобитовыйСдвигВправо()
- ПроверитьБит()
- ПроверитьПоБитовойМаске()
- УстановитьБит()