Форум программистов, компьютерный форум, киберфорум
1С: Собственные программы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/56: Рейтинг темы: голосов - 56, средняя оценка - 4.52
 Аватар для wwall
213 / 204 / 15
Регистрация: 29.05.2014
Сообщений: 1,058
1C 8.x

Парсер в 1С. Глава 1. Критикуйте

22.11.2014, 21:23. Показов 12209. Ответов 59
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У каждого действия которое мы делаем – есть мотивация. Мотивацией для этой статьи было желание увидеть продолжение статьи http://infostart.ru/public/239061/. Продал год, подвижек нет, вспомнил вечное «Хочешь сделать хорошо – сделай это сам». Как и предыдущий докладчик я пообещаю вам что к концу этой статьи вы сможете написать свой парсер текста запроса. Тем более ничего сложного в этом нет.
Если вы уже читали «Yacc is dead» (http://arxiv.org/abs/1010.5023) то можете не читать дальше, перейти к комментам, написать кг/ам и перейти к следующей публикации. Для всех остальных – в первой части статьи - небольшой экскурс в теорию.
Что такое парсер в контексте «Matching with derivatives»? Как и на любой другой вопрос в computer since – правильный ответ – функция. Но не любая, а удовлетворяющая следующим условиям
1. Функция разбора пустой строки всегда возвращает истину
2. Функция принимает 2 аргумента – символ для проверки и строку
3. В случае если первый символ в строке для разбора совпадает с символолм для проверки, то функция возвращает остаток строки, исключив первый символ
4. Если 1 символ не совпадает с символом для проверки, то функция возвращает входящую строку
Рассмотрим примитивный парсер, разбирающий строку «а»
1C
1
2
3
4
5
6
7
Функция Разобрать_символ(символ,строка)
    Если сред(строка,1,1) = символ Тогда
        Возврат сред(строка,2);
    Иначе
        Возврат строка;
    КонецЕсли;
КонецФункции
Вызов Разобрать_символ(«м», «м») вернет пустую строку. А как вы помните по определению - вызов любого парсера к пустой строке всегда успешен. То есть вызов Разобрать_символ(«м», «м») и есть примитивный парсер для строки «а». Но что делать если наша строка имеет вид «мама»? Логика подсказывает - необходимо уметь представить запрограммировать последовательность парсеров применяемых к одной строке.
Нет ничего проще
1C
1
2
3
4
5
6
7
Функция РазобратьСлово(ВходящееСлово) 
    результат = Разобрать_символ("м",ВходящееСлово);
    результат = Разобрать_символ("а",результат);
    результат = Разобрать_символ("м",результат);
    результат = Разобрать_символ("а",результат);
    Возврат  результат = "";
КонецФункции
Вызов РазобратьСлово(«мама») вернет истина, как и ожидается. Парсер корректно разбирает входящее слово. Но, предположим, наша грамматика определяет разбор 2 слов –
L -> «мама» | «папа».
Простой вариант решения –
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Функция РазобратьСлово_мама(ВходящееСлово) 
    результат = Разобрать_символ("м",ВходящееСлово);
    результат = Разобрать_символ("а",результат);
    результат = Разобрать_символ("м",результат);
    результат = Разобрать_символ("а",результат);
    Возврат  результат = "";
КонецФункции
Функция РазобратьСлово_папа(ВходящееСлово) 
    результат = Разобрать_символ("м",ВходящееСлово);
    результат = Разобрать_символ("а",результат);
    результат = Разобрать_символ("м",результат);
    результат = Разобрать_символ("а",результат);
    Возврат  результат = "";
КонецФункции
 
Функция РазобратьСлово (ВходящееСлово) 
    Возврат  РазобратьСлово_мама(входящееСлово) или РазобратьСлово_папа(ВходящееСлово);
КонецФункции
Как видим, РазобратьСлово(«мама») или РазобратьСлово(«папа») – вернет истину, во всех оставшихся случаях будет возвращена ложь.
Но, как быть, если наша грамматика будет представлена в виде L-> («м»| «п») «а» («м»| «п») «а»
Можно попытаться описать функцию разбора так
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Функция РазобратьСлово(ВходящееСлово) 
    результат = Разобрать_символ("м",ВходящееСлово);
    Если результат = ВходящееСлово Тогда
        результат = Разобрать_символ("п",ВходящееСлово);
    КонецЕсли;
    Если результат = ВходящееСлово Тогда
        Возврат ложь; // первый символ не "м" и не "п"
    КонецЕсли;
    результатА = Разобрать_символ("а",результат);
    Если результат = результатА Тогда
        Возврат ложь; // второй символ не "а"
    КонецЕсли;
    результат = Разобрать_символ("м",результатА);
    Если результат = результатА Тогда
        результат = Разобрать_символ("п",ВходящееСлово);
    КонецЕсли;
    Если результат = результатА Тогда
        Возврат ложь; // третий символ не "м" и не "п"
    КонецЕсли;
    результат = Разобрать_символ("а",результат);
    Возврат  результат = "";
КонецФункции
Не знаю как вам, но у меня есть подозрение - такой код писать могут только за деньги и только сотрудники франчайзи (я знаю такого франча, но писать его название не буду).
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.11.2014, 21:23
Ответы с готовыми решениями:

Парсер в 1С. Глава 2. Критикуйте
Предыдущая ветка - https://www.cyberforum.ru/1c-custom/thread1307974.html Там остаются вопросы связанные с первой главой. Вторая глава...

критикуйте мой сайт
у меня есть сайт который я создал для того, чтобы донести обществу что есть кучка людей коллекционирующих ретро автомобили, также мы их...

Оцените сбору, критикуйте, предлагайте
Дело такое, собрали мне вчера компухтер, прокомментируйте пожалуйста)) https://www.dns-shop.ru/custompc/configuration/e5df9279c4659b9d/

59
 Аватар для duk337
2956 / 1768 / 84
Регистрация: 03.11.2011
Сообщений: 8,280
25.11.2014, 23:02
Студворк — интернет-сервис помощи студентам
scribble - это игруха?
Цитата Сообщение от wwall Посмотреть сообщение
утебя красиво расположить?
как это? Тебе файловый сервис нужен или реклама?

Добавлено через 1 минуту
Это не личный сайт. Это сайт мастерской. Я просто его админ.
0
 Аватар для wwall
213 / 204 / 15
Регистрация: 29.05.2014
Сообщений: 1,058
30.11.2014, 04:51  [ТС]
Новый вариант. Вопросы и отзывы - приветствуются. А то создается впечатление, что один Dethmontt читает текст.
part.rar
0
 Аватар для duk337
2956 / 1768 / 84
Регистрация: 03.11.2011
Сообщений: 8,280
30.11.2014, 09:50
Цитата Сообщение от wwall Посмотреть сообщение
один Dethmontt читает текст
ну, "о'так от, миста', о'так от..." (К.Кизи). Извини. но читаю сейчас только по диагонали. Новый Год в стране наступает. А с каждым Новым Годом дурдом всё крепче, и всё раньше. А сейчас ещё и паранойя...
Потеоретизировать хорошо в кресле-качалке с сигарой в зубах, перекатывая мысли из полушария в полушарие и наслаждаясь их бликами на гранях разума. Так что, если согласен объяснять очевидные вещи - я встряну.
Ум у меня сейчас слишком обеспокоен

Добавлено через 4 минуты
Блин, так кто такой скриббл? Это не родственник того, из анекдота про "за стенкой скребёт мышь"?
0
 Аватар для wwall
213 / 204 / 15
Регистрация: 29.05.2014
Сообщений: 1,058
30.11.2014, 12:29  [ТС]
Цитата Сообщение от duk337 Посмотреть сообщение
Так что, если согласен объяснять очевидные вещи - я встряну.
Сформулируй вопрос, для начала. Постараюсь ответить.

Цитата Сообщение от duk337 Посмотреть сообщение
Блин, так кто такой скриббл?
Это генератор документации. Не плохой, в принципе
0
 Аватар для duk337
2956 / 1768 / 84
Регистрация: 03.11.2011
Сообщений: 8,280
30.11.2014, 15:42
Цитата Сообщение от wwall Посмотреть сообщение
Сформулируй вопрос, для начала. Постараюсь ответить.
ок. Попробую. А то вот в воскр. (сейчас, то есть) сижу как швед под полтавой между УПП и двумя лазерными резаками. Глаза в кучу.
0
Модератор
Эксперт 1С
 Аватар для Dethmontt
4032 / 2977 / 594
Регистрация: 10.03.2011
Сообщений: 11,701
Записей в блоге: 1
01.12.2014, 01:16
http://erastov.asuscomm.com/part/part1.html
0
 Аватар для wwall
213 / 204 / 15
Регистрация: 29.05.2014
Сообщений: 1,058
01.12.2014, 08:39  [ТС]
Ты это куда так удачно положил что не добраться?
0
 Аватар для duk337
2956 / 1768 / 84
Регистрация: 03.11.2011
Сообщений: 8,280
01.12.2014, 12:39
wwall, а формочку? В теоретической части много букав, мне не потянуть.

Добавлено через 4 минуты
Да и, похоже, засаживаюсь за встраиваемую систему бюджетирования. В УПП хотя бы.
Подруга-консалтер таки решила "не лепить из говна". И про существующие разработки типа Инталева это было самое мягкое слово из её уст. Вот с какими гениями я работаю. Срок - неделя

Добавлено через 5 минут
wwall, слушай, а "ВЫБРАТЬ " - тоже будешь парсить?
Я вообще представлял всё по-другому: создаётся шаблон максимальной структуры и долбится фрагментами. Или идея докопаться до "б" в трабле "Номенблатура"?
0
 Аватар для wwall
213 / 204 / 15
Регистрация: 29.05.2014
Сообщений: 1,058
01.12.2014, 12:40  [ТС]
Цитата Сообщение от duk337 Посмотреть сообщение
wwall, а формочку?
Вот сел за маркдаун парсер. Для того что бы показать как это все вместе вертиться
Цитата Сообщение от duk337 Посмотреть сообщение
Срок - неделя
Ну ты и .... гений!

Добавлено через 1 минуту
Цитата Сообщение от duk337 Посмотреть сообщение
wwall, слушай, а "ВЫБРАТЬ " - тоже будешь парсить?
Вай, дарагой, и выбрать будет, и ЛЕВОЕ СОЕДИНЕНИЕ будет. А для тебя специально даже УПОРЯДОЧИТЬ сделаю
Потерпи пару недель
0
 Аватар для duk337
2956 / 1768 / 84
Регистрация: 03.11.2011
Сообщений: 8,280
01.12.2014, 12:41
Цитата Сообщение от wwall Посмотреть сообщение
Ну ты и .... гений!
бля... и мне это надо? Моей гениальности тут кот наплакал. Вопрос постановки задачи: остроумно отпарсить планирование. А мне что планирование, что пикирование...
0
 Аватар для wwall
213 / 204 / 15
Регистрация: 29.05.2014
Сообщений: 1,058
01.12.2014, 12:42  [ТС]
Цитата Сообщение от duk337 Посмотреть сообщение
отпарсить планирование
А подробнее? что там парсить? в какой вид приводить?
0
0 / 0 / 0
Регистрация: 25.11.2014
Сообщений: 11
01.12.2014, 15:37
Начал читать, постоянно ловлю себя на том что хочу поблагодарить автора . Еще не дочитал. Вот.
0
 Аватар для wwall
213 / 204 / 15
Регистрация: 29.05.2014
Сообщений: 1,058
01.12.2014, 15:57  [ТС]
Цитата Сообщение от akabrr Посмотреть сообщение
хочу поблагодарить автора
Так и скажи спасибо, мне приятно будет.
Но лучше - если скажешь что надо улучшить, где изменить что бы было лучше. Может что не понятно и надо раскрыть подробнее
0
 Аватар для duk337
2956 / 1768 / 84
Регистрация: 03.11.2011
Сообщений: 8,280
01.12.2014, 17:00
wwall, это шутка такая, хотя в ней доля шутки. Я так понял задачу со слов своего гениального постановщика: есть планирование производства -> планирование закупок -> планирование остатков. Эта хрень закольцована. И как только в одном звене что-то пересогласовывается - бюджет летит в апож. Надо всё вместе согласовывать.
Отсюда вытекает следующее. При согласовании одного из звеньев надо отпарсить два других и выделить влияющие факторы на текущее, как-то их показав в виде ограничений и допусков. А чтоб не парсить, надо создать несколько иную - гениальную - систему хранения этих данных.
Ближе к ночи будет у меня предварительное ТЗ вроде как.
0
 Аватар для wwall
213 / 204 / 15
Регистрация: 29.05.2014
Сообщений: 1,058
01.12.2014, 17:05  [ТС]
Чего мозг выносить? Сети Петри спасут отца русской демократии
В принципе любое графовое представление процесса поможет
0
0 / 0 / 0
Регистрация: 25.11.2014
Сообщений: 11
01.12.2014, 17:13
Спасибо, за пример реализации парсера. Сам этим занимался, помимо основной работы. И чего-то мне не нравилась моя реализация. И вот в приведенном примере я увидел то что хотел.

Отдельно спасибо за пример работы с xUnitFor1C.
0
 Аватар для wwall
213 / 204 / 15
Регистрация: 29.05.2014
Сообщений: 1,058
01.12.2014, 17:15  [ТС]
Там примера еще нет. Я его в муках выдумываю.
А насчет работы с xUnitFor1C - тут к Артуру проще. Он достаточно подробно все разжевывает. Там на самом деле мощная штука запилена

Парсер чего хоть писал?
0
0 / 0 / 0
Регистрация: 25.11.2014
Сообщений: 11
01.12.2014, 17:24
Прямого запроса в 7.7, хочу объектную модель забацать. Что-то вроде таковой в снеговике.
0
 Аватар для wwall
213 / 204 / 15
Регистрация: 29.05.2014
Сообщений: 1,058
01.12.2014, 17:29  [ТС]
грамматика есть к нему?
0
0 / 0 / 0
Регистрация: 25.11.2014
Сообщений: 11
01.12.2014, 17:36
Язык представляет собой диалект SQL. Грамматику можно и самому накидать .
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.12.2014, 17:36

Критикуйте код. Очень надо
Особо интересует это - https://github.com/wwall/drracket-loxy/blob/master/rules/lexer-rules.rkt ну и полностью по проекту - тоже...

Стоит брать это Пк или по критикуйте конфигу
Мат.плата Gigabyte GA-Z68P-DS3 Soc-1155 iZ68 Процессор Core i5-3450 OEM <3.10GHz, 6Mb, LGA Вентилятор DeepCool...

Глава Microsoft
Выступает, танцует, и просто отжигает :) Молодец дядька, за такое человека можно уважать :)

Шлее, глава 40
Читал я книгу Шлее по Qt 4.5, дочитал до сороковой главы (Программирование поддержки сети). Попробовал скомпилировать его пример. Исходный...

Лафоре. Глава 11. Задача 2
Решал задачку из учебника - Лафоре. Глава 11. Задача 2. Вот код #include <iostream> #include <iomanip> #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru