<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Parser 3 forum</title>
<link>http://www.parser.ru/forum/</link>
<description>Parser 3. Обсуждение.</description>
<generator>Parser 3.5.0 (compiled on amd64-unknown-freebsd13.4) (http://www.parser.ru/)</generator>
<webMaster>mailbox@parser.ru</webMaster>
<lastBuildDate>Fri, 27 Mar 2026 13:56:04 GMT</lastBuildDate>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<item>
<title>Можем. Уже пилим и много чего запилили - только пока не публиковали широкой общественности. Возможно даже и разорвем :)</title>
<description><![CDATA[Есть уже даже несколько проектов в продакшене. Анти-битрикс в действии - по скорости работы и гибкости битрикс и рядом не стоял. Да и по скорости кодинга (даже скорее конфигурирования, а не программирования) бекенд очень быстро делается.]]></description>
<author>sergei v.2</author>
<pubDate>Fri, 27 Mar 2026 13:56:04 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87118</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87118</guid>
</item>
<item>
<title>В реестре российского ПО полно CMS…</title>
<description><![CDATA[https://reestr.digital.gov.ru/search/?q=%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0+%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5+%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BD%D1%82%D0%BE%D0%BC

Можете запилить свою и разорвать рынок. Пусть Битрикс рыдает.]]></description>
<author>Sumo</author>
<pubDate>Tue, 24 Mar 2026 17:45:38 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87117</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87117</guid>
</item>
<item>
<title>CMS</title>
<description><![CDATA[Здравствуйте! Whatsapp отъехал Телега на подходе, с 31.03.2026 отъедет из РФ cPanel так глядишь и CMSки полетят. Parser3 не планирует свою CMS для сайтов?]]></description>
<author>[Серж]</author>
<pubDate>Tue, 24 Mar 2026 07:26:50 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87116</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87116</guid>
</item>
<item>
<title>Спасибо</title>
<description><![CDATA[Добавил ссылку на https://www.parser.ru/docs/]]></description>
<author>moko</author>
<pubDate>Fri, 20 Mar 2026 14:59:16 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87115</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87115</guid>
</item>
<item>
<title>там в конце про sql syntax error (-)</title>
<author>AK666</author>
<pubDate>Wed, 18 Mar 2026 02:00:05 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87114</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87114</guid>
</item>
<item>
<title>Ну так добавьте try и запишите например в файл, чтобы не обрезалось</title>
<description><![CDATA[Но суть примерно понятна, произошло исключение при INSERT INTO log_exception]]></description>
<author>moko</author>
<pubDate>Wed, 18 Mar 2026 01:58:35 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87113</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87113</guid>
</item>
<item>
<title>никагда такого не бьіло и вот - опять:</title>
<description><![CDATA[пробую сохранять exeption в базу:

<pre> $lMessage[EXCEPTION: ^if(def $aMessage){${aMessage}^#0A}^if(def $lException ){^json:string[$lException]}^if($lStack){^#0AStack:^#0A^lStack.menu{ $lStack.name : $lStack.file ($lStack.lineno) }[^#0A]}]
</pre>
строго по Вашему шаблону:

<pre>    ^connect[$lLogger.db]{
      $query[^apply-taint[sql][
        INSERT INTO $lLogger.table
          SET
            Session = &apos;${status:pid}/$status:tid&apos;
            ^if(def $lLevel){   ,Level = ^lLevel.int(-1) }
            ^if(def $lSection){ ,Section = _utf8&apos;^lSection.left(250)&apos;}
           ,Message = _utf8&apos;^taint[$lMessage]&apos;
           ,Host    = _utf8&apos;$env:REMOTE_ADDR ^if($env:HTTP_X_REAL_IP ne $env:REMOTE_ADDR || def $env:HTTP_CF_IPCOUNTRY){($env:HTTP_X_REAL_IP $env:HTTP_CF_IPCOUNTRY)} -&gt; $env:SERVER_ADDR&apos;
           ,Domain  = _utf8&apos;$env:HTTP_HOST / $env:SERVER_NAME&apos;
           ,URI     = _utf8&apos;$env:REQUEST_URI -&gt; $env:PATH_TRANSLATED&apos;
           ,ENV     = _utf8&apos;^taint[^json:string[$env:fields]]&apos;
           ,Forms   = ^if(def $form:fields){_utf8&apos;^taint[^json:string[$form:fields]]&apos;}{NULL}
      ]]
      ^void:sql{$query}
    }
</pre>

не пишет в базу, пишет в лог парсера:

<blockquote>Unhandled exception in eLogger.p(87:13): &apos;\n        INSERT INTO log_exception\n          SET\n            Session = &apos;58979/58979&apos;\n               ,Level = 65535 \n             ,Section = _utf8&apos;UNHANDLED&apos;\n           ,Message = _utf8&apos;EXCEPTION: type: sql.execute\\nsource: \\n        INSERT INTO log_exception\\n          SET\\n            Session = \\&apos;58979/58979\\&apos;\\n               ,Level = 65535 \\n             ,Section = _utf8\\&apos;db\\&apos;\\n           ,Message = _utf8\\&apos;EXCEPTION: type: sql.execute\\\\nsource: UPDATE email SET StatusID = 200 WHERE ID = 102970\\\\nfile: /ext.bounce.p\\\\nlineno: 72\\\\ncolno: 13\\\\ncomment: UPDATE command denied to user \\\\\\&apos;API\\\\\\&apos;@\\\\\\&apos;10.0.0.22\\\\\\&apos; for table \\\\\\&apos;email\\\\\\&apos;\\\\nhandled: 0\\&apos;\\n           ,Host    = _utf8\\&apos;10.0.0.60 ( ) -&gt; 10.0.0.22\\&apos;\\n           ,Domain  = _utf8\\&apos;t.local / t.local\\&apos;\\n           ,URI     = _utf8\\&apos;/?bounce -&gt; /EXT.local/index.p3h\\&apos;\\n          &quot;</blockquote>]]></description>
<author>AK666</author>
<pubDate>Wed, 18 Mar 2026 01:09:29 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87112</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87112</guid>
</item>
<item>
<title>Наконец-то народ допер до решения, которое мы использовали 20 лет назад. :) (-)</title>
<author>Sumo</author>
<pubDate>Thu, 12 Mar 2026 16:54:19 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87111</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87111</guid>
</item>
<item>
<title>Не хватает…</title>
<description><![CDATA[Парсер все равно работает в режиме запрос-ответ. Для вебсокетов и sse нужны долгоживущие процессы, которые могут отвечать через одно соединение на кучу запросов. Поэтому спокойно берем aiohttp для Питона или пишем на Го отдельный демон для чатов и всяких прокси во внешние сервисы. Пытаться все сделать на одном языке могут только программисты на Яве. :))))]]></description>
<author>Sumo</author>
<pubDate>Thu, 12 Mar 2026 16:53:00 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87110</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87110</guid>
</item>
<item>
<title>Ответ</title>
<description><![CDATA[Теперь когда парсер умеет в демона - это возможно, или концептуально все равно чего-нибудь не хватает?]]></description>
<pubDate>Thu, 12 Mar 2026 11:06:40 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87109</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87109</guid>
</item>
<item>
<title>3.4.5 (-)</title>
<author>[Андрей]</author>
<pubDate>Wed, 11 Mar 2026 15:35:16 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87108</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87108</guid>
</item>
<item>
<title>Спасибо, увидел. В 3.4.6 не было. (-)</title>
<author>[Андрей]</author>
<pubDate>Wed, 11 Mar 2026 15:31:44 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87107</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87107</guid>
</item>
<item>
<title>Ответ</title>
<description><![CDATA[Честно говоря не очень хочется использовать готовое там где можно сделать свое. Сейчас к учетной системе сервера по работе с ТСД для склада, в итоге все равно прихожу к тому что лишний сервер это непонятные глюки, сюрпризы и зачастую невозможность получить тот функционал который нужен, сейчас переходим на другую программу которая не использует сторонние серверы и просто работает с файлами которые получает из моей системы. Да и не попался мне продукт который бы устроил в плане коммуникаций и тикетов, если у вас есть на слуху удачные решения прошу поделиться.]]></description>
<author>[Андрей]</author>
<pubDate>Wed, 11 Mar 2026 15:28:44 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87106</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87106</guid>
</item>
<item>
<title>Зоопарк - мейнстрим последних лет</title>
<description><![CDATA[Логичнее взять готовое решение для коммуникаций/тикетов и интегрировать его по API (которое написать на парсере). Да, получается некоторый зоопарк, но так теперь принято: не делать один монолит “на все”, а подключать специализированные сервисы там, где они есть.]]></description>
<author>moko</author>
<pubDate>Wed, 11 Mar 2026 13:11:45 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87105</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87105</guid>
</item>
<item>
<title>Сомневаюсь что готовые решения найдете</title>
<description><![CDATA[Но можно написать всё что угодно, в том числе и перечисленное вами.

Как принимать почту с помощью Parser есть в описании.]]></description>
<author>Spearance</author>
<pubDate>Wed, 11 Mar 2026 12:39:54 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87104</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87104</guid>
</item>
<item>
<title>Месенджер, email-клиент, crm на парсер. Возможно?</title>
<description><![CDATA[Уважаемые гуру и монстры парсера! Подскажите куда копать, на что обратить внимание и какие инструменты использовать. 
Существует написанная на парсере система куда входит товароучетная система типа 1с для работы офиса, терминал для работы менеджеров в магазине, b2b-портал для оптовиков и сайт для розничных покупателей. 
Есть необходимость прикрутить туда же внутренний мессенджер, он же тикет-система с задачами внутри компании, он же простейшая crm система для работы с клиентами. 
Из вопросов: как организовать получение и отправку почты (что-то типа простого email клиента), как организовать работу месенджера. Если кто-то решал подобные задачи буду признателен за любую информацию.]]></description>
<author>[Андрей]</author>
<pubDate>Wed, 11 Mar 2026 10:33:35 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87103</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87103</guid>
</item>
<item>
<title>Свежее прочтение документации Parser 3</title>
<description><![CDATA[Предыдущий пост был не просто так, он был и остается обособленной частью проекта о котором речь пойдет ниже.

Я решил переосмыслить документацию Parser и написать свой вариант, основываясь на формате Markdown. Ссылка на <a href="https://meenga.ru/doc/">документацию</a> (временная).

Что изменилось в документации по Parser?

<b>1. Структура</b>

Классы вынесены на первое место, потому что являются более актуальными в поиске.

Некоторые разделы переставлены, например, «Комментарии к частям выражения» переехал в ветку «Условных операторов».

Упрощено обращение через адресную строку браузера. Ссылки теперь выглядят так <i>/class/имя_класса/[method|field|option]/имя_метода_поля_или_опции/</i>, например:
<i>URL/class/table/method/count/</i>.

Единая структура для всех страниц с описанием.

Внутри страниц описания код с примерами подсвечивается и получил возможность копирования. Из-за этого пришлось отказаться от прямых ссылок из кода на перекрестные страницы, по крайней мере пока.

Все параметры внутри кода описаны через snake_case. Это сделано для удобства дальнейшего исправления после копирования в свой код.

<b>2. Поиск</b>

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

Два поиска:
- по заголовкам
- по ключевым словам

<b>3. Горячие клавиши</b>

Поиск активируется горячей клавишей /. Стрелки вверх/вниз перемещения по результатам поиска, отмена поиска (ESC) и подтверждение (Enter).
Клавиша возврата к оглавлению раздела Alt + ← (Win) или ⌘ + ← (Мас) из страницы с описанием.

<b>4. Оформление</b>

Добавлена тёмная тема.
Птиц немного анимирован и добавлен в сноски.

<b>5. Версия для печати</b>

Любую страницу можно напечатать и она будет хорошо свёрстана. Ссылки и аббревиатуры отображаются текстом.

<b>Версия для смартфонов.</b>

<b>6. Прочее</b>

Улучшены семантика и типографика.

В примерах символы табуляции, например в таблицах, стоят правильными знаками и не требуют замены при копировании.

Добавлены аббревиатуры.

---

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

Если этот формат приживется, готов предложить его для замены текущей документации на сайте <b>parser.ru</b>, но это должно решить сообщество.]]></description>
<author>Spearance</author>
<pubDate>Tue, 10 Mar 2026 16:05:20 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87102</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87102</guid>
</item>
<item>
<title>Документация Parser 3 в Markdown на GitHub</title>
<description><![CDATA[В продолжении тестирования класса <a href="https://github.com/Spearance/markdown-p3">makdown.p</a> решил замахнуться на святое и переверстал всю документацию Parser 3 в Markdown.

На сегодня — это практически копия исходной документации, лишь в некоторых местах совсем чуть-чуть подправлены описания, примеры, добавлены картинки в класс <b>image</b> и прочие мелочи.

Вся структура приведена к единому стилю, но со своими особенностями.

Маркдаун моего класса работает более логично (правильно, если хотите), поэтому некоторые конструкции не очень хорошо читаются в GitHub. Например ссылки внутри бэктиков GitHub обрабатывать не умеет, или не позволяет эскейпить сами бэктики.

Структура разделов документации изменилась, теперь классы вынесены на первое место, а всё остальное, наоборот, убрано подальше. Почему так случилось — напишу чуть позже, а сейчас, у всех есть возможность использовать документацию как опенсорс.

Ссылка на <a href="https://github.com/Spearance/Parser-3-Documentation/">документацию</a>.

Как всегда приветствуются ишьи, советы, комментарии.]]></description>
<author>Spearance</author>
<pubDate>Tue, 10 Mar 2026 05:02:15 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87101</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87101</guid>
</item>
<item>
<title>Размышления Страуструпа про защищенные члены…</title>
<description><![CDATA[Из очень хорошей книги «Дизайн и эволюция языка C++

~~~~~~~~~~~

13.9. Защищенные члены

Простая модель сокрытия данных на основе закрытых и открытых секций класса прекрасно работала в C++, пока он использовался в основном как язык для абстрагирования данных. Данная модель была вполне пригодна и для большого
класса задач, где наследование применялось для объектноориентированного программирования. Однако, когда речь заходит о классах, выясняется, что к любому
из них обращаются либо производные от него классы, либо прочие классы и функции. Функциичлены и дружественные функции, реализующие операции с классом, воздействуют на его объекты от имени одного из этих «пользователей». Механизм открытых и закрытых членов позволяет четко различать автора класса и т.п., но не дает возможности приспособить поведение к нуждам производных классов.

Вскоре после выхода версии 1.0 ко мне в кабинет заглянул Марк Линтон и умолял добавить третий уровень контроля доступа, который напрямую поддержал бы стиль, применяемый в библиотеке Interviews (см. раздел 8.4.1). Она разрабатывалась в Стэнфорде. Мы выбрали слово protected для обозначения членов класса, которые вели себя как «открытые» для прочих членов самого этого класса и производных от него, но как «закрытые» для всех остальных «пользователей».

Марк был главным создателем библиотеки Interviews. Основываясь на опыте
и примерах из настоящих программ, он убедительно доказывал, что защищенные
данные абсолютно необходимы при проектировании эффективной и расширяемой инструментальной библиотеки для X Windows. Альтернативой защищенным
данным, по его словам, были неприемлемо низкая эффективность, неуправляемое
распространение встраиваемых интерфейсных функций или глобальные данные.
Защищенные данные и, в более широком смысле, защищенные члены казались
меньшим злом. Кроме того, так называемые чистые языки вроде Smalltalk поддерживали именно такую – довольно слабую – защиту вместо более сильной защиты C++, основанной на концепции private. Мне самому приходилось писать код, в котором данные были объявлены как public просто для того, чтобы ими можно было пользоваться в производных классах. Видел я также и программы, в которых концепция friend использовалась неудачно и лишь ради того, чтобы дать доступ явно поименованным производным классам.

Это были веские аргументы, убедившие меня в том, что защищенные члены надо разрешить. Однако «веские аргументы» могут найтись для каждого мысли
мого языкового средства и для любого возможного его использования. Нам же
нужны факты. Не имея фактов и должным образом осознанного опыта, мы уподобляемся греческим философам, которые на протяжении нескольких веков велиблистательные дискуссии, но так и не смогли договориться, из каких же четырех (а может, пяти) основных субстанций состоит Вселенная.

Примерно через пять лет Марк запретил использование защищенных членов
данных в Interviews, поскольку они стали источником ошибок и серьезно усложнили сопровождение. В пленарном докладе Барбары Лисков (Barbara Liskov) на
конференции OOPSLA [Liskov, 1987] достаточно подробно описываются теоретические и практические проблемы, связанные с контролем доступа на основе
концепции protected. Мой опыт показывает, что всегда существовали альтернативы размещению информации в общем базовом классе, где она была бы доступной производным классам. Я сомневался по поводу protected еще и потому, что
при небрежном программировании общий базовый класс слишком уж легко использовать как разновидность глобальных данных.

К счастью, вас никто не принуждает пользоваться защищенными данными в C++. По умолчанию члены класса имеют атрибут private, и обычно такой выбор лучше. Замечу, впрочем, что ни одно из этих возражений не относится к защищенным членамфункциям. Убежден, что protected прекрасно подходит для специфицирования операций, которыми можно пользоваться в производных классах.

Защищенные члены появились в версии 1.2. Защищенные базовые классы были впервые описаны в ARM и включены в версию 2.1. Оглядываясь назад, я думаю, что protected– это тот случай, когда «веские аргументы» и мода сбили меня с пути истинного и заставили отказаться от своих убеждений ради новых
возможностей.

~~~~~~~~~~~

Дополню разработчика самого универсального языка программирования… Чем меньше мы мешаем программистам пользоваться нашими объектами, тем лучше. Чем больше я программирую тем чаще делаю все переменные публичными. :)]]></description>
<author>Sumo</author>
<pubDate>Wed, 04 Mar 2026 20:03:03 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87100</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87100</guid>
</item>
<item>
<title>Нет. Куча лишних вызовов функций для обрашения к полям</title>
<description><![CDATA[Да и вся эта возня с разделением на приватные и публичные поля и методы прекрасно решается на уровне соглашений об именах. Жесткий контроль не требуется нигде. А в языках с динамической типизацией и подавно.]]></description>
<author>Sumo</author>
<pubDate>Wed, 04 Mar 2026 19:23:20 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87099</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87099</guid>
</item>
<item>
<title>Написал тестовый пример для переменных private</title>
<description><![CDATA[<b>test.p:</b>
<pre>@CLASS
test

@OPTIONS
locals

@create[]

@getPrivate[]
	$result[$self.vars.private]

@GET_DEFAULT[sFieldName]
	^if(^self.privateVarNames.contains[$sFieldName]){
		^return[PRIVATE]
	}
	$result[$self.vars.[$sFieldName]]

@GET_vars[]
	^if(^reflection:uid[$self] ne ^reflection:uid[$caller.self]){
		^return[PRIVATE]
	}
	$result[
		$.public[777]
		$.private[666]
	]

@GET_privateVarNames[]
	^if(^reflection:uid[$self] ne ^reflection:uid[$caller.self]){
		^return[PRIVATE]
	}
	$result[
		$.private[]
	]</pre>

<b>index.html:</b>
<pre>	^use[test.p]
	$oTest[^test::create[]]
	public=$oTest.public&lt;br /&gt;
	private=$oTest.private&lt;br /&gt;
	private_by_method=^oTest.getPrivate[]&lt;br /&gt;
	vars=^json:string[$oTest.vars]&lt;br /&gt;
	privateVarNames=^json:string[$oTest.privateVarNames]</pre>

На выходе получаем:
<blockquote>public=777
private=PRIVATE
private_by_method=666
vars=&quot;PRIVATE&quot;
privateVarNames=&quot;PRIVATE&quot;</blockquote>

Наверняка что-то не учел.)
Есть ли смысл копать в этом же направлении?]]></description>
<author>virusav</author>
<pubDate>Wed, 04 Mar 2026 19:08:10 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87098</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87098</guid>
</item>
<item>
<title>Только на уровне соглашения…</title>
<description><![CDATA[Обычно делают как в Питоне — начинают приватные поля со знака подчеркивания. В коде прекрасно видно, если появляется обращение объект._член и это не self._член. Значит в этом месте делается какая-то ерунда.

В питоне отлично работает — https://docs.python.org/3/tutorial/classes.html#private-variables]]></description>
<author>Sumo</author>
<pubDate>Wed, 04 Mar 2026 18:12:32 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87097</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87097</guid>
</item>
<item>
<title>Разделение переменных и методов класса на public/protected/private</title>
<description><![CDATA[Добрый день.
Как я понял, сейчас все переменные и методы класса по умолчанию <b>public</b>.

Есть ли стандартный способ сделать переменную/метод <b>protected/private</b>?]]></description>
<author>virusav</author>
<pubDate>Wed, 04 Mar 2026 18:05:16 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87096</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87096</guid>
</item>
<item>
<title>В качестве обходного решения можно использовать разные пути для одного и того же файла.</title>
<description><![CDATA[Такое подключение уже использованного класса не поместит его в конец списка:
<pre>	^use[class1.p;
		$.replace(true)
	]</pre>

А такое - поместит:
<pre>	^use[../test/class1.p;
		$.replace(true)
	]</pre>

Если уж для оптимизации уже подключенные файлы заново не подключаются, то, может, стоит их подключать по абсолютному пути (от корня веб-пространства или диска)?
Или это тоже фича, чтобы можно было повторно использовать один и тот же файл?)]]></description>
<author>virusav</author>
<pubDate>Tue, 03 Mar 2026 17:21:39 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87095</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87095</guid>
</item>
<item>
<title>Такое возможно реализовать самостоятельно</title>
<description><![CDATA[В парсер это добавляться не будет, поскольку это лишние действия.]]></description>
<author>moko</author>
<pubDate>Tue, 03 Mar 2026 17:13:52 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87094</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87094</guid>
</item>
<item>
<title>В теории возможен вариант</title>
<description><![CDATA[Если был какой-нибудь хеш, который хранил бы соответствие <b>путь к файлу - название класса</b>, то при повторном подключении можно было бы взять название класса из этого хеша и сделать, как уже сейчас в ночных сборках.

<pre>$USED.$filename[название класса и, возможно, еще какие-нибудь параметры]</pre>

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

Такое возможно?]]></description>
<author>virusav</author>
<pubDate>Tue, 03 Mar 2026 17:09:59 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87093</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87093</guid>
</item>
<item>
<title>Так не получится</title>
<description><![CDATA[Если файл не грузится/не компилируется, то и класс не подключается, а значит и список классов не может поменяться.]]></description>
<author>moko</author>
<pubDate>Tue, 03 Mar 2026 15:59:45 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87092</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87092</guid>
</item>
<item>
<title>Повторная обработка не нужна</title>
<description><![CDATA[Но при этом нужно, чтобы название подключенного класса было последним в списке.)

Если переопределить <b>^use[]</b>, то будет повторное подключение, а это не нужно.]]></description>
<author>virusav</author>
<pubDate>Tue, 03 Mar 2026 14:00:23 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87091</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87091</guid>
</item>
<item>
<title>Это фича</title>
<description><![CDATA[В документации правда не очень однозначно написано:

<blockquote>попытки подключить уже подключенные ранее модули не приводят к повторному считыванию файлов с диска.</blockquote>

Если вам нужна повторная обработка - используйте ^process[], как в реализации ^use[] на парсере (но понятно без $USED):

https://cvsview.parser.ru/cgi/viewcvs.cgi/parser3/tests/366.html?view=markup]]></description>
<author>moko</author>
<pubDate>Mon, 02 Mar 2026 19:38:59 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87090</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87090</guid>
</item>
<item>
<title>Не работает.</title>
<description><![CDATA[class.p:
<pre>@CLASS
test

@method1[]
</pre>

class1.p:
<pre>@CLASS
test1

@method2[]
</pre>

index.html:
<pre>@main[]
	^use[class1.p;
		$.replace(true)
	]
	^use[class.p;
		$.replace(true)
	]
	^use[class1.p;
		$.replace(true)
	]
	$hClasses[^reflection:classes[]]
	&lt;pre&gt;!^json:string[$hClasses]!&lt;/pre&gt;
	&lt;pre&gt;!^hClasses._at(-1)[key]!&lt;/pre&gt;</pre>

В итоге последний метод - <b>test</b>, а должен быть - <b>test1</b>.

Возможно, проблема в том, что при повторном подключении того же самого файла фактически не происходит его подключения.
Когда файлы называются по-разному, но название класса совпадает, то <b>use</b> работает.]]></description>
<author>virusav</author>
<pubDate>Mon, 02 Mar 2026 19:30:55 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87089</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87089</guid>
</item>
<item>
<title>Это уже сделано</title>
<description><![CDATA[При повторном подключении класса он становится последним в хеше, который выдает ^reflection:classes[].]]></description>
<author>moko</author>
<pubDate>Mon, 02 Mar 2026 19:12:29 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87088</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87088</guid>
</item>
<item>
<title>Если класс уже подключался, то независимо от $.replace(true) его не получить?</title>
<description><![CDATA[<pre>	^use[class1.p;
		$.replace(true)
	]
	^use[class.p;
		$.replace(true)
	]
	^use[class1.p;
		$.replace(true)
	]</pre>

Нужно реализовывать метод <b>use</b>, чтобы можно было снова подключать класс и получать его название через <b>reflection:classes</b>?
Или можно как-то сделать, чтобы вновь подключаемый класс становился последним без этого?]]></description>
<author>virusav</author>
<pubDate>Mon, 02 Mar 2026 19:02:57 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87087</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87087</guid>
</item>
<item>
<title>https://en.wikipedia.org/wiki/Smart_host</title>
<description><![CDATA[В postfix настраивается в одну команду:
relayhost = your.provider.smtp
Но это мы уже ушли от парсера.]]></description>
<author>moko</author>
<pubDate>Fri, 27 Feb 2026 15:34:26 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87086</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87086</guid>
</item>
<item>
<title>Эта история нужна, когда нет почтового сервера без авторизации на серваке с парсером или рядом в сети.</title>
<description><![CDATA[Или когда есть, но 25 порт для него на исходящие закрыт и хостер упирается и не открывает.
Яндекс.клауд например.
Нету предмета для администрирования. Когда есть и он работает через 25й порт, то $MAIL[$.SMTP[...]] достаточно.]]></description>
<author>sergei v.2</author>
<pubDate>Fri, 27 Feb 2026 15:27:04 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87085</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87085</guid>
</item>
<item>
<title>Настройка почты на unix сервере - это не уровень приложения</title>
<description><![CDATA[Это задача системного администратора. Почту отправляет не только сайт, но и cron и еще потенциально куча сервисов. Да, если нужно используется smarthost, но опять же это задача администратора. Ему же и удобнее, когда все письма зафиксированы в логах почтового сервера (у нас обычно postfix).]]></description>
<author>moko</author>
<pubDate>Fri, 27 Feb 2026 13:30:36 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87084</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87084</guid>
</item>
<item>
<title>Практически на каждом сайте надо отправлять почту ...</title>
<description><![CDATA[От формы обратной связи до регистрации и забыли пароль.

С блокировкой хостерами 25-го порта начинаются приключения. MSMTP решает проблему, но тут надо таскать за собой его конфиг /etc/msmtprc, хотя можно было бы обойтись уровнем приложения легко, без дополнительных конфигов внешних приложений.
Вообще странно, что строка эта сплитится по пробелам (чтобы потом по сути их опять склеить, ну может в другом порядке и может что-то исключить) - надо было либо её как есть клеить, либо делать через хеш-параметров (как вы и предложили выше) и их тоже как есть склеивать.

Я к тому, что можно один раз доделать нормально и закрыть вопрос с отправкой почты раз и на всегда.
И ещё не очень понятно почему в unsafe mode можно менять sendmail на другое приложение через параметризацию, а в safe mode нельзя?]]></description>
<author>sergei v.2</author>
<pubDate>Fri, 27 Feb 2026 08:58:01 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87083</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87083</guid>
</item>
<item>
<title>Технически понятно можно</title>
<description><![CDATA[Например поддержать массив опций, а не только строку. Но не то чтобы это часто надо. Так что задачу добавлю, но едва ли это будет скоро сделано.]]></description>
<author>moko</author>
<pubDate>Thu, 26 Feb 2026 19:15:27 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87082</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87082</guid>
</item>
<item>
<title>Да хотелось из приложения на парсере всем этим рулить и конфигугрировать через оидн конфиг, а не распихивать настройки в кучу мест</title>
<description><![CDATA[а нельзя эти options (или может ввести новый спец-ключ) и &quot;как есть&quot; в конец команды приклеивать как строку?]]></description>
<author>sergei v.2</author>
<pubDate>Thu, 26 Feb 2026 17:05:29 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87081</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87081</guid>
</item>
<item>
<title>Да, парсером</title>
<description><![CDATA[https://github.com/artlebedev/parser3/blob/master/src/classes/mail.C#L145]]></description>
<author>moko</author>
<pubDate>Thu, 26 Feb 2026 16:38:57 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87080</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87080</guid>
</item>
<item>
<title>&quot;аргументы разделяются по пробелу&quot; - кем? парсером? (-)</title>
<author>sergei v.2</author>
<pubDate>Thu, 26 Feb 2026 16:35:48 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87079</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87079</guid>
</item>
<item>
<title>Никак</title>
<description><![CDATA[Это не командная строка bash, кавычки там не поддерживаются, аргументы разделяются по пробелу, то есть такое: --passwordeval=&quot;echo -n qwerty&quot; будет передано как 3 аргумента: --passwordeval=&quot;echo, -n, qwerty&quot;. Проще вернуться к врапперу на shell. :)]]></description>
<author>moko</author>
<pubDate>Thu, 26 Feb 2026 16:18:45 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87078</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87078</guid>
</item>
<item>
<title>Не очень понятно как передать кавычки в $.options[... --passwordeval=&quot;echo -n qwerty&quot; ...]</title>
<description><![CDATA[Так всё авторизуется и отправляется из bash
<pre>echo &quot;Test message.&quot; | /usr/sbin/sendmail -t -i -f info@fromdomain.ru --host=mx.fromdomain.ru --port=465 --auth=login --user=&quot;info@fromdomain.ru&quot; --passwordeval=&quot;echo -n qwerty&quot; --tls=on --tls-starttls=off --tls-certcheck=off vasya@mail.ru
</pre>

А когда подсовываем параметры через парсер
<pre>
######################################
@main[]

^sendMail[
      $.from[Сайт &lt;info@fromdomain.ru&gt;]
      $.to[Вася &lt;vasya@mail.ru&gt;]
      $.subject[как дела твои]
      $.text[Как у тебя дела? У меня - изумительно!]
]


^eval(2+3)

######################################
@sendMail[h]

^h.add[$.options[--host=mx.fromdomain.ru --port=465 --auth=login --user=&quot;info@fromdomain.ru&quot; --passwordeval=&quot;echo -n qwerty&quot; --tls=on --tls-starttls=off --tls-certcheck=off]]
^mail:send[$h]
</pre>

Получаем ошибку 

send

&apos;/usr/sbin/sendmail&apos; reported problem: sh: -c: line 1: unexpected EOF while looking for matching `&quot;&apos;
sendmail: cannot read output of &apos;&quot;echo&apos;

Если без кавычек, то он не может авторизоваться
send

&apos;/usr/sbin/sendmail&apos; reported problem: sendmail: authentication failed (method LOGIN)
sendmail: server message: 535 5.7.8 Error: authentication failed: (reason unavailable)
sendmail: could not send mail]]></description>
<author>sergei v.2</author>
<pubDate>Thu, 26 Feb 2026 16:06:49 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87077</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87077</guid>
</item>
<item>
<title>симлинк + ^mail:send[... $.options[-a smtp_mail_ru] ...] тоже работает (-)</title>
<author>sergei v.2</author>
<pubDate>Wed, 25 Feb 2026 21:12:26 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87076</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87076</guid>
</item>
<item>
<title>Да целый день читал два абзаца на этой странице :) ... Много думал. Симлинк придумал максимум</title>
<description><![CDATA[До враппера не додумался - спасибо за подсказку. Сделал - всё работает идеально :)

Ну и не задавать переменную изначально из серии &quot;а что так можно было?&quot; -- не очевидно (интуитивно ожидалось, что её можно сбросить)]]></description>
<author>sergei v.2</author>
<pubDate>Wed, 25 Feb 2026 20:56:40 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87075</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87075</guid>
</item>
<item>
<title>А прочитать наконец документацию?</title>
<description><![CDATA[https://www.parser.ru/docs/lang/?parserconfmethod.htm - уже же даже ссылку дал.

Но в случае safe версии понятно остается только враппер на shell положить вместо /usr/sbin/sendmail, который вызовет /bin/msmtp уже с нужными параметрами.]]></description>
<author>moko</author>
<pubDate>Wed, 25 Feb 2026 20:34:28 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87074</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87074</guid>
</item>
<item>
<title>а как докинуть к sendmail дополнительные ключи через ^mail:send[]?</title>
<description><![CDATA[Например ключ &quot;-a smtp_mail_ru&quot;

echo &quot;Test message.&quot; | /usr/sbin/sendmail -t -i -f website@fromdomain.ru -a local_smtp_x vasya@mail.ru]]></description>
<author>sergei v.2</author>
<pubDate>Wed, 25 Feb 2026 20:25:21 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87073</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87073</guid>
</item>
<item>
<title>Решилось не определением переменной $MAIL на самом верху (закоментил) - в auto.p рядом с парсером</title>
<description><![CDATA[Было бы наверное не плохо уметь делать пустое значение в любом месте кода $MAIL[]]]></description>
<author>sergei v.2</author>
<pubDate>Wed, 25 Feb 2026 20:21:39 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87072</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87072</guid>
</item>
<item>
<title>Гм...</title>
<description><![CDATA[https://www.parser.ru/docs/lang/?parserconfmethod.htm

&quot;в бинарных версиях, распространяемых с сайта parser.ru, задана команда отправки писем
/usr/sbin/sendmail -i -t -f postmaster&quot;

Если не задавать $MAIN:MAIL, будет использоваться именно она (в вашем случае будет вызван msmtp, что вроде как вам и требуется).]]></description>
<author>moko</author>
<pubDate>Wed, 25 Feb 2026 20:20:10 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87071</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87071</guid>
</item>
<item>
<title>Проблема в том, что 25й порт закрыт на исходыщие на многих хостингах :((</title>
<description><![CDATA[Можно поднять рядом с парсером exim и пихнуть в него письмо, но у него не получается его на условный mxs.mail.ru:25 засунуть :(

telnet&gt; o mxs.mail.ru 25
Trying 217.69.139.150...
^C

зависли ...

А если слать через внешний smtp и порт 465 парсер не умеет авторизацию делать по логину+паролю -- приехали.

Можно решить через msmtp это легко, прописав в его конфиге host:465 login+password
Но парсеру вместо тупого вызова msmtp (симлинк sendmail) надо обязательно видимо SMTP-сервер :(]]></description>
<author>sergei v.2</author>
<pubDate>Wed, 25 Feb 2026 20:13:44 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87070</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87070</guid>
</item>
<item>
<title>Ответ</title>
<description><![CDATA[<blockquote>$MAIL.SMTP[]
^MAIL.delete[SMTP]
Вопрос не решают :( 
</blockquote>

В какой момент вы пытаетесь это сделать? Конфигурирование класса mail исторически происходит до начала работы класса MAIN, то есть удалять перед ^mail:send[] поздно, проще в cgi/auto.p убрать. Правда сложно сказать зачем оно так, без проблем можно переделать, чтобы можно было по ходу дела менять, кода даже меньше будет... Все равно там странно - содержимое хеша $MAIN:MAIL менять можно когда угодно, а сам хеш - нет.

То есть:

<pre>$MAIL.SMTP[another.server]
^mail:send[] - сработает
$MAIL[ $.SMTP[yet.another.server] ]
^mail:send[] - будет использовано прошлое значение...
</pre>]]></description>
<author>moko</author>
<pubDate>Wed, 25 Feb 2026 19:10:01 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87069</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87069</guid>
</item>
</channel>
</rss>