Что такое буквы в 1С

18.05.13

Разработка - Механизмы платформы 1С

Некоторые особенности и неочевидные моменты использования символов в 1С.

Что такое буквы в 1С.

Скрипт приведенный ниже демонстрирует следующие особенности работы с символами в 1С:

  • Символ/КодСимвола работают в диапазоне -1..65535, причем Символ(-1) - строка без символов
  • Скрипт ищет все символы "пустые строки". Некоторые из этих строк отображаются как непустые.
  • Скрипт показывает, какие символы являются "буквами" для языка 1С - это полезно для написания обфускаторов и для проверок самописных парсеров языка 1С (собственно для проверки лексического генератора и написан этот скрипт).
  • Скрипт показывает допустимость символов для XML. Это важно, потому что сервер и клиент 1С в управляемых формах общаются через XML, поэтому при попытке передать недопустимый символ возникнет ошибка времени выполнения. Если при загрузке данных из внешних источников это не учитывать, то может возникнуть ситуация, когда 1С будет всегда падать при открытии, например, справочника.
  • Демонстрируется, что строка в 1С не является null-terminated. В скрипте не демонстрируется, но упомянуто, что ТекстовыйДокумент не умеет корректно работать со строками, содержащими Символ(0)

Сам скрипт проверялся в управляемых формах:


&НаКлиенте
Процедура ВыполнитьТест(Команда)

   
РезультатТеста = Новый Массив;
   
СтруктураДляПроверкиБукв = Новый Структура;
   
Начало = -2;
   
Конец = 65540;

    Для
Сч = Начало По Конец Цикл

        Если
Сч % 1024 = 0 Тогда
           
Состояние("Символ № " + Строка(Сч));
           
ОбработкаПрерыванияПользователя();
        КонецЕсли;

       
СимволПоКоду = Символ(Сч);
       
СтруктураРезультат = Новый Структура(
           
"Номер, Символ, ЭтоСимвол, ПустаяСтрока, ЭтоБуква, ДопустимыйСимволыXML, КорректнаяКонкатенация");
       
РезультатТеста.Добавить(СтруктураРезультат);
       
СтруктураРезультат.Номер = Сч;
       
СтруктураРезультат.Символ = СимволПоКоду;

       
//Проверка 1 - Это символ?
        //Демонстрируется, что Символ/КодСимвола работают в диапазоне -1..65535, причем Символ(-1) - строка без символов
       
КодПоСимволу = КодСимвола(СимволПоКоду);
        Если
КодПоСимволу<>Сч Тогда
           
СтруктураРезультат.ЭтоСимвол = Ложь;
            Продолжить;
        Иначе
           
СтруктураРезультат.ЭтоСимвол = Истина;
        КонецЕсли;

       
//Проверка 2 - Это пустая строка?
        //Неочевидный момент - некоторые "пустые строки" вполне имеют графическое непустое отображение
       
СтруктураРезультат.ПустаяСтрока = ПустаяСтрока(СимволПоКоду);

       
//Проверка 3 - Это буква?
        //Буквой считаем символ, который может быть именем поля в структуре. Таких букв достаточно много.
       
ТекущееЗначение = "";
        Попытка
            Если
СтруктураДляПроверкиБукв.Свойство(СимволПоКоду, ТекущееЗначение) Тогда
               
//Заодно сохраняем все "одинаковые" буквы, максимальное количество - 4:Θθϑe2;
               
СтруктураДляПроверкиБукв[СимволПоКоду] = ТекущееЗначение + СимволПоКоду;
            Иначе
               
СтруктураДляПроверкиБукв.Вставить(СимволПоКоду, СимволПоКоду);
            КонецЕсли;
           
СтруктураРезультат.ЭтоБуква = Истина;
        Исключение
           
СтруктураРезультат.ЭтоБуква = Ложь;
        КонецПопытки;

       
//Проверка 4 - Допустимые символы XML. Строки с недопустимыми символами нельзя передать с сервера или на сервер.
        //При получении данных из любых сторонних источников, перез записью их в БД крайне желательно их проверять на то,
        //что они смогут потом быть прочитанными. 
       
СтруктураРезультат.ДопустимыйСимволыXML = (НайтиНедопустимыеСимволыXML(СимволПоКоду) = 0);

       
//Проверка 5 - корректность конкатенации
        //- очевидно, что для символа с кодом -1 конкатенация не работает (это пустая строка длины 0)
        //- менее очевидно, что символы кода 0 успешно конкатенируются. Только ТекстовыйДокумент об этом, к сожалению, не знает
       
ДлиннаяСтрока = СимволПоКоду + СимволПоКоду + СимволПоКоду + СимволПоКоду + СимволПоКоду;
       
СтруктураРезультат.КорректнаяКонкатенация = (СтрДлина(ДлиннаяСтрока) = 5);

    КонецЦикла;

   
//1. в текстовый документ нельзя вывести "нулевой символ"
    //2. Выводим "честно" - последовательно по строкам и колонкам, чтобы не привлекать дополнительные механизмы
   
ТабличныйДокумент = Новый ТабличныйДокумент;
   
СчКолонок = 1;
    Для каждого
КлючИЗначениеСтруктураРезультат Из СтруктураРезультат Цикл
       
ТабличныйДокумент.Область(1, СчКолонок, 1, СчКолонок).Текст = КлючИЗначениеСтруктураРезультат.Ключ;
       
СчКолонок = СчКолонок + 1;
    КонецЦикла;
   
ТабличныйДокумент.Область(1, СчКолонок, 1, СчКолонок).Текст = "АналогичныеСимволы";
   
ТабличныйДокумент.Область(1, СчКолонок + 1, 1, СчКолонок + 1).Текст = "КоличествоАналогов";
   
СчСтрок = 2;
    Для каждого
СтруктураРезультат Из РезультатТеста Цикл

        Если
СчСтрок % 1024 = 0 Тогда
           
Состояние("Строка № " + Строка(СчСтрок));
           
ОбработкаПрерыванияПользователя();
        КонецЕсли;

       
СчКолонок = 1;
        Для каждого
КлючИЗначениеСтруктураРезультат Из СтруктураРезультат Цикл
           
ТабличныйДокумент.Область(СчСтрок, СчКолонок, СчСтрок, СчКолонок).Текст КлючИЗначениеСтруктураРезультат.Значение;
           
СчКолонок = СчКолонок + 1;
        КонецЦикла;
        Если
СтруктураРезультат.ЭтоБуква = Истина Тогда
           
ТабличныйДокумент.Область(СчСтрок, СчКолонок, СчСтрок, СчКолонок).Текст = СтруктураДляПроверкиБукв[СтруктураРезультат.Символ];
           
ТабличныйДокумент.Область(СчСтрок, СчКолонок + 1, СчСтрок, СчКолонок + 1).Текст = СтрДлина(СтруктураДляПроверкиБукв[СтруктураРезультат.Символ]);
        КонецЕсли;
       
СчСтрок = СчСтрок + 1;

    КонецЦикла;
   
ТабличныйДокумент.Показать();

КонецПроцедуры

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

 

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4525    dsdred    53    

72

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5294    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6409    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18473    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12088    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8821    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15986    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. TrinitronHome 20.05.13 20:07 Сейчас в теме
спасибо большое за статью, очень полезный материал для меня
2. Virikus 61 22.05.13 12:32 Сейчас в теме
Для проверки обмена через XML будет полезно. Спасибо.
3. dr.vatson 27.05.13 19:51 Сейчас в теме
Скрипт пробегает по всем символам и просто выводит на экран табличный документ с результатами

выводит ошибки или вносит исправления?
5. speshuric 1326 27.05.13 21:26 Сейчас в теме
(3) Не понял. Куда вносить исправления? Просто тупо выводит сформированную табличку с колонками. И всё.
4. KillHunter 7 27.05.13 20:03 Сейчас в теме
Отличная статья. Спасибо!
Оставьте свое сообщение