Как определить кодировку строки 1с
Войдите как ученик, чтобы получить доступ к материалам школы
Внутренний язык программирования 1С 8.3 для начинающих программистов: работа со строками в 1С
Автор уроков и преподаватель школы: Владимир Милькин
Друзья, сегодня будет интереснейший урок. Мы научимся выполнять операции со строками (мы проходили их здесь).
Наверное, не найдётся ни одного языка программирования, который не давал бы возможностей для обработки строк. Настолько это фундаментальный и необходимый тип данных.
И 1с в этом смысле не исключение. Я, как обычно, прошу вас повторять и проверять у себя весь код, который мы будем писать в этом уроке.
Откуда в программе появляются строки
Сам программист может закодировать определенное значение строки прямо в коде, используя двойные кавычки .
. и далее использовать его по своему усмотрению:
Бывает и так, что значение строки должен ввести сам пользователь. Это делается при помощи команды ВвестиСтроку:
Из чего состоит строка
Любая строка состоит из символов.
К примеру, строка "привет" состоит из символов 'п', 'р', 'и', 'в', 'е', 'т'.
К этим символам можно обращаться по их порядковому номеру. При этом нумерация символов в строке (в отличие от коллекций) начинается не с 0, а с 1.
Узнать общее количество символов в строке можно при помощи функции СтрДлина. Она принимает на вход строку и возвращает нам число символов в этой строке.
Таким образом, цикл обхода строки будет таким:
Если мы запустим эту программу на компьютере, то увидим такой результат:
Мы научились получать номера символов в строке, но как получать сами символы?
За получение нужного символа (или даже группы символов) из строки отвечает функция Сред (сокращение от слов "средина", "средний").
Она принимает три параметра:
- Саму строку.
- Номер символа в строке, который нужно получить.
- Количество символов, которое нужно получить.
В нашем случае мы будем получать по одному символу, поэтому третий параметр у нас всегда будет равен 1.
Итак, перепишем наш код вот так:
Теперь вывод будет совсем другим:
Что представляет из себя символ
Мне иногда кажется, что всё в этом мире есть числа . И символы строки, кстати, не исключение.
И это на самом деле так, ведь каждому значению символа соответствует определенное число, его код.
Зачем вообще может понадобиться переводить символ в числовой код и обратно? Например, если мы захотим написать программу для шифрования и дешифрования текстов. А мы захотим и сделаем это в следующем модуле школы.
За перевод символа в числовой код отвечает функция КодСимвола. Она принимает строку и порядковый номер символа в ней, а возвращает числовой код этого символа.
Давайте выведем числовой код каждого символа нашей строки:
Запустим эту программу, вывод будет таким:
Получается, что, к примеру, символу 'п' соответствует числовой код 1087? Да, это действительно так. Проверим это.
Для этого я сообщу вам способ для обратного перевода: из числового кода в символ. За такой перевод отвечает функция Символ. Она принимает на вход числовой код, а возвращает символ.
Объединение строк
Давайте представим, что у нас есть две вот такие строки .
. и мы хотим сложить (ещё говорят "склеить", "объединить") эти строки вместе, чтобы за значением первой строки сразу следовало значение второй.
Это делается при помощи оператора плюс (+), вот так:
Выведем эту строку пользователю:
Выглядит не очень, правда?
Давайте усложним задачу - требуется объединить эти строки, но между ними вставить пробел, а в конце добавить восклицательный знак.
Вот так гораздо лучше!
Поиск в строке
Давайте рассмотрим такую интересную задачу. Попросим пользователя ввести любой текст, но чтобы в нём встречалось (или нет) слово "счастье".
А в ответ мы будем говорить пользователю в какой позиции в строке находится это слово.
К примеру, если пользователь введёт строку "высыпаться по утрам - счастье", то программа должна ему сказать, что слово "счастье" есть в строке и оно находится в позиции 23.
Будем писать программу по частям.
Сначала напишем ввод строки от пользователя:
За поиск в строке отвечает функция СтрНайти.
На вход она принимает 2 параметра (на самом деле параметров больше, но мы рассмотрим только первые два):
- Строку, в которой надо искать.
- Часть строки (её ещё называют "подстрока"), которую надо найти.
Функция возвращает 0, если вхождение не найдено и позицию в строке, если вхождение найдено. Функция ищет только первое вхождение подстроки в строку.
С учётом этого продолжим написание программы вот так:
Замена в строке
А давайте подшутим над пользователем?
Пусть он введёт строку со словом "счастье", а мы выведем его же строку, в которой заменим слово "счастье", например, на "удовольствие".
За замену одной части строки на другую отвечает функция СтрЗаменить.
На вход она принимает 3 параметра:
- Строку, в которой нужно сделать замену.
- Подстроку, которую надо найти и заменить.
- Подстроку, на которую нужно заменить.
Функция возвращает строку, полученную в результате замены. При этом функция заменяет все вхождения.
Верхний и нижний регистры
А вы заметили, что один и тот же символ может иметь два варианта, например: 'п' и 'П'. Первый вариант называется "нижний регистр", а второй - "верхний регистр".
И для компьютера это разные буквы. Мы можем легко в этом убедиться, если выведем числовые коды этих букв:
Именно поэтому для компьютера, к примеру, строка "привет" будет не равна строке "Привет":
Компьютер при сравнении строк сравнивает числовой код каждого символа одной строки с соответствующим ему (по порядку) числовым кодом символа другой строки. И если есть хотя бы одно неравенство - строки считаются различными.
Но у нас есть замечательная возможность менять регистр строк: из верхнего в нижний и наоборот. За это отвечают функции НРег (сокращение от "нижний регистр") и ВРег (сокращение от "верхний регистр").
Когда это может быть полезно? Вспомните задачу, когда мы заменяли слово "счастье" на "удовольствие".
Функция СтрЗаменить (как и Найти) ищет подстроку с учётом регистра. То есть если пользователь введет вместо "счастье", например, "Счастье", то программа не найдёт этого вхождения.
И чтобы поиск и замена не зависели от того в каком регистре ввёл строку пользователь, мы напишем вот так:
Теперь, даже если пользователь введёт "Любимая работа - это СЧАСТЬЕ!" программа сможет найти слово "счастье" и вывести пользователю "любимая работа - это удовольствие!".
Подведём итоги
Мы рассмотрели основные операции над строками, но на самом деле их больше.
Некоторые из них вы можете изучить вместе с примерами в справочнике по языку 1с.
« Как стать программистом 1С » Язык 1С » Функции работы со строками 1С — анализ текста
Функции работы со строками 1С — анализ текста
В качестве примера работы функций работы со строками 1С мы хотели бы создать автоматический анализ текста. Текст мы будем брать из файла. Результат анализа выводить в произвольном виде пользователю.
Нам нужно создать внешнюю обработку, которая позволит нам выбрать текстовый файл и запустить анализатор.
Анализ текста 1С — форма и кнопки
Итак, создаем внешнюю обработку: Конфигуратор/Файл/Новый/Внешняя обработка.
Добавляем форму. На форме нам нужно разместить поле выбора текстового файла и кнопку анализа.
Анализ текста 1С — толстый клиент
На форму разместим обычное текстовое поле. Длина строки – неограниченная, ведь путь к файлу (имена каталогов) может быть значительным.
Чтобы пользователю не пришлось вписывать имя файла, а можно было выбрать его – у поля включим кнопку выбора.
Имя поля изменим на «ИмяФайла», имя связанного реквизита формы изменится на такое же автоматически.
В качестве кнопки будем использовать автоматически добавленную платформой кнопку «Выполнить» (и у нее уже подключен обработчик – удобно).
Анализ текста 1С — тонкий клиент
В тонком клиенте мы самостоятельно создадим реквизит формы «ИмяФайла». Перетащим реквизит на форму. В свойствах элемента формы также включим кнопку выбора.
В качестве кнопки – создадим команду «Выполнить», назначим ей обработку и перетащим на форму.
Анализ текста 1С — программируем
Первое, что нам нужно сделать – обработать нажатие кнопки выбора – показать по нажатию диалог выбора файла.
Зайдем в свойства нашего текстового поля на форме (в толстом клиенте – левой кнопкой мыши прямо на поле, в тонком – на имя поля в списке), и укажем обработчик события «НачалоВыбора».
Внутри функции обработчика, которую создаст 1С при назначении, впишем нехитрый код:
Теперь у нас есть имя файла. Нам нужно «достать» его содержимое и вызвать анализ текста.
У нас уже есть обработчик кнопки «Выполнить». В толстом клиенте кнопка и ее обработчик были созданы автоматически конфигуратором 1С. В тонком клиенте мы добавляли ее ручками.
Впишем в обработчик код, который считает файл в строку:
Касательно кодировки файла. Если создать объект ЧтениеТекста() без параметра с указанием кодировки – 1С попытается самостоятельно определить кодировку (по сигнатуре Byte Order Mark – BOM, или будет считать его кодировку ANSI).
Вы можете указать нужную кодировку напрямую, например так:
Файл = Новый ЧтениеТекста(ИмяФайла, "UTF-8"); //имя кодировки подставить нужное
Идентификация Web сервисов 1C 0
1. Если на web сервере стоит Anonymous access 1.1 В базе нет пользователей – идеальный вариант для тестирования web-сервиса, чтобы не заморачиваться… 1.2 Если хочется, чтобы вэб сервис работал под определенным пользователем 1С. Добавляем в файл de Подбор из справочника на основе управляемых форм 2
В данной статье рассматривается технология реализации подбора на платформе 1С 8.2. Статья не претендует на академизм, просто столкнувшись с рядом проблем и не нашедшим «правильной» методологии решения (возможно плохо искал), решил пройти этот путь с Функция проверки, строка написана только русскими и латинскими буквами? 0
// Параметры: // СтрокаПараметр - строка, проверяемая строка. // // Возвращаемое значение: // Истина - строка состоит из допустимых символов // Ложь - в строке встречаются недопустимые символы // // Описание: // Строка проверяется на на Посмотреть все результаты поиска похожих
Еще в этой же категории
Полезные возможности редактора кода 1С 28
Мне частенько приходится взаимодействовать с 1С-разработчиками, и во время совместной работы над проектами замечаю, что далеко не все из них хорошо знают свой главный инструмент – «Конфигуратор». Причем это не относится к степени крутости девелопера Работа с буфером обмена средствами 1С 19
Копировать из 1С в буфер обмена( без ВК): ЭлементыФормы.Добавить(Тип(" ПолеHTMLДокумента" ), " Поле_HTML_Документа_acb123" , Ложь); Окно = ЭлементыФормы.Поле_HTML_Документа_acb123.Документ.ParentWindow; Окно.ClipboardData.SetData(" Text" , Текст Структура и название таблиц использыемых для хранения данных в БД 1С 8.х 17
Данные, которые определяют логику функционирования системы на базе 1С:Предприятия, относятся к информационной базе. Хранение информационной базы осуществляется в базе данных с виде набора таблиц, для чего 1С:Предприятие 8.1 может использовать одну из Программно получить список активных пользователей 12
Процедура ПолучениеСпискаАктивныхПользователей() ИтогСписокСоединений.Очистить(); СоединенияИнформационнойБазы = ПолучитьСоединенияИнформационнойБазы(); Для Каждого Соединение Из СоединенияИнформационнойБазы Цикл ТЗ=ИтогСпи Как получить ссылку на объект из навигационной ссылки? 7
Процедура ПолучитьСсылкуИзНавигационной(НС) ПерваяТочка = Найти(НС, " e1cib/data/" ); ВтораяТочка = Найти(НС, " ?ref icon-exclamation-sign"> Посмотреть все в категории Полезные, Универсальные Функции
Столкнулся с задачей — автоопределение кодировки страницы/текста/чего угодно. Задача не нова, и велосипедов понапридумано уже много. В статье небольшой обзор найденного в сети — плюс предложение своего, как мне кажется, достойного решения.
1. Почему не mb_detect_encoding() ?
Если кратко — он не работает.
Давайте смотреть:
Как видим, на выходе — полная каша. Что мы делаем, когда непонятно почему так себя ведет функция? Правильно, гуглим. Нашел замечательный ответ.
Чтобы окончательно развеять все надежды на использование mb_detect_encoding(), надо залезть в исходники расширения mbstring. Итак, закатали рукава, поехали:
Постить полный текст метода не буду, чтобы не засорять статью лишними исходниками. Кому это интересно посмотрят сами. Нас истересует строка под номером 593, где собственно и происходит проверка того, подходит ли символ под кодировку:
Вот основные фильтры для однобайтовой кириллицы:
Windows-1251 (оригинальные комментарии сохранены)
ISO-8859-5 (тут вообще все весело)
Как видим, ISO-8859-5 всегда возвращает TRUE (чтобы вернуть FALSE, нужно выставить filter->flag = 1).
В общем, fail. Оно и понятно — только по кодам символов нельзя в общем случае узнать кодировку, так как эти коды пересекаются в разных кодировках.
2. Что выдает гугл
3. Поиск по хабру
4. Собственно, мое решение
Идея возникла во время просмотра второй ссылки из прошлого раздела. Идея следующая: берем большой русский текст, замеряем частоты разных букв, по этим частотам детектим кодировку. Забегая вперед, сразу скажу — будут проблемы с большими и маленькими буквами. Поэтому выкладываю примеры частот букв (назовем это — «спектр») как с учетом регистра, так и без (во втором случае к маленькой букве добавлял еще большую с такой же частотой, а большие все удалял). В этих «спектрах» вырезаны все буквы, имеющие частоты меньше 0,001 и пробел. Вот, что у меня получилось после обработки «Войны и Мира»:
Спектры в разных кодировках (ключи массива — коды соответствующих символов в соответствующей кодировке):
Далее. Берем текст неизвестной кодировки, для каждой проверяемой кодировки находим частоту текущего символа и прибавляем к «рейтингу» этой кодировки. Кодировка с бОльшим рейтингом и есть, скорее всего, кодировка текста.
Даже не пытайтесь выполнить этот код у себя — он не заработает. Можете считать это псевдокодом — я опустил детали, чтобы не загромождать статью. $char_specter — это как раз те массивы, на которые стоят ссылки на pastebin.
Результаты
Строки таблицы — кодировка текста, столбцы — содержимое массива $enc_rates.
Как видим, верная кодировка стабильно лидирует и с регистрозависимыми «спектрами» (если строка содержит небольшое количество заглавных букв), и с регистронезависимыми. Во втором случае, с регистронезависимыми, лидирует не так уверенно, конечно, но вполне стабильно даже на маленьких строках. Можно поиграться еще с весами букв — сделать их нелинейными относительно частоты, например.
5. Заключение
В топике не расмотрена работа с UTF-8 — тут никакий принципиальной разницы нету, разве что получение кодов символов и разбиение строки на символы будет несколько длиннее/сложнее.
Эти идеи можно распространить не только на кириллические кодировки, конечно — вопрос только в «спектрах» соответствующих языков/кодировок.
P.S. Если будет очень нужно/интересно — потом выложу второй частью полностью работающую библиотеку на GitHub. Хотя я считаю, что данных в посте вполне достаточно для быстрого написания такой библиотеки и самому под свои нужды — «спектр» для русского языка выложен, его можно без труда перенести на все нужные кодировки.
UPDATED
В комментариях проскочила замечательная функция, ссылку на которую я опубликовал под графом «убожество». Может быть погорячился со словами, но уж как опубликовал, так опубликовал — редактировать такие вещи не привык. Чтобы не быть голословным, давайте разберемся, работает ли она на 100%, как об этом говорит предполагаемый автор.
1) будут ли ошибки при «нормальной» работе этой функции? Предположим, что контент у нас на 100% валидный.
ответ: да, будут.
2) определит ли она что-нибудь кроме UTF-8 и не-UTF-8?
ответ: нет, не определит.
Что мы видим? Однобайтовая кириллица после iconv($encoding, $encodigng) не изменится. Так можно отличить только UTF-8 от не-UTF-8. И то — ценой ворнинга.
ИМХО именно вот из-за таких кусков кода и считают PHP «языком для дураков» (с) — как не переминут написать тролли в любом топике про этот язык.
Строка — примитивный тип данных в языке программирования 1С. Помимо 1С, этот тип данных используется во всех известных языках программирования, обычно он называется «string».
Функции работы со строками в 1С
Рассмотрим основные функции встроенного языка программирования 1С.
Строка
Функция Строка() позволяет получить текстовое представление переменных других типов.
СтрДлина
Функция позволяет получить количество символов в строке 1C, включая пробелы и незначащие символы.
СокрЛП, СокрЛ, СокрП
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Полезная функция для удаления незначащих символов в строковом значении. СокрЛ обрабатывает символы, стоящие слева от последнего значащего символа, СокрП — справа. А СокрЛП — справа и слева.
Помимо пробелов, функция 1C удаляет такие символы, как перенос строки, неразрывный пробел и т.д.
Лев, Прав, Сред
С помощью данных функций очень просто получить первые (Лев) или последние (Прав) символы в строке, а также произвольное количество символов (Сред).
Найти
Функция для поиска подстроки внутри другой подстроки. Синтаксис Найти(, ). Функция возвращает число — номер позиции символа (или символов) в исходной подстроке. Если подстроки не найдено, вернётся число 0. Если в искомой подстроке есть несколько вхождений, вернется номер позиции первого совпадения.
ВРег, НРег, ТРег
Функции для управления регистром строки. ВРег — преобразует строку в верхний регистр. НРег — в нижний. ТРег — у каждого нового слова первая буква преобразуется в верхний регистр, остальные в нижний.
ПустаяСтрока
Функция, позволяющая сравнить исходную строку с пустой строкой. Проверяется наличие незначащих символов.
Аналогично можно проверить строку на пустое значение следующим образом:
СтрЗаменить
Функция СтрЗаменить позволяет массово заменить искомое значение на нужное нам. Синтаксис:
СтрЧислоСтрок
Позволяет получить количество строк в многострочном тексте. Функция считает количество переносов строк (Символы.ПС).
Например, построчная обработка текстового фрагмента:
СтрПолучитьСтроку
С помощью данной функции можно получить произвольную строку из многострочного текста. Синтаксис — СтрПолучитьСтроку(, ).
СтрЧислоВхождений
Функция для подсчета числа вхождений произвольного фрагмента в строку. Например, подсчитать количество вхождений определенных символов или слов в текст.
Символ и КодСимвола
Две обратные функции. С помощью КодСимвола можно получить код символа в кодировке Unicode. Функцией Символ можно получить символ, зная Unicode кодификатор.
Часто встречающиеся задачи по работе со строками в 1С
Рассмотрим классические примеры решения задач в работе с текстовыми переменными.
Конкатенация строк в 1С
Конкатенация, или объединение строк в 1С делается оператором «+».
Преобразовать число в строку
Тут всё просто. Достаточно использовать метод «Строка()»:
Однако может смущать наличие неразрывного пробела.
Его можно убрать с помощью замены неразрывного пробела на пустую строку:
или с помощью метода Формат:
Кавычки в строке 1С
Для новичков достаточно трудно установить кавычки внутри строки, хотя в этом нет ничего сложного. Достаточно внутри строки поставить вместо одних кавычек двое.
Символ переноса строки
Символ переноса строки необходим для переноса строки на следующую строку. В 1С это можно сделать с помощью специальной конструкции «Символы.ПС».
Сравнение строк в 1С
Сравнить строки достаточно просто с помощью оператора сравнения — «=».
Однако для получения корректного сравнения часто требуется возвести строки в один регистр и убрать незначащие символы:
Таким образом, мы получим более точное сравнение двух строк.
Убрать пробелы в строке 1С
Достаточно часто нужно убрать пробелы в строке 1С.
Если требуется убрать пробелы справа и слева:
Если требуется убрать абсолютно все пробелы, можно заменить их на пустую строку:
Если требуется убрать неразрывные пробелы из строки, которая получена из числового типа, сделать это можно так:
Другие статьи по 1С:
Если Вы начинаете изучать 1С программирование, рекомендуем наш курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
Читайте также: