Усольцев Петр

33
Рейтинг

prohorp
Петр Усольцев



  •   Регистрация: 04.04.2013 (11 лет назад)

  •   Был(а) на сайте: 29.09.2023

Друзья
  • Владимир Ведерников
Подписчики 6

Рейтинг 33

Статический анализатор кода 1С на Си

Статья Программист Платформа 1С v8.3 Россия Бесплатно (free) Нет файла Языки и среды

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

30.06.2023    3083    prohorp    15       

12

Экспорт запроса из отладки в консоль запросов

Инструменты и обработки Программист Платформа 1С v8.3 Платформа 1C v8.2 Конфигурации 1cv8 Россия Бесплатно (free) Внешняя обработка (ert,epf) Инструментарий разработчика

Есть множество вариантов, как выгрузить запрос в файл в момент отладки для дальнейшей быстрой загрузки этого файла в консоль запросов (включая временные таблицы). Я просто опишу код, который можно добавить в консоль запросов управляемого приложения, скачанную с сайта ИТС для 8.2 и 8.3. Описание - в самом коде/заголовках процедур. Тестировал на платформе 1С:Предприятие 8.3 (8.3.18.1334). Спасибо за тестирование, объективная критика приветствуется. Спасибо Андрею Габец (прощу прощения, если склонение фамилии сделал неверно). При просмотре его курсов по БСП впервые увидел реализацию выгрузки запроса из отладки. Отдельное спасибо ему за соавторство в написании книги "Профессиональная разработка в системе «1С:Предприятие 8»", по которой я в 2012 начал изучать 1С.

27.09.2021    7123    157    prohorp    16       

21

Комментарии

ОбменУменьшаем трафик: HTTP запрос со сжатием GZIP средствами 1С. На примере выгрузки файлов на Яндекс-диск#11 16.08.23 10:35
Начал делать обмен 1С с ClickHouse.
По информации в интернете сделал обработку, в которую накидал методы получения и отправки данных(поэтому все так безобразно выглядит).
Команда2НаСервере - это получение данных.
ОтправитьДанныеНаСервере - это отправка сжатого GZIP-ом запроса.
Работа с GZIP была скопирована с другого тоже популярного источника 1С.
Может вариант не идеальный, но рабочий.

Код
&НаКлиенте
Процедура Команда1(Команда)
   Команда1НаСервере();
КонецПроцедуры

&НаСервере
Процедура Команда1НаСервере()
   gzip = ПолучитьМодульGZIP();
   стр64 = СтрокаВGZIP(gzip, "Hy"); 
   сообщить(стр64);
   Стр = GZIPВСтроку(gzip, стр64);  
   сообщить(Стр);
КонецПроцедуры  

Функция ПолучитьМодульGZIP() 
   МодульGZIP = Новый Структура;
   МодульGZIP.Вставить("NetObject", новый COMОбъект("NetObjectToIDispatch45"));
   МодульGZIP.Вставить("MemoryStream", МодульGZIP.NetObject.ПолучитьТип("System.IO.MemoryStream"));
   МодульGZIP.Вставить("UTF8", МодульGZIP.NetObject.ПолучитьТип("System.Text.Encoding").UTF8);
   МодульGZIP.Вставить("CompressionMode", МодульGZIP.NetObject.ПолучитьТип("System.IO.Compression.CompressionMode"));
   МодульGZIP.Вставить("Convert", МодульGZIP.NetObject.ПолучитьТип("System.Convert"));
   Возврат МодульGZIP;
КонецФункции

Функция СтрокаВGZIP(gzip, стр)   
   СжатыйПоток = gzip.NetObject.СоздатьОбъект(gzip.MemoryStream); //Поток куда запишутся сжатые данные
   zipStr = gzip.NetObject.СоздатьОбъект("System.IO.Compression.GZipStream", СжатыйПоток, gzip.CompressionMode.Compress);
   МассивДанных= gzip.UTF8.GetBytes(стр);// Получим массив данных используя кодировку  UTF8
   ПотокДляСжатия = gzip.NetObject.СоздатьОбъект(gzip.MemoryStream,МассивДанных);  // Создадим поток из массива данных
   ПотокДляСжатия.CopyTo(zipStr);
   zipStr.Flush(); // Сбросим данные в  СжатыйПоток
   zipStr.Close(); // Закроем  GZipStream
   compressed = СжатыйПоток.ToArray(); // Получим массив байт сжатых данных
   Возврат gzip.Convert.ToBase64String(compressed); // Переведем сжатые данные в Base64
КонецФункции  

Функция GZIPВСтроку(gzip, стр64)
   compressed=gzip.Convert.FromBase64String(стр64);
   ПотокСжатыхДанных = gzip.NetObject.СоздатьОбъект(gzip.MemoryStream,compressed);
   GZipПоток =gzip.NetObject.СоздатьОбъект("System.IO.Compression.GZipStream",ПотокСжатыхДанных, gzip.CompressionMode.Decompress);
   ПотокРазжатыхДанных = gzip.NetObject.СоздатьОбъект(gzip.MemoryStream);
   GZipПоток.CopyTo(ПотокРазжатыхДанных);
   Данные=ПотокРазжатыхДанных.ToArray();
   Возврат gzip.UTF8.GetString(Данные);
КонецФункции // ()

&НаКлиенте
Процедура Команда2(Команда)
   Команда2НаСервере();
КонецПроцедуры

&НаСервере
Процедура Команда2НаСервере()  
   
   АдресСервера = "10.0.10.140";
   Порт = 8123;
   ТекстЗапроса = "SEL ECT * FROM my_first_table ORDER BY timestamp";
   РесурсНаСервере = "";
   
   Попытка
      Соединение = Новый HTTPСоединение(АдресСервера,Порт);
   Исключение
      Сообщить("Не удалось установить соединение с сервером онлайн-проверки:" 
      + Символы.ПС + ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
      Возврат;
   КонецПопытки;
   
   // посылаем запрос
   
   Попытка
      HTTPЗапрос = Новый HTTPЗапрос(РесурсНаСервере);
      HTTPЗапрос.УстановитьТелоИзСтроки(ТекстЗапроса);
      Результат  = Соединение.ОтправитьДляОбработки(HTTPЗапрос); 
      Ответ = Результат.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);       
      сообщить(Ответ);
      Соединение = Неопределено;
      Если Результат.КодСостояния > 299 Тогда
         Сообщить("Код состояния " + Результат.КодСостояния + ". Проверка не выполнена");
      КонецЕсли;
   Исключение
      Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
   КонецПопытки;   
   
КонецПроцедуры

&НаКлиенте
Процедура ОтправитьДанные(Команда)
   ОтправитьДанныеНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОтправитьДанныеНаСервере()

   АдресСервера = "10.0.10.140";
   Порт = 8123;
   gzip = ПолучитьМодульGZIP();
   
   ТекстЗапроса = "INS ERT IN TO my_first_table (user_id, message, timestamp, metric) VALUES (150, 'Здорова Petr fr om gzip',now(),6.6)";
   ТекстЗапросаGZIP = СтрокаВGZIP(gzip, ТекстЗапроса); 
   
   ДД = Base64Значение(ТекстЗапросаGZIP);
   
   РесурсНаСервере = ""; 
   Заголовки = Новый Соответствие;
   Заголовки.Вставить("Content-Encoding", "gzip");   

   Попытка
      Соединение = Новый HTTPСоединение(АдресСервера,Порт);
   Исключение
      Сообщить("Не удалось установить соединение с сервером онлайн-проверки:" 
      + Символы.ПС + ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
      Возврат;
   КонецПопытки;
   
   // посылаем запрос
   
   Попытка
      HTTPЗапрос = Новый HTTPЗапрос(РесурсНаСервере, Заголовки);
      HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДД);
      Результат  = Соединение.ОтправитьДляОбработки(HTTPЗапрос); 
      Ответ = Результат.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);       
      сообщить(Ответ);
      Соединение = Неопределено;
      Если Результат.КодСостояния > 299 Тогда
         Сообщить("Код состояния " + Результат.КодСостояния + ". Проверка не выполнена");
      КонецЕсли;
   Исключение
      Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
   КонецПопытки;   

КонецПроцедуры
ПубликацииСтатический анализатор кода 1С на Си#15 20.07.23 8:13
(14)Ну пока что 1С 8, если все получится(сделать минимальный набор проверок), то в будущем можно и 1С:Предприятие.Элемент анализировать(но я с ним пока не знаком)
ПубликацииСтатический анализатор кода 1С на Си#13 08.07.23 12:56
(12)Спасибо, попробую!
ПубликацииСтатический анализатор кода 1С на Си#11 07.07.23 13:17
(10)re2c обрабатывает только латиницу и символы, русские буквы я там не обрабатываю, т.к. при генерации кода через re2c 2 тысячи строк кода генерируется если искать кирилицу. Я русские зарезервированные слова ищу через хэш-таблицу, а re2c у меня все подобное как ID определяет. Так что терпеливости у меня тут нет)
ПубликацииСтатический анализатор кода 1С на Си#7 01.07.23 18:58
(4)по tree-sitter Посмотрел вводную информацию на сайте + в интернете погуглил.
Описание там такое:
Цитата
Он может создавать конкретное синтаксическое дерево для исходного файла и эффективно обновлять синтаксическое дерево по мере редактирования исходного файла.
Все таки этот парсер подходит для редакторов, чтобы в режиме онлайн быстро перестраивать синтаксическое дерево. Bison же подходит именно для полного быстрого парсинга и используется повсеместно. Но спасибо за ссылку, не слышал даже про такой продукт.
ПубликацииСтатический анализатор кода 1С на Си#6 30.06.23 9:58
(4)Вот это полезная информация, большое спасибо!
ПубликацииСтатический анализатор кода 1С на Си#5 30.06.23 8:53
(3)
Цитата
BSL LANGUAGE SERVER
Да спасибо, слышал, но он написал на Java, а тут чистая Си. А так получилось, что я изучаю Си, а не Java)
ПубликацииСтатический анализатор кода 1С на Си#2 30.06.23 8:31
(1)
Цитата
а что же, всё-таки, оно делает
Здравствуйте, она делает статический анализ кода (из названия видно). Умеет пока что только вот это (взял из статьи): Изначально планировал сделать автоматический отлов разыменования ссылок (когда ссылки полученных из запроса разыменуются - выдется ошибка), на чем пока и остановился. Еще есть туториал, в котором можно практиковаться и учиться дорабатывать проект. Основная разработка ведется в корне проекта, а tutorial чисто для обучения и для истории (там первая версия этого проекта). Ключевое в статье это получить навыки программирования на Си на проекте для 1С, ведь это делается исключительно для аудитории 1сников. Призыв к коллективной разработке.
ПубликацииВскрытие статического анализа кода проектов 1С#8 30.06.23 5:08
Сделал проект для групповой разработки статического анализатора, написанный на чистом Си Статический анализатор кода 1С на Си