1с преобразовать строку в адрес
Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.
Реализовано в версии 8.3.20.1549
Когда мы пишем запросы и создаем отчёты, нередко бывает нужно не просто показать данные в том виде, в котором они лежат в БД, а произвести над ними какие-то операции. Например, посчитать разницу между двумя датами или округлить число до нужной разрядности. Хорошо, если нужная функция есть в языке запросов (или в языке СКД) - тогда мы можем сделать с данными то, что хотим, на уровне запроса / СКД, а потом просто отобразить результат. Если же нужная функция в языке запросов не реализована – приходится делать постобработку запроса в языке 1С, проходясь в цикле по результатам запроса и выполняя нужные операции. Что приводит к разрастанию кода конфигурации и может снизить производительность.
К нам довольно часто обращаются разработчики с пожеланиями о добавлении дополнительных функций в язык запросов и язык СКД. Мы внимательно проанализировали пожелания и выделили список наиболее востребованных функций, которые планируем реализовать в версии 8.3.20.
Язык запросов
В язык запросов добавляются функции:
Строка(String) – преобразует значение в примитивного типа в строку с учетом национальных установок.
Тригонометрические функции Sin, Cos, Tan, ASin, ACos, ATan (все вычисления производятся в радианах)
Exp - вычисляет результат возведения основания натурального логарифма (числа e) в степень
Log - вычисляет натуральный логарифм числа.
Log10 - вычисляет десятичный логарифм числа.
Pow - вычисляет возведение в степень.
Sqrt – вычисляет квадратный корень.
Окр(Round) - округляет исходное число до нужной разрядности
Цел(Int) - вычисляет целую часть переданного числа, полностью отсекая дробную часть.
ДлинаСтроки(StringLength) – вычисляет длину строки.
СокрЛ(TrimL) – отбрасывает незначащие пробелы слева.
СокрП(TrimR) – отбрасывает незначащие пробелы справа.
СокрЛП(TrimAll) – отбрасывает незначащие пробелы слева и справа.
Лев(Left) – получает первые слева символы строки.
Прав(Right) – получает первые справа символы строки.
СтрНайти(StrFind) – находит первую позицию подстроки в строке (без учета регистра).
ВРег(Upper) – преобразует все символы строки в верхний регистр.
НРег(Lower) – преобразует все символы строки в нижний регистр.
СтрЗаменить(StrReplace) – заменяет все вхождения подстроки на другую подстроку (без учета регистра).
РазмерХранимыхДанных(StoredDataSize) – возвращает размер данных в байтах, которые занимают данные параметра.
Система компоновки данных
В язык выражений системы компоновки данных добавлены новые функции:
СокрЛ(TrimL) – отбросить незначащие пробелы слева.
СокрП(TrimR) – отбросить незначащие пробелы справа.
СокрЛП(TrimAll) – отбросить незначащие пробелы слева и справа.
Лев(Left) – получить первые слева символы строки.
Прав(Right) – получить первые справа символы строки.
СтрНайти(StrFind) – найти подстроку в строке (без учета регистра).
ВРег(Upper) – преобразует все символы строки в верхний регистр.
НРег(Lower) – преобразует все символы строки в нижний регистр.
СтрЗаменить(StrReplace) – заменяет все вхождения подстроки на другую подстроку (без учета регистра).
НСтр(NStr) – получает строку на языке пользователя (аналогично тому, как работает метод НСтр глобального контекста). Параметры:
ИсходнаяСтрока – строка, содержащая строки на разных языках (например, "ru = 'Добрый вечер!'; en = 'Good Evening!'").
КодЯзыка (необязательный) – строка с кодом языка, на котором нужно получать строку. Если не указан - строка получается на языке текущего пользователя.
Всем привет! Данный материал посвящен описанию базовых возможностей работы с контактной информацией в конфигурациях, содержащих "Библиотеку стандартных подсистем" (БСП). Данная статья будет полезна для разработчиков, программистов и всех тех, кто решился не придумывать свои "разработки - велосипеды" для работы с контактной информацией, а взять уже готовое. Статья призвана экономить ваше время и повысить эффективность разработки.
Итак, перехожу к разделу получения контактной информации объектов с помощью БСП:
Получение контактной информации объектов
Чтобы получить полную контактную информацию контрагента, организации, партнера можно воспользоваться функцией:
КонтактнаяИнформацияОбъекта(СсылкаИлиОбъект, ВидКонтактнойИнформации = Неопределено, Дата = Неопределено, ТолькоПредставление = Истина) Экспорт
В данном примере, получаем полную контактную информацию на текущую дату. При установленном параметре ложь, будет возвращаться ТаблицаЗначений со всей контактной информацией.
В следующем примере вернем фактический адрес контрагента строкой:
Так же существует схожая функция, производящая получение контактной информации для нескольких ссылок или объектов одновременно:
Функция КонтактнаяИнформацияОбъектов(СсылкиИлиОбъекты, Знач ТипыКонтактнойИнформации = Неопределено, Знач ВидыКонтактнойИнформации = Неопределено, Дата = Неопределено) Экспорт
В данной функции ТипыКонтактнойИнформации и ВидыКонтактнойИнформации - массивы, содержащие необходимые типы и виды контактной информации. Функция возвращает таблицу значений по "фильтру" входящих параметров.
Пример использования такой:
Вышеперечисленные функции можно использовать в связке с "индивидуальными" функциями конфигураций по получению информации об организации и контрагентах. Частично об "индивидуальных" функциях я изложил материал вот здесь .
Теперь, давайте посмотрим немного глубже в результаты вышеуказанных функций. Строка возвращаемой таблицы значений выглядит вот так:
Рис.1. Строка таблицы значений контактной информации.
Обратим внимание на колонку Значение - это строка в формате json, выглядит она вот так:
Рис.2. Формат json в колонке Значение.
Сейчас, я хочу преобразовать эту json-строку в структуру для дальнейшего использования. Сделаю это стандартными методами БСП, воспользуюсь функцией:
Функция СтрокуJSONВСтруктуру(Значение) Экспорт
Доработанный код будет выглядеть вот так:
Переменная ААА - содержит структуру по входящей строке json. Выглядит это вот так:
Рис.3. Преобразованная json в структуру.
Здесь, я ничего не придумываю, использую только типовые функции и процедуры БСП и получаю требуемую контактную информацию "по полям" в удобном виде.
Пожалуй, с базовыми вариантами получения контактной информации мы разобрались - можем смело применять. Теперь, перейдем к разделу преобразование контактной информации объектов в разные форматы.
Преобразование контактной информации объектов
В данном разделе рассмотрим несколько полезных функций, позволяющих стандартно конвертировать контактную информацию в разные форматы - xml, json.
Сначала рассмотрим функцию, которая позволяет получить контактную информацию в формате xml
Функция КонтактнаяИнформацияВXML(Знач ЗначенияПолей, Знач Представление = "", Знач ОжидаемыйВид = Неопределено) Экспорт
В качестве входящего параметра ЗначенияПолей, я обычно передаю структуру по заполненным ключам. Представление я не заполняю, а в качестве ожидаемого вида - перечисление с типом контактной информации.
Рассмотрим пример работы с данной функцией, предварительно доработав предыдущий пример:
В качестве результата в переменную ККК возвращается XML-структура, согласно схемы пакетов КонтактнаяИнформация или Адрес.
Рис.4. Преобразованная структура в XML-строку.
Еще один пример с телефоном:
В переменную ТелефонXML возвращается XML строка вот такого содержания:
Рис.5. XML-строка с типом "Номер телефона".
Преобразование структуры "телефона" идет по такой типовой схеме:
Теперь, преобразуем полученную строку XML в строку JSON, доработаем код процедуры:
Полученный ТелефонJSON такой:
Рис.6. JSON-строка с типом "Номер телефона".
Его так же можно преобразовать в структуру с помощью вышеуказанной функции
Функция СтрокуJSONВСтруктуру(Значение) Экспорт
Так, базовые вещи с преобразованием контактной информации я описал. Теперь, переходим к разделу записи контактной информации объектов.
Запись контактной информации объектов
В данном разделе я рассмотрю базовую процедуру добавления контактной информации по ссылке
Процедура ДобавитьКонтактнуюИнформацию(СсылкаИлиОбъект, ЗначениеИлиПредставление, ВидКонтактнойИнформации, Дата = Неопределено, Замещать = Истина) Экспорт
Доработаем наш пример:
Данным кодом мы добавляем нужный нам телефон (Истина - замещает, Ложь - добавляет второй телефон). ТелефонJSON - ранее сформированная нами строка-json. Выглядит это вот так:
Рис.7. Результат добавления "Номера телефона" в карточку контрагента с помощью возможностей БСП.
В данном примере номер телефона "красиво разложен" по полям. Хорошо, переходим к заключению.
Заключение
В данной статье, я постарался обозначить основные правила и методы работы с контактной информацией в рамках библиотеки стандартных подсистем конфигурации. Я описал чтение, преобразование и запись контактной информации объектов.
Надеюсь, что данная информация будем вам полезна, применение данных стандартных методов позволит вам экономить ваше время на разработку ваших решений.
Примеры данной статьи я реализовывал на Платформе 1с 8.3.17.1549, конфигурации Розница 2.3.5 с включенной БСП 3.1.2.457.
Если вам интересен мой практический подход и информация, которую вы сможете реально использовать, если у вас есть желание, чтобы данный комплекс статей наполнялся практическими материалы для программистов - я не откажусь от поддержки как данной статьи, так и всего комплекса статей в целом.
Всем спасибо за прочтение, до новых встреч!
Предыдущие материалы
Так же, я прошу посмотреть мои предыдущие статьи, посвященные базовым возможностям типовых конфигураций:
1С 8.3 БСП ЗначениеВСтрокуXML. Преобразует (сериализует) любое значение в XML-строку. Преобразованы в могут быть только те объекты, для которых в синтаксис-помощнике указано, что они сериализуются.
// тест
Результат = ОбщегоНазначения . ЗначениеВСтрокуXML ( "тест" )
// // xmlns="http://v8.1c.ru/8.1/data/enterprise/current-config"
// xmlns:xs="http://www.w3.org/2001/XMLSchema"
// xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
// xsi:type="CatalogRef.Номенклатура">
// f93e113e-c83a-11e2-8026-0015e9b8c48d
//
Результат = ОбщегоНазначения . ЗначениеВСтрокуXML ( Номенклатура )
// Метод в основном используется для сохранения/загрузки настроек
&НаСервере
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка )
СтрокаXML = ПолучитьИзВременногоХранилища ( Параметры . АдресВоВременномХранилище );
Ведомость = ОбщегоНазначения . ЗначениеИзСтрокиXML ( СтрокаXML ); // ТЗ из XML строки
Обработка = РеквизитФормыВЗначение ( "Объект" );
Обработка . Зарплата . Загрузить ( Ведомость . Зарплата . Выгрузить ());
&НаСервере
Процедура ЗаписатьНаСервере ()
СтрокаXML = ПолучитьИзВременногоХранилища ( АдресВоВременномХранилище );
Ведомость = ОбщегоНазначения . ЗначениеИзСтрокиXML ( СтрокаXML ); // ТЗ из XML строки
Обработка = РеквизитФормыВЗначение ( "Объект" );
Ведомость . Зарплата . Загрузить ( Обработка . Зарплата . Выгрузить ());
СтрокаXML = ОбщегоНазначения . ЗначениеВСтрокуXML ( Ведомость ); // ТЗ в XML строку
ПоместитьВоВременноеХранилище ( СтрокаXML , АдресВоВременномХранилище );
Если по ходу отладочной сессии возникает необходимость вытащить из программного кода не просто текст запроса, а экземпляр – то есть запрос с уже установленными параметрами, готовый к выполнению в консоли – это можно сделать при помощи БСП. Нам потребуется конструкция:
Если остановить выполнение процедурного кода на соответствующей строке, поместить указанную конструкцию в табло, на выходе мы получим XML-дамп нашего объекта Запрос.
Да, конечно, потребуется вручную скопировать этот дамп в буфер, переключиться на дополнительный клиентский сеанс, открыть там консоль запросов (поставляется в комплекте БСП) и выполнить загрузку запроса из XML-дампа. Но это сложно только в описании, а в реальности выполняется на раз-два и даже с завязанными глазами.
Единственное, на что стоит обратить внимание – если копировать XML-дамп прямо из табло (фокус на ячейке, ctrl+c), к искомой строке платформа может добавить непрошенный спецсимвол перевода строки, поэтому лучше сперва открыть значение в отдельном окне (фокус на ячейке, F2), а уже потом копировать.
Излишне упоминать, что указанный метод БСП можно использовать не только для ручной отладки, но и, например, для автоматической записи «телеметрии», то есть некоего прикладного аналога ТЖ. Так что упоминать об этом мы и не станем. ;-)
Передать через функции взятые из БСП серьезные объекты (в моем случае это был тип данных РезультатЗапроса) без выгрузки или других танцев с бубном в рамках портирования консоли на мобильные платформы оказалось абсолютно невозможным, так как данные типы тип не сериализуются XDTO. Однако для этого можно применить следующее правило, которое может работать в пределах одной базы:
- Если тип сериализуется - ничего не делаем. Сразу преобразуем.
- Если нельзя сериализовать- упаковываем в хранилище значений. Следует отметить, что хранилище значений упаковывается также, чтобы с ним не было проблем.
// Преобразованы в могут быть любые объекты (дополнено через ХранилищеЗначения.
// См. также ЗначениеИзСтрокиXML.
//
// Параметры:
// Значение - Произвольный - значение, которое необходимо сериализовать в XML-строку.
//
// Возвращаемое значение:
// Строка - XML-строка.
//
Функция ЗначениеВСтрокуXML ( Значение ) Экспорт
ЗаписьXML = Новый ЗаписьXML ;
ЗаписьXML . УстановитьСтроку ();
Если Значение = Тип ( "ХранилищеЗначения" ) Тогда
//Сохраняем жизнь исходному типу - через оборачивание.
ХранилищеЗначения = новый ХранилищеЗначения ( Значение );
СериализаторXDTO . ЗаписатьXML ( ЗаписьXML , ХранилищеЗначения );
Иначе
//Выполняем Сериализацию:
Попытка
СериализаторXDTO . ЗаписатьXML ( ЗаписьXML , Значение );
Исключение
ХранилищеЗначения = новый ХранилищеЗначения ( Значение );
СериализаторXDTO . ЗаписатьXML ( ЗаписьXML , ХранилищеЗначения );
КонецПопытки;
КонецЕсли;
Возврат ЗаписьXML . Закрыть ();
КонецФункции
// Выполняет преобразование (десериализацию) XML-строки в значение.
// См. также ЗначениеВСтрокуXML.
//
// Параметры:
// СтрокаXML - Строка - XML-строка, с сериализованным объектом..
//
// Возвращаемое значение:
// Произвольный - значение, полученное из переданной XML-строки.
//
Функция ЗначениеИзСтрокиXML ( СтрокаXML ) Экспорт
ЧтениеXML = Новый ЧтениеXML ;
ЧтениеXML . УстановитьСтроку ( СтрокаXML );
ХранилищеЗначение = СериализаторXDTO . ПрочитатьXML ( ЧтениеXML );
//Восстанавливаем значение из Хранилища:
Если ХранилищеЗначение = Тип ( "ХранилищеЗначения" ) Тогда
Возврат ХранилищеЗначение . Получить ();
Иначе
Возврат ХранилищеЗначение ;
КонецЕсли;
Если есть необходимость ввести универсальную функцию, которая совместима на компьютерных платформах со старым внутренним форматом 1С (мне понадобилось для работы с Консолью Запросов на Windows), тогда полученные универсальные функции:
Функция УниверсальнаяЗначениеВСтрокуВнутр ( Значение )
Попытка
Возврат Вычислить ( "ЗначениеВСтрокуВнутр(Значение)" );
Исключение
//Для мобильных приложений выполняем по правилам XMl-Функций, которые были переделаны:
Возврат ЗначениеВСтрокуXML ( Значение );
КонецПопытки;
Функция УниверсальнаяЗначениеИзСтрокиВнутр ( Значение )
Попытка
Возврат Вычислить ( "ЗначениеИзСтрокиВнутр(Значение)" );
Исключение
//Для мобильных приложений выполняем по правилам XMl-Функций, которые были переделаны:
Возврат ЗначениеИзСтрокиXML ( Значение );
КонецПопытки;
Небольшая библиотека функций по преобразованию данных из 1С в строку JSON и обратно.
Удобна для обмена данными между двумя базами 1С.
Позволяет преобразовывать в строку и обратно любые типы данных, для которых доступна XML-сериализация + объекты 1С (справочники, документы, ПВХ, ПВР).
Ссылки и объекты при передаче преобразуются из адресного пространства одной базы в адресное пространство другой базы по UID.
За основу брались функции преобразования из JSON и UnJSON в 1С
Добавлена поддержка любых XML-сериализуемых типов (ссылочных типов 1С, дат, перечислений, двоичных данных, хранилище значений и др) + объектов 1С (справочников, документов, ПВХ, ПВР). При передачи объектов полное соответствие структур баз отправителя и получателя не обязательно. Совпадающие реквизиты заполняются, не совпадающие игнорируются. Если объект в базе приемнике найден, то он перезаполняется, иначе создается новый.
Преобразование простым обходом коллекций и обратное преобразование разбором строки. Возможно, для 8.3.6 можно будет переписать разбор через встроенные функции по работе с JSON для более быстрой работы.
Работа аналогична исходной обработке. Есть 2 функции: преобразование из строки в JSON и обратное из JSON в строку.
1. В первой базе выполняем команду "СтрокаJSON = JSON(Значение)";
2. Строковое значение " СтрокаJSON " передаем в другую базу любым способом (через файл, веб-сервис, .COM);
3. Во второй базе выполняем обратное преобразование "Значение = UnJSON(СтрокаJSON)";
Для использования достаточно перенести функции из модуля обработки в общий модуль и дополнительно указать соответствие между типами ссылок в двух базах.
У обработки есть форма с несколькими примерами для проверки преобразования.
В приложении 2 варианта обработки. Первая преобразует только XML-сериализуемых типы, вторая также объекты 1С (справочники, документы, ПВХ, ПВР).
UPD. Пример использования:
1. Выгрузка/загрузка данных в формате JSON для отличающихся конфигураций (Такси+ОФ) - универсальная обработка по переносу данных между любыми конфигурациями.
Строка — примитивный тип данных в языке программирования 1С. Помимо 1С, этот тип данных используется во всех известных языках программирования, обычно он называется «string».
Функции работы со строками в 1С
Рассмотрим основные функции встроенного языка программирования 1С.
Строка
Функция Строка() позволяет получить текстовое представление переменных других типов.
СтрДлина
Функция позволяет получить количество символов в строке 1C, включая пробелы и незначащие символы.
СокрЛП, СокрЛ, СокрП
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Полезная функция для удаления незначащих символов в строковом значении. СокрЛ обрабатывает символы, стоящие слева от последнего значащего символа, СокрП — справа. А СокрЛП — справа и слева.
Помимо пробелов, функция 1C удаляет такие символы, как перенос строки, неразрывный пробел и т.д.
Лев, Прав, Сред
С помощью данных функций очень просто получить первые (Лев) или последние (Прав) символы в строке, а также произвольное количество символов (Сред).
Найти
Функция для поиска подстроки внутри другой подстроки. Синтаксис Найти(, ). Функция возвращает число — номер позиции символа (или символов) в исходной подстроке. Если подстроки не найдено, вернётся число 0. Если в искомой подстроке есть несколько вхождений, вернется номер позиции первого совпадения.
ВРег, НРег, ТРег
Функции для управления регистром строки. ВРег — преобразует строку в верхний регистр. НРег — в нижний. ТРег — у каждого нового слова первая буква преобразуется в верхний регистр, остальные в нижний.
ПустаяСтрока
Функция, позволяющая сравнить исходную строку с пустой строкой. Проверяется наличие незначащих символов.
Аналогично можно проверить строку на пустое значение следующим образом:
СтрЗаменить
Функция СтрЗаменить позволяет массово заменить искомое значение на нужное нам. Синтаксис:
СтрЧислоСтрок
Позволяет получить количество строк в многострочном тексте. Функция считает количество переносов строк (Символы.ПС).
Например, построчная обработка текстового фрагмента:
СтрПолучитьСтроку
С помощью данной функции можно получить произвольную строку из многострочного текста. Синтаксис — СтрПолучитьСтроку(, ).
СтрЧислоВхождений
Функция для подсчета числа вхождений произвольного фрагмента в строку. Например, подсчитать количество вхождений определенных символов или слов в текст.
Символ и КодСимвола
Две обратные функции. С помощью КодСимвола можно получить код символа в кодировке Unicode. Функцией Символ можно получить символ, зная Unicode кодификатор.
Часто встречающиеся задачи по работе со строками в 1С
Рассмотрим классические примеры решения задач в работе с текстовыми переменными.
Конкатенация строк в 1С
Конкатенация, или объединение строк в 1С делается оператором «+».
Преобразовать число в строку
Тут всё просто. Достаточно использовать метод «Строка()»:
Однако может смущать наличие неразрывного пробела.
Его можно убрать с помощью замены неразрывного пробела на пустую строку:
или с помощью метода Формат:
Кавычки в строке 1С
Для новичков достаточно трудно установить кавычки внутри строки, хотя в этом нет ничего сложного. Достаточно внутри строки поставить вместо одних кавычек двое.
Символ переноса строки
Символ переноса строки необходим для переноса строки на следующую строку. В 1С это можно сделать с помощью специальной конструкции «Символы.ПС».
Сравнение строк в 1С
Сравнить строки достаточно просто с помощью оператора сравнения — «=».
Однако для получения корректного сравнения часто требуется возвести строки в один регистр и убрать незначащие символы:
Таким образом, мы получим более точное сравнение двух строк.
Убрать пробелы в строке 1С
Достаточно часто нужно убрать пробелы в строке 1С.
Если требуется убрать пробелы справа и слева:
Если требуется убрать абсолютно все пробелы, можно заменить их на пустую строку:
Если требуется убрать неразрывные пробелы из строки, которая получена из числового типа, сделать это можно так:
Другие статьи по 1С:
Если Вы начинаете изучать 1С программирование, рекомендуем наш курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
Читайте также: