1С перенос строки в коде

Информация в 1С может быть представлена: справочником, документом, регистром…

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

Сейчас мы разберем как из языка 1С можно работать со строками. Паралелльно попробуем различные варианты автоматического анализа текста.

Виды строк

Строки могут быть ограничены по длине или неограниченной длины. Если строковое значение взято из реквизита – то в типе реквизита указывается это ограничение.

Если строку ввел пользователь на форме, то у элемента формы может стоять галочки «Многострочный режим» и «Расширенное редактирование». Первая значит, что строка может содержать знаки «Переноса строки 1С (Enter)». Вторая – что строка может содержать прочие служебные символы 1С, например TAB.

Если строка взята из файла, например с использованием ЧтениеТекста(), то становится важна и кодировка — при чтении файла нужно указывать кодировку (UTF-8, KOI8 и т.п.).

Служебные символы 1С

Для работы со специальными символами используется перечисление Символы 1С.

Например, строковое значение, состоящее из двух слов:
ТекстоваяСтрока = «Первая строка» + Символы.ПС + «Вторая строка»;

Например, поиск перенос строки 1С в тексте:
Позиция = Найти(ТекстоваяСтрока, Символы.ПС);

Работать можно со следующими специальными символами:

  • CR и LF
    Означают перенос строки 1С. Часто встречаются в текстовых файлах.
    Код символа в ASCII – 0x0D и 0x0A, в Unicode – U+000D и U+000A.

    В языке 1С выглядят как Символы.CR и Символы.LF, или по-русски Символы.ВК и Символы.ПС. Для переноса строки 1С при ее создании в коде 1С, достаточно использования ПС.

  • Только зарегистрированные пользователи VIP группы могут видеть этот контент.

Прочие символы 1С

Строки в 1С «физически» используются в формате Unicode (Юникод, http://ru.wikipedia.org/wiki/%DE%ED%E8%EA%EE%E4).

Если Вы не сталкивались ранее с «кодированием» символов, кратко заметим:

  • При работе со строками, компьютер использует номера букв, а не сами буквы
  • Так как «человеческих» алфавитов мнозжество (английский, русский, греческий, китайский и др., а еще есть служебные и «непечатные» символы 1С), то существует несколько вариантов компьютерных алфавитов, одним из которых является Unicode, который включает в себя символы 1С всех языков
  • Алфавит Unicode выглядит примерно так:
    o Распространенные «непечатные» служебные символы 1С
    o Знаки препринания и математики
    o Цифры
    o Английский алфавит
    o Доп. символы 1С английского алфавита, которые используются в европейских языках (например в немецком)
    o Греческий алфавит
    o Русский алфавит
    o …

При необходимости в строках 1С возможно использовать все символы 1С, доступные в Unicode.

Во-первых Вы их можно набрать с клавиатуры, если у Вас в Windows установлена раскладка (по-умолчанию на территории России обычно ставится английская и русская).

Во-вторых можно набрать с помощью следующего приема:

Только зарегистрированные пользователи VIP группы могут видеть этот контент.

В-третьих работать можно из кода программы. Функция Символ(Цифра) возвращает символ с указанным номером, а функция КодСимвола(Строка) возвращает номер символа у первой буквы в строке. Если нужна другая буква в строке, то КодСимвола(Строка, НомерБуквы).

Или, узнаем код символа:

Только зарегистрированные пользователи VIP группы могут видеть этот контент.

Число в 1С 8 — значение примитивного типа Число. Числовым типом может быть представлено любое десятичное число. С числовыми данными возможно совершать основные арифметические операции: сложение, вычитание, умножение и деление. Максимальное количество разрядов для числа в 1с 8: 38 знаков.

Пример 1. Создадим числовую переменную

ЧислоПи = 3.14;

Преобразование значений другого типа в число

Преобразовать в число можно значения строкового типа, либо логического типа (Булево). Значение типа Булево преобразуется в число по следующим правилам:

  • Ложь преобразуется в 0;
  • Истина преобразуется в 1.

Значение типа Строка преобразуется в число в том случае, если оно является строковым представлением литерала численного типа.

Для преобразования существует специальная функция Число(<Значение>), которая возвращает полученное число, если преобразование удалось и выдает сообщение об ошибке в противном случае.

Пример 2. Преобразовать в 1с число строку «1.25»

Строка = «1.25»; ПолученноеЧисло = Число(Строка);

После выполнения данного кода в переменной ПолученноеЧисло будет содержаться числовое значение 1.25

Пример 3. Преобразовать в число строку «Привет мир!»

Строка = «Привет мир!»; ПолученноеЧисло = Число(Строка);

При попытке выполнить данный код будет выдано сообщение об ошибке: «Преобразование значения к типу Число не может быть выполнено».

Функции работы со значениями типа Число в 1с 8.3

В данном разделе будут рассмотрены основные функции работы с числами в 1с 8 и приведены примеры их использования.

Цел

Цел(<Число>). Возвращает целую часть числа переданного в параметре.

Пример 4. Определить делится ли число 121 на 11.

Делимое = 121; Делитель = 11; Результат = Делимое / Делитель; Если Цел(Результат) = Результат Тогда Сообщить(«Делится нацело»); Иначе Сообщить(«Не делится нацело»); КонецЕсли;

Результатом выполнения данного кода будет вывод на экран сообщения «Делится нацело».

Окр

Окр(<Число>, <Разрядность>, <РежимОкругления>). Функция округляет число, переданное в первом параметре, до знака после запятой переданного во втором параметре. Значение разрядности может быть и нулевым (округление до целого) и отрицательным (округление до соответствующего разряда целой части). Параметр РежимОкругления может принимать значения:

  • 0 (или РежимОкругления.Окр15как10). Округляет в меньшую сторону, то есть при округлении 1.5 будет возвращено 1;
  • 1 (или РежимОкругления.Окр15как20). Округляет в большую сторону, то есть при округлении 1.5 будет возвращено 2;

Пример 5. Для того чтобы лучше разобраться с принципами округления рассмотрим округление до целого в меньшую и большую стороны, на ряде чисел от 1.1 до 1.9

Массив = Новый Массив; Шаг = 0.1; Число = 1; Пока Число < 1.9 Цикл Число = Число + Шаг; Массив.Добавить(Число); КонецЦикла; ШаблонСообщения = «Исходное: %1 В меньшую: %2 В большую: %3»; Для Каждого ЭлементМассива Из Массив Цикл ИсходноеЧисло = ЭлементМассива; ОкруглениеВМеньшую = Окр(ИсходноеЧисло, 0, 0); ОкруглениеВБольшую = Окр(ИсходноеЧисло, 0, 1); ТекстСообщения = СтрШаблон(ШаблонСообщения, ИсходноеЧисло, ОкруглениеВМеньшую, ОкруглениеВБольшую); Сообщить(ТекстСообщения); КонецЦикла;

Pow

Pow(<Основание>, <Показатель>). Возводит число переданное в первом параметре в степень переданную во втором параметре.

Пример 6. Извлечь квадратный корень из числа 144, а затем возвести его в квадрат, в итоге снова должно получится число 144.

Число = 144; КвадратныйКорень = Pow(Число, 1/2); Число = Pow(КвадратныйКорень, 2); Сообщить(Число);

Результатом исполнения кода будет вывод на экран числа 144.

Прочие функции работы со значениями типа Число в 1с 8.3

Также прочитайте статью: Строки в 1С 8.3 — строковые функции

Код 1C v 8.х
// Функция «расщепляет» строку на подстроки, используя заданный
// разделитель. Разделитель может иметь любую длину.
// Если в качестве разделителя задан пробел, рядом стоящие пробелы
// считаются одним разделителем, а ведущие и хвостовые пробелы параметра Стр
// игнорируются.
// Например,
// РазложитьСтрокуВМассивПодстрок(«,ку,,,му», «,») возвратит массив значений из пяти элементов,
// три из которых — пустые строки, а
// РазложитьСтрокуВМассивПодстрок(» ку му», » «) возвратит массив значений из двух элементов
//
// Параметры:
// Стр — строка, которую необходимо разложить на подстроки.
// Разделитель — строка-разделитель, по умолчанию — запятая.
//
// Возвращаемое значение:
// массив значений, элементы которого — подстроки
//
Функция РазложитьСтрокуВМассив(Знач Стр, Разделитель = «,») Экспорт
МассивСтрок = Новый Массив();
Если Разделитель = » » Тогда
Стр = СокрЛП(Стр);
Пока 1=1 Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = СокрЛ(Сред(Стр,Поз));
КонецЦикла;
Иначе
ДлинаРазделителя = СтрДлина(Разделитель);
Пока 1=1 Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = Сред(Стр,Поз+ДлинаРазделителя);
КонецЦикла;
КонецЕсли;
КонецФункции
Пример с использованием предустановленной библиотеки RegExp, т.е. она есть в любом windows.
Плюсы RegExp:
1. Хорошая скорость анализа, т.к. 1С анализ строк (разбор) обычно реализуется циклами и функциями: Лев, Прав, Сред, Найти, а встроенный язык медленный
2. Высокая читаемость и модифицированность (более предсказуем в случае несоответствия строки — разбору)
3. Дополнительный функционал (можно осуществлять анализ, замену и проверку строковых выражений)
Минусы RegExp:
1. Не все задачи можно решить (например рекурсивные разборы тип 1 + (2+3*(2-7)) в случае если нужно разобрать на выражения в скобках) приходится смешивать с кодом.
2. Возможность зависания при использовании сложных шаблонов(редкость, но бывает).
3. RegExp — это дополнительная библиотека и инициализация занимает значительное время.
Код 1C v 8.х // Пример с использованием предустановленной библиотеки RegExp, т.е. она есть в любом windows.
Функция РазложитьСтрокуВМассив(Строка, Разделитель = «,») Экспорт
RegExp = Новый COMОбъект(«VBScript.RegExp»); // создаем объект для работы с регулярными выражениями
//Параметры:
RegExp.MultiLine = Ложь; // истина — текст многострочный, ложь — одна строка
RegExp.Global = Истина; // истина — поиск по всей строке, ложь — до первого совпадения
RegExp.IgnoreCase = Ложь; // истина — игнорировать регистр строки при поиске
//Разбор строки вида 1,СЛОВО,(1+2); Маска для разделителя ‘,’ *»
RegExp.Pattern = «+»;

Функция 1С Найти(СтрокаГдеИщем, СтрокаЧтоИщем) ищет в тексте первое вхождение нужной нам подстроки, и возвращает номер позиции первой буквы найденной подстроки в тексте.

Например:

  • Выполняем 1С Найти(«Ежик смеялся и кушал кактус», «и кушал»)
  • 1С возвращает номер позиции слова «и» — 14
  • Выполняем 1С Найти(«Ежик смеялся и кушал кактус», «и»)
  • 1С возвращает номер позиции буквы «и» в слове «ежик» — 3
  • Выполняем 1С Найти(«Ежик смеялся и кушал кактус», «с иголками»)
  • 1С возвращает 0, так как той подстроки, что мы ищем в тексте нет.

Аккуратно — если в параметре(ах) 1С Найти указана пустая строка, то вернет не 0, а 1.

На примере нашего анализатора текста сделаем с помощью 1С Найти – сохранение списка значений в строку с разделителями, и восстановление из строки в список значений обратно.

Допустим:

  • что нам на «входе» подается массив или список значений (колонку таблицы значений можно выгрузить в массив с помощью метода ВыгрузитьКолонку())
  • что значения в массиве/списке только строковые (т.е. не будем запоминать, число это было или строка)
  • как пример «строки с разделителями»: «12;32;белый»

Только зарегистрированные пользователи VIP группы могут видеть этот контент.

Входящая строка: 22;33,5;Здесь был Петя;Петя нашел йожика#ЗДЕСЬ_БЫЛ_РАЗДЕЛИТЕЛЬ а тот съел Петю;25.10.2012 14:14:43

Результат:
22
33,5
Здесь был Петя
Петя нашел йожика; а тот съел Петю
25.10.2012 14:14:43

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *