<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://wiki.courierexe.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sammy</id>
		<title>Меасофт - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.courierexe.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sammy"/>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Sammy"/>
		<updated>2026-05-19T13:48:40Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C_%C2%AB%D0%9A%D0%B0%D1%80%D1%82%D0%B0%C2%BB&amp;diff=15875</id>
		<title>Модуль «Карта»</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C_%C2%AB%D0%9A%D0%B0%D1%80%D1%82%D0%B0%C2%BB&amp;diff=15875"/>
				<updated>2026-03-25T06:57:10Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Группировка адресов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Назначение ==&lt;br /&gt;
&lt;br /&gt;
Модуль предназначен для визуального планирования городских доставок и создания [[Зоны на карте|тарифных зон]] на карте в режиме [[#Единое районирование|единого районирования]].&lt;br /&gt;
&lt;br /&gt;
= Заказы на карте =&lt;br /&gt;
Отображение отправлений на карте позволяет увидеть объем предстоящих доставок, найденные и ненайденные адреса.&lt;br /&gt;
&lt;br /&gt;
На вкладке '''Заказы''' выделите заказы и нажмите на клавишу ПРОБЕЛ или выберите пункт контекстного меню '''Перейти к адресам'''. На вкладке '''Адреса''' отобразятся отправления, которые нужно доставить или забрать. Для удобства список корреспонденции можно [[Основные принципы работы в программе#Сортировка списка адресов|отсортировать]].&lt;br /&gt;
&lt;br /&gt;
Чтобы открыть заказы на карте, на вкладке '''Адреса''' нажмите на кнопку [[Файл:Показать на карте.jpg|30 px]]. Чтобы посмотреть определенное отправление, выделите его и выберите пункт контекстного меню '''Показать на карте'''.&lt;br /&gt;
&lt;br /&gt;
Откроется окно «Карта»:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Карта.png|none]]&lt;br /&gt;
&lt;br /&gt;
Верхнее меню содержит следующие кнопки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Globe.png]] — обзор всей карты;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Print.png]] — печать видимого участка карты;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Settings.png]] — [[Модуль «Карта»#Настройки|настройки отображения]] информации на карте;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Кнопка_Поиск.png]] — поиск по адресу или координатам.&lt;br /&gt;
&lt;br /&gt;
В панели слева настройте отображение списка курьеров:&lt;br /&gt;
* выберите из выпадающего списка филиал, курьеров которого нужно просмотреть;&lt;br /&gt;
* укажите менеджеров, чьих курьеров нужно отобразить в списке;&lt;br /&gt;
* укажите дату планируемой доставки для курьеров. Чтобы курьер отображался в списке, должны быть выполнены следующие условия:&lt;br /&gt;
*# В карточке курьера указана дата приема на работу; &lt;br /&gt;
*# Для курьера установлено свободное посещение или есть график на дату планирования. Подробнее см. раздел «[[Графики работы сотрудников]]».&lt;br /&gt;
&lt;br /&gt;
В окне справа отображается карта с адресами отправлений, отмеченными [[Модуль «Карта»#Настройка карты|маркерами]].&lt;br /&gt;
&lt;br /&gt;
===Ненайденные адреса ===&lt;br /&gt;
&lt;br /&gt;
Адреса, которые не удалось найти на карте, отображаются в нижней части окна. &lt;br /&gt;
&lt;br /&gt;
Если адрес не отображается на карте:&lt;br /&gt;
* щелкните дважды по строке ненайденного адреса и в карточке корреспонденции проверьте правильность написания  соответствие [[Знакомство с программой#Ввод адресной информации|правилам ввода адресной информации]];&lt;br /&gt;
* в контекстном меню списка ненайденных адресов выберите '''Поискать адрес на карте'''. Если адрес найден, перетащите запись из нижней части окна на точку, найденную на карте;&lt;br /&gt;
* в контекстном меню списка ненайденных адресов выберите '''Поискать адрес в интернете'''. Откроется окно браузера по умолчанию с адресом на карте. Скопируйте координаты найденного адреса, вставьте в строку поиска сверху и нажмите на кнопку [[Файл:Кнопка_Поиск.png]]. На карте отобразится найденный адрес в виде зеленого ромба. Перетащите запись из нижней части окна на точку, найденную на карте. Изображение ромба пропадет, если удалить из строки поиска координаты его широты и долготы;&lt;br /&gt;
* если вы точно знаете местоположение ненайденного адреса на карте, перетащите адрес в нужное место.&lt;br /&gt;
&lt;br /&gt;
Если маркер корреспонденции отмечен не на том месте, открепите точку через контекстное меню (адрес перенесется в «ненайденные»), а затем перетащите на нужное место.&lt;br /&gt;
&lt;br /&gt;
MeaSoft запоминает все адреса, найденные и указанные в ручном режиме, а затем автоматически подставляет их при повторной работе с модулем.&lt;br /&gt;
&lt;br /&gt;
=== Настройки===&lt;br /&gt;
&lt;br /&gt;
Настройки вызываются по нажатию на [[Файл:Settings.png]]. Окно настроек выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Карта_маркеры.png|none|300px]]&lt;br /&gt;
&lt;br /&gt;
====Настройка карты====&lt;br /&gt;
&lt;br /&gt;
Вкладка  предназначена для установки отображения корреспонденции на карте. Вы можете выбрать один из вариантов:&lt;br /&gt;
* '''Цвета состояния''' — корреспонденция отмечается в зависимости от ее статуса. Можно изменить цвета, выбранные по умолчанию. Чтобы изменить цвет, нажмите на кнопку [[Файл:More.png]] справа от цвета, откроется окно с вариантами. Выберите нужный и нажмите '''ОК'''. Этот режим помогает логисту видеть запланированные и незапланированные на курьеров доставки;&lt;br /&gt;
*''' Цвета курьеров''' — корреспонденция отображается цветом назначенного курьеру маркера. Предусмотрено 24 разных цвета для курьеров. Если все цвета уже назначены, всем последующим курьерам присваивается белый цвет. Этот режим помогает видеть район доставки корреспонденции на карте при относительно небольшом количестве курьеров.&lt;br /&gt;
&lt;br /&gt;
===== Группировка адресов =====&lt;br /&gt;
&lt;br /&gt;
В новой версии программы появился режим '''Включить группировку адресов на карте'''.  &lt;br /&gt;
После его активации,адреса расположенные в одной точке, объединяются в общий маркер, на котором отображается количество адресов в данной точке.&lt;br /&gt;
&lt;br /&gt;
Цветовая схема маркеров помогает быстрее оценить состояние планирования:&lt;br /&gt;
&lt;br /&gt;
* '''Чёрный круг''' — не все адреса в точке запланированы на курьеров.  &lt;br /&gt;
  Пример: текст ''5/10'' означает, что из 10 адресов запланировано только 5.&lt;br /&gt;
&lt;br /&gt;
* '''Зелёный круг''' — все адреса в точке распределены между курьерами.&lt;br /&gt;
&lt;br /&gt;
Если в точке есть адреса запланированные на выбранного курьера, то появляются дополнительные цвета:&lt;br /&gt;
&lt;br /&gt;
* '''Жёлтый круг''' — в точке есть адреса, закреплённые за выбранным курьером.  &lt;br /&gt;
  Пример: текст ''1/10'' — на выбранного курьера назначен 1 адрес из 10.&lt;br /&gt;
&lt;br /&gt;
* '''Красный круг''' — у выбранного курьера есть адреса в этой точке, и часть остальных адресов пока не запланирована.  &lt;br /&gt;
  Такие адреса можно «докинуть» курьеру, так как он всё равно посещает эту точку.  &lt;br /&gt;
  Пример: текст ''3/10'' — на выбранного курьера запланировано 3 адреса из 10.&lt;br /&gt;
&lt;br /&gt;
* '''Двухцветный круг''' , одна половина '''черная''', другая '''красная''' - в точке адреса запланированы, но на разных курьеров.&lt;br /&gt;
  Пример: текст ''7/8'' — на курьеров запланировано 7 адресов из 8, причем 7 адресов запланированы на разных курьеров.&lt;br /&gt;
&lt;br /&gt;
==== Печать ====&lt;br /&gt;
&lt;br /&gt;
Вкладка предназначена для настройки контрастности печати. Проблема с четкостью карты может возникнуть, если логист использует черно-белый принтер.&lt;br /&gt;
&lt;br /&gt;
Чтобы улучшить качество изображения, введите коэффициент усиления контрастности печати.&lt;br /&gt;
&lt;br /&gt;
Варианты печати карты:&lt;br /&gt;
* печать карты из окна «Карта». Слева вверху нажмите на кнопку '''Печать''';&lt;br /&gt;
* автоматическая печать. Позволяет распечатывать карту вместе с документами, необходимыми при выдаче корреспонденции. Можно &amp;lt;rspoiler text=&amp;quot;настроить печать&amp;quot;&amp;gt;'''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Печать''' &amp;gt; '''Печатать карту при выдаче'''. Возможные значения: '''Не печатать''', '''Печатать после акта''' (если нужно нумеровать корреспонденцию на печатной карте) и '''Печатать до акта''' (если нужно нумеровать адреса на печатной карте).&amp;lt;/rspoiler&amp;gt;до выдачи или после выдачи акта.&lt;br /&gt;
&lt;br /&gt;
Существуют следующие варианты обозначения корреспонденции на печатной карте при выдаче:  &lt;br /&gt;
* нумеруется корреспонденция. Внутри каждого квадрата находится порядковый номер корреспонденции из акта приема-передачи курьеру. Если получателю предназначены несколько отправлений, на карте в квадрате будут перечислены их порядковые номера из акта приема-передачи. Такой вид отображения удобен, когда курьеру нужно сообщить логисту о передаче корреспонденции получателю. Курьер сообщает номер корреспонденции, логист отмечает передачу в программе. &amp;lt;spoiler text=&amp;quot;Настройка переменной&amp;quot;&amp;gt;&lt;br /&gt;
'''Справочники''' &amp;gt; '''Настройка''' &amp;gt; '''Печать''' &amp;gt; '''Акты передачи курьеру''' &amp;gt; '''Сохранять номер строки в акте передачи курьеру''' &amp;gt; '''Запоминать из актов'''&amp;lt;/spoiler&amp;gt;&lt;br /&gt;
* нумеруются адреса корреспонденции.  Внутри каждого квадрата находится порядковый номер адреса. Если получателей несколько на один адрес, на вкладке '''Выдача''' в графе '''Номер в акте''' у нескольких корреспонденций будет один порядковый номер.&amp;lt;spoiler text=&amp;quot;Настройка переменной&amp;quot;&amp;gt;'''Справочники''' &amp;gt; '''Настройка''' &amp;gt; '''Печать''' &amp;gt; '''Акты передачи курьеру''' &amp;gt; '''Сохранять номер строки в акте передачи курьеру''' &amp;gt; '''Запоминать из карт'''&amp;lt;/spoiler&amp;gt;Пример карты:&lt;br /&gt;
[[Файл:Печать на карте.jpg|500px|none]]&lt;br /&gt;
&lt;br /&gt;
==== Хинты ====&lt;br /&gt;
&lt;br /&gt;
Вкладка предназначена для настройки всплывающих подсказок, которые отображаются при наведении курсора на маркер.&lt;br /&gt;
&lt;br /&gt;
Всплывающие подсказки настраиваются отдельно для отображения карты в разных режимах:&lt;br /&gt;
* по кнопке '''Адреса ''' — подсказки на вкладке '''Адреса''';&lt;br /&gt;
* по кнопке '''Трекинг''' — подсказки при просмотре маршрута курьера в [[Функции#Трекинг курьеров|трекинге]];&lt;br /&gt;
* по кнопке '''Выдача в трекинге''' — подсказки при просмотре выданной корреспонденции в [[Функции#Трекинг курьеров|трекинге]].&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные возможности ===&lt;br /&gt;
&lt;br /&gt;
В программе предусмотрены параметры, которые позволяют задать условия отображения маркера на карте. Например, можно сделать заборы большими синими треугольниками, а вечерние доставки отображать маленькими желтыми квадратиками. Подробнее см. раздел [[Системные доп. возможности#Настройка вида маркера | «Руководство программиста»]].&lt;br /&gt;
&lt;br /&gt;
'''Примечание.''' Мы настоятельно рекомендуем не изменять эту настройку без помощи специалиста. Вы можете обратиться к нам, настройка маркеров для 2-го и 3-го тарифа поддержки будет бесплатной или недорогой в других случаях.&lt;br /&gt;
&lt;br /&gt;
=Виды планирования=&lt;br /&gt;
* Планирование по курьерам с помощью карт:&lt;br /&gt;
** [[Модуль «Карта»#Ручное планирование|вручную]]&lt;br /&gt;
** [[Модуль «Карта»#Планирование схемами|схемы]]&lt;br /&gt;
** позаказно&lt;br /&gt;
* Планирование по списку &lt;br /&gt;
* Планирование маршрутов курьеров:&lt;br /&gt;
**[[#Ручное планирование маршрутов|ручное планирование маршрутов]]&lt;br /&gt;
** автоматическое планирование [[Максоптра]]&lt;br /&gt;
** автоматическое планирование [[Яндекс.Маршрутизация]]&lt;br /&gt;
&lt;br /&gt;
=== Ручное планирование по курьерам ===&lt;br /&gt;
Виды ручного планирования:&lt;br /&gt;
* назначение курьера на маркер. В контекстном меню маркера корреспонденции выберите '''Запланировать'''. Заказ планируется на сотрудника, выбранного в списке слева. По умолчанию это первый в списке курьер. Чтобы выбрать конкретного курьера, в контекстном меню маркера выберите '''Запланировать для курьера''';&lt;br /&gt;
* перемещение маркеров. Например, курьер на доставку запланирован, нужно добавить ему еще отправления. Удерживая нажатой кнопку CTRL, перетащите свободный маркер на маркер c запланированным сотрудником. В результате два адреса планируются для доставки одним сотрудником. Если на обоих маркерах уже запланированы курьеры, при перемещении одного на другой отправление будет назначено сотруднику, на маркер которого перетащили;&lt;br /&gt;
* выделение области. Удерживая нажатой правую кнопку мыши, обведите область с маркерами, затем в контекстном меню области выберите пункт '''Запланировать для курьера'''. В результате отправления этой области назначена на доставку указанному сотруднику.&lt;br /&gt;
&lt;br /&gt;
=== Планирование схемами по курьерам ===&lt;br /&gt;
;Схемы&lt;br /&gt;
: Графически выделенные контуры районов доставки, сохраненные на карте, возможно, с назначенными на них курьерами.&lt;br /&gt;
&lt;br /&gt;
Планирование схемами позволяет сократить ручную работу при помощи созданных районов доставки. Районы доставки можно изменять по размеру или объединять — в зависимости от веса, объема и количества корреспонденции. Например, при большом количестве корреспонденции можно уменьшить район доставок, чтобы разделить нагрузку между курьерами.&lt;br /&gt;
&lt;br /&gt;
[[Файл:зонирование.png|none]]&lt;br /&gt;
&lt;br /&gt;
==== Создание схемы ====&lt;br /&gt;
# Выберите заказы, перейдите на вкладку '''Адреса''' и нажмите на кнопку [[Файл:Показать на карте.jpg|30 px]]. Откроется окно «Карта».&lt;br /&gt;
# Нажмите на кнопку '''Добавить'''.&lt;br /&gt;
# В выпадающем списке выберите добавленную схему.&lt;br /&gt;
# Нажмите на кнопку [[Файл:Кнопка Опции.png]] рядом с кнопкой '''Добавить''' и выберите пункт '''Редактировать схему'''.&lt;br /&gt;
# В контекстном меню на карте выберите пункт '''Создать контур'''. Подробнее см. раздел «[[Зоны на карте#Создание контуров на карте|Создание контуров на карте]]».&lt;br /&gt;
# При помощи правой клавиши мыши выставляйте точки контура так, чтобы получилась замкнутая область. Когда контур готов, нажмите ENTER. Чтобы объединить соседние контуры, выделите их, удерживая зажатой клавишу CTRL, и в контекстном меню выберите '''Объединить контуры'''.&lt;br /&gt;
# Чтобы назначить курьера на контур, в контекстном меню выберите пункт '''Установить курьера'''.&lt;br /&gt;
# Создайте столько контуров с назначенными курьерами, сколько нужно для работы, и нажмите на кнопку '''Завершить'''.&lt;br /&gt;
# Нажмите на кнопку [[Файл:Кнопка Опции.png]] рядом с кнопкой '''Добавить''' и выберите пункт '''Параметры схемы'''. В открывшемся окне укажите название схемы и выберите филиал, к которому будет относиться схема.&lt;br /&gt;
&lt;br /&gt;
Пункт контекстного меню '''Указать номер зоны''' используется в клиентской автоматизации, не входящей в стандартную поставку. &amp;lt;spoiler text=&amp;quot;Подробнее&amp;quot;&amp;gt;Автоматизация создает начисления, компенсирующие курьерам затраты на ГСМ. Зонам на схеме присваивается номер, соответствующий размеру компенсации ГСМ. Например, номер зоны 200 означает, что компенсация равна 200 рублям.&amp;lt;br&amp;gt;Автоматизация учитывает вчерашние выдачи со статусами «Отказ на месте» и «Доставлено», начисляет компенсацию каждому курьеру по самой удаленной зоне доставки и выводит сумму к выдаче в АПК.&amp;lt;/spoiler&amp;gt;&lt;br /&gt;
При создании контуров не допускайте пустоты и пересечения контуров. Если адрес доставки или забора попадет в пустое место между контурами, то в режиме [[Модуль Карта#Полуавтоматическое планирование|полуавтоматического планирования]] ни один курьер не будет назначен на доставку. Если адрес попадет на пересечение контуров, то курьер будет выбран случайно из назначенных на пересекающиеся области.&lt;br /&gt;
&lt;br /&gt;
Чтобы использовать контуры одной схемы для другой или для создания новой, используйте функцию '''Копировать схему''' в выпадающем меню рядом с кнопкой '''Добавить'''.&lt;br /&gt;
&lt;br /&gt;
==== Планирование ====&lt;br /&gt;
Чтобы начать планирование, в окне «Карта» выберите [[#Создание схемы|созданную схему]] из выпадающего списка и нажмите на кнопку '''Проставить по всем'''. Корреспонденция распределится между работающими курьерами, по завершении операции формируется отчёт в отдельном окне. Можно использовать способы [[#Ручное планирование|ручного планирования]].&lt;br /&gt;
&lt;br /&gt;
На несколько районов можно запланировать одного курьера. Для этого выделите районы, удерживая зажатой клавишу CTRL, и в контекстном меню выберите курьера.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание: временная область, нарисованная на схеме, имеет больший приоритет. Временные контуры можно использовать для назначения другого сотрудника, когда на одного курьера запланировано большое количество отправлений, которые он физически не сможет доставить.&lt;br /&gt;
  &lt;br /&gt;
Для разных случаев можно создать отдельные схемы районов доставки: количество корреспонденции, будние или выходные дни, праздники и т. д.&lt;br /&gt;
&lt;br /&gt;
==== Удаление схемы ====&lt;br /&gt;
В окне «Карта» выберите схему из выпадающего списка, нажмите на кнопку [[Файл:Кнопка Опции.png]] рядом с кнопкой '''Добавить''' и выберите пункт '''Удалить схему'''.&lt;br /&gt;
&lt;br /&gt;
===Ручное планирование маршрутов===&lt;br /&gt;
&lt;br /&gt;
Вы можете спланировать маршрут курьера и сформировать путевые листы с указанной последовательностью точек.&lt;br /&gt;
&lt;br /&gt;
# В окне «Карта» нажмите на кнопку '''Доставка'''. Если есть корреспонденции, запланированные на курьера на указанную дату, маршруты автоматически сформируются и отобразятся на карте. Точки в маршрутах располагаются в случайном порядке.&lt;br /&gt;
# [[#Запланировано|Скорректируйте]] маршруты при необходимости и нажмите на кнопку '''Подтвердить все маршруты'''. Номера точек в маршруте заносятся в [[путевые листы]]. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Ручная маршрутизация.png|none|1500 px]]&lt;br /&gt;
&lt;br /&gt;
Информация в панели '''Доставка''' сгруппирована по вкладкам:&lt;br /&gt;
* Запланировано — общая информация о сформированных маршрутах. Поля «Отбытие», «Прибытие», «КМ» не заполняются;&lt;br /&gt;
* Не запланировано — список отправлений, которые не запланированы на курьера или на дату или не найдены на карте.&lt;br /&gt;
&lt;br /&gt;
Вы можете использовать способы [[#Ручное планирование|ручного планирования]] на карте для указания курьера.&lt;br /&gt;
&lt;br /&gt;
====Запланировано====&lt;br /&gt;
В таблице «Маршруты» содержится общая информация о сформированных маршрутах. &lt;br /&gt;
&lt;br /&gt;
Возможные действия:&lt;br /&gt;
* добавить новый маршрут для курьера, еще не указанного в списке — в контекстном меню выберите '''Создать новый маршрут''' и укажите сотрудника;&lt;br /&gt;
* запланировать сформированный маршрут для выбранного курьера — в контекстном меню выберите '''Запланировать''';&lt;br /&gt;
* назначить другого курьера для сформированного маршрута — в контекстном меню выберите '''Запланировать для курьера'''.&lt;br /&gt;
&lt;br /&gt;
В таблице «Адреса» перечислены точки, входящие в маршрут курьера, выделенного в таблице «Маршруты» выше. Точки в маршрутах располагаются в случайном порядке. Вы можете перемещать точки:&lt;br /&gt;
* внутри маршрута — комбинацией клавиш ВВЕРХ + CTRL и ВНИЗ + CTRL или с помощью пунктов контекстного меню '''Передвинуть выше''' и '''Передвинуть ниже''';&lt;br /&gt;
* между маршрутами — используйте пункт контекстного меню '''Переместить в маршрут'''. Точка добавляется в конец списка адресов. &lt;br /&gt;
&lt;br /&gt;
Выделенная в списке точка подсвечивается в маршруте на карте. &lt;br /&gt;
&lt;br /&gt;
Отправления, не подходящие для доставки в указанную дату, выделяются розовым цветом. При наведении на такие строки курсора мыши отображается подсказка с причиной ошибки. Вы можете открыть соответствующую корреспонденцию двойным щелчком по строке и исправить данные.&lt;br /&gt;
&lt;br /&gt;
Чтобы подтвердить сформированные маршруты, нажмите на кнопку '''Подтвердить все маршруты'''. Номера точек в маршруте заносятся в [[путевые листы]]. &lt;br /&gt;
&lt;br /&gt;
====Не запланировано====&lt;br /&gt;
&lt;br /&gt;
Вкладка содержит список отправлений с ошибками планирования. Строки выделены розовым цветом, при наведении курсора мыши на строку или в столбце «Примечание» отображается подсказка с причиной ошибки:&lt;br /&gt;
* не запланирован на курьера — используйте пункт контекстного меню '''Переместить в маршрут'''. Точка добавляется в конец списка адресов маршрута;&lt;br /&gt;
* не подходит план. дата доставки — откройте корреспонденцию щелчком по строке и исправьте дату доставки;&lt;br /&gt;
* местоположение не подтверждено — выполните действия, описанные в разделе [[#Ненайденные адреса|«Ненайденные адреса»]];&lt;br /&gt;
* курьер не доступен по графику — убедитесь, что в карточке курьера есть [[Графики работы сотрудников|график]] на дату планирования.&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое планирование ===&lt;br /&gt;
Вид планирования, который позволяет автоматизировать назначение курьеров и просчет оптимальных маршрутов доставки корреспонденции с учетом дорожных условий.&lt;br /&gt;
&lt;br /&gt;
В MeaSoft доступны интеграции с сервисами автоматического планирования:&lt;br /&gt;
* [[Maxoptra]]&lt;br /&gt;
* [[Яндекс.Маршрутизация]]&lt;br /&gt;
&lt;br /&gt;
= Картографическая система =&lt;br /&gt;
&lt;br /&gt;
Программа MeaSoft работает с картографической системой [http://www.openstreetmap.org '''OpenStreetMap'''].&lt;br /&gt;
&lt;br /&gt;
Проект создан сообществом картографов, которые добавляют и поддерживают данные о дорогах, тропах, кафе, вокзалах и многих других объектах по всему миру.&lt;br /&gt;
&lt;br /&gt;
Карты OpenStreetMap позволяют создавать области и тарифицировать зоны, назначать курьеров в окне '''Карта''', планировать курьеров на доставку.&lt;br /&gt;
&lt;br /&gt;
OpenStreetMap не умеет строить маршруты курьеров, для работы с новыми областями необходимо постоянное подключение к интернету. Просмотренные области карты [[Терминология#Карта|кешируются]] и в дальнейшем доступны для работы даже без интернета.&lt;br /&gt;
&lt;br /&gt;
Система OpenstreetMap в программе MeaSoft не требует никакой региональной настройки и сразу готова к работе.&lt;br /&gt;
&lt;br /&gt;
= Геокодирование =&lt;br /&gt;
&lt;br /&gt;
== Описание и принцип работы ==&lt;br /&gt;
Для отображения любой информации на карте используется [https://ru.wikipedia.org/wiki/Геокодирование геокодирование].&lt;br /&gt;
&lt;br /&gt;
Если в офисном приложении координаты адреса неизвестны, оно отправляет запрос в геокодер MeaSoft: передает город и адрес, в ответ получает координаты, которые сохраняются в кеш программы. Поэтому, прежде чем отправить запрос в геокодер, сначала проверяется, нет ли данных для этого адреса в кеше. Если есть, запрос к геокодеру не нужен.&lt;br /&gt;
&lt;br /&gt;
При записи и чтении из кэша срабатывает упрощение адреса: до первой запятой — считается улицей, 5 символов после — номер дома. Использование упрощения адресов определяется переменной '''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Подключения''' &amp;gt; '''Карты''' &amp;gt; '''Геокодирование''' &amp;gt; '''Отключить упрощение адреса при геокодировании''':&lt;br /&gt;
* если упрощение включено, в кеш записывается не весь найденный адрес, а только часть. Перед поиском адрес также сначала упрощается. Например, адрес вида «Солнечногорск, улица Островского, 1» и «Солнечногорск, улица Гоголя, 1» упрощается до «Солнечногорск, улица». И программа оба адреса сведет к одной точке. При включении упрощения точность до дома не гарантируется;&lt;br /&gt;
* если упрощение адреса выключено, поиск и запись адреса в кеш ведется в том виде, в каком он указан, и время определения координат может увеличиться. При разнице хотя бы в один символ нужен повторный запрос к геокодеру. Например, эти адреса будут разными: «Солнечногорск, улица Островского, 1» и «Солнечногорск, улица Островского, д1».&lt;br /&gt;
&lt;br /&gt;
Для улучшения результатов геокодирования при включенном упрощении указывайте адрес по стандарту MeaSoft. Например, в поле '''Адрес''' нужно указать «улица Островского, 1», а в поле '''Город''' указать «Солнечногорск». Тогда точность будет высокой при хорошей скорости геокодирования.&lt;br /&gt;
&lt;br /&gt;
Если геокодер MeaSoft не нашел адрес, он может сделать запрос к платному геокодеру: [https://www.ahunter.ru/ Ахантер] и к [https://yandex.ru/maps Яндекс. Картам]. Сервер геокодирования Яндекс. Карт, получая запрос, преобразует адреса в координаты и ищет соответствия по своей базе данных, затем возвращает адреса в программу. В окне «Карта» отображаются маркеры адресов, которым сервер Яндекс. Карт смог найти соответствия.&lt;br /&gt;
&lt;br /&gt;
== Настройка  ==&lt;br /&gt;
Данные сервера геокодирования Яндекс.Карт находятся в '''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Подключения''' &amp;gt; '''Карты''' &amp;gt; '''Яндекс''' &amp;gt; '''Сервер геокодирования Яндекс'''.&lt;br /&gt;
&lt;br /&gt;
Чтобы адреса корректно определялись на карте, перейдите по [https://developer.tech.yandex.ru/  ссылке] и получите ключ «JavaScript API и HTTP Геокодер», затем укажите его в '''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Подключения''' &amp;gt; '''Карты''' &amp;gt; '''Геокодирование''' &amp;gt; '''API-Ключ'''.&lt;br /&gt;
&lt;br /&gt;
== Лимиты геокодирования  Яндекс.Карт == &lt;br /&gt;
Из-за существенного уменьшения лимитов запросов Яндексом - в данный момент в сутки на общий АПИ ключ дается только 1000 запросов на всех пользователей сервиса. &lt;br /&gt;
Для увеличения лимитов вы можете добавить свой АПИ ключ Яндекса.&lt;br /&gt;
&lt;br /&gt;
== Поиск адреса на Карте ==&lt;br /&gt;
В данный момент поиск на карте использует уже имеющиеся результаты геокодирования. Если конкретный адрес найти не удалось, то система пытается приблизить к улице, чтобы таким образом облегчить поиск.&lt;br /&gt;
&lt;br /&gt;
=Единое районирование=&lt;br /&gt;
&lt;br /&gt;
;Единое районирование&lt;br /&gt;
:Cистема планирования работы курьеров, при которой заказы распределяются по районам, нарисованным на карте. Этот метод пришел на смену планированию по станциям метро. Единое районирование работает для всех филиалов компании. &lt;br /&gt;
&lt;br /&gt;
Чтобы включить единое районирование:&lt;br /&gt;
# Выберите '''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Финансы''' &amp;gt; '''Расчет района по адресу''', установите значение переменной '''1''' и нажмите '''Сохранить'''. При этом автоматически включатся связанные переменные '''Расчет стоимости по адресу''' и '''Расчет зоны курьера по адресу'''.&lt;br /&gt;
#: Можно включить единое районирование для отдельных пользователей.  Для этого после 0 укажите через запятую &amp;lt;rspoiler text=имена&amp;gt;'''Настройки''' &amp;gt; '''Пользователи''' &amp;gt; карточка пользователя &amp;gt; поле '''Имя пользователя''' &amp;lt;/rspoiler&amp;gt; конкретных пользователей и нажмите '''Сохранить''':[[Файл:Edinoe raionirovanie.png|none|700px]]&lt;br /&gt;
# Выберите '''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Корреспонденция''' &amp;gt; '''Планировать по курьерам в режиме многофилиальности'''. Возможные значения переменной:&lt;br /&gt;
#* '''0''' — адреса на карте планируются по районам, в окне слева будет отображаться список районов;&lt;br /&gt;
#* '''1''' — адреса на карте планируются по курьерам, в окне слева будет отображаться список курьеров.&lt;br /&gt;
#: Чтобы внедрять функциональность в работу постепенно, в переменных можно указать отдельных пользователей аналогично действиям в пункте 1.&lt;br /&gt;
#: Установите значение переменной и нажмите '''Сохранить'''.&lt;br /&gt;
# Выберите '''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Умолчания''' &amp;gt; '''Псевдоним метро''' и введите название, которое заменит слово «метро» в интерфейсе программы. Например, «районы».&lt;br /&gt;
# После изменения значения переменных перезагрузите программу MeaSoft.&lt;br /&gt;
После включения единого районирования станут недоступны справочники '''Метро''', '''Улицы''', планирование по станциям метро. Чтобы установить тарифные зоны:&lt;br /&gt;
# Выберите '''Справочники''' &amp;gt; '''Районы''', нарисуйте районы доставки на карте и закрепите за ними курьеров для автоматического планирования. &lt;br /&gt;
# Выберите '''Справочники''' &amp;gt; '''Зоны на карте''' и нарисуйте зоны курьеров и/или клиентов. Подробнее см. раздел [[Зоны на карте|«Зоны на карте»]].&lt;br /&gt;
&lt;br /&gt;
По завершении всех настроек на вкладке '''Адреса''' выделите несколько адресов и нажмите на кнопку [[Файл:Показать на карте.jpg|30 px]]. В зависимости от значения переменной '''Планировать по курьерам в режиме многофилиальности''' на карте в окне слева отобразится список курьеров или районов доставки. Если отображается неполный список курьеров, перейдите в карточку отсутствующего в списке сотрудника и проверьте, указаны ли у него дата приема на работу и график работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;spoiler text=&amp;quot;См. также&amp;quot;&amp;gt;&lt;br /&gt;
[[Графики работы сотрудников]]&amp;lt;/spoiler&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C_%C2%AB%D0%9A%D0%B0%D1%80%D1%82%D0%B0%C2%BB&amp;diff=15874</id>
		<title>Модуль «Карта»</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C_%C2%AB%D0%9A%D0%B0%D1%80%D1%82%D0%B0%C2%BB&amp;diff=15874"/>
				<updated>2026-03-25T06:55:14Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Группировка адресов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Назначение ==&lt;br /&gt;
&lt;br /&gt;
Модуль предназначен для визуального планирования городских доставок и создания [[Зоны на карте|тарифных зон]] на карте в режиме [[#Единое районирование|единого районирования]].&lt;br /&gt;
&lt;br /&gt;
= Заказы на карте =&lt;br /&gt;
Отображение отправлений на карте позволяет увидеть объем предстоящих доставок, найденные и ненайденные адреса.&lt;br /&gt;
&lt;br /&gt;
На вкладке '''Заказы''' выделите заказы и нажмите на клавишу ПРОБЕЛ или выберите пункт контекстного меню '''Перейти к адресам'''. На вкладке '''Адреса''' отобразятся отправления, которые нужно доставить или забрать. Для удобства список корреспонденции можно [[Основные принципы работы в программе#Сортировка списка адресов|отсортировать]].&lt;br /&gt;
&lt;br /&gt;
Чтобы открыть заказы на карте, на вкладке '''Адреса''' нажмите на кнопку [[Файл:Показать на карте.jpg|30 px]]. Чтобы посмотреть определенное отправление, выделите его и выберите пункт контекстного меню '''Показать на карте'''.&lt;br /&gt;
&lt;br /&gt;
Откроется окно «Карта»:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Карта.png|none]]&lt;br /&gt;
&lt;br /&gt;
Верхнее меню содержит следующие кнопки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Globe.png]] — обзор всей карты;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Print.png]] — печать видимого участка карты;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Settings.png]] — [[Модуль «Карта»#Настройки|настройки отображения]] информации на карте;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Кнопка_Поиск.png]] — поиск по адресу или координатам.&lt;br /&gt;
&lt;br /&gt;
В панели слева настройте отображение списка курьеров:&lt;br /&gt;
* выберите из выпадающего списка филиал, курьеров которого нужно просмотреть;&lt;br /&gt;
* укажите менеджеров, чьих курьеров нужно отобразить в списке;&lt;br /&gt;
* укажите дату планируемой доставки для курьеров. Чтобы курьер отображался в списке, должны быть выполнены следующие условия:&lt;br /&gt;
*# В карточке курьера указана дата приема на работу; &lt;br /&gt;
*# Для курьера установлено свободное посещение или есть график на дату планирования. Подробнее см. раздел «[[Графики работы сотрудников]]».&lt;br /&gt;
&lt;br /&gt;
В окне справа отображается карта с адресами отправлений, отмеченными [[Модуль «Карта»#Настройка карты|маркерами]].&lt;br /&gt;
&lt;br /&gt;
===Ненайденные адреса ===&lt;br /&gt;
&lt;br /&gt;
Адреса, которые не удалось найти на карте, отображаются в нижней части окна. &lt;br /&gt;
&lt;br /&gt;
Если адрес не отображается на карте:&lt;br /&gt;
* щелкните дважды по строке ненайденного адреса и в карточке корреспонденции проверьте правильность написания  соответствие [[Знакомство с программой#Ввод адресной информации|правилам ввода адресной информации]];&lt;br /&gt;
* в контекстном меню списка ненайденных адресов выберите '''Поискать адрес на карте'''. Если адрес найден, перетащите запись из нижней части окна на точку, найденную на карте;&lt;br /&gt;
* в контекстном меню списка ненайденных адресов выберите '''Поискать адрес в интернете'''. Откроется окно браузера по умолчанию с адресом на карте. Скопируйте координаты найденного адреса, вставьте в строку поиска сверху и нажмите на кнопку [[Файл:Кнопка_Поиск.png]]. На карте отобразится найденный адрес в виде зеленого ромба. Перетащите запись из нижней части окна на точку, найденную на карте. Изображение ромба пропадет, если удалить из строки поиска координаты его широты и долготы;&lt;br /&gt;
* если вы точно знаете местоположение ненайденного адреса на карте, перетащите адрес в нужное место.&lt;br /&gt;
&lt;br /&gt;
Если маркер корреспонденции отмечен не на том месте, открепите точку через контекстное меню (адрес перенесется в «ненайденные»), а затем перетащите на нужное место.&lt;br /&gt;
&lt;br /&gt;
MeaSoft запоминает все адреса, найденные и указанные в ручном режиме, а затем автоматически подставляет их при повторной работе с модулем.&lt;br /&gt;
&lt;br /&gt;
=== Настройки===&lt;br /&gt;
&lt;br /&gt;
Настройки вызываются по нажатию на [[Файл:Settings.png]]. Окно настроек выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Карта_маркеры.png|none|300px]]&lt;br /&gt;
&lt;br /&gt;
====Настройка карты====&lt;br /&gt;
&lt;br /&gt;
Вкладка  предназначена для установки отображения корреспонденции на карте. Вы можете выбрать один из вариантов:&lt;br /&gt;
* '''Цвета состояния''' — корреспонденция отмечается в зависимости от ее статуса. Можно изменить цвета, выбранные по умолчанию. Чтобы изменить цвет, нажмите на кнопку [[Файл:More.png]] справа от цвета, откроется окно с вариантами. Выберите нужный и нажмите '''ОК'''. Этот режим помогает логисту видеть запланированные и незапланированные на курьеров доставки;&lt;br /&gt;
*''' Цвета курьеров''' — корреспонденция отображается цветом назначенного курьеру маркера. Предусмотрено 24 разных цвета для курьеров. Если все цвета уже назначены, всем последующим курьерам присваивается белый цвет. Этот режим помогает видеть район доставки корреспонденции на карте при относительно небольшом количестве курьеров.&lt;br /&gt;
&lt;br /&gt;
===== Группировка адресов =====&lt;br /&gt;
&lt;br /&gt;
В новой версии программы появился режим '''Включить группировку адресов на карте'''.  &lt;br /&gt;
После его активации,адреса расположенные в одной точке, объединяются в общий маркер, на котором отображается количество адресов в данной точке.&lt;br /&gt;
&lt;br /&gt;
Цветовая схема маркеров помогает быстрее оценить состояние планирования:&lt;br /&gt;
&lt;br /&gt;
* '''Чёрный круг''' — не все адреса в точке запланированы на курьеров.  &lt;br /&gt;
  Пример: текст ''5/10'' означает, что из 10 адресов запланировано только 5.&lt;br /&gt;
&lt;br /&gt;
* '''Зелёный круг''' — все адреса в точке распределены между курьерами.&lt;br /&gt;
&lt;br /&gt;
Если в точке есть адреса запланированные на выбранного курьера, то появляются дополнительные цвета:&lt;br /&gt;
&lt;br /&gt;
* '''Жёлтый круг''' — в точке есть адреса, закреплённые за выбранным курьером.  &lt;br /&gt;
  Пример: текст ''1/10'' — на выбранного курьера назначен 1 адрес из 10.&lt;br /&gt;
&lt;br /&gt;
* '''Красный круг''' — у выбранного курьера есть адреса в этой точке, и часть остальных адресов пока не запланирована.  &lt;br /&gt;
  Такие адреса можно «докинуть» курьеру, так как он всё равно посещает эту точку.  &lt;br /&gt;
  Пример: текст ''3/10'' — на выбранного курьера запланировано 3 адреса из 10.&lt;br /&gt;
&lt;br /&gt;
* '''Двухцветный круг''' , одна половина '''черная''', другая '''красная''' - в точке адреса запланированы, но на разных курьеров.&lt;br /&gt;
&lt;br /&gt;
==== Печать ====&lt;br /&gt;
&lt;br /&gt;
Вкладка предназначена для настройки контрастности печати. Проблема с четкостью карты может возникнуть, если логист использует черно-белый принтер.&lt;br /&gt;
&lt;br /&gt;
Чтобы улучшить качество изображения, введите коэффициент усиления контрастности печати.&lt;br /&gt;
&lt;br /&gt;
Варианты печати карты:&lt;br /&gt;
* печать карты из окна «Карта». Слева вверху нажмите на кнопку '''Печать''';&lt;br /&gt;
* автоматическая печать. Позволяет распечатывать карту вместе с документами, необходимыми при выдаче корреспонденции. Можно &amp;lt;rspoiler text=&amp;quot;настроить печать&amp;quot;&amp;gt;'''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Печать''' &amp;gt; '''Печатать карту при выдаче'''. Возможные значения: '''Не печатать''', '''Печатать после акта''' (если нужно нумеровать корреспонденцию на печатной карте) и '''Печатать до акта''' (если нужно нумеровать адреса на печатной карте).&amp;lt;/rspoiler&amp;gt;до выдачи или после выдачи акта.&lt;br /&gt;
&lt;br /&gt;
Существуют следующие варианты обозначения корреспонденции на печатной карте при выдаче:  &lt;br /&gt;
* нумеруется корреспонденция. Внутри каждого квадрата находится порядковый номер корреспонденции из акта приема-передачи курьеру. Если получателю предназначены несколько отправлений, на карте в квадрате будут перечислены их порядковые номера из акта приема-передачи. Такой вид отображения удобен, когда курьеру нужно сообщить логисту о передаче корреспонденции получателю. Курьер сообщает номер корреспонденции, логист отмечает передачу в программе. &amp;lt;spoiler text=&amp;quot;Настройка переменной&amp;quot;&amp;gt;&lt;br /&gt;
'''Справочники''' &amp;gt; '''Настройка''' &amp;gt; '''Печать''' &amp;gt; '''Акты передачи курьеру''' &amp;gt; '''Сохранять номер строки в акте передачи курьеру''' &amp;gt; '''Запоминать из актов'''&amp;lt;/spoiler&amp;gt;&lt;br /&gt;
* нумеруются адреса корреспонденции.  Внутри каждого квадрата находится порядковый номер адреса. Если получателей несколько на один адрес, на вкладке '''Выдача''' в графе '''Номер в акте''' у нескольких корреспонденций будет один порядковый номер.&amp;lt;spoiler text=&amp;quot;Настройка переменной&amp;quot;&amp;gt;'''Справочники''' &amp;gt; '''Настройка''' &amp;gt; '''Печать''' &amp;gt; '''Акты передачи курьеру''' &amp;gt; '''Сохранять номер строки в акте передачи курьеру''' &amp;gt; '''Запоминать из карт'''&amp;lt;/spoiler&amp;gt;Пример карты:&lt;br /&gt;
[[Файл:Печать на карте.jpg|500px|none]]&lt;br /&gt;
&lt;br /&gt;
==== Хинты ====&lt;br /&gt;
&lt;br /&gt;
Вкладка предназначена для настройки всплывающих подсказок, которые отображаются при наведении курсора на маркер.&lt;br /&gt;
&lt;br /&gt;
Всплывающие подсказки настраиваются отдельно для отображения карты в разных режимах:&lt;br /&gt;
* по кнопке '''Адреса ''' — подсказки на вкладке '''Адреса''';&lt;br /&gt;
* по кнопке '''Трекинг''' — подсказки при просмотре маршрута курьера в [[Функции#Трекинг курьеров|трекинге]];&lt;br /&gt;
* по кнопке '''Выдача в трекинге''' — подсказки при просмотре выданной корреспонденции в [[Функции#Трекинг курьеров|трекинге]].&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные возможности ===&lt;br /&gt;
&lt;br /&gt;
В программе предусмотрены параметры, которые позволяют задать условия отображения маркера на карте. Например, можно сделать заборы большими синими треугольниками, а вечерние доставки отображать маленькими желтыми квадратиками. Подробнее см. раздел [[Системные доп. возможности#Настройка вида маркера | «Руководство программиста»]].&lt;br /&gt;
&lt;br /&gt;
'''Примечание.''' Мы настоятельно рекомендуем не изменять эту настройку без помощи специалиста. Вы можете обратиться к нам, настройка маркеров для 2-го и 3-го тарифа поддержки будет бесплатной или недорогой в других случаях.&lt;br /&gt;
&lt;br /&gt;
=Виды планирования=&lt;br /&gt;
* Планирование по курьерам с помощью карт:&lt;br /&gt;
** [[Модуль «Карта»#Ручное планирование|вручную]]&lt;br /&gt;
** [[Модуль «Карта»#Планирование схемами|схемы]]&lt;br /&gt;
** позаказно&lt;br /&gt;
* Планирование по списку &lt;br /&gt;
* Планирование маршрутов курьеров:&lt;br /&gt;
**[[#Ручное планирование маршрутов|ручное планирование маршрутов]]&lt;br /&gt;
** автоматическое планирование [[Максоптра]]&lt;br /&gt;
** автоматическое планирование [[Яндекс.Маршрутизация]]&lt;br /&gt;
&lt;br /&gt;
=== Ручное планирование по курьерам ===&lt;br /&gt;
Виды ручного планирования:&lt;br /&gt;
* назначение курьера на маркер. В контекстном меню маркера корреспонденции выберите '''Запланировать'''. Заказ планируется на сотрудника, выбранного в списке слева. По умолчанию это первый в списке курьер. Чтобы выбрать конкретного курьера, в контекстном меню маркера выберите '''Запланировать для курьера''';&lt;br /&gt;
* перемещение маркеров. Например, курьер на доставку запланирован, нужно добавить ему еще отправления. Удерживая нажатой кнопку CTRL, перетащите свободный маркер на маркер c запланированным сотрудником. В результате два адреса планируются для доставки одним сотрудником. Если на обоих маркерах уже запланированы курьеры, при перемещении одного на другой отправление будет назначено сотруднику, на маркер которого перетащили;&lt;br /&gt;
* выделение области. Удерживая нажатой правую кнопку мыши, обведите область с маркерами, затем в контекстном меню области выберите пункт '''Запланировать для курьера'''. В результате отправления этой области назначена на доставку указанному сотруднику.&lt;br /&gt;
&lt;br /&gt;
=== Планирование схемами по курьерам ===&lt;br /&gt;
;Схемы&lt;br /&gt;
: Графически выделенные контуры районов доставки, сохраненные на карте, возможно, с назначенными на них курьерами.&lt;br /&gt;
&lt;br /&gt;
Планирование схемами позволяет сократить ручную работу при помощи созданных районов доставки. Районы доставки можно изменять по размеру или объединять — в зависимости от веса, объема и количества корреспонденции. Например, при большом количестве корреспонденции можно уменьшить район доставок, чтобы разделить нагрузку между курьерами.&lt;br /&gt;
&lt;br /&gt;
[[Файл:зонирование.png|none]]&lt;br /&gt;
&lt;br /&gt;
==== Создание схемы ====&lt;br /&gt;
# Выберите заказы, перейдите на вкладку '''Адреса''' и нажмите на кнопку [[Файл:Показать на карте.jpg|30 px]]. Откроется окно «Карта».&lt;br /&gt;
# Нажмите на кнопку '''Добавить'''.&lt;br /&gt;
# В выпадающем списке выберите добавленную схему.&lt;br /&gt;
# Нажмите на кнопку [[Файл:Кнопка Опции.png]] рядом с кнопкой '''Добавить''' и выберите пункт '''Редактировать схему'''.&lt;br /&gt;
# В контекстном меню на карте выберите пункт '''Создать контур'''. Подробнее см. раздел «[[Зоны на карте#Создание контуров на карте|Создание контуров на карте]]».&lt;br /&gt;
# При помощи правой клавиши мыши выставляйте точки контура так, чтобы получилась замкнутая область. Когда контур готов, нажмите ENTER. Чтобы объединить соседние контуры, выделите их, удерживая зажатой клавишу CTRL, и в контекстном меню выберите '''Объединить контуры'''.&lt;br /&gt;
# Чтобы назначить курьера на контур, в контекстном меню выберите пункт '''Установить курьера'''.&lt;br /&gt;
# Создайте столько контуров с назначенными курьерами, сколько нужно для работы, и нажмите на кнопку '''Завершить'''.&lt;br /&gt;
# Нажмите на кнопку [[Файл:Кнопка Опции.png]] рядом с кнопкой '''Добавить''' и выберите пункт '''Параметры схемы'''. В открывшемся окне укажите название схемы и выберите филиал, к которому будет относиться схема.&lt;br /&gt;
&lt;br /&gt;
Пункт контекстного меню '''Указать номер зоны''' используется в клиентской автоматизации, не входящей в стандартную поставку. &amp;lt;spoiler text=&amp;quot;Подробнее&amp;quot;&amp;gt;Автоматизация создает начисления, компенсирующие курьерам затраты на ГСМ. Зонам на схеме присваивается номер, соответствующий размеру компенсации ГСМ. Например, номер зоны 200 означает, что компенсация равна 200 рублям.&amp;lt;br&amp;gt;Автоматизация учитывает вчерашние выдачи со статусами «Отказ на месте» и «Доставлено», начисляет компенсацию каждому курьеру по самой удаленной зоне доставки и выводит сумму к выдаче в АПК.&amp;lt;/spoiler&amp;gt;&lt;br /&gt;
При создании контуров не допускайте пустоты и пересечения контуров. Если адрес доставки или забора попадет в пустое место между контурами, то в режиме [[Модуль Карта#Полуавтоматическое планирование|полуавтоматического планирования]] ни один курьер не будет назначен на доставку. Если адрес попадет на пересечение контуров, то курьер будет выбран случайно из назначенных на пересекающиеся области.&lt;br /&gt;
&lt;br /&gt;
Чтобы использовать контуры одной схемы для другой или для создания новой, используйте функцию '''Копировать схему''' в выпадающем меню рядом с кнопкой '''Добавить'''.&lt;br /&gt;
&lt;br /&gt;
==== Планирование ====&lt;br /&gt;
Чтобы начать планирование, в окне «Карта» выберите [[#Создание схемы|созданную схему]] из выпадающего списка и нажмите на кнопку '''Проставить по всем'''. Корреспонденция распределится между работающими курьерами, по завершении операции формируется отчёт в отдельном окне. Можно использовать способы [[#Ручное планирование|ручного планирования]].&lt;br /&gt;
&lt;br /&gt;
На несколько районов можно запланировать одного курьера. Для этого выделите районы, удерживая зажатой клавишу CTRL, и в контекстном меню выберите курьера.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание: временная область, нарисованная на схеме, имеет больший приоритет. Временные контуры можно использовать для назначения другого сотрудника, когда на одного курьера запланировано большое количество отправлений, которые он физически не сможет доставить.&lt;br /&gt;
  &lt;br /&gt;
Для разных случаев можно создать отдельные схемы районов доставки: количество корреспонденции, будние или выходные дни, праздники и т. д.&lt;br /&gt;
&lt;br /&gt;
==== Удаление схемы ====&lt;br /&gt;
В окне «Карта» выберите схему из выпадающего списка, нажмите на кнопку [[Файл:Кнопка Опции.png]] рядом с кнопкой '''Добавить''' и выберите пункт '''Удалить схему'''.&lt;br /&gt;
&lt;br /&gt;
===Ручное планирование маршрутов===&lt;br /&gt;
&lt;br /&gt;
Вы можете спланировать маршрут курьера и сформировать путевые листы с указанной последовательностью точек.&lt;br /&gt;
&lt;br /&gt;
# В окне «Карта» нажмите на кнопку '''Доставка'''. Если есть корреспонденции, запланированные на курьера на указанную дату, маршруты автоматически сформируются и отобразятся на карте. Точки в маршрутах располагаются в случайном порядке.&lt;br /&gt;
# [[#Запланировано|Скорректируйте]] маршруты при необходимости и нажмите на кнопку '''Подтвердить все маршруты'''. Номера точек в маршруте заносятся в [[путевые листы]]. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Ручная маршрутизация.png|none|1500 px]]&lt;br /&gt;
&lt;br /&gt;
Информация в панели '''Доставка''' сгруппирована по вкладкам:&lt;br /&gt;
* Запланировано — общая информация о сформированных маршрутах. Поля «Отбытие», «Прибытие», «КМ» не заполняются;&lt;br /&gt;
* Не запланировано — список отправлений, которые не запланированы на курьера или на дату или не найдены на карте.&lt;br /&gt;
&lt;br /&gt;
Вы можете использовать способы [[#Ручное планирование|ручного планирования]] на карте для указания курьера.&lt;br /&gt;
&lt;br /&gt;
====Запланировано====&lt;br /&gt;
В таблице «Маршруты» содержится общая информация о сформированных маршрутах. &lt;br /&gt;
&lt;br /&gt;
Возможные действия:&lt;br /&gt;
* добавить новый маршрут для курьера, еще не указанного в списке — в контекстном меню выберите '''Создать новый маршрут''' и укажите сотрудника;&lt;br /&gt;
* запланировать сформированный маршрут для выбранного курьера — в контекстном меню выберите '''Запланировать''';&lt;br /&gt;
* назначить другого курьера для сформированного маршрута — в контекстном меню выберите '''Запланировать для курьера'''.&lt;br /&gt;
&lt;br /&gt;
В таблице «Адреса» перечислены точки, входящие в маршрут курьера, выделенного в таблице «Маршруты» выше. Точки в маршрутах располагаются в случайном порядке. Вы можете перемещать точки:&lt;br /&gt;
* внутри маршрута — комбинацией клавиш ВВЕРХ + CTRL и ВНИЗ + CTRL или с помощью пунктов контекстного меню '''Передвинуть выше''' и '''Передвинуть ниже''';&lt;br /&gt;
* между маршрутами — используйте пункт контекстного меню '''Переместить в маршрут'''. Точка добавляется в конец списка адресов. &lt;br /&gt;
&lt;br /&gt;
Выделенная в списке точка подсвечивается в маршруте на карте. &lt;br /&gt;
&lt;br /&gt;
Отправления, не подходящие для доставки в указанную дату, выделяются розовым цветом. При наведении на такие строки курсора мыши отображается подсказка с причиной ошибки. Вы можете открыть соответствующую корреспонденцию двойным щелчком по строке и исправить данные.&lt;br /&gt;
&lt;br /&gt;
Чтобы подтвердить сформированные маршруты, нажмите на кнопку '''Подтвердить все маршруты'''. Номера точек в маршруте заносятся в [[путевые листы]]. &lt;br /&gt;
&lt;br /&gt;
====Не запланировано====&lt;br /&gt;
&lt;br /&gt;
Вкладка содержит список отправлений с ошибками планирования. Строки выделены розовым цветом, при наведении курсора мыши на строку или в столбце «Примечание» отображается подсказка с причиной ошибки:&lt;br /&gt;
* не запланирован на курьера — используйте пункт контекстного меню '''Переместить в маршрут'''. Точка добавляется в конец списка адресов маршрута;&lt;br /&gt;
* не подходит план. дата доставки — откройте корреспонденцию щелчком по строке и исправьте дату доставки;&lt;br /&gt;
* местоположение не подтверждено — выполните действия, описанные в разделе [[#Ненайденные адреса|«Ненайденные адреса»]];&lt;br /&gt;
* курьер не доступен по графику — убедитесь, что в карточке курьера есть [[Графики работы сотрудников|график]] на дату планирования.&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое планирование ===&lt;br /&gt;
Вид планирования, который позволяет автоматизировать назначение курьеров и просчет оптимальных маршрутов доставки корреспонденции с учетом дорожных условий.&lt;br /&gt;
&lt;br /&gt;
В MeaSoft доступны интеграции с сервисами автоматического планирования:&lt;br /&gt;
* [[Maxoptra]]&lt;br /&gt;
* [[Яндекс.Маршрутизация]]&lt;br /&gt;
&lt;br /&gt;
= Картографическая система =&lt;br /&gt;
&lt;br /&gt;
Программа MeaSoft работает с картографической системой [http://www.openstreetmap.org '''OpenStreetMap'''].&lt;br /&gt;
&lt;br /&gt;
Проект создан сообществом картографов, которые добавляют и поддерживают данные о дорогах, тропах, кафе, вокзалах и многих других объектах по всему миру.&lt;br /&gt;
&lt;br /&gt;
Карты OpenStreetMap позволяют создавать области и тарифицировать зоны, назначать курьеров в окне '''Карта''', планировать курьеров на доставку.&lt;br /&gt;
&lt;br /&gt;
OpenStreetMap не умеет строить маршруты курьеров, для работы с новыми областями необходимо постоянное подключение к интернету. Просмотренные области карты [[Терминология#Карта|кешируются]] и в дальнейшем доступны для работы даже без интернета.&lt;br /&gt;
&lt;br /&gt;
Система OpenstreetMap в программе MeaSoft не требует никакой региональной настройки и сразу готова к работе.&lt;br /&gt;
&lt;br /&gt;
= Геокодирование =&lt;br /&gt;
&lt;br /&gt;
== Описание и принцип работы ==&lt;br /&gt;
Для отображения любой информации на карте используется [https://ru.wikipedia.org/wiki/Геокодирование геокодирование].&lt;br /&gt;
&lt;br /&gt;
Если в офисном приложении координаты адреса неизвестны, оно отправляет запрос в геокодер MeaSoft: передает город и адрес, в ответ получает координаты, которые сохраняются в кеш программы. Поэтому, прежде чем отправить запрос в геокодер, сначала проверяется, нет ли данных для этого адреса в кеше. Если есть, запрос к геокодеру не нужен.&lt;br /&gt;
&lt;br /&gt;
При записи и чтении из кэша срабатывает упрощение адреса: до первой запятой — считается улицей, 5 символов после — номер дома. Использование упрощения адресов определяется переменной '''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Подключения''' &amp;gt; '''Карты''' &amp;gt; '''Геокодирование''' &amp;gt; '''Отключить упрощение адреса при геокодировании''':&lt;br /&gt;
* если упрощение включено, в кеш записывается не весь найденный адрес, а только часть. Перед поиском адрес также сначала упрощается. Например, адрес вида «Солнечногорск, улица Островского, 1» и «Солнечногорск, улица Гоголя, 1» упрощается до «Солнечногорск, улица». И программа оба адреса сведет к одной точке. При включении упрощения точность до дома не гарантируется;&lt;br /&gt;
* если упрощение адреса выключено, поиск и запись адреса в кеш ведется в том виде, в каком он указан, и время определения координат может увеличиться. При разнице хотя бы в один символ нужен повторный запрос к геокодеру. Например, эти адреса будут разными: «Солнечногорск, улица Островского, 1» и «Солнечногорск, улица Островского, д1».&lt;br /&gt;
&lt;br /&gt;
Для улучшения результатов геокодирования при включенном упрощении указывайте адрес по стандарту MeaSoft. Например, в поле '''Адрес''' нужно указать «улица Островского, 1», а в поле '''Город''' указать «Солнечногорск». Тогда точность будет высокой при хорошей скорости геокодирования.&lt;br /&gt;
&lt;br /&gt;
Если геокодер MeaSoft не нашел адрес, он может сделать запрос к платному геокодеру: [https://www.ahunter.ru/ Ахантер] и к [https://yandex.ru/maps Яндекс. Картам]. Сервер геокодирования Яндекс. Карт, получая запрос, преобразует адреса в координаты и ищет соответствия по своей базе данных, затем возвращает адреса в программу. В окне «Карта» отображаются маркеры адресов, которым сервер Яндекс. Карт смог найти соответствия.&lt;br /&gt;
&lt;br /&gt;
== Настройка  ==&lt;br /&gt;
Данные сервера геокодирования Яндекс.Карт находятся в '''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Подключения''' &amp;gt; '''Карты''' &amp;gt; '''Яндекс''' &amp;gt; '''Сервер геокодирования Яндекс'''.&lt;br /&gt;
&lt;br /&gt;
Чтобы адреса корректно определялись на карте, перейдите по [https://developer.tech.yandex.ru/  ссылке] и получите ключ «JavaScript API и HTTP Геокодер», затем укажите его в '''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Подключения''' &amp;gt; '''Карты''' &amp;gt; '''Геокодирование''' &amp;gt; '''API-Ключ'''.&lt;br /&gt;
&lt;br /&gt;
== Лимиты геокодирования  Яндекс.Карт == &lt;br /&gt;
Из-за существенного уменьшения лимитов запросов Яндексом - в данный момент в сутки на общий АПИ ключ дается только 1000 запросов на всех пользователей сервиса. &lt;br /&gt;
Для увеличения лимитов вы можете добавить свой АПИ ключ Яндекса.&lt;br /&gt;
&lt;br /&gt;
== Поиск адреса на Карте ==&lt;br /&gt;
В данный момент поиск на карте использует уже имеющиеся результаты геокодирования. Если конкретный адрес найти не удалось, то система пытается приблизить к улице, чтобы таким образом облегчить поиск.&lt;br /&gt;
&lt;br /&gt;
=Единое районирование=&lt;br /&gt;
&lt;br /&gt;
;Единое районирование&lt;br /&gt;
:Cистема планирования работы курьеров, при которой заказы распределяются по районам, нарисованным на карте. Этот метод пришел на смену планированию по станциям метро. Единое районирование работает для всех филиалов компании. &lt;br /&gt;
&lt;br /&gt;
Чтобы включить единое районирование:&lt;br /&gt;
# Выберите '''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Финансы''' &amp;gt; '''Расчет района по адресу''', установите значение переменной '''1''' и нажмите '''Сохранить'''. При этом автоматически включатся связанные переменные '''Расчет стоимости по адресу''' и '''Расчет зоны курьера по адресу'''.&lt;br /&gt;
#: Можно включить единое районирование для отдельных пользователей.  Для этого после 0 укажите через запятую &amp;lt;rspoiler text=имена&amp;gt;'''Настройки''' &amp;gt; '''Пользователи''' &amp;gt; карточка пользователя &amp;gt; поле '''Имя пользователя''' &amp;lt;/rspoiler&amp;gt; конкретных пользователей и нажмите '''Сохранить''':[[Файл:Edinoe raionirovanie.png|none|700px]]&lt;br /&gt;
# Выберите '''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Корреспонденция''' &amp;gt; '''Планировать по курьерам в режиме многофилиальности'''. Возможные значения переменной:&lt;br /&gt;
#* '''0''' — адреса на карте планируются по районам, в окне слева будет отображаться список районов;&lt;br /&gt;
#* '''1''' — адреса на карте планируются по курьерам, в окне слева будет отображаться список курьеров.&lt;br /&gt;
#: Чтобы внедрять функциональность в работу постепенно, в переменных можно указать отдельных пользователей аналогично действиям в пункте 1.&lt;br /&gt;
#: Установите значение переменной и нажмите '''Сохранить'''.&lt;br /&gt;
# Выберите '''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Умолчания''' &amp;gt; '''Псевдоним метро''' и введите название, которое заменит слово «метро» в интерфейсе программы. Например, «районы».&lt;br /&gt;
# После изменения значения переменных перезагрузите программу MeaSoft.&lt;br /&gt;
После включения единого районирования станут недоступны справочники '''Метро''', '''Улицы''', планирование по станциям метро. Чтобы установить тарифные зоны:&lt;br /&gt;
# Выберите '''Справочники''' &amp;gt; '''Районы''', нарисуйте районы доставки на карте и закрепите за ними курьеров для автоматического планирования. &lt;br /&gt;
# Выберите '''Справочники''' &amp;gt; '''Зоны на карте''' и нарисуйте зоны курьеров и/или клиентов. Подробнее см. раздел [[Зоны на карте|«Зоны на карте»]].&lt;br /&gt;
&lt;br /&gt;
По завершении всех настроек на вкладке '''Адреса''' выделите несколько адресов и нажмите на кнопку [[Файл:Показать на карте.jpg|30 px]]. В зависимости от значения переменной '''Планировать по курьерам в режиме многофилиальности''' на карте в окне слева отобразится список курьеров или районов доставки. Если отображается неполный список курьеров, перейдите в карточку отсутствующего в списке сотрудника и проверьте, указаны ли у него дата приема на работу и график работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;spoiler text=&amp;quot;См. также&amp;quot;&amp;gt;&lt;br /&gt;
[[Графики работы сотрудников]]&amp;lt;/spoiler&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C_%C2%AB%D0%9A%D0%B0%D1%80%D1%82%D0%B0%C2%BB&amp;diff=15873</id>
		<title>Модуль «Карта»</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C_%C2%AB%D0%9A%D0%B0%D1%80%D1%82%D0%B0%C2%BB&amp;diff=15873"/>
				<updated>2026-03-25T06:54:53Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Группировка адресов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Назначение ==&lt;br /&gt;
&lt;br /&gt;
Модуль предназначен для визуального планирования городских доставок и создания [[Зоны на карте|тарифных зон]] на карте в режиме [[#Единое районирование|единого районирования]].&lt;br /&gt;
&lt;br /&gt;
= Заказы на карте =&lt;br /&gt;
Отображение отправлений на карте позволяет увидеть объем предстоящих доставок, найденные и ненайденные адреса.&lt;br /&gt;
&lt;br /&gt;
На вкладке '''Заказы''' выделите заказы и нажмите на клавишу ПРОБЕЛ или выберите пункт контекстного меню '''Перейти к адресам'''. На вкладке '''Адреса''' отобразятся отправления, которые нужно доставить или забрать. Для удобства список корреспонденции можно [[Основные принципы работы в программе#Сортировка списка адресов|отсортировать]].&lt;br /&gt;
&lt;br /&gt;
Чтобы открыть заказы на карте, на вкладке '''Адреса''' нажмите на кнопку [[Файл:Показать на карте.jpg|30 px]]. Чтобы посмотреть определенное отправление, выделите его и выберите пункт контекстного меню '''Показать на карте'''.&lt;br /&gt;
&lt;br /&gt;
Откроется окно «Карта»:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Карта.png|none]]&lt;br /&gt;
&lt;br /&gt;
Верхнее меню содержит следующие кнопки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Globe.png]] — обзор всей карты;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Print.png]] — печать видимого участка карты;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Settings.png]] — [[Модуль «Карта»#Настройки|настройки отображения]] информации на карте;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Кнопка_Поиск.png]] — поиск по адресу или координатам.&lt;br /&gt;
&lt;br /&gt;
В панели слева настройте отображение списка курьеров:&lt;br /&gt;
* выберите из выпадающего списка филиал, курьеров которого нужно просмотреть;&lt;br /&gt;
* укажите менеджеров, чьих курьеров нужно отобразить в списке;&lt;br /&gt;
* укажите дату планируемой доставки для курьеров. Чтобы курьер отображался в списке, должны быть выполнены следующие условия:&lt;br /&gt;
*# В карточке курьера указана дата приема на работу; &lt;br /&gt;
*# Для курьера установлено свободное посещение или есть график на дату планирования. Подробнее см. раздел «[[Графики работы сотрудников]]».&lt;br /&gt;
&lt;br /&gt;
В окне справа отображается карта с адресами отправлений, отмеченными [[Модуль «Карта»#Настройка карты|маркерами]].&lt;br /&gt;
&lt;br /&gt;
===Ненайденные адреса ===&lt;br /&gt;
&lt;br /&gt;
Адреса, которые не удалось найти на карте, отображаются в нижней части окна. &lt;br /&gt;
&lt;br /&gt;
Если адрес не отображается на карте:&lt;br /&gt;
* щелкните дважды по строке ненайденного адреса и в карточке корреспонденции проверьте правильность написания  соответствие [[Знакомство с программой#Ввод адресной информации|правилам ввода адресной информации]];&lt;br /&gt;
* в контекстном меню списка ненайденных адресов выберите '''Поискать адрес на карте'''. Если адрес найден, перетащите запись из нижней части окна на точку, найденную на карте;&lt;br /&gt;
* в контекстном меню списка ненайденных адресов выберите '''Поискать адрес в интернете'''. Откроется окно браузера по умолчанию с адресом на карте. Скопируйте координаты найденного адреса, вставьте в строку поиска сверху и нажмите на кнопку [[Файл:Кнопка_Поиск.png]]. На карте отобразится найденный адрес в виде зеленого ромба. Перетащите запись из нижней части окна на точку, найденную на карте. Изображение ромба пропадет, если удалить из строки поиска координаты его широты и долготы;&lt;br /&gt;
* если вы точно знаете местоположение ненайденного адреса на карте, перетащите адрес в нужное место.&lt;br /&gt;
&lt;br /&gt;
Если маркер корреспонденции отмечен не на том месте, открепите точку через контекстное меню (адрес перенесется в «ненайденные»), а затем перетащите на нужное место.&lt;br /&gt;
&lt;br /&gt;
MeaSoft запоминает все адреса, найденные и указанные в ручном режиме, а затем автоматически подставляет их при повторной работе с модулем.&lt;br /&gt;
&lt;br /&gt;
=== Настройки===&lt;br /&gt;
&lt;br /&gt;
Настройки вызываются по нажатию на [[Файл:Settings.png]]. Окно настроек выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Карта_маркеры.png|none|300px]]&lt;br /&gt;
&lt;br /&gt;
====Настройка карты====&lt;br /&gt;
&lt;br /&gt;
Вкладка  предназначена для установки отображения корреспонденции на карте. Вы можете выбрать один из вариантов:&lt;br /&gt;
* '''Цвета состояния''' — корреспонденция отмечается в зависимости от ее статуса. Можно изменить цвета, выбранные по умолчанию. Чтобы изменить цвет, нажмите на кнопку [[Файл:More.png]] справа от цвета, откроется окно с вариантами. Выберите нужный и нажмите '''ОК'''. Этот режим помогает логисту видеть запланированные и незапланированные на курьеров доставки;&lt;br /&gt;
*''' Цвета курьеров''' — корреспонденция отображается цветом назначенного курьеру маркера. Предусмотрено 24 разных цвета для курьеров. Если все цвета уже назначены, всем последующим курьерам присваивается белый цвет. Этот режим помогает видеть район доставки корреспонденции на карте при относительно небольшом количестве курьеров.&lt;br /&gt;
&lt;br /&gt;
===== Группировка адресов =====&lt;br /&gt;
&lt;br /&gt;
В новой версии программы появился режим '''Включить группировку адресов на карте'''.  &lt;br /&gt;
После его активации,адреса расположенные в одной точке, объединяются в общий маркер, на котором отображается количество адресов в данной точке.&lt;br /&gt;
&lt;br /&gt;
Цветовая схема маркеров помогает быстрее оценить состояние планирования:&lt;br /&gt;
&lt;br /&gt;
* '''Чёрный круг''' — не все адреса в точке запланированы на курьеров.  &lt;br /&gt;
  Пример: текст ''5/10'' означает, что из 10 адресов запланировано только 5.&lt;br /&gt;
&lt;br /&gt;
* '''Зелёный круг''' — все адреса в точке распределены между курьерами.&lt;br /&gt;
&lt;br /&gt;
Если в точке есть адреса запланированные на выбранного курьера, то появляются дополнительные цвета:&lt;br /&gt;
&lt;br /&gt;
* '''Жёлтый круг''' — в точке есть адреса, закреплённые за выбранным курьером.  &lt;br /&gt;
  Пример: текст ''1/10'' — на выбранного курьера назначен 1 адрес из 10.&lt;br /&gt;
&lt;br /&gt;
* '''Красный круг''' — у выбранного курьера есть адреса в этой точке, и часть остальных адресов пока не запланирована.  &lt;br /&gt;
  Такие адреса можно «докинуть» курьеру, так как он всё равно посещает эту точку.  &lt;br /&gt;
  Пример: текст ''3/10'' — на выбранного курьера запланировано 3 адреса из 10.&lt;br /&gt;
&lt;br /&gt;
* Двухцветный круг , одна половина '''черная''', другая '''красная''' - в точке адреса запланированы, но на разных курьеров.&lt;br /&gt;
&lt;br /&gt;
==== Печать ====&lt;br /&gt;
&lt;br /&gt;
Вкладка предназначена для настройки контрастности печати. Проблема с четкостью карты может возникнуть, если логист использует черно-белый принтер.&lt;br /&gt;
&lt;br /&gt;
Чтобы улучшить качество изображения, введите коэффициент усиления контрастности печати.&lt;br /&gt;
&lt;br /&gt;
Варианты печати карты:&lt;br /&gt;
* печать карты из окна «Карта». Слева вверху нажмите на кнопку '''Печать''';&lt;br /&gt;
* автоматическая печать. Позволяет распечатывать карту вместе с документами, необходимыми при выдаче корреспонденции. Можно &amp;lt;rspoiler text=&amp;quot;настроить печать&amp;quot;&amp;gt;'''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Печать''' &amp;gt; '''Печатать карту при выдаче'''. Возможные значения: '''Не печатать''', '''Печатать после акта''' (если нужно нумеровать корреспонденцию на печатной карте) и '''Печатать до акта''' (если нужно нумеровать адреса на печатной карте).&amp;lt;/rspoiler&amp;gt;до выдачи или после выдачи акта.&lt;br /&gt;
&lt;br /&gt;
Существуют следующие варианты обозначения корреспонденции на печатной карте при выдаче:  &lt;br /&gt;
* нумеруется корреспонденция. Внутри каждого квадрата находится порядковый номер корреспонденции из акта приема-передачи курьеру. Если получателю предназначены несколько отправлений, на карте в квадрате будут перечислены их порядковые номера из акта приема-передачи. Такой вид отображения удобен, когда курьеру нужно сообщить логисту о передаче корреспонденции получателю. Курьер сообщает номер корреспонденции, логист отмечает передачу в программе. &amp;lt;spoiler text=&amp;quot;Настройка переменной&amp;quot;&amp;gt;&lt;br /&gt;
'''Справочники''' &amp;gt; '''Настройка''' &amp;gt; '''Печать''' &amp;gt; '''Акты передачи курьеру''' &amp;gt; '''Сохранять номер строки в акте передачи курьеру''' &amp;gt; '''Запоминать из актов'''&amp;lt;/spoiler&amp;gt;&lt;br /&gt;
* нумеруются адреса корреспонденции.  Внутри каждого квадрата находится порядковый номер адреса. Если получателей несколько на один адрес, на вкладке '''Выдача''' в графе '''Номер в акте''' у нескольких корреспонденций будет один порядковый номер.&amp;lt;spoiler text=&amp;quot;Настройка переменной&amp;quot;&amp;gt;'''Справочники''' &amp;gt; '''Настройка''' &amp;gt; '''Печать''' &amp;gt; '''Акты передачи курьеру''' &amp;gt; '''Сохранять номер строки в акте передачи курьеру''' &amp;gt; '''Запоминать из карт'''&amp;lt;/spoiler&amp;gt;Пример карты:&lt;br /&gt;
[[Файл:Печать на карте.jpg|500px|none]]&lt;br /&gt;
&lt;br /&gt;
==== Хинты ====&lt;br /&gt;
&lt;br /&gt;
Вкладка предназначена для настройки всплывающих подсказок, которые отображаются при наведении курсора на маркер.&lt;br /&gt;
&lt;br /&gt;
Всплывающие подсказки настраиваются отдельно для отображения карты в разных режимах:&lt;br /&gt;
* по кнопке '''Адреса ''' — подсказки на вкладке '''Адреса''';&lt;br /&gt;
* по кнопке '''Трекинг''' — подсказки при просмотре маршрута курьера в [[Функции#Трекинг курьеров|трекинге]];&lt;br /&gt;
* по кнопке '''Выдача в трекинге''' — подсказки при просмотре выданной корреспонденции в [[Функции#Трекинг курьеров|трекинге]].&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные возможности ===&lt;br /&gt;
&lt;br /&gt;
В программе предусмотрены параметры, которые позволяют задать условия отображения маркера на карте. Например, можно сделать заборы большими синими треугольниками, а вечерние доставки отображать маленькими желтыми квадратиками. Подробнее см. раздел [[Системные доп. возможности#Настройка вида маркера | «Руководство программиста»]].&lt;br /&gt;
&lt;br /&gt;
'''Примечание.''' Мы настоятельно рекомендуем не изменять эту настройку без помощи специалиста. Вы можете обратиться к нам, настройка маркеров для 2-го и 3-го тарифа поддержки будет бесплатной или недорогой в других случаях.&lt;br /&gt;
&lt;br /&gt;
=Виды планирования=&lt;br /&gt;
* Планирование по курьерам с помощью карт:&lt;br /&gt;
** [[Модуль «Карта»#Ручное планирование|вручную]]&lt;br /&gt;
** [[Модуль «Карта»#Планирование схемами|схемы]]&lt;br /&gt;
** позаказно&lt;br /&gt;
* Планирование по списку &lt;br /&gt;
* Планирование маршрутов курьеров:&lt;br /&gt;
**[[#Ручное планирование маршрутов|ручное планирование маршрутов]]&lt;br /&gt;
** автоматическое планирование [[Максоптра]]&lt;br /&gt;
** автоматическое планирование [[Яндекс.Маршрутизация]]&lt;br /&gt;
&lt;br /&gt;
=== Ручное планирование по курьерам ===&lt;br /&gt;
Виды ручного планирования:&lt;br /&gt;
* назначение курьера на маркер. В контекстном меню маркера корреспонденции выберите '''Запланировать'''. Заказ планируется на сотрудника, выбранного в списке слева. По умолчанию это первый в списке курьер. Чтобы выбрать конкретного курьера, в контекстном меню маркера выберите '''Запланировать для курьера''';&lt;br /&gt;
* перемещение маркеров. Например, курьер на доставку запланирован, нужно добавить ему еще отправления. Удерживая нажатой кнопку CTRL, перетащите свободный маркер на маркер c запланированным сотрудником. В результате два адреса планируются для доставки одним сотрудником. Если на обоих маркерах уже запланированы курьеры, при перемещении одного на другой отправление будет назначено сотруднику, на маркер которого перетащили;&lt;br /&gt;
* выделение области. Удерживая нажатой правую кнопку мыши, обведите область с маркерами, затем в контекстном меню области выберите пункт '''Запланировать для курьера'''. В результате отправления этой области назначена на доставку указанному сотруднику.&lt;br /&gt;
&lt;br /&gt;
=== Планирование схемами по курьерам ===&lt;br /&gt;
;Схемы&lt;br /&gt;
: Графически выделенные контуры районов доставки, сохраненные на карте, возможно, с назначенными на них курьерами.&lt;br /&gt;
&lt;br /&gt;
Планирование схемами позволяет сократить ручную работу при помощи созданных районов доставки. Районы доставки можно изменять по размеру или объединять — в зависимости от веса, объема и количества корреспонденции. Например, при большом количестве корреспонденции можно уменьшить район доставок, чтобы разделить нагрузку между курьерами.&lt;br /&gt;
&lt;br /&gt;
[[Файл:зонирование.png|none]]&lt;br /&gt;
&lt;br /&gt;
==== Создание схемы ====&lt;br /&gt;
# Выберите заказы, перейдите на вкладку '''Адреса''' и нажмите на кнопку [[Файл:Показать на карте.jpg|30 px]]. Откроется окно «Карта».&lt;br /&gt;
# Нажмите на кнопку '''Добавить'''.&lt;br /&gt;
# В выпадающем списке выберите добавленную схему.&lt;br /&gt;
# Нажмите на кнопку [[Файл:Кнопка Опции.png]] рядом с кнопкой '''Добавить''' и выберите пункт '''Редактировать схему'''.&lt;br /&gt;
# В контекстном меню на карте выберите пункт '''Создать контур'''. Подробнее см. раздел «[[Зоны на карте#Создание контуров на карте|Создание контуров на карте]]».&lt;br /&gt;
# При помощи правой клавиши мыши выставляйте точки контура так, чтобы получилась замкнутая область. Когда контур готов, нажмите ENTER. Чтобы объединить соседние контуры, выделите их, удерживая зажатой клавишу CTRL, и в контекстном меню выберите '''Объединить контуры'''.&lt;br /&gt;
# Чтобы назначить курьера на контур, в контекстном меню выберите пункт '''Установить курьера'''.&lt;br /&gt;
# Создайте столько контуров с назначенными курьерами, сколько нужно для работы, и нажмите на кнопку '''Завершить'''.&lt;br /&gt;
# Нажмите на кнопку [[Файл:Кнопка Опции.png]] рядом с кнопкой '''Добавить''' и выберите пункт '''Параметры схемы'''. В открывшемся окне укажите название схемы и выберите филиал, к которому будет относиться схема.&lt;br /&gt;
&lt;br /&gt;
Пункт контекстного меню '''Указать номер зоны''' используется в клиентской автоматизации, не входящей в стандартную поставку. &amp;lt;spoiler text=&amp;quot;Подробнее&amp;quot;&amp;gt;Автоматизация создает начисления, компенсирующие курьерам затраты на ГСМ. Зонам на схеме присваивается номер, соответствующий размеру компенсации ГСМ. Например, номер зоны 200 означает, что компенсация равна 200 рублям.&amp;lt;br&amp;gt;Автоматизация учитывает вчерашние выдачи со статусами «Отказ на месте» и «Доставлено», начисляет компенсацию каждому курьеру по самой удаленной зоне доставки и выводит сумму к выдаче в АПК.&amp;lt;/spoiler&amp;gt;&lt;br /&gt;
При создании контуров не допускайте пустоты и пересечения контуров. Если адрес доставки или забора попадет в пустое место между контурами, то в режиме [[Модуль Карта#Полуавтоматическое планирование|полуавтоматического планирования]] ни один курьер не будет назначен на доставку. Если адрес попадет на пересечение контуров, то курьер будет выбран случайно из назначенных на пересекающиеся области.&lt;br /&gt;
&lt;br /&gt;
Чтобы использовать контуры одной схемы для другой или для создания новой, используйте функцию '''Копировать схему''' в выпадающем меню рядом с кнопкой '''Добавить'''.&lt;br /&gt;
&lt;br /&gt;
==== Планирование ====&lt;br /&gt;
Чтобы начать планирование, в окне «Карта» выберите [[#Создание схемы|созданную схему]] из выпадающего списка и нажмите на кнопку '''Проставить по всем'''. Корреспонденция распределится между работающими курьерами, по завершении операции формируется отчёт в отдельном окне. Можно использовать способы [[#Ручное планирование|ручного планирования]].&lt;br /&gt;
&lt;br /&gt;
На несколько районов можно запланировать одного курьера. Для этого выделите районы, удерживая зажатой клавишу CTRL, и в контекстном меню выберите курьера.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание: временная область, нарисованная на схеме, имеет больший приоритет. Временные контуры можно использовать для назначения другого сотрудника, когда на одного курьера запланировано большое количество отправлений, которые он физически не сможет доставить.&lt;br /&gt;
  &lt;br /&gt;
Для разных случаев можно создать отдельные схемы районов доставки: количество корреспонденции, будние или выходные дни, праздники и т. д.&lt;br /&gt;
&lt;br /&gt;
==== Удаление схемы ====&lt;br /&gt;
В окне «Карта» выберите схему из выпадающего списка, нажмите на кнопку [[Файл:Кнопка Опции.png]] рядом с кнопкой '''Добавить''' и выберите пункт '''Удалить схему'''.&lt;br /&gt;
&lt;br /&gt;
===Ручное планирование маршрутов===&lt;br /&gt;
&lt;br /&gt;
Вы можете спланировать маршрут курьера и сформировать путевые листы с указанной последовательностью точек.&lt;br /&gt;
&lt;br /&gt;
# В окне «Карта» нажмите на кнопку '''Доставка'''. Если есть корреспонденции, запланированные на курьера на указанную дату, маршруты автоматически сформируются и отобразятся на карте. Точки в маршрутах располагаются в случайном порядке.&lt;br /&gt;
# [[#Запланировано|Скорректируйте]] маршруты при необходимости и нажмите на кнопку '''Подтвердить все маршруты'''. Номера точек в маршруте заносятся в [[путевые листы]]. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Ручная маршрутизация.png|none|1500 px]]&lt;br /&gt;
&lt;br /&gt;
Информация в панели '''Доставка''' сгруппирована по вкладкам:&lt;br /&gt;
* Запланировано — общая информация о сформированных маршрутах. Поля «Отбытие», «Прибытие», «КМ» не заполняются;&lt;br /&gt;
* Не запланировано — список отправлений, которые не запланированы на курьера или на дату или не найдены на карте.&lt;br /&gt;
&lt;br /&gt;
Вы можете использовать способы [[#Ручное планирование|ручного планирования]] на карте для указания курьера.&lt;br /&gt;
&lt;br /&gt;
====Запланировано====&lt;br /&gt;
В таблице «Маршруты» содержится общая информация о сформированных маршрутах. &lt;br /&gt;
&lt;br /&gt;
Возможные действия:&lt;br /&gt;
* добавить новый маршрут для курьера, еще не указанного в списке — в контекстном меню выберите '''Создать новый маршрут''' и укажите сотрудника;&lt;br /&gt;
* запланировать сформированный маршрут для выбранного курьера — в контекстном меню выберите '''Запланировать''';&lt;br /&gt;
* назначить другого курьера для сформированного маршрута — в контекстном меню выберите '''Запланировать для курьера'''.&lt;br /&gt;
&lt;br /&gt;
В таблице «Адреса» перечислены точки, входящие в маршрут курьера, выделенного в таблице «Маршруты» выше. Точки в маршрутах располагаются в случайном порядке. Вы можете перемещать точки:&lt;br /&gt;
* внутри маршрута — комбинацией клавиш ВВЕРХ + CTRL и ВНИЗ + CTRL или с помощью пунктов контекстного меню '''Передвинуть выше''' и '''Передвинуть ниже''';&lt;br /&gt;
* между маршрутами — используйте пункт контекстного меню '''Переместить в маршрут'''. Точка добавляется в конец списка адресов. &lt;br /&gt;
&lt;br /&gt;
Выделенная в списке точка подсвечивается в маршруте на карте. &lt;br /&gt;
&lt;br /&gt;
Отправления, не подходящие для доставки в указанную дату, выделяются розовым цветом. При наведении на такие строки курсора мыши отображается подсказка с причиной ошибки. Вы можете открыть соответствующую корреспонденцию двойным щелчком по строке и исправить данные.&lt;br /&gt;
&lt;br /&gt;
Чтобы подтвердить сформированные маршруты, нажмите на кнопку '''Подтвердить все маршруты'''. Номера точек в маршруте заносятся в [[путевые листы]]. &lt;br /&gt;
&lt;br /&gt;
====Не запланировано====&lt;br /&gt;
&lt;br /&gt;
Вкладка содержит список отправлений с ошибками планирования. Строки выделены розовым цветом, при наведении курсора мыши на строку или в столбце «Примечание» отображается подсказка с причиной ошибки:&lt;br /&gt;
* не запланирован на курьера — используйте пункт контекстного меню '''Переместить в маршрут'''. Точка добавляется в конец списка адресов маршрута;&lt;br /&gt;
* не подходит план. дата доставки — откройте корреспонденцию щелчком по строке и исправьте дату доставки;&lt;br /&gt;
* местоположение не подтверждено — выполните действия, описанные в разделе [[#Ненайденные адреса|«Ненайденные адреса»]];&lt;br /&gt;
* курьер не доступен по графику — убедитесь, что в карточке курьера есть [[Графики работы сотрудников|график]] на дату планирования.&lt;br /&gt;
&lt;br /&gt;
=== Автоматическое планирование ===&lt;br /&gt;
Вид планирования, который позволяет автоматизировать назначение курьеров и просчет оптимальных маршрутов доставки корреспонденции с учетом дорожных условий.&lt;br /&gt;
&lt;br /&gt;
В MeaSoft доступны интеграции с сервисами автоматического планирования:&lt;br /&gt;
* [[Maxoptra]]&lt;br /&gt;
* [[Яндекс.Маршрутизация]]&lt;br /&gt;
&lt;br /&gt;
= Картографическая система =&lt;br /&gt;
&lt;br /&gt;
Программа MeaSoft работает с картографической системой [http://www.openstreetmap.org '''OpenStreetMap'''].&lt;br /&gt;
&lt;br /&gt;
Проект создан сообществом картографов, которые добавляют и поддерживают данные о дорогах, тропах, кафе, вокзалах и многих других объектах по всему миру.&lt;br /&gt;
&lt;br /&gt;
Карты OpenStreetMap позволяют создавать области и тарифицировать зоны, назначать курьеров в окне '''Карта''', планировать курьеров на доставку.&lt;br /&gt;
&lt;br /&gt;
OpenStreetMap не умеет строить маршруты курьеров, для работы с новыми областями необходимо постоянное подключение к интернету. Просмотренные области карты [[Терминология#Карта|кешируются]] и в дальнейшем доступны для работы даже без интернета.&lt;br /&gt;
&lt;br /&gt;
Система OpenstreetMap в программе MeaSoft не требует никакой региональной настройки и сразу готова к работе.&lt;br /&gt;
&lt;br /&gt;
= Геокодирование =&lt;br /&gt;
&lt;br /&gt;
== Описание и принцип работы ==&lt;br /&gt;
Для отображения любой информации на карте используется [https://ru.wikipedia.org/wiki/Геокодирование геокодирование].&lt;br /&gt;
&lt;br /&gt;
Если в офисном приложении координаты адреса неизвестны, оно отправляет запрос в геокодер MeaSoft: передает город и адрес, в ответ получает координаты, которые сохраняются в кеш программы. Поэтому, прежде чем отправить запрос в геокодер, сначала проверяется, нет ли данных для этого адреса в кеше. Если есть, запрос к геокодеру не нужен.&lt;br /&gt;
&lt;br /&gt;
При записи и чтении из кэша срабатывает упрощение адреса: до первой запятой — считается улицей, 5 символов после — номер дома. Использование упрощения адресов определяется переменной '''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Подключения''' &amp;gt; '''Карты''' &amp;gt; '''Геокодирование''' &amp;gt; '''Отключить упрощение адреса при геокодировании''':&lt;br /&gt;
* если упрощение включено, в кеш записывается не весь найденный адрес, а только часть. Перед поиском адрес также сначала упрощается. Например, адрес вида «Солнечногорск, улица Островского, 1» и «Солнечногорск, улица Гоголя, 1» упрощается до «Солнечногорск, улица». И программа оба адреса сведет к одной точке. При включении упрощения точность до дома не гарантируется;&lt;br /&gt;
* если упрощение адреса выключено, поиск и запись адреса в кеш ведется в том виде, в каком он указан, и время определения координат может увеличиться. При разнице хотя бы в один символ нужен повторный запрос к геокодеру. Например, эти адреса будут разными: «Солнечногорск, улица Островского, 1» и «Солнечногорск, улица Островского, д1».&lt;br /&gt;
&lt;br /&gt;
Для улучшения результатов геокодирования при включенном упрощении указывайте адрес по стандарту MeaSoft. Например, в поле '''Адрес''' нужно указать «улица Островского, 1», а в поле '''Город''' указать «Солнечногорск». Тогда точность будет высокой при хорошей скорости геокодирования.&lt;br /&gt;
&lt;br /&gt;
Если геокодер MeaSoft не нашел адрес, он может сделать запрос к платному геокодеру: [https://www.ahunter.ru/ Ахантер] и к [https://yandex.ru/maps Яндекс. Картам]. Сервер геокодирования Яндекс. Карт, получая запрос, преобразует адреса в координаты и ищет соответствия по своей базе данных, затем возвращает адреса в программу. В окне «Карта» отображаются маркеры адресов, которым сервер Яндекс. Карт смог найти соответствия.&lt;br /&gt;
&lt;br /&gt;
== Настройка  ==&lt;br /&gt;
Данные сервера геокодирования Яндекс.Карт находятся в '''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Подключения''' &amp;gt; '''Карты''' &amp;gt; '''Яндекс''' &amp;gt; '''Сервер геокодирования Яндекс'''.&lt;br /&gt;
&lt;br /&gt;
Чтобы адреса корректно определялись на карте, перейдите по [https://developer.tech.yandex.ru/  ссылке] и получите ключ «JavaScript API и HTTP Геокодер», затем укажите его в '''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Подключения''' &amp;gt; '''Карты''' &amp;gt; '''Геокодирование''' &amp;gt; '''API-Ключ'''.&lt;br /&gt;
&lt;br /&gt;
== Лимиты геокодирования  Яндекс.Карт == &lt;br /&gt;
Из-за существенного уменьшения лимитов запросов Яндексом - в данный момент в сутки на общий АПИ ключ дается только 1000 запросов на всех пользователей сервиса. &lt;br /&gt;
Для увеличения лимитов вы можете добавить свой АПИ ключ Яндекса.&lt;br /&gt;
&lt;br /&gt;
== Поиск адреса на Карте ==&lt;br /&gt;
В данный момент поиск на карте использует уже имеющиеся результаты геокодирования. Если конкретный адрес найти не удалось, то система пытается приблизить к улице, чтобы таким образом облегчить поиск.&lt;br /&gt;
&lt;br /&gt;
=Единое районирование=&lt;br /&gt;
&lt;br /&gt;
;Единое районирование&lt;br /&gt;
:Cистема планирования работы курьеров, при которой заказы распределяются по районам, нарисованным на карте. Этот метод пришел на смену планированию по станциям метро. Единое районирование работает для всех филиалов компании. &lt;br /&gt;
&lt;br /&gt;
Чтобы включить единое районирование:&lt;br /&gt;
# Выберите '''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Финансы''' &amp;gt; '''Расчет района по адресу''', установите значение переменной '''1''' и нажмите '''Сохранить'''. При этом автоматически включатся связанные переменные '''Расчет стоимости по адресу''' и '''Расчет зоны курьера по адресу'''.&lt;br /&gt;
#: Можно включить единое районирование для отдельных пользователей.  Для этого после 0 укажите через запятую &amp;lt;rspoiler text=имена&amp;gt;'''Настройки''' &amp;gt; '''Пользователи''' &amp;gt; карточка пользователя &amp;gt; поле '''Имя пользователя''' &amp;lt;/rspoiler&amp;gt; конкретных пользователей и нажмите '''Сохранить''':[[Файл:Edinoe raionirovanie.png|none|700px]]&lt;br /&gt;
# Выберите '''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Корреспонденция''' &amp;gt; '''Планировать по курьерам в режиме многофилиальности'''. Возможные значения переменной:&lt;br /&gt;
#* '''0''' — адреса на карте планируются по районам, в окне слева будет отображаться список районов;&lt;br /&gt;
#* '''1''' — адреса на карте планируются по курьерам, в окне слева будет отображаться список курьеров.&lt;br /&gt;
#: Чтобы внедрять функциональность в работу постепенно, в переменных можно указать отдельных пользователей аналогично действиям в пункте 1.&lt;br /&gt;
#: Установите значение переменной и нажмите '''Сохранить'''.&lt;br /&gt;
# Выберите '''Справочники''' &amp;gt; '''Переменные''' &amp;gt; '''Умолчания''' &amp;gt; '''Псевдоним метро''' и введите название, которое заменит слово «метро» в интерфейсе программы. Например, «районы».&lt;br /&gt;
# После изменения значения переменных перезагрузите программу MeaSoft.&lt;br /&gt;
После включения единого районирования станут недоступны справочники '''Метро''', '''Улицы''', планирование по станциям метро. Чтобы установить тарифные зоны:&lt;br /&gt;
# Выберите '''Справочники''' &amp;gt; '''Районы''', нарисуйте районы доставки на карте и закрепите за ними курьеров для автоматического планирования. &lt;br /&gt;
# Выберите '''Справочники''' &amp;gt; '''Зоны на карте''' и нарисуйте зоны курьеров и/или клиентов. Подробнее см. раздел [[Зоны на карте|«Зоны на карте»]].&lt;br /&gt;
&lt;br /&gt;
По завершении всех настроек на вкладке '''Адреса''' выделите несколько адресов и нажмите на кнопку [[Файл:Показать на карте.jpg|30 px]]. В зависимости от значения переменной '''Планировать по курьерам в режиме многофилиальности''' на карте в окне слева отобразится список курьеров или районов доставки. Если отображается неполный список курьеров, перейдите в карточку отсутствующего в списке сотрудника и проверьте, указаны ли у него дата приема на работу и график работы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;spoiler text=&amp;quot;См. также&amp;quot;&amp;gt;&lt;br /&gt;
[[Графики работы сотрудников]]&amp;lt;/spoiler&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=15869</id>
		<title>Дополнительные возможности</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=15869"/>
				<updated>2026-03-18T14:18:47Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Настройка документов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Настройка для печатной документации ==&lt;br /&gt;
&lt;br /&gt;
'''CustomGivnAct''' - Функция позволяет заменить печатную форму, акта передачи материальных ценностей (печать из выдачи) на пользовательскую. Включить использование этой возможности можно в переменных &amp;quot;Справочники&amp;quot; -&amp;gt; &amp;quot;Переменные&amp;quot; -&amp;gt; &amp;quot;Печать&amp;quot; -&amp;gt; &amp;quot;Акты передачи курьеру&amp;quot; -&amp;gt; &amp;quot;Печатная форма акта: Пользовательская&amp;quot;.&lt;br /&gt;
Объявленные переменные&lt;br /&gt;
%code% - коды записей в выдаче которые необходимо распечатать&lt;br /&gt;
%docdate% - дата установленная в выдаче&lt;br /&gt;
%dockurier% - ФИО курьера показанного в выдаче&lt;br /&gt;
%dockurierfull% - Значение выбранного элемента в дереве (если есть выбранный узел дерева , иначе фио курьера)&lt;br /&gt;
&lt;br /&gt;
Пользовательская форма акта, будет печататься только по заказам со статусом &amp;quot;На руках&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''OnBeforePrintNakls''' - Вызывается перед печатью накладных, содержит %code% - коды всех адресов  (через запятую).&lt;br /&gt;
&lt;br /&gt;
'''OnAfterPrintNakls''' - Вызывается после печати накладных, содержит %code% - коды всех адресов  (через запятую).&lt;br /&gt;
&lt;br /&gt;
'''OnBeforePrintOneNakl''' - Вызывается перед печатью накладной, содержит %code% - код адреса.&lt;br /&gt;
&lt;br /&gt;
'''OnAfterPrintOneNakl''' - Вызывается после печати накладной, содержит %code% - код адреса.&lt;br /&gt;
&lt;br /&gt;
'''OnBeforePrintSticker''' - Вызывается перед печатью наклейки, содержит %code% - код адреса, %barcode% - ШК наклейки.&lt;br /&gt;
&lt;br /&gt;
'''OnAfterItemPrint''' - Вызывается после печати наклейки из карточки номенклатуры. Поддерживает поля ввода - input. Содержит %code% - код номенклатуры item.code, %Naimen% - наименование, %country% - название страны, %Count% - указанное количество копий к печати.&lt;br /&gt;
&lt;br /&gt;
'''PrintCustomSticker''' - Функция позволяет установить пользовательскую печатную форму для наклеек (из интерфейса &amp;quot;Печать ведомостей/наклеек&amp;quot;). Вызывается если выбран тип наклейки 15 (переменная StickerForm). Содержит %RectLeft%, %RectTop%, %RectRight%, %RectBottom% - границы прямоугольника на холсте принтера, в которые надо печатать (для поддержки табличной печати на A4), %RecNumber% - номер текущей записи датасета, %CurrentBarCode% - ШК, рассчитанный в зависимости от параметров в интерфейсе &amp;quot;Печать ведомостей/наклеек&amp;quot;.  %ACopyNo% - номер копии, нумерация с 1. %KolvoStr% - Стандартный текст &amp;quot;текущее место/всего мест&amp;quot;, с учетом возможной печати этикетки на одно место из нескольких. Также содержит весь датасет, использующийся в других типах наклеек. В момент вызова функции, принтер уже запущен и начат документ, объект TPrinter в функции создавать не нужно, необходимо только создать объект TCanvas, он создастся как ссылка на текущий холст принтера.&lt;br /&gt;
&lt;br /&gt;
'''PrintItemSticker''' - Вызывается перед печатью наклейки из карточки номенклатуры, для возможности распечатать уникальную наклейку для номенклатуры по заложенным в допвозможности условиям. Содержит %clientbar% - ШК наклейки. Если наклейка распечатана из допвозможности возвращает true, в противном случае false и будет распечатана стандартная наклейка, заложенная в системе&lt;br /&gt;
&lt;br /&gt;
'''ChangeSchetDetailQuery''' - Вызывается формировании / пересчете счета. Возвращает строку разбитую через CRLF на две. Первая строка заменяет поля в запросе по детализации счета, вторая меняет строку группировки. Обязательные поля: zakazcnt - кол-во заказов, price - стоимость курьерских услуг, cnt - количество, pr - общая стоимость курьерских услуг.&lt;br /&gt;
&lt;br /&gt;
'''OnAutoPrintManSticker''' - вызывается перед автопечатью сопроводительного документа к манифесту при заполнении номера пломбы (такая возможность включается уставкой печатаемой формы в переменной AutoPrintManSticker), содержит %code% - код манифеста, %mnf_date% - дату манифеста, %transporter% - код перевозчика, %store% - код филиала-получателя манифеста. Если доп.возможность возвращает true - автопечать происходит, false - нет.&lt;br /&gt;
&lt;br /&gt;
'''OnBeforePrintAddresses''' - Вызывается из формы печати ведомостей/наклеек после нажатия на кнопку &amp;quot;ОК&amp;quot;, содержит %code% - коды всех адресов  (через запятую).&lt;br /&gt;
&lt;br /&gt;
== Настройка всплывающих окон==&lt;br /&gt;
&lt;br /&gt;
'''OnGivnStateChanged''' - Вызывается в транзакции при изменении статуса выдачи. В параметре %code% указан код выдачи. В %pickupDocId%  указан код на таблицу docs, документ приема забранных корреспонденций у курьера (доска приема при закрытии забора). Переменная %RetNotScanned% принимает значение true, если при установленной переменной &amp;quot;Запрашивать возвратные документы при приеме&amp;quot; = &amp;quot;Требовать маркировки наклейкой&amp;quot; пользователь не стал сканировать наклейку.&lt;br /&gt;
&lt;br /&gt;
'''OnAfterGivnStateChanged''' - Вызывается после транзакции, при изменении статуса выдачи. В параметре %code% указан код выдачи. В %pickupDocId%  указан код на таблицу docs, документ приема забранных корреспонденций у курьера (доска приема при закрытии забора)&lt;br /&gt;
&lt;br /&gt;
'''OnBeforeAddressSave''' - Вызывается перед сохранением изменений в карточке корреспонденции. Код выполняется не в транзакции и есть возможность показывать диалоговые окна. В качестве параметра передан объект fieldlist (объект полный аналог addressrecord в доп. услугах). . Если результат функции -1, то происходит отмена сохранения без ошибки (abort). &lt;br /&gt;
&lt;br /&gt;
'''OnBeforeBaseSave''' - Вызывается перед сохранением изменений в карточке срочного заказа. Код выполняется не в транзакции и есть возможность показывать диалоговые окна. В качестве параметра передан объект fieldlist (объект полный аналог таблицы base). Теги %date_put%, %time_put%, %message% - содержат дату вручения, время вручения и инфо о доставке соответственно. Если результат функции -1, то происходит отмена сохранения без ошибки (abort). &lt;br /&gt;
&lt;br /&gt;
'''OnAfterAddressSave''' - Вызывается после сохранения карточки корреспонденции в транзакции. Тег %code% - равен коду адреса; %Form3FrameMode% равен 1, если корреспонденция заполняется из интерфейса: &amp;quot;Функции - Ввод заявок по фото&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''OnBarScan''' - Скриптовая обработка штрих-кода перед поиском&lt;br /&gt;
&lt;br /&gt;
'''AfterAddressAcceptance''' - Событие после приема корреспонденции на склад (например,заказы - прием корреспонденции).  Код выполняется не в транзакции и есть возможность показывать диалоговые окна. Содержит %Code% - код адреса, %StrBarCode% - отсканированный штрих-код. При вызове из интерфейса доски приема либо приема корреспонденции передается дополнительный тег %NewMass%, который содержит массу проставленную весами, содержит -1 если проставление массы отключено.&lt;br /&gt;
&lt;br /&gt;
'''BeforeAddressAcceptance''' - Событие перед приемом корреспонденции на склад (например,заказы - прием корреспонденции). Код выполняется в транзакции. Содержит %Code% - код адреса; %StrBarCode% - отсканированный штрих-код; %mass% - массу, если значение меньше 0 значит весы выключены; %l%, %w%, %h% - габариты; %MultiBarCode% - истина если это наклейка на место; %SetKolvo% - проставлять принятые места, место может быть уже принято; %ClientCode% - код клиента (clients.code); %PackCode% - код места (packages.code)  . Если функция возвращает значение больше 0, то это будет новой массой места или корреспонденции.&lt;br /&gt;
&lt;br /&gt;
'''OnAddToShippingPlace''' - событие после добавления корреспонденции в мешок манифеста. Код выполняется в транзакции. Содержит %сode% - код адреса, %BarCode% - штрих код который отсканировали,%ShippingPlace% - код мешка&lt;br /&gt;
&lt;br /&gt;
'''GetTypeShippingPlace''' - событие перед добавлением корреспонденции в мешок манифеста. Задача события распределить корреспонденцию между мешками. Результат функции код мешка, в который необходимо поместить корреспонденцию. Содержит  %сode% - код адреса.&lt;br /&gt;
&lt;br /&gt;
'''OnBeforePlanToManifest''' - событие перед планированием корреспонденции в манифест. Предназначено для дополнительных проверок. Выполняется до транзакции. Содержит %code% - код манифеста, %AddrList% - список кодов адресов через запятую. Объявление события отменяет системную проверку на возможность доставки адреса филиалом получателя, ее нужно реализовывать в этом событии.&lt;br /&gt;
&lt;br /&gt;
'''OnBeforeScanToManifest''' - событие перед добавлением корреспонденции в мешок манифеста. Предназначено для дополнительных проверок. Выполняется до транзакции. Содержит %code% - код манифеста, %Address% - код помещаемого адреса&lt;br /&gt;
&lt;br /&gt;
'''OnBeforePlanning''' - событие перед планированием одного или нескольких отправлений на курьера. Содержит %сode% - код курьера, %AddressCodes% - код(ы) планируемых корреспонденций.  &lt;br /&gt;
&lt;br /&gt;
'''OnAfterPlanning'''- событие после планирования планированием одного или нескольких отправлений на курьера. Содержит %сode% - код курьера, %AddressCodes% - код(ы) фактически запланированных корреспонденций.  &lt;br /&gt;
&lt;br /&gt;
'''DAILY''' - задание выполняемое один раз в день&lt;br /&gt;
&lt;br /&gt;
'''OnGivnKurierStateChanged''' - событие вызывается после изменений данных со слов курьера (статуса, времени или причины недоставки). Вызывается даже при получении данных из мобильного приложения курьера. В событии запрещено показывать диалоги, т.к. это может остановить синхронизацию данных с ЛК. Содержит %сode% - код выдачи.&lt;br /&gt;
&lt;br /&gt;
'''OnBeforeGivnStatus''' - событие срабатывает перед установкой статуса выдачи, не в транзакции. В параметре %code% указан код выдачи, %status% - устанавливаемый статус,%kurier% - код курьера, %date% - дата выдачи, %address% - код  адреса&lt;br /&gt;
&lt;br /&gt;
'''OnBeforeClientSave''' - событие срабатывает перед сохранением изменений в карточке клиента. Код выполняется не в транзакции и есть возможность показывать диалоговые окна. В качестве параметров переданы %code% (содержит код клиента) и объект fieldlist (полный аналог addressrecord в доп. услугах), который содержит ещё не сохранённую информацию о карточке клиента, а так же все её пользовательские поля. Если результат функции -1, то происходит отмена сохранения без ошибки (abort).&lt;br /&gt;
&lt;br /&gt;
'''OnAfterClientSave''' - событие срабатывает после сохранения изменений в карточке клиента. Код выполняется в транзакции. В качестве параметров переданы %code% (содержит код клиента) и объект fieldlist (полный аналог addressrecord в доп. услугах), который содержит сохранённую информацию о карточке клиента, а так же все её пользовательские поля с предыдущими значениями, которые можно получить через функцию _Former('VarCode', значение, 'VarValue')&lt;br /&gt;
&lt;br /&gt;
'''OnBeforeBasePutCheck''' - событие срабатывает при проставлении галки на вкладке срочных заказов. Код выполняется не в транзакции и есть возможность показывать диалоговые окна. В параметре &amp;lt;nowiki&amp;gt;%code%&amp;lt;/nowiki&amp;gt; указан код срочного заказа, а в параметре &amp;lt;nowiki&amp;gt;%BasePutCheckType%&amp;lt;/nowiki&amp;gt; указан тип проставления: 0 - если галка, 1 - если плюс. Если результат функции -1, то отмена выполняемой функции (abort).&lt;br /&gt;
&lt;br /&gt;
'''OnAfterCreateSpecialSMA''' - событие срабатывает после создания нового АПД для клиента. Код выполняется вне транзакции, потому есть возможность показывать диалоговые окна. В качестве единственного параметра %code% передается код созданного АПД.&lt;br /&gt;
&lt;br /&gt;
'''OnBeforeReturnIncome'''  - Событие перед приемом возврата на вкладке выдача. Код выполняется вне транзакции. Содержит %Code% - код адреса. Функция заполняет две переменные: ''$mass'' - масса возврата корреспонденции (проставляется только если значение переменной больше нуля, а если это значение больше массы корреспонденции, то будет использовано в качестве массы места) и ''$kurier'' - код вернувшего курьера (если пустое или равно нулю, то проставляется стандартный код курьера ВОЗВРАТ НА СКЛАД [15]).&lt;br /&gt;
&lt;br /&gt;
'''OnBeforeCreatePickup'''  - Событие перед созданием забора правой кнопкой мыши в списке заказов. Код выполняется вне транзакции. Содержит %Code% - код заказа. %FromCompany% - компания, у которой осуществляется забор (поле target), %FromAddress% - адрес забора&lt;br /&gt;
&lt;br /&gt;
'''AfterTicketAnswer'''  - Событие происходит после ответа на тикет. %code% - код сообщения, %TimeSpent% - кол-во потраченных минут, %ticket% - номер тикета. Доп. возможность может отключить стандартный ввод затраченного времени, для этого нужно вернуть любое значение.&lt;br /&gt;
&lt;br /&gt;
'''OnAfterTownSave''' - событие срабатывает после заведения нового населенного пункта через интерфейс справочника городов. Параметры: %code% - код населенного пункта, %name% - название населенного пункта, %city% - код региона (области).&lt;br /&gt;
&lt;br /&gt;
'''OnSetAddressState''' - событие срабатывает при изменении пользовательского статуса в карточке корреспонденции. Параметры: %State1% - текущий выбранный статус, %OldState1% - предыдущий выбранный статус, так же в доп. возможности доступен объект FieldList на корреспонденцию.&lt;br /&gt;
&lt;br /&gt;
'''OnBeforeManifestSave''' - событие, срабатывает перед сохранением в карточке манифеста, выполняется перед транзакцией потому можно показывать диалоговые окна. Параметры: %Code% - код манифеста, %StoreFromCode% - филиал-отправитель, %StoreCode% - филиал получатель, %SentDate% - дата отправки.&lt;br /&gt;
&lt;br /&gt;
'''OnAfterManifestSave''' - событие, срабатывает после сохранения в карточке манифеста, выполняется в транзакции потому показывать диалоговые окна нельзя. Параметры: %Code% - код манифеста, %StoreFromCode% - филиал-отправитель, %StoreCode% - филиал получатель, %SentDate% - дата отправки.&lt;br /&gt;
&lt;br /&gt;
== Настройка документов ==&lt;br /&gt;
'''CustomAddressPrnForm2''' - Кастомная реализация упрощенной печатной формы. В карточке заказа установлена галка Простые, и установлена переменная &amp;quot;Справочники&amp;quot; -&amp;gt; &amp;quot;Переменные&amp;quot; -&amp;gt; &amp;quot;Печать&amp;quot; -&amp;gt; &amp;quot;Упрощенные печатные формы&amp;quot; -&amp;gt; &amp;quot;Тип упрощенной печатной формы: 5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''GetTypeShippingPlace'''  - Выполняется при помещении корреспонденции в мешок манифеста. Содержит %code%  - код корреспонденции. Возвращаемое значение это код мешка (shippingpalce.code), если его указать , то это изменит мешок, в который будет помещена корреспонденция.&lt;br /&gt;
&lt;br /&gt;
'''OnShelvingBarScan''' - Обработка отсканированного штрих-кода при комплектации.&lt;br /&gt;
&lt;br /&gt;
'''AdditionalStringForSMA''' - задает дополнительные условия для формирования АПД (наиболее часто: разделения актов на нал. и безнал, помимо этого практически неограниченные возможности по изменению условий для отбора корреспонденций в акт, учета их доставленности и т.п.) Содержит %code% - код клиента, переменную %ActPayType% со значениями типов оплаты входящих в акт отправлений: &amp;quot;nal&amp;quot; - наличный, &amp;quot;bnal&amp;quot;- безналичный,&amp;quot;all&amp;quot; - все, а ткаже %ActDateTo% - с датой, до которой создается акт. Может возвращать строку, разделенную символами переноса строки. (На 17.09.2021 в возвращаемой строке предусмотрен 1 символ переноса, т.е. строка состоит из двух частей.) В этом случае часть строки до первого переноса будет использоваться в запросе как доп. условие отбора, часть строки после первого символа пеерноса - в качестве дополнительного условия для определения &amp;quot;выполненности&amp;quot; доставки (поле specialsma.Made). С помощью второго модификатора можно сделать например так, чтобы корреспонденции с незаполненными датой/временем вручения считались доставленными. &lt;br /&gt;
&lt;br /&gt;
'''CustomBillDetaling''' - Кастомная детализация счета. Установка переменной $CancelCustomDetail в true, включает вывод стандартной детализации. В переменной $schet - код счета по которому строится детализация.&lt;br /&gt;
&lt;br /&gt;
'''OnSchetChanged'''  - Выполняется при удалении счета и его изменении. Содержит %code% - код счета schet.code&lt;br /&gt;
&lt;br /&gt;
'''GetSchetNumber'''  - Выполняется при расчете номера счета\фактуры. Возвращаемое значение (не null) будет номером счета. Содержит %code% - наименование поля FactNumber или Number. Объект fieldlist - все поля таблицы schet. Например, fieldlist.code - код счета, fieldlist.date - дата счета, и т.д.&lt;br /&gt;
&lt;br /&gt;
'''QRCodePurpose'''  - задает строку &amp;quot;Назначение платежа&amp;quot; (тэг &amp;quot;Purpose&amp;quot;) в платежном QR-коде счета. По умолчанию &amp;quot;Курьерские услуги&amp;quot;. Содержит %code% - код счета schet.code, %Source% - код клиента clients.code&lt;br /&gt;
&lt;br /&gt;
'''ExceptionsForAPK'''  - Задает дополнительные критерии поиска корреспонденции при формировании акта передачи корреспонденции(АПК). Содержит %Boxes% - псевдоним таблицы вложений используемый в запросе. Функция возвращает !ДВЕ! части sql запроса разделенных CRLF. При отборе в АПК используется два запроса. Первый  - отбирает не доставленные заказы и возвраты документов, в него будет подставлено условие слева от разделителя CRLF. Второй запрос отбирает возращенные товары, в него будет подставлено условие справа от разделителя CRLF или вся строка условий если в строке нет разделителя CRLF (оставлено для обратной совместимости, в версии программы до 1115 фильтрация была только во втором запросе). %AdditionalParam% - дополнительный параметр, который можно установить в интерпретаторе при вызове функции CreateAddressTransferAct.&lt;br /&gt;
  пример кода по умолчанию, фильтр только по второму запросу,   вложение с названием &amp;quot;Доставка&amp;quot;  - не попадает в АПК&lt;br /&gt;
  &amp;lt;NOWIKI&amp;gt;&amp;lt;?&amp;gt;&lt;br /&gt;
   SET($ExcStr,' and %Boxes%.Name not like ''%Доставка%'' '); &lt;br /&gt;
   $ExcStr&amp;lt;/NOWIKI&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  пример для изменения фильтрации сразу у двух запросов:&lt;br /&gt;
  &amp;lt;NOWIKI&amp;gt;&amp;lt;?&amp;gt;&lt;br /&gt;
    SET($WHERE1,''); rem('условие отбора не доставленных и возврата документов');&lt;br /&gt;
    SET($WHERE2, ''); rem('условие отбора возврата товаров');&lt;br /&gt;
    $WHERE1 + CHAR(13) + CHAR(10) + $WHERE2&amp;lt;/NOWIKI&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OnOrderCountCalc''' -Для расчета стоимости доставки необходимо учитывать кол-во отправлений. Доп. возможность возвращает часть SQL запроса, уточняющий условия поиска. Содержит %code% - равен значению переменной &amp;quot;Считать кол-во отправлений по текущему месяцу&amp;quot; (UseCurrentMonthCount, нет - 0, да - 1)&lt;br /&gt;
&lt;br /&gt;
'''OnGetZakazCount''' - подменяет стандартный подсчет количества отправлений для расчета стоимости доставки (в том чисте отменяется вызов доп.возможности OnOrderCountCalc). Должна возвращать кол-во корреспонденций. В процедуру передаются следующие переменные: %CntAccType% - вид подсчета: 0-по заказу, 1-за месяц по клиенту; %code% - код клиента (обязателен для вида подсчета 1); %ZakazDate% - дата заказа; %CountByMonthType% - способ подсчета заказов за месяц (1-по текущему месяцу; 0 - по предыдущему); %UseCurrentUrgency% - 1:подсчитывать только корреспонденцию определенного режима срочности; %Mode% - этот режим срочности (при подсчете по заказу учитываются так же связанные режимы срочности, указанные в параметре 5 режима срочности в таблице статусов); %DatePut% - дата доставки (добавлено для альтернативных видов подсчета, может быть null); %SeparateIntercityDelivery% - 1:не учитывать междугородние доставки; В функцию так же передается объект fieldlist.&lt;br /&gt;
&lt;br /&gt;
'''OnSMABarcodeScan''' - событие вызывается при сканировании штрихкода АПК в списке актов. %code% - код АПК (sendmoneyact.code)&lt;br /&gt;
&lt;br /&gt;
'''OnPaintSMAColumns''' - вызывается при прорисовке таблицы в форме списка АПД/АПК. В функцию передается DataSet, содержащий поля таблиц SendMoneyAct и Clients, а так же пользовательские поля клиентов, называющиеся ufX, где X - номер поля (в статусах).  Функция должна возвращать строку следующей структуры:&lt;br /&gt;
Поле1_таблицы, Цвет_фона, Поле2_таблицы, Цвет_фона и т.п. Возврат нечетного числа параметров эквивалентен возврату пустой строки (цвет не меняется)&lt;br /&gt;
&lt;br /&gt;
'''CustomZPDetail''' - кастомное дополнение к детализации зарплаты (Специальная надбавка). Вызывается из скриптовой детализации зарплаты. Предназначено для расчета и вывода в детализацию значения какой-либо специальной надбавки, определенной пользователем. Входящие параметры: %code% - код платежа в таблице kurier_pays, %kurier% - код курьера. Возвращает строку, где через запятую указаны Название надбавки и ее значение. Если эта строка не содержит двух параметров - ничего не выводится.&lt;br /&gt;
&lt;br /&gt;
'''ZPAdditionalSheets''' - кастомное дополнение к детализации зарплаты - дополнительный лист(листы) на форме детализации. В функцию передается DataSet из детализации зарплаты, ссылка на объект Excel (имя - xl). Внутри функции нельзя объявлять объект TSelfAdo с именем DB (он объявлен в детализации). Номер новой страницы Excel передается в переменной $page.&lt;br /&gt;
&lt;br /&gt;
'''OnAddrInventoryAfterCreateDoc''' - вызывается в транзакции, в процедуре создания документа инветаризации корреспонденции.  Входящие параметры: %code% - код созданного документа инвентаризации. &lt;br /&gt;
&lt;br /&gt;
'''AddrInventoryAdditionalSQL''' - позволяет модифицировать запрос на создаваемый документ инвентаризации корреспонденции. Используется для наложения дополнительных фильтров.  Входящие параметры: %code% - код созданного документа инвентаризации. %header% - часть SQL запроса в которую необходимо сделать вставки, возможные варианты join, where. &lt;br /&gt;
Пример использования  '''AddrInventoryAdditionalSQL''', добавление фильтра по пользовательскому полю.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;SQL&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?&amp;gt;&lt;br /&gt;
 if('%header%'='join',  'left join userfields uf on uf.sourcecode=b.source and uf.sourcetable=2 and uf.varvalue=1',&lt;br /&gt;
 if('%header%'='where', 'and ifnull(uf.varvalue, &amp;quot;F&amp;quot;) = &amp;quot;T&amp;quot;'&lt;br /&gt;
 ,''))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
== Настройка вида маркера ==&lt;br /&gt;
Настройки находятся в &amp;quot;Отчеты&amp;quot; -&amp;gt; &amp;quot;Дополнительные возможности&amp;quot; - &amp;quot;Системные&amp;quot;. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
В функции передается объект Table2Map типа [[Руководство программиста#Объект TFieldObject|TFieldObject]]. Получить поля с примерами значений из него можно например так:&lt;br /&gt;
 showmessage(table2map._GETTABLEINFO)&lt;br /&gt;
(текст большое сообщения можно скопировать в буфер комбинацией Ctrl-C).&lt;br /&gt;
&lt;br /&gt;
Для доступа к данным пользуйтесь только этим объектом, т.к. любое обращение к базе приведет к значительному снижению скорости работы.&lt;br /&gt;
&lt;br /&gt;
Так же текущее состояние окна карты доступно через переменные:&lt;br /&gt;
&lt;br /&gt;
$PlanDate - Выбранная дата, на которую планируется.&lt;br /&gt;
&lt;br /&gt;
$KurierCode - Код выделенного курьера.&lt;br /&gt;
&lt;br /&gt;
$MetroCode - Код выделенной станции метро (маршрута).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что все ошибки, возникающие при отрисовке, подавляются системой. Поэтому, если вы допустите ошибку в скрипте, он просто не будет работать, никаких сообщений вы не увидите. Для отладочных целей можно заменить ошибки на сообщения такой конструкцией:&lt;br /&gt;
&lt;br /&gt;
 set($s, try( &lt;br /&gt;
  error('вот тут ошибка, которую вы увидите в виде сообщения');&lt;br /&gt;
 ));&lt;br /&gt;
 if($s, showmessage($s), '');&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MapObjectFigure''' - Доп. возможность позволяет установить вид маркера на карте. Результат определяет фигуру: 1 - перевернутый треугольник (острым концом вниз), 2 - треугольник, 3 - увеличенный перевернутый треугольник (острым концом вниз), чтобы  квадрат не мог его перекрыть, 4 - квадрат, 5 - ромб, все остальное круг. Ромб поддерживается с версии 960.&amp;lt;br/&amp;gt;&lt;br /&gt;
Например:&lt;br /&gt;
 if(table2map.zabor, 2, if(StrDateToFloat(table2map.DatePeriod) = $PlanDate, 3, 4))&lt;br /&gt;
Выводит треугольник, если отправление - забор. Иначе - если дата план отправления равна дате, на которую планируется - увеличенный перевернутый треугольник, иначе - квадрат.  &lt;br /&gt;
&lt;br /&gt;
'''MapObjectColor''' - Доп. возможность позволяет установить цвет маркера на карте.&lt;br /&gt;
При помощи данных параметров можно создать условия отображения маркеров.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для доступа к настройкам доступны переменные:&lt;br /&gt;
&lt;br /&gt;
$Color&lt;br /&gt;
&lt;br /&gt;
$DefaultColor&lt;br /&gt;
&lt;br /&gt;
$PlanedColor&lt;br /&gt;
&lt;br /&gt;
$SelectedPlanedColor&lt;br /&gt;
&lt;br /&gt;
$GetKurierColor&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
 if((table2map.kurier&amp;lt;20)*(StrDateToFloat(table2map.DatePeriod) = $PlanDate), 16753920, $color)&lt;br /&gt;
Не запланированные отправления на текущий день будут отображаться выбранным цветом, иначе - цветом по-умолчанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Речь диктора ==&lt;br /&gt;
&lt;br /&gt;
'''OnGivnVoice''' - выполняется после изменения статуса выдачи. Параметр &amp;lt;nowiki&amp;gt;%code%&amp;lt;/nowiki&amp;gt; содержит код выдачи, &amp;lt;nowiki&amp;gt;%State%&amp;lt;/nowiki&amp;gt; содержит код устанавливаемого статуса, &amp;lt;nowiki&amp;gt;%OldState%&amp;lt;/nowiki&amp;gt; - код старого статуса (0 если не было). Позволяет отключать стандартный звук ОК, если возвращает не 0.&lt;br /&gt;
&lt;br /&gt;
'''OnDashboardManifestVoice''' - выполняется после сканирования адреса в интерфейсе приёма манифестов. Параметр &amp;lt;nowiki&amp;gt;%code%&amp;lt;/nowiki&amp;gt; содержит код корреспонденции. Позволяет отключать стандартную диктовку программой (код курьера, вес и т.д.), если возвращает не 0.&lt;br /&gt;
&lt;br /&gt;
== Настройка мобильного приложения ==&lt;br /&gt;
&lt;br /&gt;
== Скрипты ==&lt;br /&gt;
'''OnEveryStartApp''' - выполняется при запуске программы.&lt;br /&gt;
&lt;br /&gt;
'''OnEveryCloseApp''' - выполняет при закрытии программы.&lt;br /&gt;
&lt;br /&gt;
'''OnBarScan''' - выполняется при получении ШК со сканера, в параметре %code% - получаем ШК. Если функция, что-то возвращает, то система будет использовать возвращенный ШК.&lt;br /&gt;
&lt;br /&gt;
'''OnMapBeforeGeolocation''' - Вызывается перед отображаем адреса на карте. В функцию передается объект fieldlist. &lt;br /&gt;
 Пример скрипта, переводящий адреса в НЕ найденные на карте, если станция метро НЕОПЕРЕДЕЛЕННАЯ.&lt;br /&gt;
 &amp;lt;NOWIKI&amp;gt;&amp;lt;?&amp;gt;&lt;br /&gt;
if(station=0, &lt;br /&gt;
  _set('lon', null);&lt;br /&gt;
  _set('lat', null);&lt;br /&gt;
  _set('searchCoordinate', 'F');&lt;br /&gt;
,0)&amp;lt;/NOWIKI&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''OnSyncInsert''' - Выполняется для каждой добавленной записи при синхронизации с ЛК. Содержит %tablename% - название синхронизируемой таблицы.&lt;br /&gt;
&lt;br /&gt;
'''OnSyncUpdate''' - Выполняется для каждой обновленной записи при синхронизации с ЛК. Содержит %tablename% - название синхронизируемой таблицы.&lt;br /&gt;
&lt;br /&gt;
 Если при получении новых адресов с ЛК, нужно поменять любое поле в таблице address, то необходимо использовать сразу два события OnSyncInsert и OnSyncUpdate. Адреса без вложений обрабатываются событием OnSyncInsert, адреса с вложениями будут обрабатываться событием OnSyncUpdate. Это связано с механизмом синхронизации, если в событии OnSyncInsert, проапдейтить поле в адресе с вложениями, то данные могут потеряться. &lt;br /&gt;
 Когда адрес без вложений, то у него сразу station = 65535 и можно апдейтить. Если с вложениями, то у него сначала station = 65534, а после синхронизации вложений есть отдельный апдейт на 65535. Пример кода, для апдейта поля в адресах, события OnSyncInsert и OnSyncUpdate:&lt;br /&gt;
 &amp;lt;NOWIKI&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
rem(ticket 23584, 23583); &lt;br /&gt;
if( ('%tablename%'='address'), &lt;br /&gt;
  query('UPDATE address a &lt;br /&gt;
    JOIN trace t ON t.address=a.code AND t.state=1 &lt;br /&gt;
    JOIN zakaz z ON z.code=a.zakaz&lt;br /&gt;
  SET &lt;br /&gt;
    a.mode = IF(z.source=646, 3, 2)&lt;br /&gt;
  WHERE &lt;br /&gt;
    a.code = %code%&lt;br /&gt;
    AND a.station=65535&lt;br /&gt;
    AND (&lt;br /&gt;
     (z.source=646 AND a.mode&amp;lt;&amp;gt;3) OR &lt;br /&gt;
     (A.DATE_PUTN=DATE(t.Statetime) AND a.mode=1) OR&lt;br /&gt;
     (A.DATE_PUTN=DATE_ADD(DATE(t.Statetime), INTERVAL 1 DAY) AND TIME(t.Statetime) &amp;gt; &amp;quot;21:59:59&amp;quot; AND a.mode=1)&lt;br /&gt;
    )')&lt;br /&gt;
, '');&amp;lt;/NOWIKI&amp;gt;&lt;br /&gt;
;&lt;br /&gt;
&lt;br /&gt;
'''OnCalcSalary''' - Событие происходит после начисления зарплаты курьеру.  %code% - код созданного начисления kurier_pays.code ; %dateto% - дата до которой рассчитали зарплату; И отдельно части зарплаты:  %profit%  -итоговая сумма; %Zarab% - сдельная часть; %Oklad% - оклад; %Friends% - выплаты за приведенных; %Other% - разное; %AgentMoney% - агентское вознаграждение;  %StandingMoney% - Доплата за стаж; %Bonus%, %Shtraf% - бонусы и штрафы.&lt;br /&gt;
&lt;br /&gt;
'''OnCalcAvans''' - Событие происходит после начисления аванса курьеру.  %code% - код созданного начисления kurier_pays.code. Можно произвести дополнительные начисления и удержания из kurier_pays.profit. &lt;br /&gt;
&lt;br /&gt;
'''OnTicketSetCusr''' - Пользовательский скрипт перед назначением ответственного в тикетах. %code% - код тикета; %Cusr% - код назначаемого пользователя (может быть равно NULL)&lt;br /&gt;
&lt;br /&gt;
'''OnCreateAddressForActDelivery''' - Пользовательский скрипт вызывающийся в момент формирования корреспонденции на доставку АПД/АПК. Позволяет существенно доработать формируемую корреспонденцию. %code% - код акта sendmoneyact.code, %Client%  - код клиента; %delivery% - флаг определяющий корр. на доставку акта (1, значение по умолчанию) или забор акта. fieldlist - объект с полями адреса (повторяет структуру таблицы address), dataset - объект дополнительными полями функции. Объект fieldlist является классом TMyFieldList и позволяет менять значения полей.  Также измененный адрес можно сохранить прямо в событии, или он будет сохранен автоматически после выполнения скрипта. Для сохранения адреса используйте метод _save. &lt;br /&gt;
&lt;br /&gt;
 Пример, для клиента с кодом 3360, в корреспонденцию на доставку АПК, добавляем список корреспонденций попавших в него во вложения.&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?&amp;gt;&lt;br /&gt;
 if((client=3360)*(ActType=2),&lt;br /&gt;
  rem('Ticket 70827, 2022-09-07 Anatoly and Sergey');&lt;br /&gt;
  set($addresscode, fieldlist._save);&lt;br /&gt;
  query('insert boxes (address, pos, name) &lt;br /&gt;
   select '+$addresscode+' AS address,  @q := @q + 1 AS pos,  &lt;br /&gt;
        CASE WHEN a.client_id &amp;lt;&amp;gt; '' THEN a.client_id WHEN a.strbarcode&amp;lt;&amp;gt;'' THEN a.strbarcode ELSE CONCAT(a.zakaz,&amp;quot;-&amp;quot;, a.number) END AS `name`&lt;br /&gt;
   FROM addressfld af&lt;br /&gt;
   JOIN address a ON a.code=af.`address` ,(SELECT @q := 0 ) p&lt;br /&gt;
   WHERE &lt;br /&gt;
    af.`AddrTransferCode` = %code% AND af.`ReceivedInTransfer` &amp;gt; 0');&lt;br /&gt;
 ,0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OnAfterPreassemblyScan''' - событие происходит после сканирования складского товара в корреспонденцию на вкладке «Склад». %code% - код корреспонденции, %ItemCode% - код товара, %ItemCnt% - количество отсканированного товара.&lt;br /&gt;
&lt;br /&gt;
'''OnGeocodeScript''' - скрипт подключения к геокодеру клиента. Используется при включенной переменной &amp;quot;Справочники&amp;quot; -&amp;gt; &amp;quot;Переменные&amp;quot; -&amp;gt; &amp;quot;Подключения&amp;quot; -&amp;gt; &amp;quot;Карты&amp;quot; -&amp;gt; &amp;quot;Геокодирование&amp;quot; -&amp;gt; &amp;quot;Протокол геокодирования: Клиентский (скрипт OnGeocodeScript)&amp;quot;. Имеет встроенные переменные:&lt;br /&gt;
*$address - адрес для геокодирования;&lt;br /&gt;
*$town - код города;&lt;br /&gt;
*$street и $home  - упрощенный адрес;&lt;br /&gt;
&lt;br /&gt;
Скрипт должен вернуть следующие переменные : &lt;br /&gt;
*$lon и $lat - координаты ;&lt;br /&gt;
*$goodaddress - нормализованный адрес (не обязательно);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;  &lt;br /&gt;
  set($response,  HTTPPOST('http://XXXXXXXX',&lt;br /&gt;
    '{&amp;quot;query&amp;quot;:'+ FormatTextJSON($address)+ '}', &lt;br /&gt;
    '','','','',&lt;br /&gt;
    'post', 'application/json', 10000));&lt;br /&gt;
  &lt;br /&gt;
  if($response!'',&lt;br /&gt;
    new('TJSON', 'json');&lt;br /&gt;
    set($e, try(&lt;br /&gt;
      json.SetText($response);&lt;br /&gt;
      json.OpenChild('geo_data');&lt;br /&gt;
      json.OpenChild('mid');&lt;br /&gt;
      set($lat, sqlfloat(json.ChildNodeValue('lat')));&lt;br /&gt;
      set($lon, sqlfloat(json.ChildNodeValue('lon')));&lt;br /&gt;
    ));&lt;br /&gt;
    if($e, error('Ошибка в разборе ответа: '+$e), '');&lt;br /&gt;
  , error('Пришел пустой ответ от геокодера')&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OnFilterAddressRecalc''' - Позволяет отфильтровать коды адресов, для которых можно пересчитать стоимость. Событие происходит перед расчетом стоимости доставки из интерфейса программы для: актов, счетов, заказов, и т.д. Не работает для пересчета запускаемого из самой карточки корреспонденции. &lt;br /&gt;
%codes% - коды адресов для пересчета стоимости доставки. Формат: (1,2,3,...). %RecalcUserCode% - код пользователя запустившего пересчет (актуально для отложенных пересчетов). &lt;br /&gt;
Функция должна вернуть коды адресов, допущенных к пересчету в формате: (1,2,3,...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
 rem('2023-12-04 Sergey.  Отключаем перерасчет стоимости доставки у корреспонденций в статусе - проверено,&lt;br /&gt;
  если у пользователя нет права Счета-изменять. Тикет 79954.&lt;br /&gt;
  Блокировка работает в связке с тикетом 77995.');&lt;br /&gt;
 new('TSelfADO', 'DB');&lt;br /&gt;
 DB.OPEN('SELECT a.code FROM courier.address a&lt;br /&gt;
  LEFT JOIN courier.users u ON u.code=%RecalcUserCode%&lt;br /&gt;
  LEFT JOIN courier.`userrules` ur ON ur.`GroupId`=u.grup AND ur.`RuleType`=1 AND  ur.newruleid =78  -- RSA&lt;br /&gt;
  WHERE ((a.state1&amp;lt;&amp;gt;8) OR (a.state1=8 AND ur.state=&amp;quot;T&amp;quot;)) AND a.code in %code%');&lt;br /&gt;
 DB.ParseForIn('CODE')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''OnRecalcBoldCntInFrame''' - срабатывает в карточке тарифа при перемещении курсора зоны. Возвращает целочисленное значение, равное количеству доставленных корреспонденций у клиента за предыдущий месяц. Срабатывает только при открытии карточки тарифа из карточки клиента. %ClientCode% - код клиента. %ZoneCode% - код зоны.&lt;br /&gt;
&lt;br /&gt;
'''ChangeStatusColor''' - подменяет цвет фона сообщения в строке статуса в форме приема корреспонденции. Возвращает целочисленное значение - новый цвет фона, 0 - если цвет менять не нужно. Входящие значения: %code% - входящее значение цвета. Остальные переменные - булевского типа - отражают состояние Настроек: %Renum% - Перенумеровывать, %IgnoreDblScan% - Игнорировать ошибки повторного сканирования, %PrintNakl% - Печатать накладные, %Given% - Выдавать отправления, %PrintFiles% - Печатать файлы, %BarLine% - Включить поддержку штрих-кодовой линейки, '%CreateTrans% - формировать кассовые чеки.&lt;br /&gt;
&lt;br /&gt;
'''GetLusrSQL''' - переопределяет столбец &amp;quot;Изменивший пользователь&amp;quot; в истории изменений. Должен возвращать часть SQL запроса для столбца lusr. Входящее значение %code% содержит код таблицы, для которой строится SQL-запрос истории.&lt;br /&gt;
&lt;br /&gt;
'''OnBeforeSendSMS''' - выполняется перед рассылкой шаблона СМС. Содержит в себе %MessageText% - текст сообщения отправляемого по шаблону, %Phone% - номер телефона. Если возвращает значение -1, отправка стандартными средствами не происходит.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''TariffCalculatorTotal''' - функция для настройки простой формы тарификатора. Работает в двух режимах: sql - запрос для построения грида. В режиме доступны теги: %ClientCode%' - код клиента, '%PriceCode%' - код прайса клиента. Столбцы SQL запроса строго фиксированы: code - код поля, fieldname - название поля, costparams - варианты цен через запятую (для отображения комбобокса), modlist - список названий для разных цен через запятую,  modvalue - выбраный элемент. Второй режим это формула расчета строки, в этом режиме доступен dataset со всеми ранее рассчитанными строками и теги  '%FieldCode%',    '%Cost%', '%Quantity%', '%ClientCode%', '%PriceCode%', '%DefaultTotal%'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
if('%code%'='sql',&lt;br /&gt;
   '(SELECT s.statecode AS code,                            -- код поля&lt;br /&gt;
      s.name AS fieldname,                                 -- название поля&lt;br /&gt;
      IFNULL(uf.varvalue, &amp;quot;&amp;quot;) AS costparams,               -- варианты цен через запятую (для отображения комбобокса) &lt;br /&gt;
      IFNULL(unquotedstr(getparam(s2.advansed, 3)), &amp;quot;&amp;quot;) AS modlist, -- список названий для разных цен через запятую  &lt;br /&gt;
      IFNULL(mods.`varValue`, '''') AS modvalue -- выбраный элемент &lt;br /&gt;
      FROM states s&lt;br /&gt;
      LEFT JOIN userfields uf ON uf.sourcetable=11 AND uf.sourcecode=%PriceCode% AND uf.varcode=s.statecode&lt;br /&gt;
      LEFT JOIN userfields AS mods ON mods.`sourceCode`=%ClientCode%&lt;br /&gt;
        AND mods.sourcetable=2 AND mods.varcode = CAST(uf.varcode AS SIGNED) - 20 AND mods.`varCode` IN (10,11) &lt;br /&gt;
      LEFT JOIN states s2 ON s2.statetype=35 AND s2.`StateCode`=mods.`varCode` &lt;br /&gt;
      WHERE s.statetype=45 &lt;br /&gt;
        AND IFNULL(s.hidden,&amp;quot;F&amp;quot;)=&amp;quot;F&amp;quot;&lt;br /&gt;
        AND getparam(s.advansed, 1) &amp;lt;&amp;gt; &amp;quot;0&amp;quot; &lt;br /&gt;
      ORDER BY s.statecode)&lt;br /&gt;
      union            (SELECT 1000,&amp;quot;ПОДДЕРЖКА&amp;quot;, &amp;quot;1,2,3&amp;quot;,  &amp;quot;Поддержка 1, Поддержка 2, Поддержка 3&amp;quot;,&amp;quot;&amp;quot; )        &lt;br /&gt;
      '&lt;br /&gt;
,&lt;br /&gt;
  if(%FieldCode%=1000,&lt;br /&gt;
 &lt;br /&gt;
    case(&lt;br /&gt;
      when(%Cost%=1, &lt;br /&gt;
        100&lt;br /&gt;
      );&lt;br /&gt;
      when(%Cost%=2,&lt;br /&gt;
        200 &lt;br /&gt;
      );&lt;br /&gt;
      when(%Cost%=3,&lt;br /&gt;
       300&lt;br /&gt;
      );&lt;br /&gt;
    )&lt;br /&gt;
  , &lt;br /&gt;
    %cost%*%Quantity%&lt;br /&gt;
  )      &lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15866</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15866"/>
				<updated>2026-03-17T16:23:41Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Подпись скрипта */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики [[Руководство_программиста|скриптов встроенного языка]].  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* Через меню '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик'''. &lt;br /&gt;
* Через меню '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''.&lt;br /&gt;
* Горячей клавишей '''Ctrl+Alt+D''' в главном окне приложения.&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Всегда есть возможность сохранить скрипт в файл.&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить в файл''' — Сохраняет текущий текст скрипта в файл. Если файл был сохранен ранее, по умолчанию предлагается предыдуший путь.&lt;br /&gt;
&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — Когда отладчик открыт без привязки к конкретному скрипту, то сохраняет изменения в файл. &lt;br /&gt;
 '''Важно!''' Если отладчик открыли например из '''Отчеты''' &amp;gt; '''Дополнительные возможности''' &amp;gt; '''Редактировать''' то сохранения через пункт '''Сохранить (Ctrl+S)''' сохранения '''всегда''' будет происходить в базу, в файл изменения сохранены не будут.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* [[Печатные формы|Скриптов из печатных форм]]&lt;br /&gt;
* [[Дополнительные_возможности|Скриптов из системных событий]]  &lt;br /&gt;
* [[Пользовательские_отчеты|Скриптов дополнительных возможностей]]&lt;br /&gt;
* [[Дополнительные услуги|Скриптов из дополнительных услуг]]&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
== Подпись скрипта ==&lt;br /&gt;
При одновременной работе нескольких программистов в отладчике возможны ложные перехваты. Чтобы сфокусировать работу отладчика только на определенном скрипте, подпишите его:&lt;br /&gt;
 AttachDebugger('ЛЮБОЙ ТЕКСТ'); &lt;br /&gt;
 &lt;br /&gt;
Отладка начнется, только если в редакторе кода строка AttachDebugger совпадает с перехваченным скриптом.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с подписью:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger('Sergey K. TestScript');&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+U''' || Двигать выбранный блок влево&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+I''' || Двигать выбранный блок вправо&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка работы с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15865</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15865"/>
				<updated>2026-03-17T16:18:02Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Подключение отладчика к работающим скриптам */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики [[Руководство_программиста|скриптов встроенного языка]].  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* Через меню '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик'''. &lt;br /&gt;
* Через меню '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''.&lt;br /&gt;
* Горячей клавишей '''Ctrl+Alt+D''' в главном окне приложения.&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Всегда есть возможность сохранить скрипт в файл.&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить в файл''' — Сохраняет текущий текст скрипта в файл. Если файл был сохранен ранее, по умолчанию предлагается предыдуший путь.&lt;br /&gt;
&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — Когда отладчик открыт без привязки к конкретному скрипту, то сохраняет изменения в файл. &lt;br /&gt;
 '''Важно!''' Если отладчик открыли например из '''Отчеты''' &amp;gt; '''Дополнительные возможности''' &amp;gt; '''Редактировать''' то сохранения через пункт '''Сохранить (Ctrl+S)''' сохранения '''всегда''' будет происходить в базу, в файл изменения сохранены не будут.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* [[Печатные формы|Скриптов из печатных форм]]&lt;br /&gt;
* [[Дополнительные_возможности|Скриптов из системных событий]]  &lt;br /&gt;
* [[Пользовательские_отчеты|Скриптов дополнительных возможностей]]&lt;br /&gt;
* [[Дополнительные услуги|Скриптов из дополнительных услуг]]&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
== Подпись скрипта ==&lt;br /&gt;
При одновременной работе нескольких программистов в отладчике возможны ложные перехваты. Чтобы избежать этого, подпишите скрипт:&lt;br /&gt;
 AttachDebugger('ЛЮБОЙ ТЕКСТ');  &lt;br /&gt;
Проверка подписи работает, только если скрипт открыт в отладчике. А строка AttachDebugger в нём совпадает с перехваченным скриптом.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с подписью:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger('Sergey K. Test script');&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+U''' || Двигать выбранный блок влево&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+I''' || Двигать выбранный блок вправо&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка работы с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15864</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15864"/>
				<updated>2026-03-17T16:16:22Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Подключение отладчика к работающим скриптам */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики [[Руководство_программиста|скриптов встроенного языка]].  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* Через меню '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик'''. &lt;br /&gt;
* Через меню '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''.&lt;br /&gt;
* Горячей клавишей '''Ctrl+Alt+D''' в главном окне приложения.&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Всегда есть возможность сохранить скрипт в файл.&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить в файл''' — Сохраняет текущий текст скрипта в файл. Если файл был сохранен ранее, по умолчанию предлагается предыдуший путь.&lt;br /&gt;
&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — Когда отладчик открыт без привязки к конкретному скрипту, то сохраняет изменения в файл. &lt;br /&gt;
 '''Важно!''' Если отладчик открыли например из '''Отчеты''' &amp;gt; '''Дополнительные возможности''' &amp;gt; '''Редактировать''' то сохранения через пункт '''Сохранить (Ctrl+S)''' сохранения '''всегда''' будет происходить в базу, в файл изменения сохранены не будут.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* [[Печатные формы|Скриптов из печатных форм]]&lt;br /&gt;
* [[Дополнительные_возможности|Скриптов из системных событий]]  &lt;br /&gt;
* [[Пользовательские_отчеты|Скриптов дополнительных возможностей]]&lt;br /&gt;
* [[Дополнительные услуги|Скриптов из дополнительных услуг]]&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
При одновременной работе нескольких программистов в отладчике возможны ложные перехваты. Чтобы избежать этого, подпишите скрипт:&lt;br /&gt;
 AttachDebugger('ЛЮБОЙ ТЕКСТ');  &lt;br /&gt;
Проверка подписи работает, только если скрипт открыт в отладчике. А строка AttachDebugger в нём совпадает с перехваченным скриптом.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+U''' || Двигать выбранный блок влево&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+I''' || Двигать выбранный блок вправо&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка работы с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D0%B1%D0%BE%D1%80%D1%83%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=15861</id>
		<title>Оборудование</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D0%B1%D0%BE%D1%80%D1%83%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=15861"/>
				<updated>2026-03-12T15:42:10Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Настройка весов Mettler Toledo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Аппаратные требования к рабочей станции ==&lt;br /&gt;
* Работа под управлением ОС Windows 32/64 Bit: Win7, Win8; Win10; Win11.&lt;br /&gt;
* Установленный и активированный пакет Microsoft Office 2007 или выше '''кроме «Office 2010 Starter»'''.&lt;br /&gt;
* Процессор: любой, удовлетворяющий рабочим требованиям линейки ОС Windows.&lt;br /&gt;
* Оперативное запоминающее устройство (ОЗУ): от 2 Gb и выше.&lt;br /&gt;
* Запоминающее устройство HDD или SSD: от 60 GB и выше.&lt;br /&gt;
* Сетевой интерфейс: проводной/беспроводной Ethernet интерфейс.&lt;br /&gt;
* Монитор: диагональ, обеспечивающая разрешающую способность экрана не менее 1024*768 пикселей.&lt;br /&gt;
* Периферийные порты ввода-вывода USB, RS232 (при необходимости наличия таковых): для подключения периферийного оборудования (сканер штрихкодов, &amp;lt;br&amp;gt;фискальный регистратор, термопринтер).&lt;br /&gt;
* Клавиатура, манипулятор мышь.&lt;br /&gt;
&lt;br /&gt;
== Выбор сервера для системы ==&lt;br /&gt;
&lt;br /&gt;
=== Выбор серверного оборудования ===&lt;br /&gt;
Система MeaSoft нетребовательна к аппаратным ресурсам сервера.&lt;br /&gt;
&lt;br /&gt;
Что касается '''производительности''', то для небольшой компании, человек 10 в офисе, как правило, производительности бытового ноутбука, установленного в качестве сервера, будет более, чем достаточно. То есть серверную часть можно установить на любую машину, за которой работает пользователь. Для компаний до 20 сотрудников мы рекомендуем использовать бытовой компьютер, но «назначенный» сервером, то есть чтобы он стоял отдельно работал круглосуточно, и им никто не пользовался в качестве рабочей станции. Для компаний более 20 человек — лучше использовать именно серверное оборудование, хотя у нас есть установка, где на бытовом Core i3 одновременно работает 80 человек.&lt;br /&gt;
&lt;br /&gt;
'''Объем диска''': Изначально при установке БД занимает около 1 Gb. Далее она увеличивается в зависимости от использования. Если компания доставляет 20000 отправлений в месяц, через 3 года объем базы будет 10 Gb с одной оговоркой: Больше всего места в БД занимают файлы, такие, как архив отсканированных накладных, отправленные по почте отчеты и счета, и т. д. Здесь, если компания использует эти возможности, она за год может накопить и 100 и 200 Gb. Так же необходимо учитывать некоторый объем свободного места, необходимый для создания резервных копий, а так же для работы самой ОС.&lt;br /&gt;
&lt;br /&gt;
Самое главное требование системы к серверу — это его '''надежность'''. Надо понимать, что при поломке сервера приостановится работа всей компании. В худшем случае — можно потерять данные, введенные с момента последней резервной копии. Для сокращения возможных рисков, нужно стараться, по возможности, делать сервер максимально надежным:&lt;br /&gt;
&lt;br /&gt;
* Мы не рекомендуем устанавливать сервер на ноутбук, так как его форм-фактор предполагает некоторую степень мобильности. Есть соблазн взять его куда-то с собой. А при перемещении велик риск его потери, кражи, его можно уронить и разбить. Еще один фактор низкой надежности ноутбуков — они часто умирают от пролитого на них чая/кофе/пива.&lt;br /&gt;
* Мы не рекомендуем устанавливать серверную часть на компьютер, за которым работает пользователь. Здесь главный фактор риска — это заражение компьютера вирусами, которые пользователь, по неграмотности, скачивает из интернета, приносит на флешках и т. д. Антивирус никакой от этого не спасает.&lt;br /&gt;
* Мы рекомендуем устанавливать на серверный компьютер [https://ru.wikipedia.org/wiki/RAID Raid-1] массивы для снижения вероятности выхода из строя/потери данных в случае поломки жесткого диска. Однако нужно понимать, что это тоже не панацея: жесткие диски достаточно часто выходят из строя все одновременно, например, при поломке блока питания, когда напряжение «пробивает» через него и приводит к выгоранию всех компонентов компьютера, В случае стихийных бедствий и несчастных случаев (прорывы в трубах, например), или просто от того, что 2 HDD одной модели, купленные одновременно имеют одинаковый ресурс наработки на отказ.&lt;br /&gt;
* Мы рекомендуем устанавливать [https://ru.wikipedia.org/wiki/Источник_бесперебойного_питания ИБП] на сервер для предохранения его от скачков напряжения в сети и/или аварийного завершения работы при отключении питания.&lt;br /&gt;
* Мы рекомендуем использовать специализированное серверное оборудование, так как оно по определению гораздо надежнее, вплоть до резервирования блоков питания. Но такое оборудование достаточно дорогое, и его использование носит исключительно рекомендательный характер.&lt;br /&gt;
&lt;br /&gt;
Некоторые наши клиенты не удовлетворяются вышеизложенными рекомендациями по выбору серверного оборудования и просят нас предоставить формальные требования к серверу. Вот они:&lt;br /&gt;
&lt;br /&gt;
1.	Работа под управлением ОС Windows 2012 Server R2;&amp;lt;br&amp;gt;&lt;br /&gt;
2.	Процессор: многоядерный, удовлетворяющий требованиям ОС;&amp;lt;br&amp;gt;&lt;br /&gt;
3.	Оперативное запоминающее устройство (ОЗУ): от 4 GB;&amp;lt;br&amp;gt;&lt;br /&gt;
4.	Запоминающее устройство HDD: от 360 Gb, Raid-1;&amp;lt;br&amp;gt;&lt;br /&gt;
5.	Сетевой интерфейс: проводной Ethernet интерфейс — 100 Mbit.;&amp;lt;br&amp;gt;&lt;br /&gt;
6.	Монитор, с разрешением минимум 1024*768;&amp;lt;br&amp;gt;&lt;br /&gt;
7.	Клавиатура microsoft минимум 103 клавиши;&amp;lt;br&amp;gt;&lt;br /&gt;
8.	Мышь оптическая;&amp;lt;br&amp;gt;&lt;br /&gt;
9.	Колонки активные минимум 2 Вт;&amp;lt;br&amp;gt;&lt;br /&gt;
10.	Коврик для мыши силиконовый :-)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Выбор серверной операционной системы ===&lt;br /&gt;
Серверная часть MeaSoft работает практически на любой операционной системе. Исключение — модуль интеграции с внешними системами.&lt;br /&gt;
&lt;br /&gt;
При выборе ОС нужно рассмотреть все плюсы и минусы. Обычно выбор стоит между Windows и Linux.&lt;br /&gt;
&lt;br /&gt;
Windows — платная система. Серверная Windows стоит 40-45 т.р. Система прекрасно работает, например, на Windows 7 (желательно только не домашнюю версию), которая стоит в разы меньше. Ограничение на количество подключений к ней не имеет отношения к нашей системе.&lt;br /&gt;
&lt;br /&gt;
Linux — «бесплатная» система. Почему в кавычках? Потому что стоимость владения им гораздо выше: для администрирования системы linux необходим системный администратор с глубокими познаниями этой ОС, а такие специалисты стоят в 2 раза дороже, чем администраторы Windows.&lt;br /&gt;
&lt;br /&gt;
Таким образом даже «дорогая» серверная Windows окупается за пару месяцев. Linux можно выбирать только в том случае, если в вашей компании и так уже работает несколько системных администраторов Linux, которые смогут решать возможные проблемы с ней. Наша компания оказывает необходимую для работы системы помощь в администрировании windows-серверов, но с linux эта функция полностью ложится на заказчика. Почему мы говорим, что должно быть несколько администраторов в случае с Linux? Потому что в случае увольнения единственного администратора, как правило, компанию ждут времена несчастий, пока не найдется новый ТОЛКОВЫЙ системный администратор.&lt;br /&gt;
&lt;br /&gt;
Резюме: Выбирайте Linux только в том случае, если вы точно уверены в том, что делаете. В противном случае — только Windows.&lt;br /&gt;
&lt;br /&gt;
=== Размещение сервера ===&lt;br /&gt;
Для классической архитектуры системы, когда офис-склад консолидированы в одном месте, мы рекомендуем размещение сервера в офисе. То есть в точке максимального использования системы. Это обеспечивает максимальную скорость и надежность. При этом при необходимости удаленного доступа к системе — достаточно, имея внешний статичный IP-адрес, «пробросить» порт 3306 на сервер.&lt;br /&gt;
&lt;br /&gt;
В последнее время все больше популярность приобретает размещение сервера «в облаке». На самом деле формально — это, конечно, не [https://ru.wikipedia.org/wiki/Облачное_хранилище_данных облако] в широком понимании, а [https://ru.wikipedia.org/wiki/VPS сервер], физический или виртуальный, находящийся в дата-центре. При выборе такого варианта установки программы следует учесть ряд факторов:&lt;br /&gt;
* '''Скорость доступа''' Наша система очень чувствительна к скорости доступа. Некоторые операции могут вызывать несколько обращений к серверу, и увеличение времени одного обращения на несколько миллисекунд существенно снижает общую производительность системы на рабочем месте. При размещении сервера в дата-центрах Европы, например, скорость доступа ([https://ru.wikipedia.org/wiki/Ping ping]) из Москвы составляет 50-60 мс. Это — на грани возможности использования программы. При размещении в дата-центре того же города, где находятся пользователи, время доступа — порядка 3-5 мс. Для сравнения — доступ по локальной сети — менее 1 мс.&lt;br /&gt;
* '''Надежность интернет-канала''' Нужно понимать, что в случае размещения сервера в интернете система не будет работать у вас в офисе и/или на складе в случае отсутствия доступа в интернет. Желательно обеспечить резервирование канала, причем, желательно, не 3G-«свистком» (см. следующие 2 пункта).&lt;br /&gt;
* '''Пропускная способность интернет-канала''' При разработке системы мы стараемся минимизировать объемы информации, передаваемые между рабочим местом и сервером. Но если доступ происходит через интернет, на одном канале работает несколько человек, на котором работает и программа и телефоны, а кто-то смотрит видео в ютубе, а кто-нибудь еще придумает пользоваться торрентами — работа остановится.&lt;br /&gt;
* '''Стабильность интернет-канала''' При доступе к серверу не должны теряться пакеты. Если на канале происходят потери — программа будет закрываться с сообщением о том, что произошла потеря соединения с сервером. Потери пакетов можно проанализировать командой ping -t &amp;lt;имя_сервера, например ya.ru&amp;gt;.&lt;br /&gt;
* '''Надежность дата-центра''' Теоретически — в дата-центре обеспечивается резервирование и электропитания, и каналов передачи данных. Естественно, в них стоят и промышленные климатические системы, поддерживающие заданную рабочую температуру всего оборудования. Но на практике часто бывает, что сервер оказывается недоступным на время от нескольких минут до нескольких дней. Техподдержка (если ее телефон вообще отвечает, а часто как раз в эти моменты она не работает — либо потому, что телефония работает на том же канале, который у них и «упал», либо потому, что тысячи пользователей серверов, обнаружив неполадки, начали им одновременно звонить) скажет «да, в вашем сегменте технические неполадки, мы устраняем», и больше сделать вы ничего не сможете. В случае, если сервер стоит у вас в офисе — вы сами принимаете моментальные меры. Вплоть до того, что можно вынуть из сгоревшего сервера жесткий диск, подключить к другому компьютеру, и восстановить работу системы.&lt;br /&gt;
* '''Стоимость''' При размещении на linux-VDS серверах стоимость на текущий момент — [http://firstvds.ru/products/vds_vps_hosting 600-900 руб/мес], Windows — [https://masterhost.ru/service/hosting/vps/ 4000 руб/мес]. По поводу выбора ОС читайте соответствующий раздел этой же статьи.&lt;br /&gt;
&lt;br /&gt;
Отсюда вывод:&lt;br /&gt;
Мы рекомендуем устанавливать сервер «в облаке» только в случае сильно распределенной структуры компании. Когда максимальную скорость и надежность нужно обеспечить множеству удаленных пользователей, а не в одном конкретном месте.&lt;br /&gt;
&lt;br /&gt;
== Доступ для установки системы ==&lt;br /&gt;
&lt;br /&gt;
Для установки системы программисту MeaSoft требуется доступ к вашему серверу с правами администратора. В процессе установки потребуется устанавливать службы, запускать и останавливать их, а также производить запуск приложений от имени администратора.  Доступ можно предоставить одним из способов:&lt;br /&gt;
* по [https://remontka.pro/microsoft-remote-desktop/ RDP] — передайте нам IP-адрес сервера, порт (если он отличается от стандартного), логин и пароль для подключения;&lt;br /&gt;
* через [https://www.teamviewer.com/ru/info/remote-desktop/ TeamViewer] — установите и запустите программу на сервере и передайте нам ID и пароль подключения.&lt;br /&gt;
&lt;br /&gt;
== Рекомендованное периферийное оборудование ==&lt;br /&gt;
&lt;br /&gt;
=== Сканер штрихкодов ===&lt;br /&gt;
Рекомендуются к приобретению сканеры, официально ввезенные в вашу страну, адаптированные для местного рынка, имеющие здесь официальных поставщиков.&lt;br /&gt;
&lt;br /&gt;
Мы рекомендуем:&lt;br /&gt;
* Zebex Z-3000 (CCD-сканер) — дешевый;&lt;br /&gt;
* Honeywell (Metrologic) 5145 Eclipse — лазерный;&lt;br /&gt;
* Honeywell (Metrologic) DS6707 — image, позволяет сканировать 2D-штрихкоды;&lt;br /&gt;
* Honeywell (Metrologic) 1202g Voyager BT — радиосканер, позволяет сканировать на расстоянии от компьютера.&lt;br /&gt;
&lt;br /&gt;
Рекомендуются к приобретению сканеры с типом подключения USB HID.&lt;br /&gt;
&lt;br /&gt;
Вы можете скачать наше бесплатное мобильное приложение [[Кладовщик — мобильное приложение для Android|Кладовщик]], которое работает как сканер штрихкодов.&lt;br /&gt;
&lt;br /&gt;
Если вы определились с моделью сканера, то тип подключения не играет существенной роли: наша программа позволяет работать с любой из списка поддерживаемых моделей (проводной или беспроводной). Выбор интерфейса, скорее всего, зависит от наличия и доступности соответствующего порта на компьютере пользователя (так, интерфейс RS-232 предполагает наличие COM-порта, а интерфейс KBW, как правило, PS/2). Очевидным является тот факт, что наиболее универсальным будет сканер, работающий через интерфейс USB (USB HID).&lt;br /&gt;
&lt;br /&gt;
Проводной или беспроводной сканер имеет такое же примерно значение, как проводная или беспроводная мышь: если вам нужно работать удаленно от управляющего устройства (компьютера), то для этого стоит выбирать беспроводную модель. Все беспроводные модели сканеров (обычно работающие через технологию Bluetooth) имеют аккумуляторные батареи и зарядные устройства, которые часто выполнены в виде базовой станции (приемно-передающего устройства) с функцией зарядки переносной части сканера.&lt;br /&gt;
&lt;br /&gt;
При выборе сканера обратите внимание на то, что при типе подключения USB HID (рекомендуется) или «разрыв клавиатуры» сканер требует некоторой настройки. [[#Подключение и настройка сканеров штрихкодов|В разделе ниже]] приведены программирующие листы для различных моделей сканеров. Если вы покупаете сканер не из списка, для которого есть программирующий лист, будьте готовы к тому, что потребуется создание такого листа. Для его создания нужно полное руководство по программированию конкретного сканера на русском или английском языках. С этим часто бывают проблемы, если вы покупаете сканеры с доставкой из Китая — они, как правило, настолько китайские, что у них нет ни документации, ни сайта производителя. В таком случае остается уповать только на везение.&lt;br /&gt;
&lt;br /&gt;
=== Термопринтер ===&lt;br /&gt;
Поддерживаются любые термо- и термо-трансферные принтеры.&amp;lt;br&amp;gt;&lt;br /&gt;
Рекомендуется термопринтер Zebra ZD410 — у него ширина печатающей головки 60 мм, поэтому ленту такой же ширины сложно вставить неправильно. Очень прост в обслуживании и заправке ленты. &amp;lt;br&amp;gt;&lt;br /&gt;
'''ВНИМАНИЕ!''' При покупке следует учитывать, что термопринтеры не комплектуются USB-шнуром и этикетками, поэтому их необходимо приобрести отдельно. Рекомендуем этикетки размером 58×40 мм.&lt;br /&gt;
&lt;br /&gt;
=== Весы ===&lt;br /&gt;
Поддерживаемые весы:&lt;br /&gt;
* [[#Настройка весов МЕРА|МЕРА]] — подходят модели, которые поддерживают протоколы «ОКА», «9 байт» или «Mera Avto». По нашим сведениям, протоколы ОКА и Mera Avto поддерживают весы, у которых есть цифровая клавиатура 0-9. Но лучше уточняйте у продавца. Протокол «9 байт» в силу своей низкоуровневой работы с COM-портом может не работать через USB-переходники. Рекомендуем весы Мера ВП-3/30 — небольшие, точные, недорогие.&amp;lt;br&amp;gt;&lt;br /&gt;
* [[#Настройка весов НЕВА|Нева]]&lt;br /&gt;
* ExpressCube&lt;br /&gt;
* Масса-К&lt;br /&gt;
* InSize&lt;br /&gt;
* Мастер-Кит&lt;br /&gt;
* CAS HD 57583&lt;br /&gt;
* UIS Metrix&lt;br /&gt;
&lt;br /&gt;
При покупке весов обратите внимание на то, что они могут подключаться к COM-порту, который отсутствует на многих компьютерах. Для весов существуют провода в USB-порт, эмулирующие COM-порт. В продаже есть переходники и платы расширения компьютеров, позволяющие добавить COM-порты.&lt;br /&gt;
&lt;br /&gt;
Инструкцию по настройке и подключению весов смотрите в этой статье [[#Настройка весов|ниже]].&lt;br /&gt;
&lt;br /&gt;
=== Фискальный регистратор ===&lt;br /&gt;
В рамках 54-ФЗ поддерживается и рекомендуется работа с сервисом удаленной фискализации LIFE PAY.&lt;br /&gt;
&lt;br /&gt;
Поддерживаются все фискальные регистраторы фирмы «Штрих-М»&lt;br /&gt;
&lt;br /&gt;
Рекомендуется ШТРИХ-LIGHT-ФР-К (cамый бюджетный)&lt;br /&gt;
&lt;br /&gt;
При покупке ФР обратите внимание на то, что они могут подключаться к COM-порту, который отсутствует на многих компьютерах. Для них существуют провода в USB-порт, эмулирующие COM-порт. Также в продаже имеются переходники и платы расширения компьютеров, позволяющие добавить COM-порты.&lt;br /&gt;
&lt;br /&gt;
=== Банковский POS-терминал ===&lt;br /&gt;
[https://ru.wikipedia.org/wiki/POS-%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B0%D0%BB POS-терминал].&lt;br /&gt;
Мобильное приложение поддерживает интеграцию с сервисами IBox, LIFE PAY, а также поддерживается работа с независимыми POS-терминалами.&lt;br /&gt;
&lt;br /&gt;
=== Планшетный сканер ===&lt;br /&gt;
Применяется для сканирования ведомостей с подписью, после чего полученные документы вы можете прикрепить в программе к соответствующей корреспонденции.&amp;lt;br&amp;gt;&lt;br /&gt;
Рекомендуются сканеры с автоматической подачей.&amp;lt;br&amp;gt;&lt;br /&gt;
При выборе устройства обратите внимание на следующие характеристики:&lt;br /&gt;
* Скорость сканирования;&lt;br /&gt;
* Наличие функции обнаружения подачи двух листов;&lt;br /&gt;
* Двухстороннее сканирование;&lt;br /&gt;
* Количество сканирований до отказа.&lt;br /&gt;
&lt;br /&gt;
=== Монитор ноутбука/нетбука/компьютера ===&lt;br /&gt;
Рабочее место пользователя для работы с MeaSoft должно оснащаться монитором с разрешающей способностью экрана не менее 1024*768 пикселей. При работе на портативных устройствах, таких как нетбуки, у которых разрешение ниже рекомендуемого, в экран могут не помещаться некоторые окна.&lt;br /&gt;
&lt;br /&gt;
=== Штрихкодовая линейка-угол ===&lt;br /&gt;
Штрихкодовая линейка-угол применяется для обмера габаритов отправления. Обмер можно производить при приеме корреспонденции на склад (F10 на вкладке «Заказы»). Каждое деление (1, 5 или 10 миллиметров) линейки промаркировано своим штрихкодом. Прикладывая товар к линейке и сканируя штрихкод, соответствующий краю товара, получаем размеры. Чтобы включить поддержку штрихкодированной линейки, нужно в окне приема, нажать кнопку «Настройки» и установить галку «Включить поддержку штрихкодированной линейки». Для работы с линейкой удобнее использовать лазерные сканеры, у них полоса считывания наводится точно на нужный штрихкод. Реализована поддержка производителя [http://cortes.ru/shtrihcode/barcodeline.php Кортес]. Перед покупкой нужно проверять модель на совместимость с системой. Система поддерживает следующий формат ШК:&amp;lt;br&amp;gt;&lt;br /&gt;
Длина ШК 7 символов, начинается всегда на «29», например: 291XXXX, 292XXXX, 293XXXX&amp;lt;br&amp;gt;&lt;br /&gt;
где: XXXX — значение в милиметрах, 3-й знак — направление измерения от 1 до 3, то есть координата (длина, ширина, высота).&lt;br /&gt;
&lt;br /&gt;
=== Терминал сбора данных ===&lt;br /&gt;
Терминал сбора данных (ТСД) под управлением Android может работать совместно с MeaSoft как сканер штрихкодов или ТСД. Для этого установите на ТСД наше приложение [[Мобильное приложение кладовщика для Android|Кладовщик]] и выберите нужный режим работы.&lt;br /&gt;
&lt;br /&gt;
== Подключение и настройка сканеров штрихкодов ==&lt;br /&gt;
MeaSoft поддерживает все виды [http://ru.wikipedia.org/wiki/Сканер_штрихкода сканеров штрихкодов], поэтому при выборе сканера следует учитывать особенности штрихкодов, которыми заказчики маркируют корреспонденцию. В частности, контактные светодиодные сканеры можно использовать для считывания штрихкодов длиной не более 5-7 см (в зависимости от модели сканера), а для двухмерных штрихкодов необходим image-сканер.&lt;br /&gt;
&lt;br /&gt;
При подключении в разрыв клавиатуры или в порт USB в режиме эмуляции разрыва клавиатуры требуется небольшая дополнительная настройка сканера. Для этого существуют специальные программирующие листы (см. ниже) для разных моделей сканеров, на которых напечатаны штрихкоды в определенной последовательности. Просканируйте их в том порядке, в котором они расположены на листе. Как правило, для сканеров одной фирмы подходят одни и те же штрихкоды.&lt;br /&gt;
В результате этих действий при каждом сканировании перед штрихкодом вставляется определенный префикс, наличие которого для программы является признаком того, что данная последовательность символов введена с помощью сканера. Для использования в качестве префикса в программе зарезервирована клавиша с буквой «ё», что накладывает некоторое ограничение: невозможно ввести с клавиатуры символы «ё», «Ё», «`», «~».&lt;br /&gt;
&lt;br /&gt;
В данном разделе приведены программирующие листы для популярных моделей сканеров штрихкодов. Если в этом списке не оказалось модели вашего сканера, попробуйте использовать лист от другой модели того же производителя. Сообщите, пожалуйста, нам, мы внесем изменения в список моделей, для которых подходит этот лист. Если никакой лист не подошел — сообщите, пожалуйста, об этом нам, мы подготовим лист для вашего сканера.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 60%&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot;|Бренд&lt;br /&gt;
!style=&amp;quot;width: 70%;&amp;quot;|Модель&lt;br /&gt;
|-&lt;br /&gt;
|Argox&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Argox.doc ArgoScan 8000/8110/8120/8150/8250/8310/8312, argox as-8020cl (usb))]&lt;br /&gt;
|-&lt;br /&gt;
|Champtek&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Champtek.doc Champtek]&lt;br /&gt;
|-&lt;br /&gt;
|Cino&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Cino.doc F680BT]&lt;br /&gt;
|-&lt;br /&gt;
|Cipherlab&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Cipherlab_1021_(simple).doc 1021 (simple)]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Cipherlab_1021_(simple)_and_back.doc 1021 с переключением обратно]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Cipherlab_1560,_1562,_1070_(bluetooth).doc 1560, 1562, 1070 (bluetooth)]&lt;br /&gt;
|-&lt;br /&gt;
|Metrologic/Eclipse/Honeywell/Motorola/Symbol/Youjie&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Honeywell_Xenon_1900.doc Xenon 1900, Voyager 1202g, YJ4600]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Metrologic,_Eclipse,_Honeywell,_ms9520,_ms9540.doc MS5145, MS9520, MS9540, HH440]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Symbol_ls1203,_LS2208.doc LS1203, LS2208] (подходит для li4278, Zebra DS2278)&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Symbol_ds6707.doc DS6707]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/honeywell_1452g.docx Honeywell Voyager 1452G]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/honeywell_1472g.docx Honeywell 1472g]&lt;br /&gt;
|-&lt;br /&gt;
|PayTor&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Paytor%20DS%201009.docx DS 1009]&lt;br /&gt;
|-&lt;br /&gt;
|Proton&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Proton.doc Proton]&lt;br /&gt;
[https://www.courierexe.ru/download/scaner/Proton_2.doc IMS3190, беспроводной)]&lt;br /&gt;
|-&lt;br /&gt;
|Datalogic&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/PSC,_Datalogic_QS2500.doc PSC, Datalogic QS2500]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/qd2100.doc QD2100]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.courierexe.ru/download/scaner/datalogic800i.docx Magellan 800i]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.courierexe.ru/download/scaner/QuickScanMobile.doc Mobile: QM2100, M2]&lt;br /&gt;
|-&lt;br /&gt;
|Scanport&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Scanport_T600.bmp T600]&lt;br /&gt;
|-&lt;br /&gt;
|Zebex&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Zebex_4.bmp Zebex]&lt;br /&gt;
|-&lt;br /&gt;
|Godex&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/godex.doc GS550U]&lt;br /&gt;
|-&lt;br /&gt;
|Mercury&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/mercury.doc CL-200]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Mercury_1100PL.docx 1100PL]&lt;br /&gt;
|-&lt;br /&gt;
|Если у вас китайский безымянный (беспроводной?) сканер, попробуйте этот лист&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Vioteh.doc Vioteh VT2208R, Dudian CT980N, bp8150s, Heroje B120G]&lt;br /&gt;
|-&lt;br /&gt;
|Vioteh&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/VT2205_VT2209.docx VT2205 VT2209]&lt;br /&gt;
|-&lt;br /&gt;
|Heroje&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Heroje_H018.doc H018]&lt;br /&gt;
|-&lt;br /&gt;
|Производитель Китай под российским брендом АТОЛ.&amp;lt;br&amp;gt;&lt;br /&gt;
Cканер не рекомендуется к покупке. Атол выпускает несколько разных версий сканера под одной моделью SB1101. К сожалению, не все модели поддаются настройке.&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Atol_SB_1101.docx SB 1101]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Atol_SB_1103.docx 1103]&lt;br /&gt;
|-&lt;br /&gt;
|Radall&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Radall_RD-h8_2d.docx RD-h8 2d]&lt;br /&gt;
|-&lt;br /&gt;
|NETUM&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/NETUM_W6.docx W6, C750]&lt;br /&gt;
|-&lt;br /&gt;
|DBS&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/DBS_HC-3208SR.docx HC-3208SR (Подходите также к МSC-3208 WEC2D V.2)]&lt;br /&gt;
|-&lt;br /&gt;
|Winson&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Winson_WNL_WNC_6003_6083.docx WNL/WNC 6003, 6083, 5083]&lt;br /&gt;
|-&lt;br /&gt;
|Global-pos&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/GP-9400B.docx Global-pos GP-9400B]&lt;br /&gt;
|-&lt;br /&gt;
|Mertech&lt;br /&gt;
|[https://courierexe.ru/download/scaner/Mertech_cl-2300.docx CL-2300]&lt;br /&gt;
|-&lt;br /&gt;
|Space&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Space_x-2020rc.docx]&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth-кольцо&lt;br /&gt;
|[https://courierexe.ru/download/scaner/GP-1901B.docx GP-1901B]&lt;br /&gt;
|-&lt;br /&gt;
|Mindeo&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/mindeo_md6600.docx MD6600]&lt;br /&gt;
[https://www.courierexe.ru/download/scaner/Mindeo_cs2290_hd_bt.docx CS2290HD(BT)]&lt;br /&gt;
|-&lt;br /&gt;
|Holyhah a30d, Hstem a30d&lt;br /&gt;
|[https://courierexe.ru/download/scaner/holyhah_a30d_hstem_a30d.docx a30d]&lt;br /&gt;
|-&lt;br /&gt;
|Urovo R70 (71) сканер-кольцо &lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/R70-71.docx R70(71)]&lt;br /&gt;
|-&lt;br /&gt;
|DATAMAX A-7710 B&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/DATAMAX_A-7710_B_2.docx A-7710 B] (если штрих-коды с листа плохо читаются, отсканируйте их же с приложенной к сканеру инструкции)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;!-- [https://www.courierexe.ru/download/scaner/Honeywell_hh400.docx Honeywell hh400] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечание'''. Для некоторых беспроводных моделей сканеров штрихкодов перед началом работы требуется обязательно выполнить привязку базовой станции сканера с переносным мобильным считывателем — отсканировать наклейку штрихкода на базовой станции переносной частью сканера. В частности, этот алгоритм касается сканеров фирмы Zebex.&lt;br /&gt;
&lt;br /&gt;
'''Примечание 2'''. В некоторых моделях сканеров, особенно это касается DATAMAX, по умолчанию устанавливается неверная кодировка символов. Даже если вы правильно настроите сканер (установите префикс в виде знака тильды), при сканировании, на выходе такой сканер может отдавать совсем другой префикс (например, вместо ~ или Ё, будет /). Чтобы решить эту проблему, измените в настройках сканера местоположение или язык на English (или любой другой, где доступно ASC2 code keyboard input) путем считывания специального управляющего кода из инструкции к сканеру.&lt;br /&gt;
&lt;br /&gt;
Cписок '''неподдерживаемого системой оборудования''':&lt;br /&gt;
* CT10 Barcode Scanner (Производитель CILICO Electronics Co., Ltd Китай);&lt;br /&gt;
* Аlanda 2.4G Barcode Scanner (производитель Китай).&lt;br /&gt;
* Birch bd — 388 iiib (производитель Китай);&lt;br /&gt;
&lt;br /&gt;
Это оборудование не позволяет установить требуемый префикс для работы с MeaSoft. Список далеко не полный.&lt;br /&gt;
&lt;br /&gt;
'''Мы рекомендуем покупать сканеры, официально ввезенные в Россию, адаптированные для российского рынка, имеющие здесь официальных поставщиков.'''&lt;br /&gt;
&lt;br /&gt;
При выборе сканера обратите внимание на то, что при типе подключения USB HID (этот режим рекомендуется) или «разрыв клавиатуры» сканер требует некоторой настройки. В разделе описания выше приведены программирующие листы для различных моделей сканеров. Если вы покупаете сканер не из списка, для которого уже есть программирующий лист, будьте готовы к тому, что потребуется создание такого листа. Для его создания нужно полное руководство по программированию конкретного сканера на русском или английском языках. С наличием инструкции очень часто возникают проблемы, если вы покупаете сканеры с доставкой из Китая — они, как правило, настолько не адаптированы к работе, что у них нет ни документации, ни сайта производителя. В таком случае остается уповать только на везение.&lt;br /&gt;
&lt;br /&gt;
Если ваш новый сканер не поддерживается нашей системой, можно попытаться выяснить, может ли он работать в режиме эмуляции COM-порта. Наличие возможности работы в таком режиме — последний шанс использовать купленное оборудование:&lt;br /&gt;
# Переведите сканер в режим USB virtual COM по инструкции.&lt;br /&gt;
# Установите бесплатные драйверы COM-порта Nuvoton.&lt;br /&gt;
# В MeaSoft программе выберите '''Настройка''' &amp;gt; '''Параметры''' &amp;gt; '''Оборудование''' &amp;gt; '''Использовать COM-сканер''', укажите номер виртуального COM-порта, созданного драйвером (см. в диспетчере устройств Windows).&lt;br /&gt;
Обратите внимание, что при переключении сканера в другой USB-порт может меняться номер COM-порта, и настройку программы нужно делать заново.&lt;br /&gt;
&lt;br /&gt;
===Возможные проблемы при работе сканеров с маркировкой Честный Знак===&lt;br /&gt;
&lt;br /&gt;
В некоторых сканерах по умолчанию может быть включена настройка, которая пытается компенсировать работу CapsLock, если тот включен, чтобы, например, в блокнот всегда печатался одинаковый код. Наша программа не учитывает CapsLock при сканировании и берет только те значения, которые передает сканер. Поэтому, при нажатом CapsLock может предаваться код маркировки с измененными регистрами букв, что затем будет мешать в работе с маркировкой. Чтобы этого избежать, нужно отключить опцию, компенсирующую работу CapsLock. Например, для сканера Sunlux XL-3200 данная настройка называется '''Caps Lock Off''': [[Файл:CapsOnScanner.png|none|700px]]&lt;br /&gt;
&lt;br /&gt;
== Настройка весов ==&lt;br /&gt;
&lt;br /&gt;
=== Общие сведения ===&lt;br /&gt;
MeaSoft поддерживает работу с различными видами весов. Весы могут подключаться через сетевой порт, COM- или USB-порт. &lt;br /&gt;
&lt;br /&gt;
При подключении через USB установите на компьютер драйвер USB-COM конвертера. Драйвер поставляется производителем весов либо переходника, через который вы подключаете весы. После установки драйвера в «Диспетчере устройств» вашего компьютера должен появиться новый COM-порт, через который и будет осуществляться дальнейшее взаимодействие с весами. Обратите внимание: при подключении USB-шнура к другому USB-разъему компьютера может измениться номер COM-порта, который привязан к шнуру. В этом случае укажите в программе новый номер порта.&lt;br /&gt;
&lt;br /&gt;
Чтобы начать использовать весы, подключите их к компьютеру, затем в пункте основного меню '''Настройка &amp;gt; '''Параметры''' &amp;gt; '''[[Настройка параметров рабочего места#Оборудование|Оборудование]]''' установите флажок '''Использовать весы''', выберите тип весов и укажите порт.&lt;br /&gt;
&lt;br /&gt;
После успешного подключения весов откройте карточку корреспонденции (или окно «Прием» в заказах). Возле поля '''Масса''' появится кнопка весов. Чтобы программа показывала вес с весов, эта кнопка должна быть нажата.&lt;br /&gt;
&lt;br /&gt;
Особенности настройки различных моделей весов приведены ниже.&lt;br /&gt;
&lt;br /&gt;
=== Настройка весов МЕРА ===&lt;br /&gt;
Для связи с весами мера система использует протоколы «9байт», «ОКА» и «MERA-AUTO» и «Сетевые».&lt;br /&gt;
&lt;br /&gt;
Какой выбрать:&lt;br /&gt;
* 9байт — установлен в весах по умолчанию. Он позволяет передавать нестабильный вес, что хорошо влияет на скорость работы оператора. Однако это протокол использует низкоуровневую работу с COM-портом, что может не поддерживаться USB-COM переходниками. Выбирайте этот протокол если весы подключены к настоящему, аппаратному COM-порту. Так же этот протокол, вероятно, единственный, который можно использовать в весах, у которых нет цифровой клавиатуры (см. ниже — без нее весы просто невозможно переключить на другой протокол);&lt;br /&gt;
* ОКА — во многих моделях весов не поддерживает передачу нестабильного веса, так что работать с ним — медленнее, чем возможно. Но этот протокол поддерживают все весы «МЕРА» с цифровой клавиатурой;&lt;br /&gt;
* MERA-AUTO — наиболее продвинутый, рекомендованный производителем протокол. Позволяет передавать нестабильный вес. Однако весы нужно на него переключать (см. ниже), также он поддерживается не всеми весами;&lt;br /&gt;
* Сетевые — для весов, подключающихся не к COM-порту, а непосредственно к локальной сети.&lt;br /&gt;
&lt;br /&gt;
Выбор протокола в весах: воспользуйтесь выдержкой из их [http://courierexe.ru/download/scale/mera/MERA-VTP_VT-1A_2007.pdf руководства пользователя] или [http://courierexe.ru/download/scale/mera/servmanpvm2007.pdf другой версии руководства]:&lt;br /&gt;
&lt;br /&gt;
  9.1 Выбор протокола&lt;br /&gt;
  9.1.1 Удерживая нажатой кнопку «5» клавиатуры терминала, кратковременным нажатием кнопки «[[Файл:PowerOn.png]]» включить весы. &lt;br /&gt;
        Используя ту же клавиатуру набрать код 39654 и затем нажать клавишу ввода «[[Файл:Enter.png]]» или «T» (Тара). &lt;br /&gt;
        При правильно выполненном действии будет активизирован режим настройки и на дисплее появится сообщение «_____9». &lt;br /&gt;
  9.1.2 Последовательно нажать кнопки «1» и «4» и ввести кодовый номер требуемого протокола '' '''(для протокола &amp;quot;9байт&amp;quot; - «0», &amp;quot;ОКА&amp;quot; - «1», &amp;quot;MERA-AUTO&amp;quot; - «5»)''' '' из таблицы кодов нажатием одной из кнопок «0»…«9». &lt;br /&gt;
  9.1.3 Нажатием кнопки «9» зафиксировать результат. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Обратите внимание''' на то, что в этой инструкции подразумевается наличие полной цифровой клавиатуры с кнопками «0»..&amp;quot;9&amp;quot;. Если у ваших весов такой клавиатуры нет — они не поддерживают изменение протокола, и переключить их не удастся.&lt;br /&gt;
&lt;br /&gt;
В программе нажмите «Настройка» — «Параметры» — «Оборудование». Поставьте галку «Использовать весы», выберите протокол и порт весов. После настройки обязательно перезагрузите программу и весы.&lt;br /&gt;
&lt;br /&gt;
Для проверки работоспособности подключения можно использовать официальную [http://courierexe.ru/download/scale/mera/Oka.exe программу МЕРА]. Обратите внимание, что эта программа не будет работать, если открыта программа MeaSoft с включенным использованием весов, и наоборот. В один момент времени к весам может подключаться только одна программа.&lt;br /&gt;
&lt;br /&gt;
=== Настройка весов НЕВА ===&lt;br /&gt;
По нашему опыту работы с весами «НЕВА» складывается интересная ситуация: производитель заявляет, что все модели их весов работают по разным протоколам. Протокол зависит от модели «пульта» — такой штуки, с индикатором и кнопками. При этом по конкретной модели пульта они передали протокол, который не соответствует действительности. В итоге конкретные весы, имевшиеся в наличии, к программе подключены (методом [https://ru.wikipedia.org/wiki/Обратная_разработка обратного инжиниринга] протокола), в списке видов весов в настройке оборудования они присутствуют, но мы не можем дать никаких гарантий того, что конкретные весы, приобретенные вами, будут работать с программой. Мы не рекомендуем этот тип весов к приобретению, но если они у вас уже есть и система с ними не работает — звоните, будем думать, что с этим можно сделать.&lt;br /&gt;
&lt;br /&gt;
=== Настройка весов МАССА-К ===&lt;br /&gt;
Для поддержки весов Масса-К в системе предусмотрена поддержка «Протокола № 2». Этот протокол по умолчанию включен в весовых терминалах [https://courierexe.ru/download/scale/massa/TB_A_r6.2_2017.pdf А/ТВ] и [https://courierexe.ru/download/scale/massa/TB_T_r3.2_2016.pdf Т/ТВ]&lt;br /&gt;
&lt;br /&gt;
=== Настройка весов CAS ===&lt;br /&gt;
&lt;br /&gt;
В программе поддерживаются весы CAS с протоколом AD. Известно, что протокол AD используется во всех моделях линейки HD, DB, но у него есть несколько версий. Чтобы весы начали передавать вес в программу, необходимо в настройках весов, через специальное меню настроек (описание есть в документации к весам), включить режим автоматической передачи данных по стабилизации.&lt;br /&gt;
&lt;br /&gt;
Примеры настройки:&lt;br /&gt;
*Для весов CAS DB-1H в программе выберите  ротокол '''CAS DB-H'''. В настройках весов обязательно включите режим '''Pr off'''. Скорость передачи 9600;&lt;br /&gt;
*Для весов CAS HD (300, 4050) в программе выберите  протокол '''CAS HD''';&lt;br /&gt;
&lt;br /&gt;
=== Настройка весов Mettler Toledo ===&lt;br /&gt;
&lt;br /&gt;
Для поддержки весов TLX Mettler Toledo в программу добавлен протокол TLX Mettler Toledo (TCP/IP Client), весы настроены в качестве сервера, программа подключается к весам и обрабатывает сообщения с данными измерений. Поддерживается передача: штрих-кода, веса, длины , ширины, высоты.&lt;br /&gt;
&lt;br /&gt;
Для поддержки весов CSN 810 Mettler Toledo в программу добавлен протокол CSN Mettler Toledo, оборудование имеет подключение к сканеру (CSN810) и весам (ICS425) по двум разным IP. Сканер настроен в качестве сервера, а весы необходимо опрашивать командой. Программа подключается по 2 IP записанным через запятую и обрабатывает сообщения с данными измерений. Поддерживается передача: веса, длины , ширины, высоты. Оборудование необходимо напрямую подключать к компьютеру по двум сетевым картам. Каждое сетевое подключение должно быть в одной сети с подключение от оборудования. Пример подключения сканера: IP сканера 192.168.127.14 порт 3001, сетевая карта должна иметь IP 192.168.127.2 маску 255.255.255.0 и основной шлюз 192.168.127.14. Пример подключения весов: IP 2.197.100.191 порт 3001, сетевая карта IP 2.197.100.2 маска 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Настройка порядка цены деления для весов ===&lt;br /&gt;
В случае ошибочного определения веса, когда порядок величины в несколько раз меньше или больше реального веса, в программе предусмотрена возможность коррекции значения.&lt;br /&gt;
&lt;br /&gt;
Настройка порядка цены деления весов доступна через главное меню '''Настройка''' &amp;gt; '''Параметры''' &amp;gt; '''Оборудование''', поле '''Порядок цены деления'''.&lt;br /&gt;
&lt;br /&gt;
Доступные значения поля '''Порядок цены деления''':&lt;br /&gt;
&lt;br /&gt;
'''0''' — 1 грамм;&lt;br /&gt;
&lt;br /&gt;
'''1''' — 10 грамм;&lt;br /&gt;
&lt;br /&gt;
'''2''' — 100 грамм.&lt;br /&gt;
&lt;br /&gt;
Таким образом, если весы показывают в 10 раз меньше, чем на самом деле, установите '''Порядок цены деления''' равным 1.&lt;br /&gt;
&lt;br /&gt;
== Настройка фискальных регистраторов ==&lt;br /&gt;
Все фискальные регистраторы должны вноситься в справочник '''[[Фирмы]]'''. Для корректной работы ФР необходимо регистрировать ее в налоговой с нужным признаком агента, а потом прописывать его в системе.&lt;br /&gt;
&lt;br /&gt;
=== Стационарные Штрих-М ===&lt;br /&gt;
&lt;br /&gt;
=== Облачные LIFE PAY ===&lt;br /&gt;
&lt;br /&gt;
=== Облачные Webkassa ===&lt;br /&gt;
&lt;br /&gt;
Для начала работы необходимо установить чековую службу с нужными параметрами и добавить фискальный регистратор, для которого указать логин и пароль от webkassa в поле Серийный номер через запятую, а также выбрать тип WebKassa&lt;br /&gt;
&lt;br /&gt;
Закрытие смены происходит через ЛК WebKassa&lt;br /&gt;
&lt;br /&gt;
== Мобильные устройства курьеров ==&lt;br /&gt;
Процесс выбора оборудования, установки и настройки приложения для мобильного устройства курьера подробно рассмотрен в статьях «[[Мобильное приложение курьера для Android]]» и «[[Мобильное приложение курьера для IPhone]]».&lt;br /&gt;
&lt;br /&gt;
== Подключение принтера по Wi-Fi ==&lt;br /&gt;
&lt;br /&gt;
=== Печать через WSD  ===&lt;br /&gt;
&lt;br /&gt;
В случаях, когда печать через WSD недоступна, драйвер не поддерживает стандартные функции печати.&lt;br /&gt;
Причина: WSD-порт не всегда корректно работает с потоковой печатью GDI. &lt;br /&gt;
Рекомендации:&lt;br /&gt;
Измените тип порта с WSD на TCP/IP. &lt;br /&gt;
 1) Откройте Панель управления → Устройства и принтеры.&lt;br /&gt;
 2) ПКМ на принтер → Свойства принтера → Порты.&lt;br /&gt;
 3) Нажмите Добавить порт → Стандартный TCP/IP-порт.&lt;br /&gt;
 4) Укажите IP-адрес принтера&lt;br /&gt;
 5) Выберите Тип устройства → Generic Network Card.&lt;br /&gt;
После создания порта — выберите его вместо WSD и примените. После этого WSD-порт можно удалить.&lt;br /&gt;
 Если принтер использует универсальный драйвер Windows (WSD), попробуйте установить PCL или PS драйвер от производителя вручную, указав IP-адрес.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D0%B1%D0%BE%D1%80%D1%83%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=15860</id>
		<title>Оборудование</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D0%B1%D0%BE%D1%80%D1%83%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=15860"/>
				<updated>2026-03-12T15:40:33Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Настройка весов Mettler Toledo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Аппаратные требования к рабочей станции ==&lt;br /&gt;
* Работа под управлением ОС Windows 32/64 Bit: Win7, Win8; Win10; Win11.&lt;br /&gt;
* Установленный и активированный пакет Microsoft Office 2007 или выше '''кроме «Office 2010 Starter»'''.&lt;br /&gt;
* Процессор: любой, удовлетворяющий рабочим требованиям линейки ОС Windows.&lt;br /&gt;
* Оперативное запоминающее устройство (ОЗУ): от 2 Gb и выше.&lt;br /&gt;
* Запоминающее устройство HDD или SSD: от 60 GB и выше.&lt;br /&gt;
* Сетевой интерфейс: проводной/беспроводной Ethernet интерфейс.&lt;br /&gt;
* Монитор: диагональ, обеспечивающая разрешающую способность экрана не менее 1024*768 пикселей.&lt;br /&gt;
* Периферийные порты ввода-вывода USB, RS232 (при необходимости наличия таковых): для подключения периферийного оборудования (сканер штрихкодов, &amp;lt;br&amp;gt;фискальный регистратор, термопринтер).&lt;br /&gt;
* Клавиатура, манипулятор мышь.&lt;br /&gt;
&lt;br /&gt;
== Выбор сервера для системы ==&lt;br /&gt;
&lt;br /&gt;
=== Выбор серверного оборудования ===&lt;br /&gt;
Система MeaSoft нетребовательна к аппаратным ресурсам сервера.&lt;br /&gt;
&lt;br /&gt;
Что касается '''производительности''', то для небольшой компании, человек 10 в офисе, как правило, производительности бытового ноутбука, установленного в качестве сервера, будет более, чем достаточно. То есть серверную часть можно установить на любую машину, за которой работает пользователь. Для компаний до 20 сотрудников мы рекомендуем использовать бытовой компьютер, но «назначенный» сервером, то есть чтобы он стоял отдельно работал круглосуточно, и им никто не пользовался в качестве рабочей станции. Для компаний более 20 человек — лучше использовать именно серверное оборудование, хотя у нас есть установка, где на бытовом Core i3 одновременно работает 80 человек.&lt;br /&gt;
&lt;br /&gt;
'''Объем диска''': Изначально при установке БД занимает около 1 Gb. Далее она увеличивается в зависимости от использования. Если компания доставляет 20000 отправлений в месяц, через 3 года объем базы будет 10 Gb с одной оговоркой: Больше всего места в БД занимают файлы, такие, как архив отсканированных накладных, отправленные по почте отчеты и счета, и т. д. Здесь, если компания использует эти возможности, она за год может накопить и 100 и 200 Gb. Так же необходимо учитывать некоторый объем свободного места, необходимый для создания резервных копий, а так же для работы самой ОС.&lt;br /&gt;
&lt;br /&gt;
Самое главное требование системы к серверу — это его '''надежность'''. Надо понимать, что при поломке сервера приостановится работа всей компании. В худшем случае — можно потерять данные, введенные с момента последней резервной копии. Для сокращения возможных рисков, нужно стараться, по возможности, делать сервер максимально надежным:&lt;br /&gt;
&lt;br /&gt;
* Мы не рекомендуем устанавливать сервер на ноутбук, так как его форм-фактор предполагает некоторую степень мобильности. Есть соблазн взять его куда-то с собой. А при перемещении велик риск его потери, кражи, его можно уронить и разбить. Еще один фактор низкой надежности ноутбуков — они часто умирают от пролитого на них чая/кофе/пива.&lt;br /&gt;
* Мы не рекомендуем устанавливать серверную часть на компьютер, за которым работает пользователь. Здесь главный фактор риска — это заражение компьютера вирусами, которые пользователь, по неграмотности, скачивает из интернета, приносит на флешках и т. д. Антивирус никакой от этого не спасает.&lt;br /&gt;
* Мы рекомендуем устанавливать на серверный компьютер [https://ru.wikipedia.org/wiki/RAID Raid-1] массивы для снижения вероятности выхода из строя/потери данных в случае поломки жесткого диска. Однако нужно понимать, что это тоже не панацея: жесткие диски достаточно часто выходят из строя все одновременно, например, при поломке блока питания, когда напряжение «пробивает» через него и приводит к выгоранию всех компонентов компьютера, В случае стихийных бедствий и несчастных случаев (прорывы в трубах, например), или просто от того, что 2 HDD одной модели, купленные одновременно имеют одинаковый ресурс наработки на отказ.&lt;br /&gt;
* Мы рекомендуем устанавливать [https://ru.wikipedia.org/wiki/Источник_бесперебойного_питания ИБП] на сервер для предохранения его от скачков напряжения в сети и/или аварийного завершения работы при отключении питания.&lt;br /&gt;
* Мы рекомендуем использовать специализированное серверное оборудование, так как оно по определению гораздо надежнее, вплоть до резервирования блоков питания. Но такое оборудование достаточно дорогое, и его использование носит исключительно рекомендательный характер.&lt;br /&gt;
&lt;br /&gt;
Некоторые наши клиенты не удовлетворяются вышеизложенными рекомендациями по выбору серверного оборудования и просят нас предоставить формальные требования к серверу. Вот они:&lt;br /&gt;
&lt;br /&gt;
1.	Работа под управлением ОС Windows 2012 Server R2;&amp;lt;br&amp;gt;&lt;br /&gt;
2.	Процессор: многоядерный, удовлетворяющий требованиям ОС;&amp;lt;br&amp;gt;&lt;br /&gt;
3.	Оперативное запоминающее устройство (ОЗУ): от 4 GB;&amp;lt;br&amp;gt;&lt;br /&gt;
4.	Запоминающее устройство HDD: от 360 Gb, Raid-1;&amp;lt;br&amp;gt;&lt;br /&gt;
5.	Сетевой интерфейс: проводной Ethernet интерфейс — 100 Mbit.;&amp;lt;br&amp;gt;&lt;br /&gt;
6.	Монитор, с разрешением минимум 1024*768;&amp;lt;br&amp;gt;&lt;br /&gt;
7.	Клавиатура microsoft минимум 103 клавиши;&amp;lt;br&amp;gt;&lt;br /&gt;
8.	Мышь оптическая;&amp;lt;br&amp;gt;&lt;br /&gt;
9.	Колонки активные минимум 2 Вт;&amp;lt;br&amp;gt;&lt;br /&gt;
10.	Коврик для мыши силиконовый :-)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Выбор серверной операционной системы ===&lt;br /&gt;
Серверная часть MeaSoft работает практически на любой операционной системе. Исключение — модуль интеграции с внешними системами.&lt;br /&gt;
&lt;br /&gt;
При выборе ОС нужно рассмотреть все плюсы и минусы. Обычно выбор стоит между Windows и Linux.&lt;br /&gt;
&lt;br /&gt;
Windows — платная система. Серверная Windows стоит 40-45 т.р. Система прекрасно работает, например, на Windows 7 (желательно только не домашнюю версию), которая стоит в разы меньше. Ограничение на количество подключений к ней не имеет отношения к нашей системе.&lt;br /&gt;
&lt;br /&gt;
Linux — «бесплатная» система. Почему в кавычках? Потому что стоимость владения им гораздо выше: для администрирования системы linux необходим системный администратор с глубокими познаниями этой ОС, а такие специалисты стоят в 2 раза дороже, чем администраторы Windows.&lt;br /&gt;
&lt;br /&gt;
Таким образом даже «дорогая» серверная Windows окупается за пару месяцев. Linux можно выбирать только в том случае, если в вашей компании и так уже работает несколько системных администраторов Linux, которые смогут решать возможные проблемы с ней. Наша компания оказывает необходимую для работы системы помощь в администрировании windows-серверов, но с linux эта функция полностью ложится на заказчика. Почему мы говорим, что должно быть несколько администраторов в случае с Linux? Потому что в случае увольнения единственного администратора, как правило, компанию ждут времена несчастий, пока не найдется новый ТОЛКОВЫЙ системный администратор.&lt;br /&gt;
&lt;br /&gt;
Резюме: Выбирайте Linux только в том случае, если вы точно уверены в том, что делаете. В противном случае — только Windows.&lt;br /&gt;
&lt;br /&gt;
=== Размещение сервера ===&lt;br /&gt;
Для классической архитектуры системы, когда офис-склад консолидированы в одном месте, мы рекомендуем размещение сервера в офисе. То есть в точке максимального использования системы. Это обеспечивает максимальную скорость и надежность. При этом при необходимости удаленного доступа к системе — достаточно, имея внешний статичный IP-адрес, «пробросить» порт 3306 на сервер.&lt;br /&gt;
&lt;br /&gt;
В последнее время все больше популярность приобретает размещение сервера «в облаке». На самом деле формально — это, конечно, не [https://ru.wikipedia.org/wiki/Облачное_хранилище_данных облако] в широком понимании, а [https://ru.wikipedia.org/wiki/VPS сервер], физический или виртуальный, находящийся в дата-центре. При выборе такого варианта установки программы следует учесть ряд факторов:&lt;br /&gt;
* '''Скорость доступа''' Наша система очень чувствительна к скорости доступа. Некоторые операции могут вызывать несколько обращений к серверу, и увеличение времени одного обращения на несколько миллисекунд существенно снижает общую производительность системы на рабочем месте. При размещении сервера в дата-центрах Европы, например, скорость доступа ([https://ru.wikipedia.org/wiki/Ping ping]) из Москвы составляет 50-60 мс. Это — на грани возможности использования программы. При размещении в дата-центре того же города, где находятся пользователи, время доступа — порядка 3-5 мс. Для сравнения — доступ по локальной сети — менее 1 мс.&lt;br /&gt;
* '''Надежность интернет-канала''' Нужно понимать, что в случае размещения сервера в интернете система не будет работать у вас в офисе и/или на складе в случае отсутствия доступа в интернет. Желательно обеспечить резервирование канала, причем, желательно, не 3G-«свистком» (см. следующие 2 пункта).&lt;br /&gt;
* '''Пропускная способность интернет-канала''' При разработке системы мы стараемся минимизировать объемы информации, передаваемые между рабочим местом и сервером. Но если доступ происходит через интернет, на одном канале работает несколько человек, на котором работает и программа и телефоны, а кто-то смотрит видео в ютубе, а кто-нибудь еще придумает пользоваться торрентами — работа остановится.&lt;br /&gt;
* '''Стабильность интернет-канала''' При доступе к серверу не должны теряться пакеты. Если на канале происходят потери — программа будет закрываться с сообщением о том, что произошла потеря соединения с сервером. Потери пакетов можно проанализировать командой ping -t &amp;lt;имя_сервера, например ya.ru&amp;gt;.&lt;br /&gt;
* '''Надежность дата-центра''' Теоретически — в дата-центре обеспечивается резервирование и электропитания, и каналов передачи данных. Естественно, в них стоят и промышленные климатические системы, поддерживающие заданную рабочую температуру всего оборудования. Но на практике часто бывает, что сервер оказывается недоступным на время от нескольких минут до нескольких дней. Техподдержка (если ее телефон вообще отвечает, а часто как раз в эти моменты она не работает — либо потому, что телефония работает на том же канале, который у них и «упал», либо потому, что тысячи пользователей серверов, обнаружив неполадки, начали им одновременно звонить) скажет «да, в вашем сегменте технические неполадки, мы устраняем», и больше сделать вы ничего не сможете. В случае, если сервер стоит у вас в офисе — вы сами принимаете моментальные меры. Вплоть до того, что можно вынуть из сгоревшего сервера жесткий диск, подключить к другому компьютеру, и восстановить работу системы.&lt;br /&gt;
* '''Стоимость''' При размещении на linux-VDS серверах стоимость на текущий момент — [http://firstvds.ru/products/vds_vps_hosting 600-900 руб/мес], Windows — [https://masterhost.ru/service/hosting/vps/ 4000 руб/мес]. По поводу выбора ОС читайте соответствующий раздел этой же статьи.&lt;br /&gt;
&lt;br /&gt;
Отсюда вывод:&lt;br /&gt;
Мы рекомендуем устанавливать сервер «в облаке» только в случае сильно распределенной структуры компании. Когда максимальную скорость и надежность нужно обеспечить множеству удаленных пользователей, а не в одном конкретном месте.&lt;br /&gt;
&lt;br /&gt;
== Доступ для установки системы ==&lt;br /&gt;
&lt;br /&gt;
Для установки системы программисту MeaSoft требуется доступ к вашему серверу с правами администратора. В процессе установки потребуется устанавливать службы, запускать и останавливать их, а также производить запуск приложений от имени администратора.  Доступ можно предоставить одним из способов:&lt;br /&gt;
* по [https://remontka.pro/microsoft-remote-desktop/ RDP] — передайте нам IP-адрес сервера, порт (если он отличается от стандартного), логин и пароль для подключения;&lt;br /&gt;
* через [https://www.teamviewer.com/ru/info/remote-desktop/ TeamViewer] — установите и запустите программу на сервере и передайте нам ID и пароль подключения.&lt;br /&gt;
&lt;br /&gt;
== Рекомендованное периферийное оборудование ==&lt;br /&gt;
&lt;br /&gt;
=== Сканер штрихкодов ===&lt;br /&gt;
Рекомендуются к приобретению сканеры, официально ввезенные в вашу страну, адаптированные для местного рынка, имеющие здесь официальных поставщиков.&lt;br /&gt;
&lt;br /&gt;
Мы рекомендуем:&lt;br /&gt;
* Zebex Z-3000 (CCD-сканер) — дешевый;&lt;br /&gt;
* Honeywell (Metrologic) 5145 Eclipse — лазерный;&lt;br /&gt;
* Honeywell (Metrologic) DS6707 — image, позволяет сканировать 2D-штрихкоды;&lt;br /&gt;
* Honeywell (Metrologic) 1202g Voyager BT — радиосканер, позволяет сканировать на расстоянии от компьютера.&lt;br /&gt;
&lt;br /&gt;
Рекомендуются к приобретению сканеры с типом подключения USB HID.&lt;br /&gt;
&lt;br /&gt;
Вы можете скачать наше бесплатное мобильное приложение [[Кладовщик — мобильное приложение для Android|Кладовщик]], которое работает как сканер штрихкодов.&lt;br /&gt;
&lt;br /&gt;
Если вы определились с моделью сканера, то тип подключения не играет существенной роли: наша программа позволяет работать с любой из списка поддерживаемых моделей (проводной или беспроводной). Выбор интерфейса, скорее всего, зависит от наличия и доступности соответствующего порта на компьютере пользователя (так, интерфейс RS-232 предполагает наличие COM-порта, а интерфейс KBW, как правило, PS/2). Очевидным является тот факт, что наиболее универсальным будет сканер, работающий через интерфейс USB (USB HID).&lt;br /&gt;
&lt;br /&gt;
Проводной или беспроводной сканер имеет такое же примерно значение, как проводная или беспроводная мышь: если вам нужно работать удаленно от управляющего устройства (компьютера), то для этого стоит выбирать беспроводную модель. Все беспроводные модели сканеров (обычно работающие через технологию Bluetooth) имеют аккумуляторные батареи и зарядные устройства, которые часто выполнены в виде базовой станции (приемно-передающего устройства) с функцией зарядки переносной части сканера.&lt;br /&gt;
&lt;br /&gt;
При выборе сканера обратите внимание на то, что при типе подключения USB HID (рекомендуется) или «разрыв клавиатуры» сканер требует некоторой настройки. [[#Подключение и настройка сканеров штрихкодов|В разделе ниже]] приведены программирующие листы для различных моделей сканеров. Если вы покупаете сканер не из списка, для которого есть программирующий лист, будьте готовы к тому, что потребуется создание такого листа. Для его создания нужно полное руководство по программированию конкретного сканера на русском или английском языках. С этим часто бывают проблемы, если вы покупаете сканеры с доставкой из Китая — они, как правило, настолько китайские, что у них нет ни документации, ни сайта производителя. В таком случае остается уповать только на везение.&lt;br /&gt;
&lt;br /&gt;
=== Термопринтер ===&lt;br /&gt;
Поддерживаются любые термо- и термо-трансферные принтеры.&amp;lt;br&amp;gt;&lt;br /&gt;
Рекомендуется термопринтер Zebra ZD410 — у него ширина печатающей головки 60 мм, поэтому ленту такой же ширины сложно вставить неправильно. Очень прост в обслуживании и заправке ленты. &amp;lt;br&amp;gt;&lt;br /&gt;
'''ВНИМАНИЕ!''' При покупке следует учитывать, что термопринтеры не комплектуются USB-шнуром и этикетками, поэтому их необходимо приобрести отдельно. Рекомендуем этикетки размером 58×40 мм.&lt;br /&gt;
&lt;br /&gt;
=== Весы ===&lt;br /&gt;
Поддерживаемые весы:&lt;br /&gt;
* [[#Настройка весов МЕРА|МЕРА]] — подходят модели, которые поддерживают протоколы «ОКА», «9 байт» или «Mera Avto». По нашим сведениям, протоколы ОКА и Mera Avto поддерживают весы, у которых есть цифровая клавиатура 0-9. Но лучше уточняйте у продавца. Протокол «9 байт» в силу своей низкоуровневой работы с COM-портом может не работать через USB-переходники. Рекомендуем весы Мера ВП-3/30 — небольшие, точные, недорогие.&amp;lt;br&amp;gt;&lt;br /&gt;
* [[#Настройка весов НЕВА|Нева]]&lt;br /&gt;
* ExpressCube&lt;br /&gt;
* Масса-К&lt;br /&gt;
* InSize&lt;br /&gt;
* Мастер-Кит&lt;br /&gt;
* CAS HD 57583&lt;br /&gt;
* UIS Metrix&lt;br /&gt;
&lt;br /&gt;
При покупке весов обратите внимание на то, что они могут подключаться к COM-порту, который отсутствует на многих компьютерах. Для весов существуют провода в USB-порт, эмулирующие COM-порт. В продаже есть переходники и платы расширения компьютеров, позволяющие добавить COM-порты.&lt;br /&gt;
&lt;br /&gt;
Инструкцию по настройке и подключению весов смотрите в этой статье [[#Настройка весов|ниже]].&lt;br /&gt;
&lt;br /&gt;
=== Фискальный регистратор ===&lt;br /&gt;
В рамках 54-ФЗ поддерживается и рекомендуется работа с сервисом удаленной фискализации LIFE PAY.&lt;br /&gt;
&lt;br /&gt;
Поддерживаются все фискальные регистраторы фирмы «Штрих-М»&lt;br /&gt;
&lt;br /&gt;
Рекомендуется ШТРИХ-LIGHT-ФР-К (cамый бюджетный)&lt;br /&gt;
&lt;br /&gt;
При покупке ФР обратите внимание на то, что они могут подключаться к COM-порту, который отсутствует на многих компьютерах. Для них существуют провода в USB-порт, эмулирующие COM-порт. Также в продаже имеются переходники и платы расширения компьютеров, позволяющие добавить COM-порты.&lt;br /&gt;
&lt;br /&gt;
=== Банковский POS-терминал ===&lt;br /&gt;
[https://ru.wikipedia.org/wiki/POS-%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B0%D0%BB POS-терминал].&lt;br /&gt;
Мобильное приложение поддерживает интеграцию с сервисами IBox, LIFE PAY, а также поддерживается работа с независимыми POS-терминалами.&lt;br /&gt;
&lt;br /&gt;
=== Планшетный сканер ===&lt;br /&gt;
Применяется для сканирования ведомостей с подписью, после чего полученные документы вы можете прикрепить в программе к соответствующей корреспонденции.&amp;lt;br&amp;gt;&lt;br /&gt;
Рекомендуются сканеры с автоматической подачей.&amp;lt;br&amp;gt;&lt;br /&gt;
При выборе устройства обратите внимание на следующие характеристики:&lt;br /&gt;
* Скорость сканирования;&lt;br /&gt;
* Наличие функции обнаружения подачи двух листов;&lt;br /&gt;
* Двухстороннее сканирование;&lt;br /&gt;
* Количество сканирований до отказа.&lt;br /&gt;
&lt;br /&gt;
=== Монитор ноутбука/нетбука/компьютера ===&lt;br /&gt;
Рабочее место пользователя для работы с MeaSoft должно оснащаться монитором с разрешающей способностью экрана не менее 1024*768 пикселей. При работе на портативных устройствах, таких как нетбуки, у которых разрешение ниже рекомендуемого, в экран могут не помещаться некоторые окна.&lt;br /&gt;
&lt;br /&gt;
=== Штрихкодовая линейка-угол ===&lt;br /&gt;
Штрихкодовая линейка-угол применяется для обмера габаритов отправления. Обмер можно производить при приеме корреспонденции на склад (F10 на вкладке «Заказы»). Каждое деление (1, 5 или 10 миллиметров) линейки промаркировано своим штрихкодом. Прикладывая товар к линейке и сканируя штрихкод, соответствующий краю товара, получаем размеры. Чтобы включить поддержку штрихкодированной линейки, нужно в окне приема, нажать кнопку «Настройки» и установить галку «Включить поддержку штрихкодированной линейки». Для работы с линейкой удобнее использовать лазерные сканеры, у них полоса считывания наводится точно на нужный штрихкод. Реализована поддержка производителя [http://cortes.ru/shtrihcode/barcodeline.php Кортес]. Перед покупкой нужно проверять модель на совместимость с системой. Система поддерживает следующий формат ШК:&amp;lt;br&amp;gt;&lt;br /&gt;
Длина ШК 7 символов, начинается всегда на «29», например: 291XXXX, 292XXXX, 293XXXX&amp;lt;br&amp;gt;&lt;br /&gt;
где: XXXX — значение в милиметрах, 3-й знак — направление измерения от 1 до 3, то есть координата (длина, ширина, высота).&lt;br /&gt;
&lt;br /&gt;
=== Терминал сбора данных ===&lt;br /&gt;
Терминал сбора данных (ТСД) под управлением Android может работать совместно с MeaSoft как сканер штрихкодов или ТСД. Для этого установите на ТСД наше приложение [[Мобильное приложение кладовщика для Android|Кладовщик]] и выберите нужный режим работы.&lt;br /&gt;
&lt;br /&gt;
== Подключение и настройка сканеров штрихкодов ==&lt;br /&gt;
MeaSoft поддерживает все виды [http://ru.wikipedia.org/wiki/Сканер_штрихкода сканеров штрихкодов], поэтому при выборе сканера следует учитывать особенности штрихкодов, которыми заказчики маркируют корреспонденцию. В частности, контактные светодиодные сканеры можно использовать для считывания штрихкодов длиной не более 5-7 см (в зависимости от модели сканера), а для двухмерных штрихкодов необходим image-сканер.&lt;br /&gt;
&lt;br /&gt;
При подключении в разрыв клавиатуры или в порт USB в режиме эмуляции разрыва клавиатуры требуется небольшая дополнительная настройка сканера. Для этого существуют специальные программирующие листы (см. ниже) для разных моделей сканеров, на которых напечатаны штрихкоды в определенной последовательности. Просканируйте их в том порядке, в котором они расположены на листе. Как правило, для сканеров одной фирмы подходят одни и те же штрихкоды.&lt;br /&gt;
В результате этих действий при каждом сканировании перед штрихкодом вставляется определенный префикс, наличие которого для программы является признаком того, что данная последовательность символов введена с помощью сканера. Для использования в качестве префикса в программе зарезервирована клавиша с буквой «ё», что накладывает некоторое ограничение: невозможно ввести с клавиатуры символы «ё», «Ё», «`», «~».&lt;br /&gt;
&lt;br /&gt;
В данном разделе приведены программирующие листы для популярных моделей сканеров штрихкодов. Если в этом списке не оказалось модели вашего сканера, попробуйте использовать лист от другой модели того же производителя. Сообщите, пожалуйста, нам, мы внесем изменения в список моделей, для которых подходит этот лист. Если никакой лист не подошел — сообщите, пожалуйста, об этом нам, мы подготовим лист для вашего сканера.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 60%&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot;|Бренд&lt;br /&gt;
!style=&amp;quot;width: 70%;&amp;quot;|Модель&lt;br /&gt;
|-&lt;br /&gt;
|Argox&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Argox.doc ArgoScan 8000/8110/8120/8150/8250/8310/8312, argox as-8020cl (usb))]&lt;br /&gt;
|-&lt;br /&gt;
|Champtek&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Champtek.doc Champtek]&lt;br /&gt;
|-&lt;br /&gt;
|Cino&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Cino.doc F680BT]&lt;br /&gt;
|-&lt;br /&gt;
|Cipherlab&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Cipherlab_1021_(simple).doc 1021 (simple)]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Cipherlab_1021_(simple)_and_back.doc 1021 с переключением обратно]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Cipherlab_1560,_1562,_1070_(bluetooth).doc 1560, 1562, 1070 (bluetooth)]&lt;br /&gt;
|-&lt;br /&gt;
|Metrologic/Eclipse/Honeywell/Motorola/Symbol/Youjie&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Honeywell_Xenon_1900.doc Xenon 1900, Voyager 1202g, YJ4600]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Metrologic,_Eclipse,_Honeywell,_ms9520,_ms9540.doc MS5145, MS9520, MS9540, HH440]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Symbol_ls1203,_LS2208.doc LS1203, LS2208] (подходит для li4278, Zebra DS2278)&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Symbol_ds6707.doc DS6707]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/honeywell_1452g.docx Honeywell Voyager 1452G]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/honeywell_1472g.docx Honeywell 1472g]&lt;br /&gt;
|-&lt;br /&gt;
|PayTor&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Paytor%20DS%201009.docx DS 1009]&lt;br /&gt;
|-&lt;br /&gt;
|Proton&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Proton.doc Proton]&lt;br /&gt;
[https://www.courierexe.ru/download/scaner/Proton_2.doc IMS3190, беспроводной)]&lt;br /&gt;
|-&lt;br /&gt;
|Datalogic&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/PSC,_Datalogic_QS2500.doc PSC, Datalogic QS2500]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/qd2100.doc QD2100]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.courierexe.ru/download/scaner/datalogic800i.docx Magellan 800i]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.courierexe.ru/download/scaner/QuickScanMobile.doc Mobile: QM2100, M2]&lt;br /&gt;
|-&lt;br /&gt;
|Scanport&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Scanport_T600.bmp T600]&lt;br /&gt;
|-&lt;br /&gt;
|Zebex&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Zebex_4.bmp Zebex]&lt;br /&gt;
|-&lt;br /&gt;
|Godex&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/godex.doc GS550U]&lt;br /&gt;
|-&lt;br /&gt;
|Mercury&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/mercury.doc CL-200]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Mercury_1100PL.docx 1100PL]&lt;br /&gt;
|-&lt;br /&gt;
|Если у вас китайский безымянный (беспроводной?) сканер, попробуйте этот лист&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Vioteh.doc Vioteh VT2208R, Dudian CT980N, bp8150s, Heroje B120G]&lt;br /&gt;
|-&lt;br /&gt;
|Vioteh&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/VT2205_VT2209.docx VT2205 VT2209]&lt;br /&gt;
|-&lt;br /&gt;
|Heroje&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Heroje_H018.doc H018]&lt;br /&gt;
|-&lt;br /&gt;
|Производитель Китай под российским брендом АТОЛ.&amp;lt;br&amp;gt;&lt;br /&gt;
Cканер не рекомендуется к покупке. Атол выпускает несколько разных версий сканера под одной моделью SB1101. К сожалению, не все модели поддаются настройке.&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Atol_SB_1101.docx SB 1101]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Atol_SB_1103.docx 1103]&lt;br /&gt;
|-&lt;br /&gt;
|Radall&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Radall_RD-h8_2d.docx RD-h8 2d]&lt;br /&gt;
|-&lt;br /&gt;
|NETUM&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/NETUM_W6.docx W6, C750]&lt;br /&gt;
|-&lt;br /&gt;
|DBS&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/DBS_HC-3208SR.docx HC-3208SR (Подходите также к МSC-3208 WEC2D V.2)]&lt;br /&gt;
|-&lt;br /&gt;
|Winson&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Winson_WNL_WNC_6003_6083.docx WNL/WNC 6003, 6083, 5083]&lt;br /&gt;
|-&lt;br /&gt;
|Global-pos&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/GP-9400B.docx Global-pos GP-9400B]&lt;br /&gt;
|-&lt;br /&gt;
|Mertech&lt;br /&gt;
|[https://courierexe.ru/download/scaner/Mertech_cl-2300.docx CL-2300]&lt;br /&gt;
|-&lt;br /&gt;
|Space&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Space_x-2020rc.docx]&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth-кольцо&lt;br /&gt;
|[https://courierexe.ru/download/scaner/GP-1901B.docx GP-1901B]&lt;br /&gt;
|-&lt;br /&gt;
|Mindeo&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/mindeo_md6600.docx MD6600]&lt;br /&gt;
[https://www.courierexe.ru/download/scaner/Mindeo_cs2290_hd_bt.docx CS2290HD(BT)]&lt;br /&gt;
|-&lt;br /&gt;
|Holyhah a30d, Hstem a30d&lt;br /&gt;
|[https://courierexe.ru/download/scaner/holyhah_a30d_hstem_a30d.docx a30d]&lt;br /&gt;
|-&lt;br /&gt;
|Urovo R70 (71) сканер-кольцо &lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/R70-71.docx R70(71)]&lt;br /&gt;
|-&lt;br /&gt;
|DATAMAX A-7710 B&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/DATAMAX_A-7710_B_2.docx A-7710 B] (если штрих-коды с листа плохо читаются, отсканируйте их же с приложенной к сканеру инструкции)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;!-- [https://www.courierexe.ru/download/scaner/Honeywell_hh400.docx Honeywell hh400] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечание'''. Для некоторых беспроводных моделей сканеров штрихкодов перед началом работы требуется обязательно выполнить привязку базовой станции сканера с переносным мобильным считывателем — отсканировать наклейку штрихкода на базовой станции переносной частью сканера. В частности, этот алгоритм касается сканеров фирмы Zebex.&lt;br /&gt;
&lt;br /&gt;
'''Примечание 2'''. В некоторых моделях сканеров, особенно это касается DATAMAX, по умолчанию устанавливается неверная кодировка символов. Даже если вы правильно настроите сканер (установите префикс в виде знака тильды), при сканировании, на выходе такой сканер может отдавать совсем другой префикс (например, вместо ~ или Ё, будет /). Чтобы решить эту проблему, измените в настройках сканера местоположение или язык на English (или любой другой, где доступно ASC2 code keyboard input) путем считывания специального управляющего кода из инструкции к сканеру.&lt;br /&gt;
&lt;br /&gt;
Cписок '''неподдерживаемого системой оборудования''':&lt;br /&gt;
* CT10 Barcode Scanner (Производитель CILICO Electronics Co., Ltd Китай);&lt;br /&gt;
* Аlanda 2.4G Barcode Scanner (производитель Китай).&lt;br /&gt;
* Birch bd — 388 iiib (производитель Китай);&lt;br /&gt;
&lt;br /&gt;
Это оборудование не позволяет установить требуемый префикс для работы с MeaSoft. Список далеко не полный.&lt;br /&gt;
&lt;br /&gt;
'''Мы рекомендуем покупать сканеры, официально ввезенные в Россию, адаптированные для российского рынка, имеющие здесь официальных поставщиков.'''&lt;br /&gt;
&lt;br /&gt;
При выборе сканера обратите внимание на то, что при типе подключения USB HID (этот режим рекомендуется) или «разрыв клавиатуры» сканер требует некоторой настройки. В разделе описания выше приведены программирующие листы для различных моделей сканеров. Если вы покупаете сканер не из списка, для которого уже есть программирующий лист, будьте готовы к тому, что потребуется создание такого листа. Для его создания нужно полное руководство по программированию конкретного сканера на русском или английском языках. С наличием инструкции очень часто возникают проблемы, если вы покупаете сканеры с доставкой из Китая — они, как правило, настолько не адаптированы к работе, что у них нет ни документации, ни сайта производителя. В таком случае остается уповать только на везение.&lt;br /&gt;
&lt;br /&gt;
Если ваш новый сканер не поддерживается нашей системой, можно попытаться выяснить, может ли он работать в режиме эмуляции COM-порта. Наличие возможности работы в таком режиме — последний шанс использовать купленное оборудование:&lt;br /&gt;
# Переведите сканер в режим USB virtual COM по инструкции.&lt;br /&gt;
# Установите бесплатные драйверы COM-порта Nuvoton.&lt;br /&gt;
# В MeaSoft программе выберите '''Настройка''' &amp;gt; '''Параметры''' &amp;gt; '''Оборудование''' &amp;gt; '''Использовать COM-сканер''', укажите номер виртуального COM-порта, созданного драйвером (см. в диспетчере устройств Windows).&lt;br /&gt;
Обратите внимание, что при переключении сканера в другой USB-порт может меняться номер COM-порта, и настройку программы нужно делать заново.&lt;br /&gt;
&lt;br /&gt;
===Возможные проблемы при работе сканеров с маркировкой Честный Знак===&lt;br /&gt;
&lt;br /&gt;
В некоторых сканерах по умолчанию может быть включена настройка, которая пытается компенсировать работу CapsLock, если тот включен, чтобы, например, в блокнот всегда печатался одинаковый код. Наша программа не учитывает CapsLock при сканировании и берет только те значения, которые передает сканер. Поэтому, при нажатом CapsLock может предаваться код маркировки с измененными регистрами букв, что затем будет мешать в работе с маркировкой. Чтобы этого избежать, нужно отключить опцию, компенсирующую работу CapsLock. Например, для сканера Sunlux XL-3200 данная настройка называется '''Caps Lock Off''': [[Файл:CapsOnScanner.png|none|700px]]&lt;br /&gt;
&lt;br /&gt;
== Настройка весов ==&lt;br /&gt;
&lt;br /&gt;
=== Общие сведения ===&lt;br /&gt;
MeaSoft поддерживает работу с различными видами весов. Весы могут подключаться через сетевой порт, COM- или USB-порт. &lt;br /&gt;
&lt;br /&gt;
При подключении через USB установите на компьютер драйвер USB-COM конвертера. Драйвер поставляется производителем весов либо переходника, через который вы подключаете весы. После установки драйвера в «Диспетчере устройств» вашего компьютера должен появиться новый COM-порт, через который и будет осуществляться дальнейшее взаимодействие с весами. Обратите внимание: при подключении USB-шнура к другому USB-разъему компьютера может измениться номер COM-порта, который привязан к шнуру. В этом случае укажите в программе новый номер порта.&lt;br /&gt;
&lt;br /&gt;
Чтобы начать использовать весы, подключите их к компьютеру, затем в пункте основного меню '''Настройка &amp;gt; '''Параметры''' &amp;gt; '''[[Настройка параметров рабочего места#Оборудование|Оборудование]]''' установите флажок '''Использовать весы''', выберите тип весов и укажите порт.&lt;br /&gt;
&lt;br /&gt;
После успешного подключения весов откройте карточку корреспонденции (или окно «Прием» в заказах). Возле поля '''Масса''' появится кнопка весов. Чтобы программа показывала вес с весов, эта кнопка должна быть нажата.&lt;br /&gt;
&lt;br /&gt;
Особенности настройки различных моделей весов приведены ниже.&lt;br /&gt;
&lt;br /&gt;
=== Настройка весов МЕРА ===&lt;br /&gt;
Для связи с весами мера система использует протоколы «9байт», «ОКА» и «MERA-AUTO» и «Сетевые».&lt;br /&gt;
&lt;br /&gt;
Какой выбрать:&lt;br /&gt;
* 9байт — установлен в весах по умолчанию. Он позволяет передавать нестабильный вес, что хорошо влияет на скорость работы оператора. Однако это протокол использует низкоуровневую работу с COM-портом, что может не поддерживаться USB-COM переходниками. Выбирайте этот протокол если весы подключены к настоящему, аппаратному COM-порту. Так же этот протокол, вероятно, единственный, который можно использовать в весах, у которых нет цифровой клавиатуры (см. ниже — без нее весы просто невозможно переключить на другой протокол);&lt;br /&gt;
* ОКА — во многих моделях весов не поддерживает передачу нестабильного веса, так что работать с ним — медленнее, чем возможно. Но этот протокол поддерживают все весы «МЕРА» с цифровой клавиатурой;&lt;br /&gt;
* MERA-AUTO — наиболее продвинутый, рекомендованный производителем протокол. Позволяет передавать нестабильный вес. Однако весы нужно на него переключать (см. ниже), также он поддерживается не всеми весами;&lt;br /&gt;
* Сетевые — для весов, подключающихся не к COM-порту, а непосредственно к локальной сети.&lt;br /&gt;
&lt;br /&gt;
Выбор протокола в весах: воспользуйтесь выдержкой из их [http://courierexe.ru/download/scale/mera/MERA-VTP_VT-1A_2007.pdf руководства пользователя] или [http://courierexe.ru/download/scale/mera/servmanpvm2007.pdf другой версии руководства]:&lt;br /&gt;
&lt;br /&gt;
  9.1 Выбор протокола&lt;br /&gt;
  9.1.1 Удерживая нажатой кнопку «5» клавиатуры терминала, кратковременным нажатием кнопки «[[Файл:PowerOn.png]]» включить весы. &lt;br /&gt;
        Используя ту же клавиатуру набрать код 39654 и затем нажать клавишу ввода «[[Файл:Enter.png]]» или «T» (Тара). &lt;br /&gt;
        При правильно выполненном действии будет активизирован режим настройки и на дисплее появится сообщение «_____9». &lt;br /&gt;
  9.1.2 Последовательно нажать кнопки «1» и «4» и ввести кодовый номер требуемого протокола '' '''(для протокола &amp;quot;9байт&amp;quot; - «0», &amp;quot;ОКА&amp;quot; - «1», &amp;quot;MERA-AUTO&amp;quot; - «5»)''' '' из таблицы кодов нажатием одной из кнопок «0»…«9». &lt;br /&gt;
  9.1.3 Нажатием кнопки «9» зафиксировать результат. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Обратите внимание''' на то, что в этой инструкции подразумевается наличие полной цифровой клавиатуры с кнопками «0»..&amp;quot;9&amp;quot;. Если у ваших весов такой клавиатуры нет — они не поддерживают изменение протокола, и переключить их не удастся.&lt;br /&gt;
&lt;br /&gt;
В программе нажмите «Настройка» — «Параметры» — «Оборудование». Поставьте галку «Использовать весы», выберите протокол и порт весов. После настройки обязательно перезагрузите программу и весы.&lt;br /&gt;
&lt;br /&gt;
Для проверки работоспособности подключения можно использовать официальную [http://courierexe.ru/download/scale/mera/Oka.exe программу МЕРА]. Обратите внимание, что эта программа не будет работать, если открыта программа MeaSoft с включенным использованием весов, и наоборот. В один момент времени к весам может подключаться только одна программа.&lt;br /&gt;
&lt;br /&gt;
=== Настройка весов НЕВА ===&lt;br /&gt;
По нашему опыту работы с весами «НЕВА» складывается интересная ситуация: производитель заявляет, что все модели их весов работают по разным протоколам. Протокол зависит от модели «пульта» — такой штуки, с индикатором и кнопками. При этом по конкретной модели пульта они передали протокол, который не соответствует действительности. В итоге конкретные весы, имевшиеся в наличии, к программе подключены (методом [https://ru.wikipedia.org/wiki/Обратная_разработка обратного инжиниринга] протокола), в списке видов весов в настройке оборудования они присутствуют, но мы не можем дать никаких гарантий того, что конкретные весы, приобретенные вами, будут работать с программой. Мы не рекомендуем этот тип весов к приобретению, но если они у вас уже есть и система с ними не работает — звоните, будем думать, что с этим можно сделать.&lt;br /&gt;
&lt;br /&gt;
=== Настройка весов МАССА-К ===&lt;br /&gt;
Для поддержки весов Масса-К в системе предусмотрена поддержка «Протокола № 2». Этот протокол по умолчанию включен в весовых терминалах [https://courierexe.ru/download/scale/massa/TB_A_r6.2_2017.pdf А/ТВ] и [https://courierexe.ru/download/scale/massa/TB_T_r3.2_2016.pdf Т/ТВ]&lt;br /&gt;
&lt;br /&gt;
=== Настройка весов CAS ===&lt;br /&gt;
&lt;br /&gt;
В программе поддерживаются весы CAS с протоколом AD. Известно, что протокол AD используется во всех моделях линейки HD, DB, но у него есть несколько версий. Чтобы весы начали передавать вес в программу, необходимо в настройках весов, через специальное меню настроек (описание есть в документации к весам), включить режим автоматической передачи данных по стабилизации.&lt;br /&gt;
&lt;br /&gt;
Примеры настройки:&lt;br /&gt;
*Для весов CAS DB-1H в программе выберите  ротокол '''CAS DB-H'''. В настройках весов обязательно включите режим '''Pr off'''. Скорость передачи 9600;&lt;br /&gt;
*Для весов CAS HD (300, 4050) в программе выберите  протокол '''CAS HD''';&lt;br /&gt;
&lt;br /&gt;
=== Настройка весов Mettler Toledo ===&lt;br /&gt;
&lt;br /&gt;
Для поддержки весов TLX Mettler Toledo в программу добавлен протокол TLX Mettler Toledo (TCP/IP Client), весы настроены в качестве сервера, программа подключается к весам и обрабатывает сообщения с данными измерений. Поддерживается передача: штрих-кода, веса, длины , ширины, высоты.&lt;br /&gt;
&lt;br /&gt;
Для поддержки весов CSN 810 Mettler Toledo в программу добавлен протокол CSN Mettler Toledo, оборудование имеет подключение к сканеру (напрямую к CSN810 без модуля интегарции VGA Display) и весам (ICS425) по двум разным IP. Сканер настроен в качестве сервера, а весы необходимо опрашивать командой. Программа подключается по 2 IP записанным через запятую и обрабатывает сообщения с данными измерений. Поддерживается передача: веса, длины , ширины, высоты. Оборудование необходимо напрямую подключать к компьютеру по двум сетевым картам. Каждое сетевое подключение должно быть в одной сети с подключение от оборудования. Пример подключения сканера: IP сканера 192.168.127.14 порт 3001, сетевая карта должна иметь IP 192.168.127.2 маску 255.255.255.0 и основной шлюз 192.168.127.14. Пример подключения весов: IP 2.197.100.191 порт 3001, сетевая карта IP 2.197.100.2 маска 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
=== Настройка порядка цены деления для весов ===&lt;br /&gt;
В случае ошибочного определения веса, когда порядок величины в несколько раз меньше или больше реального веса, в программе предусмотрена возможность коррекции значения.&lt;br /&gt;
&lt;br /&gt;
Настройка порядка цены деления весов доступна через главное меню '''Настройка''' &amp;gt; '''Параметры''' &amp;gt; '''Оборудование''', поле '''Порядок цены деления'''.&lt;br /&gt;
&lt;br /&gt;
Доступные значения поля '''Порядок цены деления''':&lt;br /&gt;
&lt;br /&gt;
'''0''' — 1 грамм;&lt;br /&gt;
&lt;br /&gt;
'''1''' — 10 грамм;&lt;br /&gt;
&lt;br /&gt;
'''2''' — 100 грамм.&lt;br /&gt;
&lt;br /&gt;
Таким образом, если весы показывают в 10 раз меньше, чем на самом деле, установите '''Порядок цены деления''' равным 1.&lt;br /&gt;
&lt;br /&gt;
== Настройка фискальных регистраторов ==&lt;br /&gt;
Все фискальные регистраторы должны вноситься в справочник '''[[Фирмы]]'''. Для корректной работы ФР необходимо регистрировать ее в налоговой с нужным признаком агента, а потом прописывать его в системе.&lt;br /&gt;
&lt;br /&gt;
=== Стационарные Штрих-М ===&lt;br /&gt;
&lt;br /&gt;
=== Облачные LIFE PAY ===&lt;br /&gt;
&lt;br /&gt;
=== Облачные Webkassa ===&lt;br /&gt;
&lt;br /&gt;
Для начала работы необходимо установить чековую службу с нужными параметрами и добавить фискальный регистратор, для которого указать логин и пароль от webkassa в поле Серийный номер через запятую, а также выбрать тип WebKassa&lt;br /&gt;
&lt;br /&gt;
Закрытие смены происходит через ЛК WebKassa&lt;br /&gt;
&lt;br /&gt;
== Мобильные устройства курьеров ==&lt;br /&gt;
Процесс выбора оборудования, установки и настройки приложения для мобильного устройства курьера подробно рассмотрен в статьях «[[Мобильное приложение курьера для Android]]» и «[[Мобильное приложение курьера для IPhone]]».&lt;br /&gt;
&lt;br /&gt;
== Подключение принтера по Wi-Fi ==&lt;br /&gt;
&lt;br /&gt;
=== Печать через WSD  ===&lt;br /&gt;
&lt;br /&gt;
В случаях, когда печать через WSD недоступна, драйвер не поддерживает стандартные функции печати.&lt;br /&gt;
Причина: WSD-порт не всегда корректно работает с потоковой печатью GDI. &lt;br /&gt;
Рекомендации:&lt;br /&gt;
Измените тип порта с WSD на TCP/IP. &lt;br /&gt;
 1) Откройте Панель управления → Устройства и принтеры.&lt;br /&gt;
 2) ПКМ на принтер → Свойства принтера → Порты.&lt;br /&gt;
 3) Нажмите Добавить порт → Стандартный TCP/IP-порт.&lt;br /&gt;
 4) Укажите IP-адрес принтера&lt;br /&gt;
 5) Выберите Тип устройства → Generic Network Card.&lt;br /&gt;
После создания порта — выберите его вместо WSD и примените. После этого WSD-порт можно удалить.&lt;br /&gt;
 Если принтер использует универсальный драйвер Windows (WSD), попробуйте установить PCL или PS драйвер от производителя вручную, указав IP-адрес.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15843</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15843"/>
				<updated>2026-02-27T09:43:38Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Пример 3: Отладка скрипта с работой с базой данных */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики [[Руководство_программиста|скриптов встроенного языка]].  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* Через меню '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик'''. &lt;br /&gt;
* Через меню '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''.&lt;br /&gt;
* Горячей клавишей '''Ctrl+Alt+D''' в главном окне приложения.&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Всегда есть возможность сохранить скрипт в файл.&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить в файл''' — Сохраняет текущий текст скрипта в файл. Если файл был сохранен ранее, по умолчанию предлагается предыдуший путь.&lt;br /&gt;
&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — Когда отладчик открыт без привязки к конкретному скрипту, то сохраняет изменения в файл. &lt;br /&gt;
 '''Важно!''' Если отладчик открыли например из '''Отчеты''' &amp;gt; '''Дополнительные возможности''' &amp;gt; '''Редактировать''' то сохранения через пункт '''Сохранить (Ctrl+S)''' сохранения '''всегда''' будет происходить в базу, в файл изменения сохранены не будут.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* [[Печатные формы|Скриптов из печатных форм]]&lt;br /&gt;
* [[Дополнительные_возможности|Скриптов из системных событий]]  &lt;br /&gt;
* [[Пользовательские_отчеты|Скриптов дополнительных возможностей]]&lt;br /&gt;
* [[Дополнительные услуги|Скриптов из дополнительных услуг]]&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+U''' || Двигать выбранный блок влево&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+I''' || Двигать выбранный блок вправо&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка работы с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=15807</id>
		<title>Дополнительные возможности</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=15807"/>
				<updated>2026-02-10T07:50:30Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Скрипты */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Настройка для печатной документации ==&lt;br /&gt;
&lt;br /&gt;
'''CustomGivnAct''' - Функция позволяет заменить печатную форму, акта передачи материальных ценностей (печать из выдачи) на пользовательскую. Включить использование этой возможности можно в переменных &amp;quot;Справочники&amp;quot; -&amp;gt; &amp;quot;Переменные&amp;quot; -&amp;gt; &amp;quot;Печать&amp;quot; -&amp;gt; &amp;quot;Акты передачи курьеру&amp;quot; -&amp;gt; &amp;quot;Печатная форма акта: Пользовательская&amp;quot;.&lt;br /&gt;
Объявленные переменные&lt;br /&gt;
%code% - коды записей в выдаче которые необходимо распечатать&lt;br /&gt;
%docdate% - дата установленная в выдаче&lt;br /&gt;
%dockurier% - ФИО курьера показанного в выдаче&lt;br /&gt;
%dockurierfull% - Значение выбранного элемента в дереве (если есть выбранный узел дерева , иначе фио курьера)&lt;br /&gt;
&lt;br /&gt;
Пользовательская форма акта, будет печататься только по заказам со статусом &amp;quot;На руках&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''OnBeforePrintNakls''' - Вызывается перед печатью накладных, содержит %code% - коды всех адресов  (через запятую).&lt;br /&gt;
&lt;br /&gt;
'''OnAfterPrintNakls''' - Вызывается после печати накладных, содержит %code% - коды всех адресов  (через запятую).&lt;br /&gt;
&lt;br /&gt;
'''OnBeforePrintOneNakl''' - Вызывается перед печатью накладной, содержит %code% - код адреса.&lt;br /&gt;
&lt;br /&gt;
'''OnAfterPrintOneNakl''' - Вызывается после печати накладной, содержит %code% - код адреса.&lt;br /&gt;
&lt;br /&gt;
'''OnBeforePrintSticker''' - Вызывается перед печатью наклейки, содержит %code% - код адреса, %barcode% - ШК наклейки.&lt;br /&gt;
&lt;br /&gt;
'''OnAfterItemPrint''' - Вызывается после печати наклейки из карточки номенклатуры. Поддерживает поля ввода - input. Содержит %code% - код номенклатуры item.code, %Naimen% - наименование, %country% - название страны, %Count% - указанное количество копий к печати.&lt;br /&gt;
&lt;br /&gt;
'''PrintCustomSticker''' - Функция позволяет установить пользовательскую печатную форму для наклеек (из интерфейса &amp;quot;Печать ведомостей/наклеек&amp;quot;). Вызывается если выбран тип наклейки 15 (переменная StickerForm). Содержит %RectLeft%, %RectTop%, %RectRight%, %RectBottom% - границы прямоугольника на холсте принтера, в которые надо печатать (для поддержки табличной печати на A4), %RecNumber% - номер текущей записи датасета, %CurrentBarCode% - ШК, рассчитанный в зависимости от параметров в интерфейсе &amp;quot;Печать ведомостей/наклеек&amp;quot;.  %ACopyNo% - номер копии, нумерация с 1. %KolvoStr% - Стандартный текст &amp;quot;текущее место/всего мест&amp;quot;, с учетом возможной печати этикетки на одно место из нескольких. Также содержит весь датасет, использующийся в других типах наклеек. В момент вызова функции, принтер уже запущен и начат документ, объект TPrinter в функции создавать не нужно, необходимо только создать объект TCanvas, он создастся как ссылка на текущий холст принтера.&lt;br /&gt;
&lt;br /&gt;
'''PrintItemSticker''' - Вызывается перед печатью наклейки из карточки номенклатуры, для возможности распечатать уникальную наклейку для номенклатуры по заложенным в допвозможности условиям. Содержит %clientbar% - ШК наклейки. Если наклейка распечатана из допвозможности возвращает true, в противном случае false и будет распечатана стандартная наклейка, заложенная в системе&lt;br /&gt;
&lt;br /&gt;
'''ChangeSchetDetailQuery''' - Вызывается формировании / пересчете счета. Возвращает строку разбитую через CRLF на две. Первая строка заменяет поля в запросе по детализации счета, вторая меняет строку группировки. Обязательные поля: zakazcnt - кол-во заказов, price - стоимость курьерских услуг, cnt - количество, pr - общая стоимость курьерских услуг.&lt;br /&gt;
&lt;br /&gt;
'''OnAutoPrintManSticker''' - вызывается перед автопечатью сопроводительного документа к манифесту при заполнении номера пломбы (такая возможность включается уставкой печатаемой формы в переменной AutoPrintManSticker), содержит %code% - код манифеста, %mnf_date% - дату манифеста, %transporter% - код перевозчика, %store% - код филиала-получателя манифеста. Если доп.возможность возвращает true - автопечать происходит, false - нет.&lt;br /&gt;
&lt;br /&gt;
'''OnBeforePrintAddresses''' - Вызывается из формы печати ведомостей/наклеек после нажатия на кнопку &amp;quot;ОК&amp;quot;, содержит %code% - коды всех адресов  (через запятую).&lt;br /&gt;
&lt;br /&gt;
== Настройка всплывающих окон==&lt;br /&gt;
&lt;br /&gt;
'''OnGivnStateChanged''' - Вызывается в транзакции при изменении статуса выдачи. В параметре %code% указан код выдачи. В %pickupDocId%  указан код на таблицу docs, документ приема забранных корреспонденций у курьера (доска приема при закрытии забора). Переменная %RetNotScanned% принимает значение true, если при установленной переменной &amp;quot;Запрашивать возвратные документы при приеме&amp;quot; = &amp;quot;Требовать маркировки наклейкой&amp;quot; пользователь не стал сканировать наклейку.&lt;br /&gt;
&lt;br /&gt;
'''OnAfterGivnStateChanged''' - Вызывается после транзакции, при изменении статуса выдачи. В параметре %code% указан код выдачи. В %pickupDocId%  указан код на таблицу docs, документ приема забранных корреспонденций у курьера (доска приема при закрытии забора)&lt;br /&gt;
&lt;br /&gt;
'''OnBeforeAddressSave''' - Вызывается перед сохранением изменений в карточке корреспонденции. Код выполняется не в транзакции и есть возможность показывать диалоговые окна. В качестве параметра передан объект fieldlist (объект полный аналог addressrecord в доп. услугах). . Если результат функции -1, то происходит отмена сохранения без ошибки (abort). &lt;br /&gt;
&lt;br /&gt;
'''OnBeforeBaseSave''' - Вызывается перед сохранением изменений в карточке срочного заказа. Код выполняется не в транзакции и есть возможность показывать диалоговые окна. В качестве параметра передан объект fieldlist (объект полный аналог таблицы base). Теги %date_put%, %time_put%, %message% - содержат дату вручения, время вручения и инфо о доставке соответственно. Если результат функции -1, то происходит отмена сохранения без ошибки (abort). &lt;br /&gt;
&lt;br /&gt;
'''OnAfterAddressSave''' - Вызывается после сохранения карточки корреспонденции в транзакции. Тег %code% - равен коду адреса; %Form3FrameMode% равен 1, если корреспонденция заполняется из интерфейса: &amp;quot;Функции - Ввод заявок по фото&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''OnBarScan''' - Скриптовая обработка штрих-кода перед поиском&lt;br /&gt;
&lt;br /&gt;
'''AfterAddressAcceptance''' - Событие после приема корреспонденции на склад (например,заказы - прием корреспонденции).  Код выполняется не в транзакции и есть возможность показывать диалоговые окна. Содержит %Code% - код адреса, %StrBarCode% - отсканированный штрих-код. При вызове из интерфейса доски приема либо приема корреспонденции передается дополнительный тег %NewMass%, который содержит массу проставленную весами, содержит -1 если проставление массы отключено.&lt;br /&gt;
&lt;br /&gt;
'''BeforeAddressAcceptance''' - Событие перед приемом корреспонденции на склад (например,заказы - прием корреспонденции). Код выполняется в транзакции. Содержит %Code% - код адреса; %StrBarCode% - отсканированный штрих-код; %mass% - массу, если значение меньше 0 значит весы выключены; %l%, %w%, %h% - габариты; %MultiBarCode% - истина если это наклейка на место; %SetKolvo% - проставлять принятые места, место может быть уже принято; %ClientCode% - код клиента (clients.code); %PackCode% - код места (packages.code)  . Если функция возвращает значение больше 0, то это будет новой массой места или корреспонденции.&lt;br /&gt;
&lt;br /&gt;
'''OnAddToShippingPlace''' - событие после добавления корреспонденции в мешок манифеста. Код выполняется в транзакции. Содержит %сode% - код адреса, %BarCode% - штрих код который отсканировали,%ShippingPlace% - код мешка&lt;br /&gt;
&lt;br /&gt;
'''GetTypeShippingPlace''' - событие перед добавлением корреспонденции в мешок манифеста. Задача события распределить корреспонденцию между мешками. Результат функции код мешка, в который необходимо поместить корреспонденцию. Содержит  %сode% - код адреса.&lt;br /&gt;
&lt;br /&gt;
'''OnBeforePlanToManifest''' - событие перед планированием корреспонденции в манифест. Предназначено для дополнительных проверок. Выполняется до транзакции. Содержит %code% - код манифеста, %AddrList% - список кодов адресов через запятую. Объявление события отменяет системную проверку на возможность доставки адреса филиалом получателя, ее нужно реализовывать в этом событии.&lt;br /&gt;
&lt;br /&gt;
'''OnBeforeScanToManifest''' - событие перед добавлением корреспонденции в мешок манифеста. Предназначено для дополнительных проверок. Выполняется до транзакции. Содержит %code% - код манифеста, %Address% - код помещаемого адреса&lt;br /&gt;
&lt;br /&gt;
'''OnBeforePlanning''' - событие перед планированием одного или нескольких отправлений на курьера. Содержит %сode% - код курьера, %AddressCodes% - код(ы) планируемых корреспонденций.  &lt;br /&gt;
&lt;br /&gt;
'''OnAfterPlanning'''- событие после планирования планированием одного или нескольких отправлений на курьера. Содержит %сode% - код курьера, %AddressCodes% - код(ы) фактически запланированных корреспонденций.  &lt;br /&gt;
&lt;br /&gt;
'''DAILY''' - задание выполняемое один раз в день&lt;br /&gt;
&lt;br /&gt;
'''OnGivnKurierStateChanged''' - событие вызывается после изменений данных со слов курьера (статуса, времени или причины недоставки). Вызывается даже при получении данных из мобильного приложения курьера. В событии запрещено показывать диалоги, т.к. это может остановить синхронизацию данных с ЛК. Содержит %сode% - код выдачи.&lt;br /&gt;
&lt;br /&gt;
'''OnBeforeGivnStatus''' - событие срабатывает перед установкой статуса выдачи, не в транзакции. В параметре %code% указан код выдачи, %status% - устанавливаемый статус,%kurier% - код курьера, %date% - дата выдачи, %address% - код  адреса&lt;br /&gt;
&lt;br /&gt;
'''OnBeforeClientSave''' - событие срабатывает перед сохранением изменений в карточке клиента. Код выполняется не в транзакции и есть возможность показывать диалоговые окна. В качестве параметров переданы %code% (содержит код клиента) и объект fieldlist (полный аналог addressrecord в доп. услугах), который содержит ещё не сохранённую информацию о карточке клиента, а так же все её пользовательские поля. Если результат функции -1, то происходит отмена сохранения без ошибки (abort).&lt;br /&gt;
&lt;br /&gt;
'''OnAfterClientSave''' - событие срабатывает после сохранения изменений в карточке клиента. Код выполняется в транзакции. В качестве параметров переданы %code% (содержит код клиента) и объект fieldlist (полный аналог addressrecord в доп. услугах), который содержит сохранённую информацию о карточке клиента, а так же все её пользовательские поля с предыдущими значениями, которые можно получить через функцию _Former('VarCode', значение, 'VarValue')&lt;br /&gt;
&lt;br /&gt;
'''OnBeforeBasePutCheck''' - событие срабатывает при проставлении галки на вкладке срочных заказов. Код выполняется не в транзакции и есть возможность показывать диалоговые окна. В параметре &amp;lt;nowiki&amp;gt;%code%&amp;lt;/nowiki&amp;gt; указан код срочного заказа, а в параметре &amp;lt;nowiki&amp;gt;%BasePutCheckType%&amp;lt;/nowiki&amp;gt; указан тип проставления: 0 - если галка, 1 - если плюс. Если результат функции -1, то отмена выполняемой функции (abort).&lt;br /&gt;
&lt;br /&gt;
'''OnAfterCreateSpecialSMA''' - событие срабатывает после создания нового АПД для клиента. Код выполняется вне транзакции, потому есть возможность показывать диалоговые окна. В качестве единственного параметра %code% передается код созданного АПД.&lt;br /&gt;
&lt;br /&gt;
'''OnBeforeReturnIncome'''  - Событие перед приемом возврата на вкладке выдача. Код выполняется вне транзакции. Содержит %Code% - код адреса. Функция заполняет две переменные: ''$mass'' - масса возврата корреспонденции (проставляется только если значение переменной больше нуля, а если это значение больше массы корреспонденции, то будет использовано в качестве массы места) и ''$kurier'' - код вернувшего курьера (если пустое или равно нулю, то проставляется стандартный код курьера ВОЗВРАТ НА СКЛАД [15]).&lt;br /&gt;
&lt;br /&gt;
'''OnBeforeCreatePickup'''  - Событие перед созданием забора правой кнопкой мыши в списке заказов. Код выполняется вне транзакции. Содержит %Code% - код заказа. %FromCompany% - компания, у которой осуществляется забор (поле target), %FromAddress% - адрес забора&lt;br /&gt;
&lt;br /&gt;
'''AfterTicketAnswer'''  - Событие происходит после ответа на тикет. %code% - код сообщения, %TimeSpent% - кол-во потраченных минут, %ticket% - номер тикета. Доп. возможность может отключить стандартный ввод затраченного времени, для этого нужно вернуть любое значение.&lt;br /&gt;
&lt;br /&gt;
'''OnAfterTownSave''' - событие срабатывает после заведения нового населенного пункта через интерфейс справочника городов. Параметры: %code% - код населенного пункта, %name% - название населенного пункта, %city% - код региона (области).&lt;br /&gt;
&lt;br /&gt;
'''OnSetAddressState''' - событие срабатывает при изменении пользовательского статуса в карточке корреспонденции. Параметры: %State1% - текущий выбранный статус, %OldState1% - предыдущий выбранный статус, так же в доп. возможности доступен объект FieldList на корреспонденцию.&lt;br /&gt;
&lt;br /&gt;
'''OnBeforeManifestSave''' - событие, срабатывает перед сохранением в карточке манифеста, выполняется перед транзакцией потому можно показывать диалоговые окна. Параметры: %Code% - код манифеста, %StoreFromCode% - филиал-отправитель, %StoreCode% - филиал получатель, %SentDate% - дата отправки.&lt;br /&gt;
&lt;br /&gt;
'''OnAfterManifestSave''' - событие, срабатывает после сохранения в карточке манифеста, выполняется в транзакции потому показывать диалоговые окна нельзя. Параметры: %Code% - код манифеста, %StoreFromCode% - филиал-отправитель, %StoreCode% - филиал получатель, %SentDate% - дата отправки.&lt;br /&gt;
&lt;br /&gt;
== Настройка документов ==&lt;br /&gt;
'''CustomAddressPrnForm2''' - Кастомная реализация упрощенной печатной формы. В карточке заказа установлена галка Простые, и установлена переменная &amp;quot;Справочники&amp;quot; -&amp;gt; &amp;quot;Переменные&amp;quot; -&amp;gt; &amp;quot;Печать&amp;quot; -&amp;gt; &amp;quot;Упрощенные печатные формы&amp;quot; -&amp;gt; &amp;quot;Тип упрощенной печатной формы: 5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''GetTypeShippingPlace'''  - Выполняется при помещении корреспонденции в мешок манифеста. Содержит %code%  - код корреспонденции. Возвращаемое значение это код мешка (shippingpalce.code), если его указать , то это изменит мешок, в который будет помещена корреспонденция.&lt;br /&gt;
&lt;br /&gt;
'''OnShelvingBarScan''' - Обработка отсканированного штрих-кода при комплектации.&lt;br /&gt;
&lt;br /&gt;
'''AdditionalStringForSMA''' - задает дополнительные условия для формирования АПД (наиболее часто: разделения актов на нал. и безнал, помимо этого практически неограниченные возможности по изменению условий для отбора корреспонденций в акт, учета их доставленности и т.п.) Содержит %code% - код клиента, переменную %ActPayType% со значениями типов оплаты входящих в акт отправлений: &amp;quot;nal&amp;quot; - наличный, &amp;quot;bnal&amp;quot;- безналичный,&amp;quot;all&amp;quot; - все, а ткаже %ActDateTo% - с датой, до которой создается акт. Может возвращать строку, разделенную символами переноса строки. (На 17.09.2021 в возвращаемой строке предусмотрен 1 символ переноса, т.е. строка состоит из двух частей.) В этом случае часть строки до первого переноса будет использоваться в запросе как доп. условие отбора, часть строки после первого символа пеерноса - в качестве дополнительного условия для определения &amp;quot;выполненности&amp;quot; доставки (поле specialsma.Made). С помощью второго модификатора можно сделать например так, чтобы корреспонденции с незаполненными датой/временем вручения считались доставленными. &lt;br /&gt;
&lt;br /&gt;
'''CustomBillDetaling''' - Кастомная детализация счета. Установка переменной $CancelCustomDetail в true, включает вывод стандартной детализации. В переменной $schet - код счета по которому строится детализация.&lt;br /&gt;
&lt;br /&gt;
'''OnSchetChanged'''  - Выполняется при удалении счета и его изменении. Содержит %code% - код счета schet.code&lt;br /&gt;
&lt;br /&gt;
'''QRCodePurpose'''  - задает строку &amp;quot;Назначение платежа&amp;quot; (тэг &amp;quot;Purpose&amp;quot;) в платежном QR-коде счета. По умолчанию &amp;quot;Курьерские услуги&amp;quot;. Содержит %code% - код счета schet.code, %Source% - код клиента clients.code&lt;br /&gt;
&lt;br /&gt;
'''ExceptionsForAPK'''  - Задает дополнительные критерии поиска корреспонденции при формировании акта передачи корреспонденции(АПК). Содержит %Boxes% - псевдоним таблицы вложений используемый в запросе. Функция возвращает !ДВЕ! части sql запроса разделенных CRLF. При отборе в АПК используется два запроса. Первый  - отбирает не доставленные заказы и возвраты документов, в него будет подставлено условие слева от разделителя CRLF. Второй запрос отбирает возращенные товары, в него будет подставлено условие справа от разделителя CRLF или вся строка условий если в строке нет разделителя CRLF (оставлено для обратной совместимости, в версии программы до 1115 фильтрация была только во втором запросе). %AdditionalParam% - дополнительный параметр, который можно установить в интерпретаторе при вызове функции CreateAddressTransferAct.&lt;br /&gt;
  пример кода по умолчанию, фильтр только по второму запросу,   вложение с названием &amp;quot;Доставка&amp;quot;  - не попадает в АПК&lt;br /&gt;
  &amp;lt;NOWIKI&amp;gt;&amp;lt;?&amp;gt;&lt;br /&gt;
   SET($ExcStr,' and %Boxes%.Name not like ''%Доставка%'' '); &lt;br /&gt;
   $ExcStr&amp;lt;/NOWIKI&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  пример для изменения фильтрации сразу у двух запросов:&lt;br /&gt;
  &amp;lt;NOWIKI&amp;gt;&amp;lt;?&amp;gt;&lt;br /&gt;
    SET($WHERE1,''); rem('условие отбора не доставленных и возврата документов');&lt;br /&gt;
    SET($WHERE2, ''); rem('условие отбора возврата товаров');&lt;br /&gt;
    $WHERE1 + CHAR(13) + CHAR(10) + $WHERE2&amp;lt;/NOWIKI&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OnOrderCountCalc''' -Для расчета стоимости доставки необходимо учитывать кол-во отправлений. Доп. возможность возвращает часть SQL запроса, уточняющий условия поиска. Содержит %code% - равен значению переменной &amp;quot;Считать кол-во отправлений по текущему месяцу&amp;quot; (UseCurrentMonthCount, нет - 0, да - 1)&lt;br /&gt;
&lt;br /&gt;
'''OnGetZakazCount''' - подменяет стандартный подсчет количества отправлений для расчета стоимости доставки (в том чисте отменяется вызов доп.возможности OnOrderCountCalc). Должна возвращать кол-во корреспонденций. В процедуру передаются следующие переменные: %CntAccType% - вид подсчета: 0-по заказу, 1-за месяц по клиенту; %code% - код клиента (обязателен для вида подсчета 1); %ZakazDate% - дата заказа; %CountByMonthType% - способ подсчета заказов за месяц (1-по текущему месяцу; 0 - по предыдущему); %UseCurrentUrgency% - 1:подсчитывать только корреспонденцию определенного режима срочности; %Mode% - этот режим срочности (при подсчете по заказу учитываются так же связанные режимы срочности, указанные в параметре 5 режима срочности в таблице статусов); %DatePut% - дата доставки (добавлено для альтернативных видов подсчета, может быть null); %SeparateIntercityDelivery% - 1:не учитывать междугородние доставки; В функцию так же передается объект fieldlist.&lt;br /&gt;
&lt;br /&gt;
'''OnSMABarcodeScan''' - событие вызывается при сканировании штрихкода АПК в списке актов. %code% - код АПК (sendmoneyact.code)&lt;br /&gt;
&lt;br /&gt;
'''OnPaintSMAColumns''' - вызывается при прорисовке таблицы в форме списка АПД/АПК. В функцию передается DataSet, содержащий поля таблиц SendMoneyAct и Clients, а так же пользовательские поля клиентов, называющиеся ufX, где X - номер поля (в статусах).  Функция должна возвращать строку следующей структуры:&lt;br /&gt;
Поле1_таблицы, Цвет_фона, Поле2_таблицы, Цвет_фона и т.п. Возврат нечетного числа параметров эквивалентен возврату пустой строки (цвет не меняется)&lt;br /&gt;
&lt;br /&gt;
'''CustomZPDetail''' - кастомное дополнение к детализации зарплаты (Специальная надбавка). Вызывается из скриптовой детализации зарплаты. Предназначено для расчета и вывода в детализацию значения какой-либо специальной надбавки, определенной пользователем. Входящие параметры: %code% - код платежа в таблице kurier_pays, %kurier% - код курьера. Возвращает строку, где через запятую указаны Название надбавки и ее значение. Если эта строка не содержит двух параметров - ничего не выводится.&lt;br /&gt;
&lt;br /&gt;
'''ZPAdditionalSheets''' - кастомное дополнение к детализации зарплаты - дополнительный лист(листы) на форме детализации. В функцию передается DataSet из детализации зарплаты, ссылка на объект Excel (имя - xl). Внутри функции нельзя объявлять объект TSelfAdo с именем DB (он объявлен в детализации). Номер новой страницы Excel передается в переменной $page.&lt;br /&gt;
&lt;br /&gt;
'''OnAddrInventoryAfterCreateDoc''' - вызывается в транзакции, в процедуре создания документа инветаризации корреспонденции.  Входящие параметры: %code% - код созданного документа инвентаризации. &lt;br /&gt;
&lt;br /&gt;
'''AddrInventoryAdditionalSQL''' - позволяет модифицировать запрос на создаваемый документ инвентаризации корреспонденции. Используется для наложения дополнительных фильтров.  Входящие параметры: %code% - код созданного документа инвентаризации. %header% - часть SQL запроса в которую необходимо сделать вставки, возможные варианты join, where. &lt;br /&gt;
Пример использования  '''AddrInventoryAdditionalSQL''', добавление фильтра по пользовательскому полю.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;SQL&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?&amp;gt;&lt;br /&gt;
 if('%header%'='join',  'left join userfields uf on uf.sourcecode=b.source and uf.sourcetable=2 and uf.varvalue=1',&lt;br /&gt;
 if('%header%'='where', 'and ifnull(uf.varvalue, &amp;quot;F&amp;quot;) = &amp;quot;T&amp;quot;'&lt;br /&gt;
 ,''))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
== Настройка вида маркера ==&lt;br /&gt;
Настройки находятся в &amp;quot;Отчеты&amp;quot; -&amp;gt; &amp;quot;Дополнительные возможности&amp;quot; - &amp;quot;Системные&amp;quot;. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
В функции передается объект Table2Map типа [[Руководство программиста#Объект TFieldObject|TFieldObject]]. Получить поля с примерами значений из него можно например так:&lt;br /&gt;
 showmessage(table2map._GETTABLEINFO)&lt;br /&gt;
(текст большое сообщения можно скопировать в буфер комбинацией Ctrl-C).&lt;br /&gt;
&lt;br /&gt;
Для доступа к данным пользуйтесь только этим объектом, т.к. любое обращение к базе приведет к значительному снижению скорости работы.&lt;br /&gt;
&lt;br /&gt;
Так же текущее состояние окна карты доступно через переменные:&lt;br /&gt;
&lt;br /&gt;
$PlanDate - Выбранная дата, на которую планируется.&lt;br /&gt;
&lt;br /&gt;
$KurierCode - Код выделенного курьера.&lt;br /&gt;
&lt;br /&gt;
$MetroCode - Код выделенной станции метро (маршрута).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что все ошибки, возникающие при отрисовке, подавляются системой. Поэтому, если вы допустите ошибку в скрипте, он просто не будет работать, никаких сообщений вы не увидите. Для отладочных целей можно заменить ошибки на сообщения такой конструкцией:&lt;br /&gt;
&lt;br /&gt;
 set($s, try( &lt;br /&gt;
  error('вот тут ошибка, которую вы увидите в виде сообщения');&lt;br /&gt;
 ));&lt;br /&gt;
 if($s, showmessage($s), '');&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MapObjectFigure''' - Доп. возможность позволяет установить вид маркера на карте. Результат определяет фигуру: 1 - перевернутый треугольник (острым концом вниз), 2 - треугольник, 3 - увеличенный перевернутый треугольник (острым концом вниз), чтобы  квадрат не мог его перекрыть, 4 - квадрат, 5 - ромб, все остальное круг. Ромб поддерживается с версии 960.&amp;lt;br/&amp;gt;&lt;br /&gt;
Например:&lt;br /&gt;
 if(table2map.zabor, 2, if(StrDateToFloat(table2map.DatePeriod) = $PlanDate, 3, 4))&lt;br /&gt;
Выводит треугольник, если отправление - забор. Иначе - если дата план отправления равна дате, на которую планируется - увеличенный перевернутый треугольник, иначе - квадрат.  &lt;br /&gt;
&lt;br /&gt;
'''MapObjectColor''' - Доп. возможность позволяет установить цвет маркера на карте.&lt;br /&gt;
При помощи данных параметров можно создать условия отображения маркеров.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для доступа к настройкам доступны переменные:&lt;br /&gt;
&lt;br /&gt;
$Color&lt;br /&gt;
&lt;br /&gt;
$DefaultColor&lt;br /&gt;
&lt;br /&gt;
$PlanedColor&lt;br /&gt;
&lt;br /&gt;
$SelectedPlanedColor&lt;br /&gt;
&lt;br /&gt;
$GetKurierColor&lt;br /&gt;
&lt;br /&gt;
Например: &lt;br /&gt;
 if((table2map.kurier&amp;lt;20)*(StrDateToFloat(table2map.DatePeriod) = $PlanDate), 16753920, $color)&lt;br /&gt;
Не запланированные отправления на текущий день будут отображаться выбранным цветом, иначе - цветом по-умолчанию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Речь диктора ==&lt;br /&gt;
&lt;br /&gt;
'''OnGivnVoice''' - выполняется после изменения статуса выдачи. Параметр &amp;lt;nowiki&amp;gt;%code%&amp;lt;/nowiki&amp;gt; содержит код выдачи, &amp;lt;nowiki&amp;gt;%State%&amp;lt;/nowiki&amp;gt; содержит код устанавливаемого статуса, &amp;lt;nowiki&amp;gt;%OldState%&amp;lt;/nowiki&amp;gt; - код старого статуса (0 если не было). Позволяет отключать стандартный звук ОК, если возвращает не 0.&lt;br /&gt;
&lt;br /&gt;
'''OnDashboardManifestVoice''' - выполняется после сканирования адреса в интерфейсе приёма манифестов. Параметр &amp;lt;nowiki&amp;gt;%code%&amp;lt;/nowiki&amp;gt; содержит код корреспонденции. Позволяет отключать стандартную диктовку программой (код курьера, вес и т.д.), если возвращает не 0.&lt;br /&gt;
&lt;br /&gt;
== Настройка мобильного приложения ==&lt;br /&gt;
&lt;br /&gt;
== Скрипты ==&lt;br /&gt;
'''OnEveryStartApp''' - выполняется при запуске программы.&lt;br /&gt;
&lt;br /&gt;
'''OnEveryCloseApp''' - выполняет при закрытии программы.&lt;br /&gt;
&lt;br /&gt;
'''OnBarScan''' - выполняется при получении ШК со сканера, в параметре %code% - получаем ШК. Если функция, что-то возвращает, то система будет использовать возвращенный ШК.&lt;br /&gt;
&lt;br /&gt;
'''OnMapBeforeGeolocation''' - Вызывается перед отображаем адреса на карте. В функцию передается объект fieldlist. &lt;br /&gt;
 Пример скрипта, переводящий адреса в НЕ найденные на карте, если станция метро НЕОПЕРЕДЕЛЕННАЯ.&lt;br /&gt;
 &amp;lt;NOWIKI&amp;gt;&amp;lt;?&amp;gt;&lt;br /&gt;
if(station=0, &lt;br /&gt;
  _set('lon', null);&lt;br /&gt;
  _set('lat', null);&lt;br /&gt;
  _set('searchCoordinate', 'F');&lt;br /&gt;
,0)&amp;lt;/NOWIKI&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''OnSyncInsert''' - Выполняется для каждой добавленной записи при синхронизации с ЛК. Содержит %tablename% - название синхронизируемой таблицы.&lt;br /&gt;
&lt;br /&gt;
'''OnSyncUpdate''' - Выполняется для каждой обновленной записи при синхронизации с ЛК. Содержит %tablename% - название синхронизируемой таблицы.&lt;br /&gt;
&lt;br /&gt;
 Если при получении новых адресов с ЛК, нужно поменять любое поле в таблице address, то необходимо использовать сразу два события OnSyncInsert и OnSyncUpdate. Адреса без вложений обрабатываются событием OnSyncInsert, адреса с вложениями будут обрабатываться событием OnSyncUpdate. Это связано с механизмом синхронизации, если в событии OnSyncInsert, проапдейтить поле в адресе с вложениями, то данные могут потеряться. &lt;br /&gt;
 Когда адрес без вложений, то у него сразу station = 65535 и можно апдейтить. Если с вложениями, то у него сначала station = 65534, а после синхронизации вложений есть отдельный апдейт на 65535. Пример кода, для апдейта поля в адресах, события OnSyncInsert и OnSyncUpdate:&lt;br /&gt;
 &amp;lt;NOWIKI&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
rem(ticket 23584, 23583); &lt;br /&gt;
if( ('%tablename%'='address'), &lt;br /&gt;
  query('UPDATE address a &lt;br /&gt;
    JOIN trace t ON t.address=a.code AND t.state=1 &lt;br /&gt;
    JOIN zakaz z ON z.code=a.zakaz&lt;br /&gt;
  SET &lt;br /&gt;
    a.mode = IF(z.source=646, 3, 2)&lt;br /&gt;
  WHERE &lt;br /&gt;
    a.code = %code%&lt;br /&gt;
    AND a.station=65535&lt;br /&gt;
    AND (&lt;br /&gt;
     (z.source=646 AND a.mode&amp;lt;&amp;gt;3) OR &lt;br /&gt;
     (A.DATE_PUTN=DATE(t.Statetime) AND a.mode=1) OR&lt;br /&gt;
     (A.DATE_PUTN=DATE_ADD(DATE(t.Statetime), INTERVAL 1 DAY) AND TIME(t.Statetime) &amp;gt; &amp;quot;21:59:59&amp;quot; AND a.mode=1)&lt;br /&gt;
    )')&lt;br /&gt;
, '');&amp;lt;/NOWIKI&amp;gt;&lt;br /&gt;
;&lt;br /&gt;
&lt;br /&gt;
'''OnCalcSalary''' - Событие происходит после начисления зарплаты курьеру.  %code% - код созданного начисления kurier_pays.code ; %dateto% - дата до которой рассчитали зарплату; И отдельно части зарплаты:  %profit%  -итоговая сумма; %Zarab% - сдельная часть; %Oklad% - оклад; %Friends% - выплаты за приведенных; %Other% - разное; %AgentMoney% - агентское вознаграждение;  %StandingMoney% - Доплата за стаж; %Bonus%, %Shtraf% - бонусы и штрафы.&lt;br /&gt;
&lt;br /&gt;
'''OnCalcAvans''' - Событие происходит после начисления аванса курьеру.  %code% - код созданного начисления kurier_pays.code. Можно произвести дополнительные начисления и удержания из kurier_pays.profit. &lt;br /&gt;
&lt;br /&gt;
'''OnTicketSetCusr''' - Пользовательский скрипт перед назначением ответственного в тикетах. %code% - код тикета; %Cusr% - код назначаемого пользователя (может быть равно NULL)&lt;br /&gt;
&lt;br /&gt;
'''OnCreateAddressForActDelivery''' - Пользовательский скрипт вызывающийся в момент формирования корреспонденции на доставку АПД/АПК. Позволяет существенно доработать формируемую корреспонденцию. %code% - код акта sendmoneyact.code, %Client%  - код клиента; %delivery% - флаг определяющий корр. на доставку акта (1, значение по умолчанию) или забор акта. fieldlist - объект с полями адреса (повторяет структуру таблицы address), dataset - объект дополнительными полями функции. Объект fieldlist является классом TMyFieldList и позволяет менять значения полей.  Также измененный адрес можно сохранить прямо в событии, или он будет сохранен автоматически после выполнения скрипта. Для сохранения адреса используйте метод _save. &lt;br /&gt;
&lt;br /&gt;
 Пример, для клиента с кодом 3360, в корреспонденцию на доставку АПК, добавляем список корреспонденций попавших в него во вложения.&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?&amp;gt;&lt;br /&gt;
 if((client=3360)*(ActType=2),&lt;br /&gt;
  rem('Ticket 70827, 2022-09-07 Anatoly and Sergey');&lt;br /&gt;
  set($addresscode, fieldlist._save);&lt;br /&gt;
  query('insert boxes (address, pos, name) &lt;br /&gt;
   select '+$addresscode+' AS address,  @q := @q + 1 AS pos,  &lt;br /&gt;
        CASE WHEN a.client_id &amp;lt;&amp;gt; '' THEN a.client_id WHEN a.strbarcode&amp;lt;&amp;gt;'' THEN a.strbarcode ELSE CONCAT(a.zakaz,&amp;quot;-&amp;quot;, a.number) END AS `name`&lt;br /&gt;
   FROM addressfld af&lt;br /&gt;
   JOIN address a ON a.code=af.`address` ,(SELECT @q := 0 ) p&lt;br /&gt;
   WHERE &lt;br /&gt;
    af.`AddrTransferCode` = %code% AND af.`ReceivedInTransfer` &amp;gt; 0');&lt;br /&gt;
 ,0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OnAfterPreassemblyScan''' - событие происходит после сканирования складского товара в корреспонденцию на вкладке «Склад». %code% - код корреспонденции, %ItemCode% - код товара, %ItemCnt% - количество отсканированного товара.&lt;br /&gt;
&lt;br /&gt;
'''OnGeocodeScript''' - скрипт подключения к геокодеру клиента. Используется при включенной переменной &amp;quot;Справочники&amp;quot; -&amp;gt; &amp;quot;Переменные&amp;quot; -&amp;gt; &amp;quot;Подключения&amp;quot; -&amp;gt; &amp;quot;Карты&amp;quot; -&amp;gt; &amp;quot;Геокодирование&amp;quot; -&amp;gt; &amp;quot;Протокол геокодирования: Клиентский (скрипт OnGeocodeScript)&amp;quot;. Имеет встроенные переменные:&lt;br /&gt;
*$address - адрес для геокодирования;&lt;br /&gt;
*$town - код города;&lt;br /&gt;
*$street и $home  - упрощенный адрес;&lt;br /&gt;
&lt;br /&gt;
Скрипт должен вернуть следующие переменные : &lt;br /&gt;
*$lon и $lat - координаты ;&lt;br /&gt;
*$goodaddress - нормализованный адрес (не обязательно);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;  &lt;br /&gt;
  set($response,  HTTPPOST('http://XXXXXXXX',&lt;br /&gt;
    '{&amp;quot;query&amp;quot;:'+ FormatTextJSON($address)+ '}', &lt;br /&gt;
    '','','','',&lt;br /&gt;
    'post', 'application/json', 10000));&lt;br /&gt;
  &lt;br /&gt;
  if($response!'',&lt;br /&gt;
    new('TJSON', 'json');&lt;br /&gt;
    set($e, try(&lt;br /&gt;
      json.SetText($response);&lt;br /&gt;
      json.OpenChild('geo_data');&lt;br /&gt;
      json.OpenChild('mid');&lt;br /&gt;
      set($lat, sqlfloat(json.ChildNodeValue('lat')));&lt;br /&gt;
      set($lon, sqlfloat(json.ChildNodeValue('lon')));&lt;br /&gt;
    ));&lt;br /&gt;
    if($e, error('Ошибка в разборе ответа: '+$e), '');&lt;br /&gt;
  , error('Пришел пустой ответ от геокодера')&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OnFilterAddressRecalc''' - Позволяет отфильтровать коды адресов, для которых можно пересчитать стоимость. Событие происходит перед расчетом стоимости доставки из интерфейса программы для: актов, счетов, заказов, и т.д. Не работает для пересчета запускаемого из самой карточки корреспонденции. &lt;br /&gt;
%codes% - коды адресов для пересчета стоимости доставки. Формат: (1,2,3,...). %RecalcUserCode% - код пользователя запустившего пересчет (актуально для отложенных пересчетов). &lt;br /&gt;
Функция должна вернуть коды адресов, допущенных к пересчету в формате: (1,2,3,...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
 rem('2023-12-04 Sergey.  Отключаем перерасчет стоимости доставки у корреспонденций в статусе - проверено,&lt;br /&gt;
  если у пользователя нет права Счета-изменять. Тикет 79954.&lt;br /&gt;
  Блокировка работает в связке с тикетом 77995.');&lt;br /&gt;
 new('TSelfADO', 'DB');&lt;br /&gt;
 DB.OPEN('SELECT a.code FROM courier.address a&lt;br /&gt;
  LEFT JOIN courier.users u ON u.code=%RecalcUserCode%&lt;br /&gt;
  LEFT JOIN courier.`userrules` ur ON ur.`GroupId`=u.grup AND ur.`RuleType`=1 AND  ur.newruleid =78  -- RSA&lt;br /&gt;
  WHERE ((a.state1&amp;lt;&amp;gt;8) OR (a.state1=8 AND ur.state=&amp;quot;T&amp;quot;)) AND a.code in %code%');&lt;br /&gt;
 DB.ParseForIn('CODE')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''OnRecalcBoldCntInFrame''' - срабатывает в карточке тарифа при перемещении курсора зоны. Возвращает целочисленное значение, равное количеству доставленных корреспонденций у клиента за предыдущий месяц. Срабатывает только при открытии карточки тарифа из карточки клиента. %ClientCode% - код клиента. %ZoneCode% - код зоны.&lt;br /&gt;
&lt;br /&gt;
'''ChangeStatusColor''' - подменяет цвет фона сообщения в строке статуса в форме приема корреспонденции. Возвращает целочисленное значение - новый цвет фона, 0 - если цвет менять не нужно. Входящие значения: %code% - входящее значение цвета. Остальные переменные - булевского типа - отражают состояние Настроек: %Renum% - Перенумеровывать, %IgnoreDblScan% - Игнорировать ошибки повторного сканирования, %PrintNakl% - Печатать накладные, %Given% - Выдавать отправления, %PrintFiles% - Печатать файлы, %BarLine% - Включить поддержку штрих-кодовой линейки, '%CreateTrans% - формировать кассовые чеки.&lt;br /&gt;
&lt;br /&gt;
'''GetLusrSQL''' - переопределяет столбец &amp;quot;Изменивший пользователь&amp;quot; в истории изменений. Должен возвращать часть SQL запроса для столбца lusr. Входящее значение %code% содержит код таблицы, для которой строится SQL-запрос истории.&lt;br /&gt;
&lt;br /&gt;
'''OnBeforeSendSMS''' - выполняется перед рассылкой шаблона СМС. Содержит в себе %MessageText% - текст сообщения отправляемого по шаблону, %Phone% - номер телефона. Если возвращает значение -1, отправка стандартными средствами не происходит.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''TariffCalculatorTotal''' - функция для настройки простой формы тарификатора. Работает в двух режимах: sql - запрос для построения грида. В режиме доступны теги: %ClientCode%' - код клиента, '%PriceCode%' - код прайса клиента. Столбцы SQL запроса строго фиксированы: code - код поля, fieldname - название поля, costparams - варианты цен через запятую (для отображения комбобокса), modlist - список названий для разных цен через запятую,  modvalue - выбраный элемент. Второй режим это формула расчета строки, в этом режиме доступен dataset со всеми ранее рассчитанными строками и теги  '%FieldCode%',    '%Cost%', '%Quantity%', '%ClientCode%', '%PriceCode%', '%DefaultTotal%'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
if('%code%'='sql',&lt;br /&gt;
   '(SELECT s.statecode AS code,                            -- код поля&lt;br /&gt;
      s.name AS fieldname,                                 -- название поля&lt;br /&gt;
      IFNULL(uf.varvalue, &amp;quot;&amp;quot;) AS costparams,               -- варианты цен через запятую (для отображения комбобокса) &lt;br /&gt;
      IFNULL(unquotedstr(getparam(s2.advansed, 3)), &amp;quot;&amp;quot;) AS modlist, -- список названий для разных цен через запятую  &lt;br /&gt;
      IFNULL(mods.`varValue`, '''') AS modvalue -- выбраный элемент &lt;br /&gt;
      FROM states s&lt;br /&gt;
      LEFT JOIN userfields uf ON uf.sourcetable=11 AND uf.sourcecode=%PriceCode% AND uf.varcode=s.statecode&lt;br /&gt;
      LEFT JOIN userfields AS mods ON mods.`sourceCode`=%ClientCode%&lt;br /&gt;
        AND mods.sourcetable=2 AND mods.varcode = CAST(uf.varcode AS SIGNED) - 20 AND mods.`varCode` IN (10,11) &lt;br /&gt;
      LEFT JOIN states s2 ON s2.statetype=35 AND s2.`StateCode`=mods.`varCode` &lt;br /&gt;
      WHERE s.statetype=45 &lt;br /&gt;
        AND IFNULL(s.hidden,&amp;quot;F&amp;quot;)=&amp;quot;F&amp;quot;&lt;br /&gt;
        AND getparam(s.advansed, 1) &amp;lt;&amp;gt; &amp;quot;0&amp;quot; &lt;br /&gt;
      ORDER BY s.statecode)&lt;br /&gt;
      union            (SELECT 1000,&amp;quot;ПОДДЕРЖКА&amp;quot;, &amp;quot;1,2,3&amp;quot;,  &amp;quot;Поддержка 1, Поддержка 2, Поддержка 3&amp;quot;,&amp;quot;&amp;quot; )        &lt;br /&gt;
      '&lt;br /&gt;
,&lt;br /&gt;
  if(%FieldCode%=1000,&lt;br /&gt;
 &lt;br /&gt;
    case(&lt;br /&gt;
      when(%Cost%=1, &lt;br /&gt;
        100&lt;br /&gt;
      );&lt;br /&gt;
      when(%Cost%=2,&lt;br /&gt;
        200 &lt;br /&gt;
      );&lt;br /&gt;
      when(%Cost%=3,&lt;br /&gt;
       300&lt;br /&gt;
      );&lt;br /&gt;
    )&lt;br /&gt;
  , &lt;br /&gt;
    %cost%*%Quantity%&lt;br /&gt;
  )      &lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15772</id>
		<title>Руководство программиста</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15772"/>
				<updated>2026-01-16T13:26:11Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Объект TBase */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Основные положения ==&lt;br /&gt;
&lt;br /&gt;
В систему «MEASOFT» встроен внутренний интерпретируемый язык программирования. Среда состоит из базовой функциональности, и дополнительно создаваемых объектов. Некоторые объекты автоматически создаются средой перед запуском интерпретатора для предоставления доступа к контексту, в котором работает скрипт. Все типы данных приводятся друг к другу автоматически, иногда при необходимости можно использовать функции приведения типов. &lt;br /&gt;
&lt;br /&gt;
Как интерпретатор приводит типы:&lt;br /&gt;
&lt;br /&gt;
1.	При использовании значения как параметр функции интерпретатор автоматически приводит значение к типу, необходимому функции.&lt;br /&gt;
&lt;br /&gt;
2.	При операциях сложения, а также логических операциях, операнды приводятся к строке если хотя бы один из них имеет тип «строка». Например:&lt;br /&gt;
3.3+5		-&amp;gt;  8.3&lt;br /&gt;
‘3.3’+5		-&amp;gt;  ‘3.35’&lt;br /&gt;
подобную проблему можно решить принудительно преобразовав тип:&lt;br /&gt;
float(‘3.3’)+5	-&amp;gt;  8.3&lt;br /&gt;
&lt;br /&gt;
3.	При операциях умножения, деления и вычитания операнды приводятся к числу с плавающей точкой, однако если результат выполнения операции получается целым числом, то он приводится к целочисленному типу.&lt;br /&gt;
&lt;br /&gt;
Как работают функции приведения типов:&lt;br /&gt;
&lt;br /&gt;
1.	При преобразовании строки к числу: функция «читает» строку до первого символа, не позволяющего создать число с плавающей точкой, при этом разделителем целой и дробной частей может быть как точка так и запятая. Если приведение производится к целочисленному типу, то после этого происходит округление. Например:&lt;br /&gt;
float('3.6qwerty735')	-&amp;gt;  3.6&lt;br /&gt;
int('3.6qwerty735')	-&amp;gt;  4&lt;br /&gt;
&lt;br /&gt;
2.	При преобразовании к булевому типу ложью считается пустая строка либо число 0, все остальное - истина&lt;br /&gt;
&lt;br /&gt;
3.	При преобразовании булевого типа к числу истина преобразуется в 1, ложь – в 0. Такое преобразование позволяет использовать сложение и умножение в качестве логических «ИЛИ» и «И» соответственно:&lt;br /&gt;
if((5=5)+(6=7), &amp;lt;a&amp;gt;, [b]) – условие истинно, выполнится код «a».&lt;br /&gt;
&lt;br /&gt;
4.	При преобразовании булевого типа к строке сначала происходит преобразование к числу:&lt;br /&gt;
(5=5)+'qwerty'	-&amp;gt;  ‘1qwerty’&lt;br /&gt;
&lt;br /&gt;
== Описание синтаксиса ==&lt;br /&gt;
&lt;br /&gt;
Команды разделяются точкой с запятой. Параметры функций разделяются запятыми. Каждая команда (даже цикл while) является функцией, возвращающей некоторое значение. Результатом выполнения составной команды (последовательности функций, разделенных точкой с запятой), является результат выполнения последней функции. Имена переменных, функций, объектов, а также их свойств и методов не чувствительны к регистру.&lt;br /&gt;
Константы: константы бывают целочисленными, дробными и строковыми. Значения целочисленных и дробных констант указываются «как есть» (в этом случае разделитель целой и дробной частей – точка), шестнадцатеричные значения начинаются с символа «$» и, если первая цифра – буква, она упреждается цифрой 0, а строковые – в одинарных кавычках. При этом, если внутри строковой константы встречается символ одинарной кавычки он должен быть задвоен, для указания интерпретатору того, что он не является признаком конца константы.&lt;br /&gt;
Операции сравнения: &amp;gt;, &amp;lt;, =, !  - Больше, меньше, равно, не равно соответственно.&lt;br /&gt;
Логические операции: + (ИЛИ), *  (И).&lt;br /&gt;
Арифметические операции: +, -, *, /&lt;br /&gt;
Операция конкатенации строк: +&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Функциональность базового объекта ===&lt;br /&gt;
&lt;br /&gt;
'''SET($a, a)''' – присваивает переменной (1-й параметр) значение второго параметра. При отсутствии переменной – создает ее. Имена переменных должны начинаться с символа «$», а следующий символ не должен быть цифрой. Возвращает новое значение переменной. Функция используется только для задания значений переменных. Не допускается использования для задания значений свойств объектов. Для этого используются соответствующие методы этих объектов.&lt;br /&gt;
&lt;br /&gt;
'''IF(a,b,c)''' или '''IF(a,b)'''  – Условный оператор. В первом случае возвращает b, если a истинно (не равно нулю или пустой строке), иначе – c. Во втором случае – возвращает a, если оно истинно, иначе – b.&lt;br /&gt;
&lt;br /&gt;
'''WHILE(a, b)''' – Оператор цикла. Выполняет b пока a истинно:&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i&amp;gt;0, set($sum, $sum+$i); set($i, $i-1));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''FOR($a, b, c, d)''' – Оператор цикла. Выполняет d пока $a последовательно присваиваются значения от b до с включительно:&lt;br /&gt;
	set($sum, 0);&lt;br /&gt;
for($i, 1, 10, set($sum, $sum+$i));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''NEW(ClassName, InstanceName)''' – Создает экземпляр класса ClassName, назначает ему имя InstanceName. Возвращает порядковый номер созданного объекта. Доступ к свойствам и методам объектов осуществляется по имени объекта и имени свойства/метода, разделенным точкой. Именем объекта может быть и пустая строка, тогда доступ к его свойствам и методам будет осуществляться без указания имени, и, в случае совпадения имен свойств и/или методов со стандартными или свойствами/методами других объектов, использоваться будут соответствующие свойства/методы объекта, созданного ранее, а также такой объект невозможно уничтожить до окончания выполнения скрипта. Все объекты созданные во время выполнения скрипта уничтожаются автоматически после окончания его выполнения.&lt;br /&gt;
&lt;br /&gt;
'''FREE(InstanceName)''' – Уничтожает объект с именем InstanceName. Возвращает 0. В случае отсутствия объекта с заданным именем вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
'''ShowObjects''' – Возвращает список созданных объектов – названия классов и имена.&lt;br /&gt;
&lt;br /&gt;
'''ERROR(message)''' – Вызывает ошибку с текстом message.&lt;br /&gt;
&lt;br /&gt;
'''SHOWMESSAGE(message)''' – Отображает диалоговое окно с текстом message, останавливает выполнение скрипта до закрытия окна пользователем.&lt;br /&gt;
&lt;br /&gt;
'''SimpleAskUser(Message)''' – Выводит диалоговое окно с текстом Message и кнопками «Да» и «Нет». Возвращает 1, если  пользователь нажал кнопку «Да», иначе – 0.&lt;br /&gt;
&lt;br /&gt;
'''TRY(a)''' – Выполняет a в «защищенном от ошибки» режиме. Если в процессе выполнения a возникает ошибка, возвращает текст ошибки, иначе – 0 (ложь).&lt;br /&gt;
&lt;br /&gt;
'''REM(….)''' – Код в скобках игнорируется (комментарий).&lt;br /&gt;
&lt;br /&gt;
'''EXEC(FileName, Params, Wait, WindowState)''' – Запускает внешнее приложение FileName с параметрами Params. Если Wait истинно – ожидает завершение процесса. Для WindowState доступны следующие числовые значения:&lt;br /&gt;
	0 - SW_HIDE&lt;br /&gt;
	1 - SW_SHOWNORMAL (по-умолчанию)&lt;br /&gt;
	3 - SW_MAXIMIZE&lt;br /&gt;
	6 - SW_MINIMIZE&lt;br /&gt;
Функция возвращает истину если приложение запущено успешно. Иначе – Ложь.&lt;br /&gt;
В случае успеха, при параметре Wait – истина кладет в переменную $LastResult код завершения приложения.&lt;br /&gt;
&lt;br /&gt;
'''CASE''' - Оператор множественного выбора. Позволяет выполнить одно из нескольких действий в зависимости от условий. Синтаксис:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
  case(&lt;br /&gt;
    when(условие1, действие1);&lt;br /&gt;
    when(условие2, действие2);&lt;br /&gt;
    ...&lt;br /&gt;
    else(действие_по_умолчанию);&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 50);&lt;br /&gt;
&lt;br /&gt;
showmessage(&lt;br /&gt;
  case(&lt;br /&gt;
    when($a &amp;lt; 5, 50);&lt;br /&gt;
    when($a &amp;lt; 10, 100);&lt;br /&gt;
    when($a &amp;lt; 250, 200);&lt;br /&gt;
    else($a*$b);&lt;br /&gt;
  )  &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''AttachDebugger''' - Команда позволяет подключить открытый [[Отладчик_встроенных_скриптов]] к текущему скрипту. Команда AttachDebugger должна быть '''первой командой''' в скрипте. Добавьте её в самое начало скрипта:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Как работает:'''&lt;br /&gt;
# При выполнении команды AttachDebugger скрипт останавливается.&lt;br /&gt;
# Отладчик автоматически подключается к выполняющемуся скрипту.&lt;br /&gt;
# Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
# Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Если режим отслеживания не включён, команда `AttachDebugger` игнорируется.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Команда AttachDebugger должна быть первой командой в скрипте.&lt;br /&gt;
&lt;br /&gt;
=== Строковые функции ===&lt;br /&gt;
&lt;br /&gt;
'''UpCase(s)''' – возвращает строку s в верхнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''LCase(s)''' – возвращает строку s в нижнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''Len(s)''' – возвращает количество символов в строке s.&lt;br /&gt;
&lt;br /&gt;
'''Pos(s, substr [,start])''' – возвращает номер первого символа первого включения подстроки substr в строку s, возвращает 0, если включения подстроки отсутствуют. Параметр start - это позиция старта поиска, не обязательный параметр, по умолчанию равен 1. Поиск не чувствителен к регистру.&lt;br /&gt;
&lt;br /&gt;
'''Param(s, i)''' – возвращает i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''ParamsCount(s)''' - возвращает количество элементов строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''SetParam(s, p, i)''' – заменяет на значение p i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''Left(s, i [,full] )''' – возвращает i первых символов строки s. Параметр i, может быть строкой, тогда он считается разделителем и функция, возвращает строку слева от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Mid(s, i, j)''' - возвращает подстроку из s начиная с i символа и длиной j символов&lt;br /&gt;
&lt;br /&gt;
'''Right(s, i [,full])''' – возвращает i последних символов строки s. Параметр i, может быть строкой, тогда он считается разделителем, функция ищет разделитель с конца строки, и возвращает строку справа от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Reverse(s)''' - возвращает строку s задом-наперед. Полезно например для поиска с конца функций Pos().&lt;br /&gt;
&lt;br /&gt;
'''Char(i)''' – возвращает символ с кодом i.&lt;br /&gt;
&lt;br /&gt;
'''Ord(s)''' – возвращает код первого символа строки s.&lt;br /&gt;
&lt;br /&gt;
'''Replace(s, strFind1, strReplace1, [ strFind2, strReplace2, ... ], [caseInsensetive])''' - возвращает строку s, в которой все включения строк strFind заменены строкой strReplace. Параметры поиска и замены всегда должны быть в паре и их может быть несколько. caseInsensetive - неучитывать регистр, не обязательный параметр, по умолчанию включен.&lt;br /&gt;
&lt;br /&gt;
'''RemSpace(s)''' – возвращает сроку s без начальных и конечных запятых и пробелов, а также начальных точек.&lt;br /&gt;
&lt;br /&gt;
'''SumStr(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''с добавлением валюты'''. Необязательные параметры captions - позволяет изменить название валюты, формат строки может зависеть от текущего языка(посмотреть формат можно в &amp;quot;Справочники&amp;quot;-&amp;quot;Статусы&amp;quot;-&amp;quot;32 Валюты&amp;quot;, в разделе &amp;quot;Дополнительная информация&amp;quot;). Language - код языка на котором необходимо вывести сумму прописью. По умолчанию если не обязательные параметры опущены, используются региональные настройки в переменных.&lt;br /&gt;
&lt;br /&gt;
'''NumToStrSimple(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''без валюты'''. Параметры идентичны функции SUMSTR.&lt;br /&gt;
&lt;br /&gt;
'''FullNameToShort(Name)''' – Возвращает фамилию и инициалы по полному ФИО Name.&lt;br /&gt;
&lt;br /&gt;
'''MonthName1(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в именительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''MonthName2(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в родительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''StrForXML(s)''' - Подготавливает строку к парсингу как xml: Если находит в строке подстроку &amp;quot;UTF-8&amp;quot; - перекодирует ее из utf-8 в win-1251, убирает начальный знак вопроса, если такой встречается.&lt;br /&gt;
&lt;br /&gt;
'''FixedIntToStr(i, len[, char])''' - Возвращает целое число i дополненное слева символами char (по-умолчанию - &amp;quot;0&amp;quot;) до длины len.&lt;br /&gt;
&lt;br /&gt;
'''Translate(format, [param1, param2, ...])''' - Функция перевода строки format в язык пользователя. Строка format может содержать параметры %s, %d - строка и число соответственно. &lt;br /&gt;
&lt;br /&gt;
'''ExtractFileName(FilePath)''' - возвращает имя файла с расширением из полного пути к файлу FilePath.&lt;br /&gt;
&lt;br /&gt;
====Функции перекодировки====&lt;br /&gt;
'''DecodeStr(s, charset)''' - Производит перекодировку строки s в кодировку CP1251. Кодировка строки s должна быть заранее известна и может быть :&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866, UNICODE. Имя кодировки следует передавать в точности без лишних символов.&lt;br /&gt;
&lt;br /&gt;
'''EncodeStr(s, charset)''' - Производит перекодировку строки s в кодировку charset. Кодировка строки s должна быть CP1251, возможны следующие варианты перекодировки:&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Имя кодировки следует передавать в точности без лишних символов. UNICODE не работает с версии 2021, в ней строки по умолчанию в кодировке unicode.&lt;br /&gt;
&lt;br /&gt;
Функции EncodeBase64(s), DecodeBase64(s), UrlEncode(s), UTF8Encode(s), UTF8Decode(s), Str2UTF(s) - устарели, используйте EncodeStr, DecodeStr.&lt;br /&gt;
&lt;br /&gt;
====Транслитерация====&lt;br /&gt;
&lt;br /&gt;
'''Translit(s)''' - транслитерация строки русского текста s латиницей&lt;br /&gt;
&lt;br /&gt;
'''UnTranslit(s)''' - транслитерация строки s с латиницы на русский.&lt;br /&gt;
&lt;br /&gt;
==== Экранирование ====&lt;br /&gt;
&lt;br /&gt;
'''QUOTEDSTR(s)''' – квотирует строку s символом «\» (обратный слеш). Возвращает строку s, помещенную между символами одинарной кавычки, при этом все вхождения в строку s символов: «\», «&amp;quot;» и «'» экранируются квотирующим символом, а символы  #0, #10 и #13 заменяются на \0, \n и \r соответственно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SQLFloat(f)''' – Приводит число с плавающей точкой к виду, пригодному для SQL-запроса, т.е. к тексту с разделителем дробной части – точка.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextXML(s)''' - квотирует строку s для использования в XML. Производит замены спец. символов для корректности XML-синтаксиса.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextJSON(s)''' - переводит строку в формат JSON, экранирует служебные символы.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextBlob(s)''' - строка s содержит файл, функция перекодирует переданную строку в байты, используется для заполнения полей формата blob.&lt;br /&gt;
&lt;br /&gt;
====Хеширование ====&lt;br /&gt;
&lt;br /&gt;
'''HMACHash256(key, text)''' - создаёт хэш по алгоритму SHA256 для проверки целостности сообщения, key - секретный ключ, text - хэшируемое сообщение&lt;br /&gt;
&lt;br /&gt;
'''MD5Hash(text)''' - создаёт хеш по алгоритму MD5&lt;br /&gt;
&lt;br /&gt;
'''SignatureUrl(url)''' -  Подписывает переданный URL. Функция возвратит переданный URL с добавленным в конце параметром, в котором будет записана подпись.&lt;br /&gt;
&lt;br /&gt;
=== Функции работы с датой и временем ===&lt;br /&gt;
&lt;br /&gt;
'''CurrTime''' – возвращает текущее время&lt;br /&gt;
&lt;br /&gt;
'''CurrDate''' – возвращает текущую дату&lt;br /&gt;
&lt;br /&gt;
'''CurrMillisecond''' - Возвращает количество миллисекунд прошедших с начала текущего года. Используется для точного расчета временных интервалов.&lt;br /&gt;
&lt;br /&gt;
'''Today''' - возвращает текущую дату в числовом формате.&lt;br /&gt;
&lt;br /&gt;
'''Day(dt)''' – возвращает день месяца даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Month(dt)''' – возвращает месяц года даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Year(dt)''' – возвращает год даты dt.&lt;br /&gt;
&lt;br /&gt;
'''FirstDayOfMonth(dt)''' – Возвращает первый день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( FirstDayOfMonth( CurrDate() ) );&lt;br /&gt;
'''Полужирное начертание'''&lt;br /&gt;
'''LastDayOfMonth(dt)''' – Возвращает последний день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( LastDayOfMonth( CurrDate() ) );&lt;br /&gt;
&lt;br /&gt;
'''DaysInMonth(month, year)''' – Возвращает количество дней в указанном месяце.&lt;br /&gt;
&lt;br /&gt;
'''IncDay(dt, [count=1])''' – Возвращает дату, увеличенную на count дней.&lt;br /&gt;
&lt;br /&gt;
'''SQLDate(dt)''' – Пытается конвертировать dt в дату, вернуть в формате «'YYYY-MM-DD'» (с апострофами), если не удается – возвращает «NULL».&lt;br /&gt;
&lt;br /&gt;
'''SQLDateToDate(dt)''' – Переводит дату из SQL-формата в обычный.&lt;br /&gt;
&lt;br /&gt;
'''DAYSBETWEEN(dt1, dt2)''' – Возвращает количество дней между датами dt1 и dt2. В случае ошибки приведения dt1 или dt2 к дате возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''TimeBetween(t1, t2)''' - Возвращает количество минут между временем t1 и t2. Если t1 &amp;gt; t2 то будет показано количество минут между t2 и t1. Параметр t может быть как в формате &amp;quot;HH:MM&amp;quot;, так и в числовом. Если один из параметров не удалось привести к числовому типу возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''WorkDaysBetween(dt1, dt2, [DecreaseFirstDay=0], [DefaultHolidayVarNum=1])''' - Возвращает количество рабочих дней между датами dt1 и dt2. Параметр DecreaseFirstDay уменьшает dt1 на указанное количество дней (по умолчанию 0).  В случае ошибки приведения dt1 или dt2 к дате возвращает -1000. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней(по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''TimePeriod(time1, time2)''' - Оформляет временной период. Возвращаемое значение зависит от наличия значения в параметрах. Возможные варианты: &amp;quot;time1 - time2&amp;quot; , &amp;quot;С time1&amp;quot; , &amp;quot;ДО time2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''StrDateToFloat(s, [time=false])''' - Переводит строку с датой s в числовой тип. Если параметр time включен, то в строке s должно быть указано время. Дата должна быть в формате &amp;quot;DD.MM.YYYY&amp;quot;, а время &amp;quot;HH:NN&amp;quot;. Если строку перевести не удалось возвращает 0&lt;br /&gt;
&lt;br /&gt;
'''IsAWorkDay(dt)''' - Когда день dt является рабочим, возвращает true. Если произошла ошибка приведения даты возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''IncWorkDay(dt, [count=1],[DefaultHolidayVarNum=1])''' - Прибавляет count рабочих дней к дате dt. Возвращает дату в числовом формате, если произошла ошибка приведения даты возвращает -1000. По умолчанию параметр count равен 1 и не является обязательным. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней (по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''Sleep'''(n) - Задержка выполнения на n миллисекунд.&lt;br /&gt;
&lt;br /&gt;
=== Функции приведения типов ===&lt;br /&gt;
&lt;br /&gt;
'''INT(v)''' – возвращает значение типа “целое”, приводя вариантное значение v к числовому типу, а затем округляя его. В том числе используется как функция округления.&lt;br /&gt;
&lt;br /&gt;
'''FLOAT(v)''' – возвращает значение типа “число”, приводя вариантное значение v к числовому типу, переводя в число цепочку символов до первого нецифрового символа (либо точки или запятой).&lt;br /&gt;
&lt;br /&gt;
'''STR(v)''' – возвращает значение типа “строка”, приводя вариантное значение v к строковому типу.&lt;br /&gt;
&lt;br /&gt;
'''Date(v)''' – возвращает дату, либо пустую строку, если не удается конвертировать v в дату&lt;br /&gt;
&lt;br /&gt;
'''Time(v)''' – возвращает время, либо пустую строку, если не удается конвертировать v во время. Понимает числовое представление времени.&lt;br /&gt;
&lt;br /&gt;
=== Математические функции ===&lt;br /&gt;
&lt;br /&gt;
'''ROUNDUP(f)''' – округляет число f до ближайшего большего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''ROUNDDN(f)''' – округляет число f до ближайшего меньшего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''Money(f, CouldBeEmpty, ZeroFill, MakeSpace)''' - Округляет число f, до двух знаков после запятой. CouldBeEmpty - заменить число меньше 0,0001  на пустую строку. ZeroFill  - Следить чтобы после запятой было два знака, если будет один, то добавить ноль. MakeSpace - Разделить разряды пробелом.&lt;br /&gt;
''Подсказка: для простого округления используется функция int()''&lt;br /&gt;
&lt;br /&gt;
'''Abs(f)''' - возвращает модуль числа f.&lt;br /&gt;
&lt;br /&gt;
'''Mod(x, y)''' - возвращает остаток от деления целочисленного числа x на целочисленное число y.&lt;br /&gt;
&lt;br /&gt;
=== Константы ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Null''' – Возвращает пустое значение.&lt;br /&gt;
&lt;br /&gt;
'''Да''', '''True''', '''Нет''', '''False''' – константы, соответствующие булевым значениям.&lt;br /&gt;
&lt;br /&gt;
=== Прочие функции ===&lt;br /&gt;
&lt;br /&gt;
SetPhoneParams(CountryCode, TownCode) – Устанавливает глобальные настройки кода телефонных кодов страны и города соответственно. По-умолчанию код страны – 7, код города – 495.&lt;br /&gt;
&lt;br /&gt;
PhonesCount(s) – Возвращает количество корректных телефонных номеров, найденных в строке s.&lt;br /&gt;
&lt;br /&gt;
GetPhone(s[, n]) – Возвращает n-й корректный телефонный номер, найденный в строке s. Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
GetEmail(s) – Возвращает все корректные адреса email, найденный в строке s, разделенные запятыми (т.е. готовыми к передаче в функцию SendEmail).&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY).&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
GenEan(ID, Code) – Формирует штрих-код EAN 13 Состоящий из идентификатора типа сущности ID и кода сущности Code, Выравнивает до 13-ти символов, первый – «2», последний – контрольная сума.&lt;br /&gt;
&lt;br /&gt;
CheckEan(s) - Проверяет строку s, что она является кодом EAN13.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(FileName,s, encoding [, append])- Создает текстовый файл по пути, указанному в FileName (если по указанному пути существует файл с указанным именем, он удаляется и создается новый) и производит запись строки s в созданный текстовый файл. encoding - название кодировки, по умолчанию сохраняет в кодировке ANSI. Доступные названия кодировок: KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Если append = true, то производится дописывание данных в файл, а не перезаписывание (не обязательный, по умолчанию выключен).&lt;br /&gt;
&lt;br /&gt;
StrFromFile(FileName) - Читает файл FileName, возвращает в виде строки. При ошибке чтения вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
DownloadAttachment(code, [savefilepath, tablename='attachment', fieldBlob='file', fieldLDtime='ldtime', fieldUID='uid']) - Функция выкачивает аттачмент из базы, по внутреннему коду - Code, всегда возвращает содержимое файла в виде строки, а также может сохранить файл по указанному пути в параметре savefilepath. По умолчанию, функция настроена на таблицу attachment. Code - внутренний код вложения, tablename - название таблицы, fieldBlob - название поля с содержимым файла, fieldLDtime - название поля с временем последнего изменения строки (для работы кэша). Функция использует кэш и умеет выкачивать файлы зауженные на внешние серверы (http, ftp,sftp, measoft). Для выкачивания с сервера measoft обязательно необходимо указывать параметр fieldUID.&lt;br /&gt;
&lt;br /&gt;
DeleteFile(FileName) - Удаляет файл FileName с диска, возвращает истину, если операция прошла успешно и ложь - в противном случае.&lt;br /&gt;
&lt;br /&gt;
HTTPPOST(host, PostParams, Proxy, ContentType, HTTPUser, HTTPPass, Method, CustomHeader, Reconnects) - Отправляет HTTP запрос по адресу host с данными PostParams. Proxy - объект Proxy, задающий прокси-сервер (по-умолчанию - пусто - не использовать прокси). ContentType - Заголовок ContentType. По-умолчанию - &amp;quot;application/x-www-form-urlencoded; Charset=UTF-8&amp;quot;. HTTPUser и HTTPPass - данные для http-авторизации на сервере. Method - метод отправки запроса, по-умолчанию - &amp;quot;POST&amp;quot;. CustomHeader - Дополнительные заголовки HTTP запроса, передается в виде списка параметров через запятую и всегда образуют пару: 1 параметр - название заголовка, 2 параметр - значение. Если значение содержит запятую то его нужно экранировать в двойные кавычки. Reconnects - Количество попыток подключения (по-умолчанию - 2), если больше 100 - это таймаут единственной попытки подключения в миллисекундах.&lt;br /&gt;
Функция возвращает ответ сервера. &amp;lt;br&amp;gt;&lt;br /&gt;
''Обратите внимание:'' Для имитации отправки данных html-формы методом POST может понадобиться перед передаваемыми параметрами добавить &amp;quot;Data=&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
FTPPUT(host, User, Pass, FileName[, Active]) - Отправляет файл на FTP/SFTP-сервер. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
FTPGET(host, User, Pass, SourceFileName, DestFileName[, Active]) - Загружает файл SourceFileName с FTP/SFTP-сервера, сохраняет его в файл DestFileName. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
GetTempDir - Возвращает путь к временной папке.&lt;br /&gt;
&lt;br /&gt;
ApplicationDir - Возвращает путь к файлу программы.&lt;br /&gt;
&lt;br /&gt;
Interpretate(script) - Интерпретирует скрипт указанный в script. Выполнение происходит в текущем инстансе.&lt;br /&gt;
&lt;br /&gt;
LastHttpError - Выводит последний запрос выполненный с ошибкой в функции HttpPost. Содержит подробную информацию по запросу и ответу.&lt;br /&gt;
&lt;br /&gt;
LastHttpResponse - Выводит последний запрос и ответ от сервера после выполнения Http-запроса в функции HttpPost.&lt;br /&gt;
&lt;br /&gt;
== Объект TExcel ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к данным документов MS Excel. Требует установленного приложения MS Excel. Для работы без установленного MS Excel предусмотрен объект TDirectExcel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ввод данных'''''&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Если Headered истинно (по-умолчанию), таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Если TranslateHeader истинно, то заголовки таблицы будут автоматически переведены.&lt;br /&gt;
 &lt;br /&gt;
 MyDB.Open('select * from kurier');&lt;br /&gt;
 xl.LoadFromDB(MyDB.Self);&lt;br /&gt;
 xl.DoNotDestroy(true);&lt;br /&gt;
 xl.SetVisible(true);&lt;br /&gt;
&lt;br /&gt;
Post2Sheet(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) -  Почти полный аналог LoadFromDB. В отличии от LoadFromDB если есть открытый файл, выгрузка данных будет выполнена прямо в него.&lt;br /&gt;
&lt;br /&gt;
OpenFile(aFileName) – Выполняет функции SetFileName и Open. &lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
SetFileName(aFileName) – Задает значение свойства FileName.&lt;br /&gt;
&lt;br /&gt;
Open - Открывает файл с именем, заданным свойством FileName. Если имя файла не задано - создает чистую книгу.&lt;br /&gt;
&lt;br /&gt;
Close – Закрывает текущий файл.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ячейки'''''&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
Cell(x, y, text) – Возвращает значение ячейки, заданной координатами x, y. Необязательный булевый параметр text, в случае истинности, указывает на необходимость возврата данных с учетом формата ячейки, т.е. то, что пользователь видит на экране. Обратите внимание, что если в ячейке число, и ширина столбца не достаточна для отображения, Excel выводит &amp;quot;#####&amp;quot;, что и будет возвращено программе, если text=ИСТИНА. Поэтому перед таким использованием рекомендуется выполнить функцию AutoFit.&lt;br /&gt;
&lt;br /&gt;
SetCell(x, y, v[, x2, y2]) – Устанавливает значение ячейки, заданной координатами x и y, в значение v. Если заданы параметры x2, y2 - объединяет (merge) диапазон ячеек заданных координатами, устанавливает значение объединенной ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Строки'''''&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
RowAutoFit([y1, y2]) - Устанавливает автоматическую высоту строк. Аргументы y1 и y2 необязательны и если не указаны, то процедура будет выполнена для всей страницы, в ином случае только для строк от y1 до y2.&lt;br /&gt;
&lt;br /&gt;
SetRowHeight(r, h[, cnt]) – Устанавливает высоту cnt строк (по-умолчанию 1) начиная со строки r в h пикселей.&lt;br /&gt;
&lt;br /&gt;
GetRowHeight(r) – Возвращает высоту строки r в пикселях.&lt;br /&gt;
&lt;br /&gt;
RowInsert(i[, count]) - Вставляет count (по-умолчанию - 1) строк НАД строкой с номером i.&lt;br /&gt;
&lt;br /&gt;
RowDelete(i[, count]) - Удаляет count (по-умолчанию - 1) строк начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Столбцы'''''&lt;br /&gt;
&lt;br /&gt;
ColCount - Возвращает количество столбцов в листе.&lt;br /&gt;
&lt;br /&gt;
AutoFit – Устанавливает автоматическую ширину столбцов.&lt;br /&gt;
&lt;br /&gt;
ColumnDelete(i[, count]) - Удаляет count (по-умолчанию - 1) столбцов начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
SetColWidth (c, w) – Устанавливает ширину столбца c в w пикселей.&lt;br /&gt;
&lt;br /&gt;
GetColWidth (c) – Возвращает ширину столбца c в пикселях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Листы'''''&lt;br /&gt;
&lt;br /&gt;
SetSheet(No) – Устанавливает номер текущего листа. Если лист с таким номером не существует - он будет создан (и все листы до него). Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetSheetName(Name) - Устанавливает название текущего листа.&lt;br /&gt;
&lt;br /&gt;
SheetsCount – Возвращает количество листов в книге.&lt;br /&gt;
&lt;br /&gt;
CopySheetAfter([SheetFrom[, SheetAfter]]) - Копирует лист SheetFrom (по-умолчанию - текущий), создавая новый лист после листа SheetAfter (по-умолчанию - совпадает с копируемым).&lt;br /&gt;
&lt;br /&gt;
SheetDelete(i) - Удаляет лист с номером i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Форматирование'''''&lt;br /&gt;
&lt;br /&gt;
Align(x1, y1, x2, y2 [,HAlign, VAlign]) - Устанавливает выравнивание данных в указанном диапазоне. HAlign - горизонтальное выравнивание (0 – прижато влево , 1 – по центру , 2 – прижато вправо), VAlign - Вертикальное выравнивание (0 – прижато к верху , 1 – по центру , 2 – прижато к низу).&lt;br /&gt;
&lt;br /&gt;
WrapText(x1, y1, x2, y2, value) – Устанавливает перенос текста прямоугольника в значение value. Если координаты опущены, или 0 – устанавливает границы всей используемой области. Для Value значение по-умолчанию - true.&lt;br /&gt;
&lt;br /&gt;
NumberFormat(x1, y1, x2, y2, Format) - Устанавливает формат вывода чисел в указанном диапазоне ячеек. Например, если Format='0.00' - числа будут выводиться c обязательными 2 знаками после десятичного разделителя.&lt;br /&gt;
&lt;br /&gt;
SetBorders(x1, y1, x2, y2) – Устанавливает границы прямоугольника. Если координаты опущены, или 0 – устанавливает границы всей используемой области.&lt;br /&gt;
&lt;br /&gt;
SetFont(Font[, x1, y1[, x2, y2]]) - Устанавливает шрифт Font для ячеек диапазона. Можно указать координаты только одной ячейки, можно - вообще не указать, тогда будет использован последний выделенный диапазон. Шрифт задается как обычно: 'Arial, 16, T, T, T', порядок параметров: Имя шрифта, размер, жирное начертание, курсивное начертание, одиночное подчеркивание. Если параметры не заданы, то у текущего шрифта они меняться не будут. Примеры: SetFont('Arial, 10, T, F, F', 1,1) - в ячейке A1 будет установлен шрифт Arial жирным начертанием (не курсив и без подчеркивания). SetFont(', , , T, F', 2,1) - в ячейке B1 будет поменяется только начертание курсив и будет отменено подчеркивание (если оно было). &lt;br /&gt;
&lt;br /&gt;
SaveValuesOnly - убирает формулы на текущей странице и оставляет лишь их результативные статичные значения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Цвета'''''&lt;br /&gt;
&lt;br /&gt;
SetRowFontColor(Row,Color) - Устанавливает цвет шрифта в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetRowColor(Row,Color) - Устанавливает цвет фона в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetColumnFontColor(Col,Color) - Устанавливает цвет шрифта в столбце Col. Color -  целое значение (RGB) &lt;br /&gt;
&lt;br /&gt;
SetColumnColor(Col,Color) - Устанавливает цвет фона в столбце Col. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellFontColor(Row,Col,Color) -  Устанавливает цвет шрифта в ячейке с координатами [Row,Col]. Color -  целое значение, равное номеру цвета в палитре (ColorIndex,не RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellColor(Row,Col,Color) -  Устанавливает цвет фона в ячейке с координатами [Row,Col]. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
GetRowFontColor(Row)- Возвращает RGB значение цвета шрифта строки Row&lt;br /&gt;
&lt;br /&gt;
GetRowColor(Row)- Возвращает RGB значение цвета фона строки Row&lt;br /&gt;
&lt;br /&gt;
GetColumnFontColor(Col)- Возвращает RGB значение цвета шрифта столбца Col&lt;br /&gt;
&lt;br /&gt;
GetColumnColor(Col)- Возвращает RGB значение цвета фона столбца Col &lt;br /&gt;
&lt;br /&gt;
GetCellFontColor(Row,Col) - Возвращает номер цвета шрифта в палитре (ColorIndex) в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
GetCellColor(Row,Col) - Возвращает RGB значение цвета фона в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Копи-паст'''''&lt;br /&gt;
&lt;br /&gt;
Copy(x1, y1, x2, y2) - Копирует в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Cut(x1, y1, x2, y2) - Вырезает в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Paste(x1, y1) - Вставляет из буфера экселя. Команды copy-paste неразрывны, если что нибудь сделать в промежутке между ними, например вставить значение в ячейку, то копирование сброситься. (Последовательность использования: copy - paste, cut - paste)&lt;br /&gt;
&lt;br /&gt;
PasteStyle(x1, x2, y1, y2) - Вставляет только оформление из буфера экселя (Последовательность использования:  Copy - PasteStyle)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Изображения'''''&lt;br /&gt;
&lt;br /&gt;
InsertPicture(TPicture, [x=1, y=1, DispX=0, DispY=0, width=0, height=0]) - Функция вставляет рисунок на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки, width, height (не работает для DirectExcel) - ширина и высота области рисунка в пойнтах-единицах Excel &lt;br /&gt;
&lt;br /&gt;
InsertFirmLogo(FirmCode, [x=1, y=1, DispX=0, DispY=0]) - Функция вставляет логотип фирмы с кодом FirmCode на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Вывод'''''&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки. Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SheetFitPageWidth - устанавливает режим масштабирования печати, чтобы печатная форма помещалась в ширину на один лист.&lt;br /&gt;
&lt;br /&gt;
SetOrientation(value) - Устанавливает ориентацию страницы. True (по-умолчанию) - альбомная (ландшафтная), Ложь - портретная.&lt;br /&gt;
&lt;br /&gt;
PrintOut([copies]) - Печатает текущий лист на принтере по умолчанию. Параметр copies - количество копий, по умолчанию равен 1.&lt;br /&gt;
&lt;br /&gt;
Save(filename) - Сохраняет в файл filename. Если файл существует, в основной системе он будет перезаписан, в других проектах - вызовет ошибку &amp;quot;Файл уже существует&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SetVisible(b) – Устанавливает видимость приложения Excel для пользователя. По-умолчанию – false (не видимо).&lt;br /&gt;
&lt;br /&gt;
DoNotDestroy(b) – При уничтожении объекта TExcel (а он уничтожается, как и все остальные объекты автоматически при завершении выполнения скрипта), приложение Excel уничтожается вместе с ним. DoNotDestroy(true) отключает уничтожение приложения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования'''''&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'myxl');&lt;br /&gt;
 myxl.OpenFile('c:\asdf.xlsx');&lt;br /&gt;
 set($sum, 0);&lt;br /&gt;
 while (myxl.EOF=0, &lt;br /&gt;
      set($sum, $sum+int(myxl.c));&lt;br /&gt;
      myxl.next );&lt;br /&gt;
 $sum&lt;br /&gt;
 &lt;br /&gt;
 ''Возвращает сумму всех числовых данных столбца C файла 'c:\asdf.xlsx'''&lt;br /&gt;
&lt;br /&gt;
== Объект TDirectExcel ==&lt;br /&gt;
Объект позволяет работать с файлами Excel напрямую, без установленного пакета MsOffice. Применяется в сервисах и при отсутствии экселя. Он максимально совместим с объектом TExcel, однако некоторые методы могут быть не реализованы. &lt;br /&gt;
&lt;br /&gt;
== Объект TCSVFile ==&lt;br /&gt;
Предназначен для доступа к данным документов CSV. Разделителем столбцов является символ точка с запятой ;&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
OpenFile(FileName) – Открывает файл FileName.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=false]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO.&lt;br /&gt;
&lt;br /&gt;
LoadFromText(s) - Загружает таблицу из строки s.&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). &lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(Filename) - Сохраняет в файл с именем filename.&lt;br /&gt;
&lt;br /&gt;
== Объект TADO ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к базам данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|Connect(ConnectionString)&lt;br /&gt;
|Подключает к источнику данных. ConnectionString – Строка подключения ADO.&lt;br /&gt;
|-&lt;br /&gt;
|ConnectMySQL(DBServer, DBPort, DBUser, DBPass, DBName)&lt;br /&gt;
|Подключает к базе данных MySQL.&lt;br /&gt;
|-&lt;br /&gt;
|Open(Query)&lt;br /&gt;
|Открывает набор данных выполнив запрос Query.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByNo(i)&lt;br /&gt;
|Возвращает значение поля с номером i. Нумерация полей – с нуля.&lt;br /&gt;
|-&lt;br /&gt;
|FieldName(i)&lt;br /&gt;
|Возвращает имя поля с номером i.&lt;br /&gt;
|-&lt;br /&gt;
|FieldCount&lt;br /&gt;
|Возвращает количество  полей.&lt;br /&gt;
|-&lt;br /&gt;
|RecordCount&lt;br /&gt;
|Возвращает количество записей.&lt;br /&gt;
|-&lt;br /&gt;
|RecNo&lt;br /&gt;
|Возвращает номер текущей записи. ''ВНИМАНИЕ! В зависимости от способа подключения к БД нумерация может начинаться как с 0 так и с 1!''&lt;br /&gt;
|-&lt;br /&gt;
|EOF&lt;br /&gt;
|Возвращает признак достижения конца набора данных. Становится истиной когда выполняется команда Next на последней записи.&lt;br /&gt;
|-&lt;br /&gt;
|Next&lt;br /&gt;
|Переход на следующую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|First&lt;br /&gt;
|Переход на первую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|Last&lt;br /&gt;
|Переход на последнюю запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByName(FieldName)&lt;br /&gt;
|Возвращает значение поля по имени. Также возможно указание имени поля как свойства объекта.&lt;br /&gt;
|-&lt;br /&gt;
|Field(Table, ID, FieldName)&lt;br /&gt;
|Возвращает значение поля FieldName записи с кодом ID таблицы Table. Набор данных, если он открыт, при этом не закрывается. Первичный ключ таблицы должен называться «code». Гарантированно работает только с MYSQL!!!&lt;br /&gt;
|-&lt;br /&gt;
|GetSQLValue(Query)&lt;br /&gt;
|Выполняет SQL-запрос. Текст запроса должен начинаться с первого символа строки (перед запросом не должно быть пробелов, переносов строк, комментариев и т.д.). Если запрос Insert – возвращает ID вставленной записи. Если запрос – Update, Delete, Replace, Set, Start, Commit, Rollback – возвращает количество измененных записей (RowsAffected), иначе – Select – значение первого поля первой строки результата как текст.&lt;br /&gt;
|-&lt;br /&gt;
|FillText(s)&lt;br /&gt;
|Возвращает строку s с замененными названиями полей между знаками процента на соответствующие значения текущей записи. Так же в строке возможно использование интерпретируемого кода, заключенного между тегами &amp;quot;&amp;lt;?&amp;gt;&amp;quot; и &amp;quot;&amp;gt;&amp;quot;. При интерпретации система сначала производит замену полей с процентами на значения, потом интерпретирует код. ''Внимание! Функция не создает отельный контекст интерпретатора, а использует существующий, в нем доступны все объекты и переменные, вызывающего скрипта.'' Дополнительно автоматически создается объект TSelfADO, подключенный к той же БД, что и контекст, вызвавший функцию, с пустым именем, а так же с именем &amp;quot;dataset&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|Query(Query)&lt;br /&gt;
|Синоним GetSQLValue.&lt;br /&gt;
|-&lt;br /&gt;
|Close&lt;br /&gt;
|Закрывает набор данных.&lt;br /&gt;
|-&lt;br /&gt;
|Self&lt;br /&gt;
|Возвращает указатель на подключение к БД для использования в других объектах.&lt;br /&gt;
|-&lt;br /&gt;
|ParseForIn([FieldName='code']) &lt;br /&gt;
|Возвращает через запятую значения всех строк в указанном столбце. По умолчанию, используется столбец с именем code.&lt;br /&gt;
|-&lt;br /&gt;
|GetSQL&lt;br /&gt;
|Для отладки. Возвращает последний SQL запрос переданный в методы Open, Query, GetSQLValue&lt;br /&gt;
|-&lt;br /&gt;
|ExportExcel&lt;br /&gt;
|Для отладки. Выгружает в эксель содержимое датасета. Можно использовать в незнакомом окружении для понимания передаваемых полей в : шаблонах, печатных формах и т.д. Аналог команды %echo% в шаблонах, на случай если она не сработает.&lt;br /&gt;
|-&lt;br /&gt;
|OnGetText&lt;br /&gt;
|Функция подменяет текстовый вывод значения поля при выгрузке в эксель. Первый параметр это имя поля, которое надо подменить. Второй параметр это то что необходимо вывести. Работает только с текстовыми полями. &lt;br /&gt;
'''''Пример использования'''''  &lt;br /&gt;
  DB.OnGetText('Зона', IF((DB.FieldByName('-Lat') ! 0) * (DB.FieldByName('-Lon') ! 0),&lt;br /&gt;
       	GetPolygonByLatLon(DB.FieldByName('-Lat'), DB.FieldByName('-Lon'), 'TYPE = 1 AND IFNULL(zone, 0) &amp;gt; 0 AND PRICE = ' + DB.FieldByName('-price'), 'zone')&lt;br /&gt;
  ,&lt;br /&gt;
        ''&lt;br /&gt;
  ));&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования – см. TSelfADO&lt;br /&gt;
&lt;br /&gt;
== Объект TSelfADO ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наследник объекта TADO. Служит для подключения к «родной» для программы, в которой выполняется скрипт, базе данных. Обладает всеми свойствами и методами объекта TADO, кроме Connect. Иногда автоматически создается системой для обеспечения простого доступа к базе данных, а также иногда создается системой с уже открытым набором данных для передачи обрабатываемого системой набора данных в скрипт. В этом случае для скрипта недоступны функции Open и Close.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&lt;br /&gt;
 rem('Копируем данные из &amp;quot;родной&amp;quot; базы данных в базу MSSQL.');&lt;br /&gt;
 new('TSelfADO', 'MyDB');&lt;br /&gt;
 new('TADO', 'MSSQL');&lt;br /&gt;
 MSSQL.Connect('Provider=SQLOLEDB.1;Password=myPassword;Persist Security Info=True;User ID=myUsername;Initial Catalog=myDataBase;Data Source=myServerAddress');&lt;br /&gt;
 MyDB.Open('select code, name, passport from kurier where code&amp;gt;'+Int(MSSQL.Query('select max(code) from kurier'))+' order by code');&lt;br /&gt;
 While(MyDB.EOF=0,&lt;br /&gt;
      MSSQL.Query('insert kurier (code, name, passport) VALUES ('+MyDB.Code+', '+QuotedStr(MyDB.Name)+', '+QuotedStr(MyDB.Passport)+')');&lt;br /&gt;
      MyDB.Next;&lt;br /&gt;
      );&lt;br /&gt;
&lt;br /&gt;
== Объект TPrinter ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к принтерам.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
BeginDoc – Начинает новый документ.&lt;br /&gt;
&lt;br /&gt;
EndDoc – Закрывает документ&lt;br /&gt;
&lt;br /&gt;
PageHeight – Возвращает высоту страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageWidth – Возвращает ширину страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageNumber – Возвращает номер текущей страницы документа&lt;br /&gt;
&lt;br /&gt;
Orientation – Возвращает текущую ориентацию страницы (0 – портретная, 1 – ландшафтная)&lt;br /&gt;
&lt;br /&gt;
Printing – Возвращает истину если документ открыт&lt;br /&gt;
&lt;br /&gt;
SetOrientation(Orientation) – Устанавливает ориентацию страницы. При необходимости начинает новый документ, новую страницу.&lt;br /&gt;
&lt;br /&gt;
ShowDialog – Показывает пользовательский диалог печати. Возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
NewPage – Начинает новую страницу&lt;br /&gt;
&lt;br /&gt;
Canvas – Предоставляет доступ к объекту TCanvas, связанному с принтером.&lt;br /&gt;
&lt;br /&gt;
PrinterNames – Возвращает список принтеров, установленных в системе, разделенный переносами строк&lt;br /&gt;
&lt;br /&gt;
PrintersCount – Возвращает количество установленных в системе принтеров&lt;br /&gt;
&lt;br /&gt;
SetPrinter(Printer) – Устанавливает текущий принтер. Если передана строка – ищет принтер по названию, иначе – по номеру. Нумерация начинается с 0.&lt;br /&gt;
&lt;br /&gt;
PrintTable(Y, Table) – Выводит на печать таблицу Table типа TTable, начиная с координаты Y. При необходимости таблица печатается на нескольких страницах. Возвращает координату Y конца таблицы.&lt;br /&gt;
&lt;br /&gt;
GetDefaultPrinter - Возвращает имя текущего активного принтера.&lt;br /&gt;
&lt;br /&gt;
SetDefaultPrinter(Printer) – Запоминает предыдущий активный принтер и устанавливает новый текущий принтер. Printer - имя принтера. При необходимости нескольких последовательных вызовов SetDefaultPrinter рекомендуется между вызовами использовать RestoreDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
RestoreDefaultPrinter - Устанавливает активным принтер, который был текущим перед последним вызовом SetDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
== Объект TCanvas ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предоставляет доступ к холсту объекта для прорисовки изображения.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
DPIX – Возвращает разрешение холста по горизонтали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
DPIY – Возвращает разрешение холста по вертикали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
TextOut(x, y, s[, x1, y1, x2, y2]) – Выводит строку s начиная с точки с координатами x и y. Если указаны параметры x1, y1, x2, y2 – то выводимый текст ограничивается заданным прямоугольником.&lt;br /&gt;
&lt;br /&gt;
TextOutEx(x1, y1, x2, y2, Alignment, Font, s, Indent) – Выводит строку s в прямоугольнике с координатами x1, y1, x2, y2. По горизонтали строка выравнивается в соответствии с Alignment (0 – прижато влево, 1 – вправо, 2 – по центру), по вертикали выравнивается по центру. Используя шрифт Font (см описание ниже). Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату X фактического окончания текста (правой стороны – если строка прижата влево, и левой – в остальных случаях)&lt;br /&gt;
&lt;br /&gt;
MLTextOut(x1, y1, x2, y2, Alignment, VAlignment, Font, s, Heigth, Indent) – Выводит многострочный текст s в прямоугольнике с координатами x1, y1, x2, y2 с переносом по словам. По горизонтали строки выравниваются в соответствии с Alignment, по вертикали – в соответствии с VAlignment (0 – прижато вверх, 1 – по центру, 2 – прижато вниз). Используя шрифт Font (см описание ниже). Heigth – высота строки. Если опущено или равно нулю – высота определяется автоматически в соответствии с выбранным шрифтом. Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату Y фактического окончания текста (нижней границы последней строки текста. ''ВНИМАНИЕ! Функция использует координаты прямоугольника для позиционирования текста, однако она не ограничивает его верхней и нижней границами этого прямоугольника!''&lt;br /&gt;
&lt;br /&gt;
DrawPic(x1, y1, x2, y2, Pic, Style, Alignment, Mode) – Прорисовывает изображение Pic (ссылка на изображение TPicture.Self) в прямоугольник заданный координатами x1-y2. Style – стиль масштабирования. 0 – растянуть изображение до границ прямоугольника не сохраняя пропорции, 1 – вписать изображение в прямоугольник сохраняя пропорции – вероятно, останутся поля по вертикали или горизонтали, 2 – вписать сохраняя пропорции, обрезав при необходимости изображение по вертикали или горизонтали. Alignment – выравнивание по горизонтали. Работает только в случае если style=1 и при растягивании изображения получились вертикальные поля. 0 – разместить по центру, 1 – прижать влево, 2 – прижать вправо. Функция возвращает координату X правой стороны изображения кроме случая, когда Style=1 и Alignment=2 – в этом случае возвращается координата левой стороны изображения. Mode - способ наложения изображения. 0 (по-умолчанию) - копирование как есть. 1 - Наложение операцией AND (применяется для получения эффекта прозрачности изображения), 2 - наложение операцией XOR (Применяется для возможности повторной операцией убрать изображение), 3 - Наложение операцией OR.&lt;br /&gt;
&lt;br /&gt;
FillRect(x1, y1, x2, y2) – Рисует прямоугольник '''без границ''' и закрашивает цветом BrashColor&lt;br /&gt;
&lt;br /&gt;
Rect(x1, y1, x2, y2) – Рисует прямоугольник '''c границами''', задаваемыми текущим пером, и закрашивает цветом BrashColor &lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Устанавливает шрифт по-умолчанию.&lt;br /&gt;
&lt;br /&gt;
SetPen(Width, Color) - Устанавливает параметры &amp;quot;ручки&amp;quot; - толщину и цвет. Если любой параметр опустить, соответствующее значение не будет изменено.&lt;br /&gt;
&lt;br /&gt;
SetBrush(Color, Style) - Устанавливает параметры заливки - цвет и стиль. Если любой параметр опустить, соответствующее значение не будет изменено. Стили заливки: 0 - сплошная, 1 - отсутствует (прозрачная), 2-7 - различные виды штриховки (горизонтальные, вертикальные, в клеточку и т.д.).&lt;br /&gt;
&lt;br /&gt;
TextHeight(s) – Возвращает высоту текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
TextWidth(s) – Возвращает ширину текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
Использование шрифта (Font): У объекта TCanvas есть «глобальные» установки шрифта. Однако для некоторых функций возможно указание шрифта, отличающегося от глобального. Параметры шрифта – это текстовая строка, состоящая из 6-ти параметров, разделенных запятыми: Название, размер, жирный, курсив, подчеркнутый, цвет. Например:&lt;br /&gt;
&lt;br /&gt;
 'Times New Roman, 8, Y, N, N, 255'&lt;br /&gt;
&lt;br /&gt;
Любой параметр можно опустить, и тогда вместо него будет использовано значение по-умолчанию: шрифт: arial, размер – 10, не жирный, не курсив, не подчеркнутый, цвет – черный. Например: ', 7' – указывает, что по-умолчанию нужно взять все параметры кроме размера шрифта. Также можно вместо всей строки указать тире ('-') или пустую строку, и шрифт будет использоваться «глобальный».&lt;br /&gt;
&lt;br /&gt;
Объект можно создать отдельно, не создавая объект TPrinter. В таком случае объект создастся как ссылка на текущий холст принтера (принтер должен быть запущен и начат новый документ). Такой подход используется в доп. возможности PrintCustomSticker&lt;br /&gt;
&lt;br /&gt;
== Объект TPicture ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с графическими изображениями форматов BMP, GIF, JPEG и PNG, а также для формирования штрих-кодов. Обратите внимание, прозрачность изображений не поддерживается, однако в методе TCanvas.DrawPic есть параметр Mode, призванный создавать эффект прозрачности.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(FileName) – Загружает изображение из файла FileName. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB, Query) – Загружает изображение из базы данных. DB – ссылка на подключение к базе данных TADO.Self, Query – текст запроса. Запрос должен вернуть в первом поле первой строки BLOB-поле с изображением, все остальные данные возвращаемые запросом игнорируются. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromStr($s) – Загружает изображение из строки $s. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
CreateBar(Width, Height, BarCode, Textless, Type) – Формирует штрих-код шириной Width и высотой Height с типом кодирования Type. BarCode – текст штрих-кода. Булево значение Textless указывает, что в штрих-коде не должно быть человеко-читаемых символов если истинно. Type указывает тип кодирования: 0 (по-умолчанию) CODE128, 1 - EAN-13, 2 - Interleaved 2-5, 3-DataMatrix, 4-QRCode.&lt;br /&gt;
Штрихкод должен быть: Для EAN-13 цифровым 12 или 13 символов (13-й, контрольная сумма рассчитывается автоматически), для CODE128 - должен иметь состоять из допустимого для этого кодирования набора символов. Для Interleaved - должен состоять из четного числа цифр, контрольная сумма автоматически не рассчитывается. Если для Interleaved кода указано значение из 14-ти знаков, подпись цифр выводится в формате Почты России.&lt;br /&gt;
Внимание! Для кодов EAN-13 и Interleaved ширина штрих-кода Width не является точным значением получаемого на выходе изображения. Ширина изображения рассчитывается как максимальное кратное минимально возможной ширине, но не меньше минимально возможной. Конечную ширину можно получить в соответствующем свойстве объекта. Для кода CODE128 штрих-код на выходе может оказаться пустым, если указанной ширины штрих-кода не достаточно для его формирования.&lt;br /&gt;
Для кода DataMatrix можно установить режим для печати скрытых символов с кодами 29(GS) и 232(FCN1), которые требуются для формирования Честного Знака. Для этого необходимо в начале строки указать символ &amp;quot;[&amp;quot; и все разделители 01, 21, 91, 92 так же экранировать этими скобками. Должно получиться [01]02900002317701[21]k3LInNbH_oG0Q[91]EE06[92]YXiyKfiHjE4YE8b+YVMC1O5r8VtpplA3AwcCqrcG9Dk= . При формировании кода, включится режим формирования штрих-кода DataMatrix GS1, в начале будет добавлен символ с кодом 232 (FCN1), а потом будут добавлены разделители с кодом 29 (GS)&lt;br /&gt;
Функция возвращает 1 в случае успеха, или текст ошибки, если такая произошла.&lt;br /&gt;
&lt;br /&gt;
SetSize(Width, Height) - Устанавливает размер изображения.&lt;br /&gt;
&lt;br /&gt;
AsString([ImageFormat]) - Возвращает изображение в виде строки с двоичными данными. ImageFormat принимает значения 1 - Bitmap (по-умолчанию), 2 - jpeg, 3 - png, 4 - gif.&lt;br /&gt;
&lt;br /&gt;
Width – Возвращает ширину изображения.&lt;br /&gt;
&lt;br /&gt;
Height – Возвращает высоту изображения.&lt;br /&gt;
&lt;br /&gt;
Rotate(Angle) – Поворачивает изображение по часовой стрелке на угол Angle. Угол указывается в градусах и может принимать любые значения.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с изображением, используется в качестве параметра для функций, работающих с изображениями из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Canvas - ссылка на объект TCanvas холста изображения.&lt;br /&gt;
&lt;br /&gt;
== Объект TTable ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с таблицами. Удобен для печати таблицы на принтере. Алгоритм таков: Загружаем датасет в таблицу, настраиваем ее (шрифты, штрих-коды и т.д.), потом выводим на принтер функцией TPrinter.PrintTable.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Заголовок – это первая строка таблицы.&lt;br /&gt;
&lt;br /&gt;
Cell(С, R) – Возвращает значение ячейки таблицы с координатами (C, R). Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetCell(С, R, Value) – Устанавливает значение ячейки таблицы с координатами (C, R) в Value. Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
RowCount – Возвращает количество строк в таблице.&lt;br /&gt;
&lt;br /&gt;
ColCount – Возвращает количество столбцов в таблице.&lt;br /&gt;
&lt;br /&gt;
SetTitleFont(Font) – Задает шрифт заголовка таблицы (первой строки).&lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Задает шрифт всей таблицы кроме заголовка.&lt;br /&gt;
&lt;br /&gt;
SetColFont(C, Font) - Устанавливает шрифт столбца C.&lt;br /&gt;
&lt;br /&gt;
SetIndent(Indent) – Задает отступ от границы ячейки до текста в процентах от ширины страницы. По-умолчанию значение 0.3&lt;br /&gt;
&lt;br /&gt;
SetWidth(С, Width) – Задает значение ширины столбца C в процентах от ширины страницы.&lt;br /&gt;
&lt;br /&gt;
SetMinRowHeght (Heght) – Задает значение минимальной высоты строки в пикселях. &lt;br /&gt;
&lt;br /&gt;
SetBarCode(Col, Type) - Указывает, что данные из столбца Col должны печататься в виде штрих-кода. Тип штрих-кода - Type. Значение '''&amp;quot;1&amp;quot; - EAN13'''. Для кода EAN13 первая строка данных в ячейке должна иметь вид &amp;quot;тип штрих-кода, номер&amp;quot;, например &amp;quot;7, 123&amp;quot; (без кавычек, конечно). В этом случае система сформирует штрих-код: &amp;quot;2700000001233&amp;quot;. Первая цифра - всегда 2, далее - указанный тип штрих-кода, нули, чтобы получилось 13 символов, номер, указанный в таблице, и один символ - контрольная сумма. Значение '''&amp;quot;2&amp;quot; - CODE128''' (с версии 734). Данные из первой строки ячейки таблицы печатаются в штрих-коде &amp;quot;как есть&amp;quot;. Для всех видов штрих-кода (с версии 734) последующие строки печатаются под штрих-кодом в виде текста.&lt;br /&gt;
&lt;br /&gt;
SetMultiHeader(Active) - Включает печать заголовка при переносе таблицы на несколько страниц. По умолчанию отключено.&lt;br /&gt;
&lt;br /&gt;
SetCustomHeader(script) - Включает печать пользовательского заголовка. Script - это код интерпретатора, который должен печатать заголовок на канву. Печать таблицы может происходить на нескольких листах, по этому скрипт будет вызван для каждого листа. При использовании этого метода, автоматически инициализируются переменные: $TablePageNo - номер страницы, нумерация начинается с нуля; $TableY - координата по оси Y, от которой рисуется заголовок. Чтобы таблица была под заголовком необходимо значение переменной $TableY увеличить на высоту заголовка.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с таблицей, используется в качестве параметра для функций, работающих с таблицами из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 &amp;lt;?&amp;gt;&lt;br /&gt;
 NEW('TPrinter', 'Prn');&lt;br /&gt;
 If(prn.ShowDialog,&lt;br /&gt;
  NEW('TTable', 'Tbl'); &lt;br /&gt;
  NEW('TSelfADO', 'MyDB'); &lt;br /&gt;
  MyDB.Open('SELECT concat(&amp;quot;7&amp;quot;, &amp;quot;, &amp;quot;,  a.code, &amp;quot;\r\n&amp;quot;, a.client_id, &amp;quot;\r\n&amp;quot;, a.zakaz, &amp;quot;-&amp;quot;, a.number) as &amp;quot;Штрих-код&amp;quot;, a.target AS &amp;quot;Заказик&amp;quot;, address, phone, vlog, poruch FROM address a order by code desc limit 10');&lt;br /&gt;
  Tbl.LoadFromDB(MyDB.Self); &lt;br /&gt;
  Tbl.SetBarcode(1, 1);&lt;br /&gt;
  Tbl.SetCustomHeader(     &lt;br /&gt;
    if($TablePageNo&amp;gt;0,&lt;br /&gt;
      Prn.Canvas.TextOut(Prn.Canvas.DPIX*0.1, $TableY, 'Продолжение таблицы');&lt;br /&gt;
      set($TableY, $TableY + Prn.Canvas.TextHeight('H'));&lt;br /&gt;
    ,0)&lt;br /&gt;
  );&lt;br /&gt;
  Prn.BeginDoc; &lt;br /&gt;
  Prn.PrintTable(0, Tbl.Self);   &lt;br /&gt;
  Prn.EndDoc&lt;br /&gt;
 , );&lt;br /&gt;
&lt;br /&gt;
== Объект TBaseUtils ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции, базирующиеся на БД системы «MEASOFT». По-умолчанию, при создании подключается к основной базе данных модуля, в котором выполняется скрипт, если такая определена контекстом, однако это можно изменить, см SetConnection.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
'''MakeAddress(s[,town])''' – возвращает значение, полученное путем преобразований адреса s для приведения его к внутреннему формату программы. В процессе преобразования до нескольких раз происходит замена буквосочетаний по таблице замены (ее редактирование доступно по нажатию кнопки «Автозамена» в интерфейсе импорта БД из Excel системы (см. Руководство пользователя)), поиск улиц по базе КЛАДР с точностью до одного знака, и некоторые другие операции, нацеленные на исправление ошибок в написании адреса.&lt;br /&gt;
&lt;br /&gt;
С версии программы 2008.0.0.615, при вызове функции в формулах загрузки реестра, в первую очередь происходит проверка строки s на условия:&lt;br /&gt;
* в строке s записано  число; &lt;br /&gt;
* строка s начинается с &amp;quot;ПВЗ &amp;quot;. &lt;br /&gt;
Если одно из этих условий выполняется, то функция пытается установить пункт самовывоза - т.е она сама в загружаемой карточке корреспонденции укажет: адрес ПВЗ, город ПВЗ и установит галку самовывоз. &amp;lt;br/&amp;gt;Правила поиска ПВЗ:&lt;br /&gt;
* Если s число -  считаем его внутренним кодом филиала;&lt;br /&gt;
* Если s начинается с &amp;quot;ПВЗ &amp;quot; - Например в адресе передана строка &amp;quot;ПВЗ На Ленинском проспекте&amp;quot;, то искать будем филиал с названием &amp;quot;На Ленинском проспекте&amp;quot; который подчиненный, активный, с галкой ПВЗ и в городе town. Если город не указан, то ищем филиал во всех городах, и считаем его найденным если найдем только один филиал. &lt;br /&gt;
* Если филиалы найти не удалось, функция makeaddress работает как обычно и выполняет преобразование адреса.&lt;br /&gt;
&lt;br /&gt;
Если адрес не содержит русских букв, только латиница, и курьерская служба находится в одной из стран Россия, Белоруссия, Казахстан или Украина, и город-получатель (второй параметр, town) находится так же в одной из этих стран, функция автоматически делает транслитерацию адреса на русский язык.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''SetConnection(DB) – Подключает объект к базе данных DB, где DB – ссылка на объект TADO.Self.'' '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
''SetTown(Town) – Устанавливает код текущего города (используется в некоторых функциях объекта) в значение Town. По-умолчанию текущий город – 1.''  '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
'''SetIndexLength(Length)''' – Устанавливает длину почтового индекса. По-умолчанию – 6.&lt;br /&gt;
&lt;br /&gt;
'''GetIndex(Address)''' – Возвращает почтовый индекс из адреса.&lt;br /&gt;
&lt;br /&gt;
'''GetStreet(Address)''' - Возвращает улицу до первой запятой.&lt;br /&gt;
&lt;br /&gt;
'''GetHome(Address)''' - Возвращает номер дома до второй запятой, но не более пяти символов.&lt;br /&gt;
&lt;br /&gt;
'''GetKurierByStation(station, Mass, Cash, Date_Putn)'''&lt;br /&gt;
&lt;br /&gt;
'''TownByIndex(Index[, PriorityName][, PriorityCountry])''' – Возвращает код города по индексу. В случае ошибки поиска – код текущего города. Если нашлось несколько населенных пунктов, и указано приоритетное название - выбирается населенный пункт, название которого начинается с PriorityName (если есть).&lt;br /&gt;
&lt;br /&gt;
'''TownByName(Name[,NotNeedCL=False, City=0])''' – Возвращает код города по имени. В случае ошибки поиска – возвратит код текущего города. Если параметр NotNeedCL (параметр не обязательный) установить в TRUE, тогда функция возвратит 0, если город не удалось найти. Параметр City (код региона) позволяет ограничить поиск одной областью (не обязательный, по умолчанию не используется).&lt;br /&gt;
&lt;br /&gt;
'''FillClientInfo(Excel, client, Sheet, Row, Col)''' – Выводит в эксель информацию о клиенте с кодом client на лист sheet начиная со строки row и столбца col.&lt;br /&gt;
&lt;br /&gt;
'''SavePrintFormToFile(FormType, FormNumber)''' - Сохраняет на диске файл печатной формы и возвращает путь к нему&lt;br /&gt;
&lt;br /&gt;
'''CreateTrans(Address[, Store][, Operator][,Correction])''' - Формирует запись для печати кассового чека для корреспонденции с кодом Address, для выбора кассового аппарата используется код склада Store. Если Store не указано - при исполнении в среде клиентского модуля системы использует склад, указанный пользователем в окне [[Настройка параметров рабочего места|&amp;quot;Настройка&amp;quot; - &amp;quot;Параметры&amp;quot;]], в остальных модулях - код текущего склада из [[Настройка глобальных параметров|переменной]] &amp;quot;CL&amp;quot; (&amp;quot;Текущий филиал&amp;quot;). Поле Operator позволяет указать кассира (передается код справочника сотрудников). Если не указан, в основной системе будет использован код авторизованного пользователя, в других модулях - 1.&lt;br /&gt;
Поле Correction позволяет указать данные для корректировочного чека, используется в системе Штрих-М. По умолчанию пустая строка. Возвращает идентификаторы записей чеков. Может вернуть пустую строку, если чек создавать не понадобилось, один или несколько кодов через запятую, если создано несколько чеков. В случае ошибки вызывает ошибку, поэтому рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CreateReturnTrans(Address)''' - формирует запись для печати чека возврата для корреспонденции с кодом Address. Чек возврата печатается на полную сумму и с теми же атрибутами, что и чек продажи. Возвращает идентификатор записи чека возврата. В случае ошибки вызывает ошибку, поэтому, как и с CreateTrans,  рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownDeliveryDays(Source, Mode, TownTo, TownFrom)''' - возвращает количество дней необходимых на доставку отправления, только для межгорода. Source - код клиента, Mode - режим срочности, TownFrom - код города отправителя, TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcDeliveryDate(Source, Mode, TownTo, TownFrom, Date_Beg, Time_beg)''' - Возвращает планируемую дату доставки с учетом сроков доставки. Работает при городской и междугородней доставке. Для межгорода сроки доставки берутся из зон. Для городской доставки, из дополнительных параметров статуса (17 статус, 1 параметр в доп. информации)  Если рассчитать дату планируемой доставки не удалось, возвращает пустую строку. Параметры: Source - код клиента, Mode - режим срочности, TownTo - город получатель, TownFrom - город отправитель, date_beg - дата заказа (может быть передана строкой в формате DD.MM.YYYY или в числовом), time_beg - время заказа. &lt;br /&gt;
&lt;br /&gt;
'''GenSpecialSMA(DirectExcel, Code)''' - функция для генерации отчета о доставке по акту передачи денег. Первый параметр - указатель на TDirectExcel, второй параметр - код акта передачи денег. АПД выводится на текущий лист объекта TDirectExcel.&lt;br /&gt;
&lt;br /&gt;
'''CreateSpecialSMA(ClientCode, DateTo)''' - Функция создает исходящий акт передачи денег (АПД). Требует ClientCode - код клиента, DateTo - дату акта. Функция возвращает коды созданных актов. Если возвращаемых параметров два, значит функция пыталась создать два АПД: первым, идет код АПД с наличной оплатой, а вторым с безналичной. Примеры возвращаемого результата: '0'- акт не был создан, отсутствуют корреспонденции; '124' - код созданного акта; '0,0' - пытались создать два акта, но отсутствуют данные; '4556,0' - создан только наличный АПД; '0,445' - создан только безнал.; '4556,445' - созданы нал. и безнал.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressForActDelivery(ActCode, [DeliveryDateMode=0, Delivery=True])''' - Функция создает корреспонденцию на доставку акта. ActCode - код акта; DeliveryDateMode: 0 - установить план. дату доставки текущим рабочим днем, 1 - установить план. дату доставки следующим рабочим днем, 2 - установить план. дату доставки равной планируемой дате оплаты АПД; Delivery - создать корр. на доставку АПД или создать корреспонденцию на забор АПД (по умолчанию, доставка АПД). Работа функции может быть изменена системной доп. возможностью OnCreateAddressForActDelivery.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressTransferAct(ClientCode, Store, DateTo, [AdditionalParam])''' - Функция создает исходящий акт передачи корреспонденции (АПК). Требует  ClientCode - код клиента, Store - код филиала, для которого будет создан акт, DateTo - дату, до которой в акт попадут возвраты, AdditionalParam - дополнительный строковый параметр для передачи в системную доп. возможность ExceptionsForAPK, позволяющий отобрать в акт, например, только полные возвраты.   Возвращает код созданного акта. ВНИМАНИЕ: при создании АПК используется системная функция ExceptionsForAPK. Если в ней используются интерактивные функции (вывод сообщений, диалоговые окна, выполнение скриптов), то акт сформирован не будет, а функция CREATEADDRESSTRANSFERACT вернет ошибку.     &lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByAddress(Address, TownCode, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попал адрес. Если полигон найти не удалось, функция возвратит пустую строку. Address - адрес корреспонденции текстом; TownCode - код города; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByAddress(addressrecord.address, if((addressrecord.number=0)*(addressrecord.strbarcode=&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;), addressrecord.townfrom, addressrecord.townto), '`schema`=1') - пытаемся найти вхождение адреса в полигоны 1 схемы, при выборе города учитывается корр. на забор, у нее нужно использовать город-отправитель (а для обычной корр. нужен город-получатель).&lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByLatLon(Lat, Lon, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попали GPS координаты. Если полигон найти не удалось, функция возвратит пустую строку. Lat - широта  текстом; Lon - долгота текстом; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByLatLon('55.769064','37.590713','zone is not null and price=0') - пытаемся найти вхождение координат в полигоны, где задана зона, для всех клиентских и курьерских зон.&lt;br /&gt;
&lt;br /&gt;
'''GetLatLonByAddress(AddressText, TownCode)''' - возвращает географические координаты вида lat,lon указанного в AddressText адреса. Поиск производится в городе, имеющем код TownCode в таблице Town.&lt;br /&gt;
&lt;br /&gt;
'''GetRouteCode(AddressText, TownCode, LatLon[, Lon])''' - для адреса AddressText в городе с кодом TownCode (из таблицы Town) по географическим координатам lat, lon возвращает код роута (записи, хранящей координаты адреса в городе). Если роут не найден (для адреса в городе не найдено записи с указанными координатами) - создает новый роут и возвращает его код, если роут найден (был создан ранее) - обновляет у роута координаты. Если параметр Lon задан, то параметр LatLon должен содержать одну координату, иначе LatLon должен содержать строку вида 'lat, lon'.&lt;br /&gt;
В случае ошибки возвращает Null.&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode(address, townto, '55.114034, 36.592397'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Троицк, Полковника милиции Курочкина ул., 11', 1, '37.467446, 55.740537'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Обнинск, Маркса пр., 20', TownByName('Обнинск'), 55.114034, 36.592397));&lt;br /&gt;
&lt;br /&gt;
'''CalcAgentPrice(AddressCode, AgentCode, TownFrom, TownTo, Mode, [, Count=1])''' - функция возвращает стоимость доставки рассчитанную по тарифу агента. AddressCode - код адреса, AgenCode - код филиала (агента), TownFrom - код города отправителя, TownTo - код города получателя, Mode - режим срочности, count - тарифная сетку от указанного количества отправлений (по умолчанию 1)&lt;br /&gt;
&lt;br /&gt;
'''SetAddrKol_vo(address, getkol_vo)''' - функция делает прием корреспонденции в текущем ответственном филиале. address - внутренний код адреса, getkol_vo - количество принимаемых мест, может принимать значения: &amp;quot;kol_vo&amp;quot; - принять все места, &amp;quot;getKol_vo+1&amp;quot; - принять еще одно место, &amp;quot;число&amp;quot; - сделать количество принятых мест равным указанному числу.&lt;br /&gt;
&lt;br /&gt;
'''CalcClientCnt(client_code, date, is_intown [, date_put=CurrDate(), skipajust=false])''' - функция расчета количество доставленных корреспонденций у клиента с кодом client_code за предыдущий месяц от даты date (Или за текущий месяц, подробнее смотри переменную UseCurrentMonthCount) среди внутригородских (is_intown = true) либо междугородних (is_intown = false) корреспонденций, date_put - дата доставки (для альтернативного способа подсчета, включаемого переменной UseDatePutForCalcCnt), skipajust - не учитывать принудительно введенные количества (таблица priceclientadjust типы записей 0 и 1).&lt;br /&gt;
&lt;br /&gt;
'''GetBasePrice''' - возвращает базовую стоимость доставки посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов,зоны,типа,срочности,массы, расстояния. В системах с выключенными доп. услугами также считает проценты от суммы и страховки. &lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset._self&amp;quot;.&lt;br /&gt;
  Описание некоторых полей датасета:&lt;br /&gt;
    pmoney - процент от суммы;&lt;br /&gt;
    pmoneycard - процент от суммы при оплате картой;&lt;br /&gt;
    pricecode - код прайса (таблица Price) ;&lt;br /&gt;
    distarea - район метро получателя (актуально при отключённом едином районировании, как правило район от 200 до 299 является признаком области);&lt;br /&gt;
    region - признак области при включенном едином районировании;&lt;br /&gt;
    distareaFrom и regionFrom  - аналог distarea, region только для отправителя;&lt;br /&gt;
    pcncode - код записи таблицы pricecnt &amp;quot;количество от&amp;quot;;&lt;br /&gt;
    Запрос содержит поля таблицы pricelinesnew - начальная стоимость по тарифной сетки, найденные без учета массы,только по типу срочности и режиму.&lt;br /&gt;
    Запрос содержит поля таблицы price.&lt;br /&gt;
&lt;br /&gt;
*addressrecord - ссылка на объектную модель карточки корреспонденции, следует использовать уже созданную addressrecord._self&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*type - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*wait - количество минут ожидания (не учитывается при доп. услугах, есть системная услуга &amp;quot;ожидание&amp;quot;);&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*rur - сумма передаваемых денег (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от суммы&amp;quot;);&lt;br /&gt;
*inshprice - сумма страховки (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от объявленной стоимости&amp;quot;);&lt;br /&gt;
*distance - расстояние до места доставки, обычно поле заполняется при доставке в область (регион в едино районировании). Дополнительная наценка к стоимости доставки;&lt;br /&gt;
*forward - направление доставки: true - туда; false - обратно;&lt;br /&gt;
*Collection - признак заборной корреспонденции: true - забор, false - доставка (В тарифе есть возможность указать стоимость для забора);&lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
В тарифе есть возможность указать формулу, которая может влиять на базовый расчет. Формула может объявить служебные переменные, которые:&lt;br /&gt;
*$FormulaReplace - если true – возвращаемое значение полностью заменяет базовый расчет;&lt;br /&gt;
*$FormulaKoeff - коэффициент на который будет помножена базовая стоимость.&lt;br /&gt;
Также внутри формулы объявлены следующие объекты dataset, addressrecord и переменные:&lt;br /&gt;
*$ForceIntown - Переменная становится истиной, если междугородний расчет был отменен, т.к. адрес попал в нарисованную зону на карте.&lt;br /&gt;
*а также: $forward, $distance, $Count, $Collection, $Wait, $FormulaKoeff, $PriceCode - описание есть выше.&lt;br /&gt;
&lt;br /&gt;
Для направления &amp;quot;туда&amp;quot;, Функция GetBasePrice вызывается  через доп. услугу &amp;quot;База&amp;quot; (при включенных доп. услугах), для направления &amp;quot;Обратно&amp;quot; всегда вызывается напрямую (т.к. доп. услуги работают только в для направления &amp;quot;туда&amp;quot;).&lt;br /&gt;
На расчет этой функции влияют следующие переменные: &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Расчет стоимости по адресу&amp;quot;, &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Зона клиента по умолчанию&amp;quot;,  &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Подсчет кол-ва отправлений за месяц&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownPrice''' - возвращает базовую стоимость междугородней доставки, посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов, типа, срочности, массы, расстояния.&lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset.self&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*tp - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcAddressPrice(AddressCode, [,ZakazCount])''' - полностью пересчитывает стоимость доставки корреспонденции по тарифу клиента. AddressCode - внутренний код адреса, ZakazCount - не обязательный параметр, кол-во заказов от клиента.&lt;br /&gt;
&lt;br /&gt;
'''GetStationCode(s [,town])''' – возвращает код станции метро, ассоциированный в системе с адресом s. В случае невозможности идентифицировать станцию метро – возвращает 0. &lt;br /&gt;
Когда включено районирование по карте, необходим второй параметр &amp;quot;town&amp;quot; - код города в котором нужно искать адрес.  Возвращает код района если удалось его найти; код станции меж-города - если адрес удалось геокодировать, но район не нашли; код 0 - когда не удалось геокодировать адрес.&lt;br /&gt;
&lt;br /&gt;
'''RecalcSpecialSMA(ActCode)''' - пересчитать акт передачи денег (АПД). Также, у корреспонденций входящих в АПД будет пересчитана стоимость доставки. Для Входящего АПД сумма акта не пересчитывается. Параметр ActCode - внутренний код акта, коды можно перечислять через запятую.&lt;br /&gt;
&lt;br /&gt;
'''UserCode''' - Возвращает код текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserName''' - Возвращает имя текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserPass''' - Возвращает пароль текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''UserBaseCode''' – Возвращает код текущего пользователя из таблицы «Сотрудники» (kurier).&lt;br /&gt;
&lt;br /&gt;
'''UserEmail''' - Возвращает e-mail текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''CurrentTown''' – Возвращает код текущего города (из таблицы town).&lt;br /&gt;
&lt;br /&gt;
'''CurrentCity''' – Возвращает код текущего региона (из таблицы city).&lt;br /&gt;
&lt;br /&gt;
'''CurrentLocation''' – Возвращает код текущего филиала (из таблицы store).&lt;br /&gt;
&lt;br /&gt;
'''FromEmailStr''' - строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
'''FillExcelDoc'''(Excel, Dataset, FormType, FormNumber,Print,[printer]) - Выполняет указанную печатную форму в объекте excel. Excel объект можно не указывать, тогда функция сама создаст объект экселя и разрушит его, полезно когда книгу &lt;br /&gt;
нужно распечатать или отправить по email (на листе данных в ячейке 1,1 укажите ключевое слово email). Dataset объект с данными для скрипта в печатной форме, может быть null. Dataset передавать можно так db.self, тогда переданный dataset внутри печатной формы будет доступен по имени dataset. Print - печатает книгу на принтере, после печати объект excel разрушается, при использовании параметра не указываете объект excel. Printer - имя принтера, на котором печатать (по умолчанию пустая строка, что означает &amp;quot;печатать на принтере по умолчанию&amp;quot;). Например:&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'excel');&lt;br /&gt;
 FillExcelDoc(excel.self, null, 12, 1);&lt;br /&gt;
 excel.DoNotDestroy(true);&lt;br /&gt;
 excel.SetVisible(true);&lt;br /&gt;
 ''Покажет эксель с выполненной печатной формой''&lt;br /&gt;
&lt;br /&gt;
'''ValutaSign''' – Возвращает название валюты для суммы.&lt;br /&gt;
&lt;br /&gt;
'''SendToMeasoft(xml)''' - Отправляет запрос в клиентское API Measoft. Автоматически добавляет начальный &amp;quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''InsertFirmAtt(excel, sheet, firmcode)''' - Вставляем на лист эксель по коду фирмы: печать, подпись, подпись бухгалтера, логотип. Тэги &amp;lt;STAMP&amp;gt;, &amp;lt;DIR&amp;gt;, &amp;lt;BUH&amp;gt;, &amp;lt;LOGO&amp;gt; соответственно. После тега можно указать размеры изображения в символах Microsoft Excel. Формат записи: &amp;lt;STAMP&amp;gt; 16, 16&lt;br /&gt;
&lt;br /&gt;
'''PreCalcSalary(kurier, addressCodes)''' - Рассчитывает предварительную зарплату. Kurier - код курьера, используется для определения тарифа. addressCodes - коды адресов, через запятую для которых необходимо посчитать зарплату. Результаты расчета будут записаны в таблицу kurierpaydetail, так как расчет предварительный то записи не будут прикреплены к конкретному начислению. &lt;br /&gt;
&lt;br /&gt;
  select a.code, kpd.price as &amp;quot;туда&amp;quot;, kpd2.price as &amp;quot;обратно&amp;quot; from address a &lt;br /&gt;
  left join kurierpaydetail kpd on kpd.sourcetable=3 and kpd.sourcecode=a.code and kpd.rectype = 1 &lt;br /&gt;
  left join kurierpaydetail kpd2 on kpd2.sourcetable=3 and kpd2.sourcecode=a.code and kpd2.rectype = 2&lt;br /&gt;
  where a.code in (...)&lt;br /&gt;
&lt;br /&gt;
'''CalcSalary(DateTo, [Filter=0, KurierCode = 0, ManagerCode = 0])''' - Полный расчет зарплаты курьерам. DateTo  - дата до которой создается начисление. Условия отбора курьеров для начисления. Filter - роль сотрудника: 0 - Все, 1 - курьеры, 2 - менеджеры; KurierCode - код курьера, ограничить расчет зарплаты одним курьером;ManagerCode - код курьера, ограничить расчет зарплаты курьерами указанного менеджера. Внимание фильтры Filter, KurierCode и ManagerCode накладываются друг на друга. Результатом функции является SubSQL с информацией по созданным начислениям. &lt;br /&gt;
  поля ответа: код курьера, код менеджера, начислено, бонусы, штрафы, аванс, итого;&lt;br /&gt;
  select kurier, manager, profit, bonus, shtraf, prepay, total  [union select ...]&lt;br /&gt;
&lt;br /&gt;
'''SelDistAddr(s)''' – Возвращает строку для вставки в select запрос, для вывода поля с упрощенным адресом. Принимает один необязательный строковый параметр - алиас таблицы из которой будет упрощаться поле address, по умолчанию &amp;quot;a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''VoiceReadStr(str)''' – Озвучивает фразу str голосовым уведомлением доступными словами из базы. Может содержать тег &amp;quot;{break_off}&amp;quot; для того, чтобы сделать эту фразу не пропускаемой в очереди воспроизведения.&lt;br /&gt;
&lt;br /&gt;
'''CalcStorageCost(ClientCodes, DateFrom, DateTo, NeedReport[, Store])''' – рассчитывает стоимость хранения на складе для выбранных клиентов (ClientCodes - коды клиентов через запятую), в период дат с DateFrom до DateTo, с прикреплением к корреспонденции отчета в зависимости от выставленного параметра NeedReport. Может содержать параметр Store - код филиала, по умолчанию пустой (расчет выполняется для всех филиалов). Возвращает коды созданных корреспонденций через запятую.&lt;br /&gt;
&lt;br /&gt;
'''WriteOut(DocId, ItemId, Date, Cnt[, BC])''' – производит списание товара со склада. DocId - код (docs.code) документа списания, ItemId - код товара (item.code), Date - дата операции, Cnt - количество списываемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер. Если указан BC, то параметр ItemId игнорируется и поиск номенклатуры происходит исключительно по штрих-коду. В случае успеха, функция возвращает строку вида: код номенклатуры, списанное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''IncomePurch(DocId, ItemId, Date, Cnt[, BC, Location = CurrentLocation])''' – производит приход товара на склад. DocId - код (docs.code) приходной накладной, ItemId - код товара (item.code), Date - дата операции, Cnt - количество приходуемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер, Location - код склада (store.code).  В случае успеха, функция возвращает строку вида: код номенклатуры, введенное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''CreateLedgerDoc(Date, Client, UserCode, Type[, ExtNumber, Message])''' - создает складской документ и возвращает код этого документа. Date - дата документа. Client - код клиента. UserCode - код пользователя, создавшего документ. Type - тип документа (statetype = 13). ExtNumber - номер у поставщика для документов прихода и расхода. Message - комментарий к документу. Последние два аргумента не обязательные и могут быть пустыми.&lt;br /&gt;
&lt;br /&gt;
== Объект TINIFile ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции работы с ini-файлами. В некоторых контекстах создается автоматически для предоставления доступа к настроечному файлу модуля, выполняющего скрипт.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
IniParam(s[,section='common']) – Существует только если имя экземпляра объекта пустое. Возвращает значение параметра s ini-файла секции «common», изменить секцию можно не обязательным параметром section. В случае отсутствия параметра в файле возвращает пустую строку. &lt;br /&gt;
&lt;br /&gt;
Param(s) – Синоним IniParam с тем отличием, что существует только если имя объекта непустое.&lt;br /&gt;
&lt;br /&gt;
SetText(s) - Загружает ini файл из строки s. Если в файле нет секции «common», то принудительно объявляет ее в начале.&lt;br /&gt;
&lt;br /&gt;
== Объект TSMS ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для отправки SMS, а также проверки статуса их доставки.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetProxy(Server, Port, User, Pass) - Устанавливает настройки прокси-сервера.&lt;br /&gt;
&lt;br /&gt;
Connect(Provider, Host, User, Pass, SenderName, SMSPrefix) – Подключает объект к провайдеру provider, используя адрес Host, имя пользователя User и пароль Pass. Значение SMSPrefix предназначено для того, чтобы провайдер мог различить сообщения от разных филиалов, если этими филиалами используется одно подключение. Если необходимости разделять сообщения нет - значение SMSPrefix можно не указывать.&lt;br /&gt;
Для провайдера доступны значения 'mirsms', 'sms16', 'websms', 'epochta', 'zanzara', 'SMSManager', 'f1sms', 'BitCall', 'mirsmsGET', 'AMD' и другие, либо можно указать числовые значения номера протокола, от 1 до &amp;lt;rspoiler text=&amp;quot;20&amp;quot;&amp;gt;Набор провайдеров все время дополняется, количество и номера можно смотреть в Справочники - Переменные - Подключения - SMS&amp;lt;/rspoiler&amp;gt; соответственно. Эти значения соответствуют значениям переменной SMSProtocol таблицы &amp;quot;Value&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SendSMS(Phone, Text, [ID]) – Отправляет SMS с текстом Text на телефон Phone. Для некоторых провайдеров необходим уникальный идентификатор сообщения ID (для провайдера iVoice - идентификатор сценария (кампании)). Возвращает ID провайдера для последующей проверки статуса доставки.&lt;br /&gt;
&lt;br /&gt;
CheckSMS(ProviderID) – Проверяет состояние доставки сообщения с идентификатором ProviderID. Возвращает: 0 – доставляется, 1 – успешно доставлено, 2 – не доставлено.&lt;br /&gt;
&lt;br /&gt;
ReceiveSMS(InboxID, DateFrom, DateTo, NewOnly) - Получает входящие SMS, с ящика InboxID (идентификатор выдаётся провайдером). DateFrom, DateTo - задается временной интервал в котором были приняты сообщения(формат 08.04.2013 18:00:00 'DD.MM.YYYY HH:NN:SS'). Чтобы получать только новые сообщение поле NewOnly должно быть True. Возвращает XML с сообщениями.&lt;br /&gt;
&lt;br /&gt;
ExtraResult([ParamName='']) - Вызывается после CheckSMS, возвращает дополнительную информацию по последнему статусу смс. В настоящее время работает только для провайдеров BitCall и iVoice. Для BitCall по умолчанию возвращает кнопки, нажатые абонентом во время работы с голосовым меню. Если в paramname указать 'IdentifyText' то будет возвращен JSON  с ответами абонента на заданные вопросы(используется в случае звонков с индивидуальным сценарием). Для iVoice по умолчанию подразумевается параметр 'response', при этом будет возвращен JSON  с ответами абонента на заданные вопросы (в зависимости от сценария)&lt;br /&gt;
&lt;br /&gt;
Log - Возвращает последний HTTP запрос и ответ от сервера смс.&lt;br /&gt;
&lt;br /&gt;
== Объект TXML ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга XML-данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст XML документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию. Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля.&lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
AttribCount – Возвращает количество атрибутов текущего элемента.&lt;br /&gt;
&lt;br /&gt;
AttribName(i) – Возвращает имя атрибута с номером i.&lt;br /&gt;
&lt;br /&gt;
Attrib(V) – Ищет атрибут и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
== Объект TJSON ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга JSON-данных. &lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст JSON документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля. &lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Можно проверять наличие элементов, если элемента нет, вернется пустая строка.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
isArray - Возвращает true, если текущий элемент является массивом (доступ к дочерним элементам возможен только по индексу, нумерация элементов начинается с нуля)&lt;br /&gt;
&lt;br /&gt;
==Объект TZip==&lt;br /&gt;
Предназначен для работы с Zip архивом. &lt;br /&gt;
&lt;br /&gt;
SetZip(s) - Загружает архив в объект из строки s;&lt;br /&gt;
&lt;br /&gt;
GetZip - Возвращает архив в виде строки;&lt;br /&gt;
&lt;br /&gt;
AddFromFile(SrcPath, ZipPath) - Добавляет файл SrcPath в архив и располагает его по пути ZipPath. ZipPath содержит имя файла в архиве, при необходимости можно указать каталог; &lt;br /&gt;
&lt;br /&gt;
AddFromStr(Data, /*ZipPath*/) - '''параметр ZipPath временно не работает'''. Добавляет файл из строки Data в архив и располагает его по пути ZipPath.  -ZipPath содержит имя файла в архиве, при необходимости можно указать каталог;&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(path) - Загружает архив из файла path;&lt;br /&gt;
&lt;br /&gt;
SaveToFile(path) - Сохраняет архив в файл path;&lt;br /&gt;
&lt;br /&gt;
Count - Возвращает кол-во файлов в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByIndex(index) - Возвращает распакованный файл в виде строки. Index - номер файла в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByName(ZipPath) - Возвращает распакованный файл в виде строки. ZipPath - путь к файлу в архиве, может содержать каталоги;&lt;br /&gt;
&lt;br /&gt;
FileName(index) - По номеру файла, функция возвращает полный путь файла в архиве.&lt;br /&gt;
&lt;br /&gt;
==Объект TBase==&lt;br /&gt;
&lt;br /&gt;
'''Функции общего назначения''':&lt;br /&gt;
&lt;br /&gt;
'''ExecSimpleScript(Caption, Text)''' - Выполняет скрипт &amp;quot;Дополнительных возможностей&amp;quot;. Возвращаемые значения, введенные пользователем устанавливает в переменные $scriptvar1..$scriptvarN, Значения кодов списочных переменных - в переменных $scriptvar1codes..$scriptvarNcodes. Функция возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot; в диалоговом окне.&lt;br /&gt;
&lt;br /&gt;
'''FillAdvPriceReport(Excel, AddressCodes, StartLine, StartCol, [ShowSumPrice,InsertColumns,ShowAll])''' - добавляет отчёт по дополнительным услугам. В AddressCodes - указаны коды адресов через запятую, каждый код это отдельная строка отчета. Адреса будут показаны в порядке перечисления их в AddressCodes. Если в отчет нужно добавить пустую строку, то можно указать код адреса -1000. StartLine, StartCol - верхний левый угол выгружаемой таблицы. ShowSumPrice - добавить столбец итоговый столбец с суммой всех услуг, по умолчанию выключено. InsertColumns - раздвинуть таблицу перед вставкой отчета, позволяет встраивать отчет посередине выгрузки, по умолчанию выключено. ShowAll - показать все дополнительные услуги, по умолчанию false и показывает только услуги с начислениями. Функция возвращает количество использованных столбцов.&lt;br /&gt;
&lt;br /&gt;
'''PrintSticker(Codes, [ToBoxes=False])'''&lt;br /&gt;
&lt;br /&gt;
'''PrintBlanc(Codes, BlancNumber)''' - печатать форму из раздела &amp;quot;Заполнить бланк&amp;quot;. Codes - коды корреспонденций, BlancNumber - номер формы из раздела &amp;quot;Бланки для корреспонденции&amp;quot; (3)&lt;br /&gt;
&lt;br /&gt;
'''GetItemByName(Name)'''&lt;br /&gt;
&lt;br /&gt;
'''GetA4Printer([GetPrinterPort=False])''' - возвращает имя принтера выбранного для печати документов. GetPrinterPort - попытаться по имени принтера найти порт принтера. &lt;br /&gt;
&lt;br /&gt;
'''GetStickerPrinter([GetPrinterPort=False])''' - возвращает имя принтера выбранного для печати стикеров. GetPrinterPort - попытаться по имени принтера найти порт принтера. &lt;br /&gt;
&lt;br /&gt;
'''GetDuplexPrinter([GetPrinterPort=False])''' - возвращает имя принтера выбранного для двусторонней печати, если принтер не выбран, возвращает пустую строку. &lt;br /&gt;
&lt;br /&gt;
'''PrintAttachPDFPage(Code, FileName, Page, Printer)''' - печатает страницу из вложенного файла PDF. Code - код вложения (attachment) или путь к файлу, Page - номер страницы, Printer - 0 = принтер A4, 1 = принтер этикеток. &lt;br /&gt;
&lt;br /&gt;
'''AttachPDFToText(Code, [TextFileName])''' - преобразует файл PDF из вложений в текст. Code - код вложения (attachment) или путь к файлу, TextFileName - имя текстового файла, в который записывается результат (если не указан, используется временный файл). Возвращает текст в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''GhostScript(GScript, Code)''' — функция для выполнения консольных команд утилиты [https://ghostscript.readthedocs.io/en/latest/Use.html ghostscript]. Где, GScript — строка с командами Ghostscript; Code — код вложения или путь к PDF-файлу, предназначенному для обработки. В командах доступен специальный тег %MeasoftInFile%, который автоматически заменяется на путь к предварительно загруженному файлу (Code). Если в команде необходимо указать путь для сохранения результата обработки, используйте тег %MeasoftOutFile%. В этом случае функция на основании параметра Code автоматически сформирует имя временного выходного файла. После успешного выполнения команд функция возвращает путь к сгенерированному выходному файлу -  %MeasoftOutFile%.&lt;br /&gt;
&lt;br /&gt;
'''GetActiveForm([SkipFormName])''' - возвращает код активной формы в программе где происходит сканирование. SkipFormName - не обязательны параметр, имя формы которую нужно пропустить при определении интерфейса.&lt;br /&gt;
 '''Список интерфейсов''': &lt;br /&gt;
 0 - неопределенный; &lt;br /&gt;
 1 - прием корреспонденции на склад; &lt;br /&gt;
 2 - АПД; &lt;br /&gt;
 3 - комплектация адресов (ShelfingForm); &lt;br /&gt;
 4 - доска приема; &lt;br /&gt;
 9 - вкладка «Манифесты»; &lt;br /&gt;
 10 - Инвентаризация корреспонденции; &lt;br /&gt;
 11 - АПК; &lt;br /&gt;
 12 - вкладка «Адреса»; &lt;br /&gt;
 13 - вкладка «Выдача»; &lt;br /&gt;
 14 - вкладка «Склад»; &lt;br /&gt;
 15 - Список номенклатуры; &lt;br /&gt;
 16 - Инвентаризация склада; &lt;br /&gt;
 17 - Приходная накладная; &lt;br /&gt;
 18 - Списание товара; &lt;br /&gt;
 19 - Карточка корреспонденции.&lt;br /&gt;
&lt;br /&gt;
'''AddAddressScanLog(Code[, StrBarCode, IsManual, FromInterface, ExtraInfo])''' - добавляет событие сканирование для корреспонденции с кодом Code. Необязательные параметры: StrBarCode - сканируемый ШК корреспонденции (по умолчанию пустой), IsManual - галка ручного сканирования (по умолчанию false), FromInterface - код интерфейса сканирования (StateType=81, по умолчанию 0 - неопределенный), ExtraInfo - текстовый комментарий события.&lt;br /&gt;
&lt;br /&gt;
'''RuleName(alias)''' - Выдает полный путь в дерева прав по псевдониму права.&lt;br /&gt;
&lt;br /&gt;
'''ShowText(Caption:string, Value:string)''' - показывает пользователю окно с заголовком Caption и с многострочным полем со значением Value. Может быть полезен при отображении логов выполненной операции. &lt;br /&gt;
&lt;br /&gt;
'''ShowScanError(msg [, Speek, Color, Abort])''' - выдает пользователю окно с текстом msg блокируя последующие действия сканирования. Если Speek - истинно, то сообщение проговаривается голосовым движком, по умолчанию выключено. Color - целочисленное число цвета, в который будет окрашен фон сообщения (по умолчанию = -1, стандартный). Abort  - прервать выполнение скрипта, не показывая ошибку.&lt;br /&gt;
&lt;br /&gt;
'''CheckRule(alias)''' - функция проверки разрешения у текущего пользователя системы, alias - псевдоним права. Возвращает 1, если право есть и 0, если права нет. &lt;br /&gt;
 Пример: if(CheckRule('RSE'), ShowMessage('У пользователя есть право изменять счета'), ShowMessage('У пользователя нет права изменять счета'));&lt;br /&gt;
&lt;br /&gt;
'''GetKurierMoney(KurierCode, DateEnd, NonCash)''' - возвращает баланс курьера с кодом KurierCode на дату DateEnd. NonCash - булевый флаг, если истинно, то будет рассчитан безнальный баланс; &lt;br /&gt;
&lt;br /&gt;
'''Функции, работающие только в импорте БД из эксель:'''&lt;br /&gt;
&lt;br /&gt;
ReplaceAddress&lt;br /&gt;
&lt;br /&gt;
GetItemByCode - Поиск товара по артикулу. Внимание: в пределах одного клиента может быть несколько товаров с одинаковыми артикулами. В этом случае функция найдет последний заведенный товар.&lt;br /&gt;
&lt;br /&gt;
GetPrice&lt;br /&gt;
&lt;br /&gt;
GetNewNumber - используется при импорте реестра, возвращает номер конверта в загружаемом заказе&lt;br /&gt;
&lt;br /&gt;
GetNewPos - используется при импорте реестра, возвращает порядковый номер вложения&lt;br /&gt;
&lt;br /&gt;
GetNewPackagePos- используется при импорте реестра, возвращает порядковый номер места&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zakaz - возвращает номер заказа куда происходит импорт реестра&lt;br /&gt;
&lt;br /&gt;
addresscode  -  используется при импорте реестра, код созданного адреса&lt;br /&gt;
&lt;br /&gt;
Source  - код заказчика&lt;br /&gt;
&lt;br /&gt;
ClientTown - Узнаем город клиента, через филиал с которым он работает. Сам клиент берется из заказа указанного в окне &amp;quot;Импорт БД из Excel&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Объект TFieldObject ==&lt;br /&gt;
Создается только автоматически. Объект для доступа к записям, используется в картах и дополнительных услугах (addressrecord) и событиях карточки корреспонденции (fieldlist). Методы объекта:&lt;br /&gt;
&lt;br /&gt;
'''_GetTableInfo''' - возвращает данные о полях и примеры данных объекта.&lt;br /&gt;
&lt;br /&gt;
'''_Self''' - возвращает ссылку на объект.&lt;br /&gt;
&lt;br /&gt;
'''_Set(fieldname, fieldvalue [, DoUpdateForm])''' - Если базовый объект строка. Устаналивает для поля fieldname значение fieldvalue. DoUpdateForm по уолчанию false, если указать true то обновление поля будет не только в объекте но и пользовательском интерфейсе. Обновление работает только в карточке корреспнденции для ограниченного набора полей: vlog, mode, type, date_put, time_put, message, kurier, state1.&lt;br /&gt;
&lt;br /&gt;
'''_Set(keyfield, keyvalue, filed, value)''' - Если базовый объект таблица (addressrecord.boxes). Работает перегруженная версия метода _set, cначала происходит поиск строки по ключу, далее меняется значение указанного столбца. keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца.  Пример, отключение услуги база:&lt;br /&gt;
&lt;br /&gt;
 addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
 priceconf - поле где записан код услуги;&lt;br /&gt;
 1 - услуга База;&lt;br /&gt;
 active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
== Объект TMessage ==&lt;br /&gt;
Создается только автоматически. Объект используется для скриптовой обработки письма в [https://wiki.courierexe.ru/index.php/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8#.D0.98.D0.BC.D0.BF.D0.BE.D1.80.D1.82_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85| заданиях импорта данных]. В себе содержит текст письма в очищенном формате и оригинальном формате HTML, отправитель письма, тему письма, дата получения и список прикрепленных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.Text''' - возвращает очищенный от HTML-тегов текст письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.HTMLText''' - возвращает оригинальный текст письма со всеми HTML-тегами.&lt;br /&gt;
&lt;br /&gt;
'''Message.Sender''' - возвращает email-адрес отправителя письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.AttachmentsCount''' - возвращает количество вложенных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.DateTime''' - возвращает дату и время получения письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.Subject''' - возвращает тему письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentDataString(Number)''' - возвращает вложенный файл под номером Number в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentName(Number)''' - возвращает имя вложенного файла под номером Number.&lt;br /&gt;
&lt;br /&gt;
== Объект TStringList ==&lt;br /&gt;
Может использоваться для построчной обработки многостраничных файлов либо для организации текстовых данных. Номер строк начинается с 0. &lt;br /&gt;
Имеет следующий функционал:&lt;br /&gt;
&lt;br /&gt;
'''Count''' - возвращает количество строк в списке.&lt;br /&gt;
&lt;br /&gt;
'''Add(Value:string)''' - добавляет значение Value в конец списка.&lt;br /&gt;
&lt;br /&gt;
'''SetText(Value:string)''' - устанавливает значение списка в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Insert(Number:integer, Value:string)''' - добавляет строку Value в позицию Number.&lt;br /&gt;
&lt;br /&gt;
'''Delete(Number:integer)''' - удаляет строку из списка в позиции Number.&lt;br /&gt;
&lt;br /&gt;
'''Clear''' - очищает элементы списка.&lt;br /&gt;
&lt;br /&gt;
'''LoadFromFile(Path:string)''' - загружает текстовый файл по пути Path.&lt;br /&gt;
&lt;br /&gt;
'''Strings(Number:integer)''' - возвращает строку с номером Number.&lt;br /&gt;
&lt;br /&gt;
'''SetString(Number:integer, Value:string)''' - устанавливает значение строки с номером Number в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Text''' - возвращает полный список строк в виде текста.&lt;br /&gt;
&lt;br /&gt;
'''CommaText([Quoted:boolean])''' - возвращает список значений через запятую. Если Quoted = true, то квотирует элементы списка. По умолчанию равен false.&lt;br /&gt;
&lt;br /&gt;
'''SetCommaText(Value: string)''' - разбивает значение Value на отдельные строки и кладет в список. Разделитель - запятые.&lt;br /&gt;
&lt;br /&gt;
'''IndexOf(Value:string)''' - ищет значение Value среди элементов списка и если находит, то возвращает номер строки. Возвращает -1 если значение не было найдено.&lt;br /&gt;
&lt;br /&gt;
'''Sorted(Value:boolean)''' - устанавливает флаг отсортированности списка в Value. Если Value = true, то сразу же его сортирует. По умолчанию Value = false.&lt;br /&gt;
&lt;br /&gt;
'''Exchange(Pos1:integer, Pos2:integer)''' - меняет элементы списка с позициями Pos1 и Pos2 местами.&lt;br /&gt;
&lt;br /&gt;
'''Duplicates(Value:integer)''' - изменяет параметр управления дубликатами в списке. Если Value = 0 (значение по умолчанию), то список не реагирует на дубликаты. Если Value = 1, то список при добавлении будет игнорировать дубликаты. Если Value = 2, то список будет выдавать исключение, при добавлении дубликата в список.&lt;br /&gt;
&lt;br /&gt;
'''ParamName(Number:integer[, Delimiter:string])''' - возвращает текст до первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает пустоту.&lt;br /&gt;
&lt;br /&gt;
'''ParamValue(Number:integer[, Delimiter:string])''' - возвращает текст после первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает всю строку.&lt;br /&gt;
&lt;br /&gt;
== Объект TFunc ==&lt;br /&gt;
Объект реализует создание и использование функций в скриптовом языке. Позволяет определять переиспользуемые блоки кода с параметрами.&lt;br /&gt;
Важно учитывать, что внтури функции создается свой инстанс интерпретатора и от туда не доступны никакие переменные\объекты кроме переданных в функцию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные методы:&lt;br /&gt;
&lt;br /&gt;
'''New'''(FuncName, Param1, Param2, ..., Body) — создание новой функции.Функция возвращает результат выполнения последней команды в теле функции. Аргументы:&lt;br /&gt;
* `FuncName` — имя функции (строка)&lt;br /&gt;
* `Param1, Param2, ...` — имена параметров функции (переменные начинаются с `$`, объекты — без префикса)&lt;br /&gt;
* `Body` — тело функции (скрипт, выполняемый при вызове)&lt;br /&gt;
&lt;br /&gt;
'''FuncName'''(Arg1, Arg2, ...) — вызов созданной функции по имени. Если в объявлении была указана тип переменная, то и подставлять в аргумент надо обязательно переменную. Будет передано значение этой переменной (переменные словарине поддерживаются!). Если был объявлен объект, то указатель на объект должен быть получен через метод '''_self'''. C функциями поддерживают работу следующие классы: TExcel, TDirectExcel, TCSVFile, TADO, TSelfADO, TPrinter, TCanvas, TPicture, TTable, TINIFile, TSMS, TXML, TJSON, TZip, TStringList, TBaseUtils, а также объект addressrecord (TFieldObject). Результатом работы функции может быть число или строка.&lt;br /&gt;
&lt;br /&gt;
Пример 1, обработка результатов функции:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'calc');&lt;br /&gt;
calc.new('Sum', '$a', '$b',&lt;br /&gt;
  $a + $b&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
set($x, 10);&lt;br /&gt;
set($y, 20);&lt;br /&gt;
showmessage(calc.Sum($x, $y));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример 2, передача объекта в функцию:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'utils');&lt;br /&gt;
utils.new('ProcessDB', 'dbConn', '$value',&lt;br /&gt;
  showmessage($value);&lt;br /&gt;
  dbConn.open('SELECT * FROM address limit 3 ');&lt;br /&gt;
  if(dbConn.recordcount &amp;gt; 0,&lt;br /&gt;
    showmessage('Найдено записей: ' + dbConn.recordcount);&lt;br /&gt;
    dbConn.first;&lt;br /&gt;
    while(dbConn.eof = 0,&lt;br /&gt;
      showmessage(dbConn.fieldbyname('code'));&lt;br /&gt;
      dbConn.next&lt;br /&gt;
    )&lt;br /&gt;
  ,0)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
utils.ProcessDB(db._self,'test!');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Применение языка формул ==&lt;br /&gt;
'''в различных контекстах системы «MEASOFT» и сопутствующих проектах'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MEASOFT ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительная информация на чеке ====&lt;br /&gt;
&lt;br /&gt;
В карточке клиента на закладке «Касса» имеется поле для ввода текста, который будет отображаться на кассовых чеках, печатаемых для корреспонденции от данного клиента. В поле может быть введен как просто текст, так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TSelfDB с открытым набором данных со строчкой корреспонденции, заказа и клиента, на которую печатается чек&lt;br /&gt;
&lt;br /&gt;
TBaseSupport&lt;br /&gt;
&lt;br /&gt;
TBaseValue&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Так же система записывает в переменную $CashRegisterID вычисленный код фискального регистратора, на котором предполагается печать чека.&lt;br /&gt;
&lt;br /&gt;
Результат работы скрипта печатается на создаваемом чеке, если скрипт не возвращает значение “-1” (число или текст) – в этом случае система чек не создает. Подразумевается, что либо скриптом было принято решение об отсутствии необходимости формирования чека, либо скрипт взял эту функцию на себя.&lt;br /&gt;
&lt;br /&gt;
==== Заполнение шаблонов печатных форм ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительные возможности ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Импорт БД из Excel ====&lt;br /&gt;
В окружении интерпретатора создается объект ZakazRecord, он является списком со значениями таблицы zakaz. Именно в этот заказ будут загружены данные. Из этого объекта также доступно :&amp;lt;br&amp;gt;&lt;br /&gt;
*ZakazRecord.userfields - пользовательские поля заказа;&lt;br /&gt;
*ZakazRecord.Clients - данные таблицы clients;&lt;br /&gt;
*ZakazRecord.Clients.userfields - пользовательские поля заказчика.&lt;br /&gt;
&lt;br /&gt;
==== Прайс лист клиента ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в валюте клиента для каждой поездки (туда или обратно) единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Помимо стандартных объектов, система создает объект AddressRecord, в котором, как свойства, доступны все поля текущей записи. Так же она выставляет значение переменной $Forward в 1 (истина), если необходимо произвести расчет для направления &amp;quot;Туда&amp;quot; и 0 (ложь) - если обратно. ВНИМАНИЕ! Как и во всех остальных местах, после формулы нельзя ставить &amp;quot;;&amp;quot;, иначе скрипт вернет 0!&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 if(int(AddressRecord.Time_Put_Max)&amp;gt;19, 100, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Прибавляет 100 рублей в случае, если максимальный срок доставки 20 часов или более''&lt;br /&gt;
&lt;br /&gt;
 if(pos(AddressRecord.Address, 'Аренда')&amp;gt;0, &lt;br /&gt;
           set($FormulaReplace, 1); &lt;br /&gt;
           1500&lt;br /&gt;
 , 0)&lt;br /&gt;
 &lt;br /&gt;
 ''В случае наличия подстроки &amp;quot;Аренда&amp;quot; в адресе заменяет штатное ценообразование на 1500 рублей''&lt;br /&gt;
&lt;br /&gt;
Объект AddressRecord может предоставить доступ к связанным таблицам :&lt;br /&gt;
* addressrecord.boxes&lt;br /&gt;
* addressrecord.packages&lt;br /&gt;
* addressrecord.clients&lt;br /&gt;
* addressrecord.price&lt;br /&gt;
* addressrecord.advprice&lt;br /&gt;
* addressrecord.userfields&lt;br /&gt;
* addressrecord.addressfld&lt;br /&gt;
* addressrecord.clients.userfields&lt;br /&gt;
* addressrecord.price.userfields&lt;br /&gt;
* addressrecord.zakaz&lt;br /&gt;
* addressrecord.zakaz.userfields&lt;br /&gt;
 &lt;br /&gt;
Чтобы получить доступ к полю VarCode из таблицы userfields необходимо записать AddressRecord.Userfields.VarCode. В присоединённой таблице может быть несколько записей чтобы получить к ним доступ предусмотрены функции _First, _EOF, _Next, _RecordCount, _Set.&lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
 set($value1, 0); set($value2, 0);&lt;br /&gt;
 while(AddressRecord.userfields._EOF=0,&lt;br /&gt;
   if(AddressRecord.userfields.varCode=1, &lt;br /&gt;
     set($value1, if(AddressRecord.userFields.VarValue='Праздничная упаковка', 150, 0)), ''''''');&lt;br /&gt;
   if(AddressRecord.userfields.varCode=2, &lt;br /&gt;
     set($value2, AddressRecord.userFields.VarValue), ''''''');&lt;br /&gt;
   AddressRecord.userFields._Next;&lt;br /&gt;
 );&lt;br /&gt;
 int($value1) + int($value2)&lt;br /&gt;
&lt;br /&gt;
Пример делающий тоже самое что и выше но через поиск Locate:&lt;br /&gt;
 set($value1, if(addressrecord.userfields.VarValue('VarCode', 1)='Праздничная упаковка', 150, 0));&lt;br /&gt;
 set($value2, int(addressrecord.userfields.VarValue('VarCode', 2)));&lt;br /&gt;
 $value1 + $value2&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
В скрипте доступны переменные: &lt;br /&gt;
«$FormulaKoeff» - это коэффициент на который умножится конечная цена (по умолчанию равна 1);&lt;br /&gt;
«$PriceCode»  - код прайса;&lt;br /&gt;
«$CurrentPriceConf»  - код услуги;&lt;br /&gt;
«$BasePrice» - стоимость всех услуг с уровнем (pricelevel) меньше текущего.&lt;br /&gt;
&lt;br /&gt;
Для вызова функции CalcBasePrice (Расчёт базовой цены) в скрипте объявленны переменные: $Count,$Collection,$Distance,$Wait.&lt;br /&gt;
&lt;br /&gt;
Существует поиск по ключевому полю (поиск регистронезависимый), например чтобы найти в таблице advprice введённое значение для текущей услуги, нужно сделать такую запись  addressrecord.advprice.value('priceconf', $CurrentPriceConf) - Первый параметр это ключевое поле, второй искомое значение. Если запись найдётся будет возвращено значение поле value, если нет функция вернёт значение 0.&lt;br /&gt;
 &lt;br /&gt;
Пример &lt;br /&gt;
 if(addressrecord.advprice.active('priceconf', 3)='T', addressrecord.advprice.price, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Смотрим включена ли услуга и если да, возвращаем рассчитанную стоимость&lt;br /&gt;
&lt;br /&gt;
Чтобы изменить значение записанное в объект addressrecord, нужно воспользоваться методом _set(keyfield, keyvalue, filed, value). Параметр keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца. Сначала происходит поиск строки по ключу, далее меняется значение указанного столбца.&lt;br /&gt;
Пример, отключение услуги база:&lt;br /&gt;
  addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
  priceconf - поле где записан код услуги;&lt;br /&gt;
  1 - услуга База;&lt;br /&gt;
  active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
Также существует упрощенный метод _set, с двумя параметрами filed, value - он используется в шаблонах загрузки или в системных доп. возможностях где доступен объект addressrecord.&lt;br /&gt;
&lt;br /&gt;
==== Зарплата курьеров ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в основной валюте для каждой единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Переменные «$FormulaTablKoeff» и «$FormulaMoneyKoeff»  позволяют установить повышающий или понижающий коэффициент на стоимость доставки (по тарифной сетке) и услуги соответственно (процент от суммы, процент от стоимости доставки, ожидание).  Переменная «$UsingZoneName» и «$KurierZone» содержат название и код зоны соответственно, есть возможность поменять название зоны для отчета.&lt;br /&gt;
&lt;br /&gt;
=== Планировщик ===&lt;br /&gt;
&lt;br /&gt;
В поле текста задания может быть введен как текст с командами планировщика (см ниже), так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TIniFile, Указывает на настроечный ini-файл планировщика.&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Для записи в лог планировщика нужно использовать функцию Print&lt;br /&gt;
&lt;br /&gt;
=== Репликатор ===&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
ReplaceAddress(target, address) – Возвращает адрес последней доставки корреспонденции получателю target по адресу address от текущего клиента. При отсутствии такой доставки, возвращает address.&lt;br /&gt;
&lt;br /&gt;
GetPrice –возвращает рассчитанное значение цены, на основе прайс-листа клиента и данных о корреспонденции.&lt;br /&gt;
&lt;br /&gt;
GetKurierByStation(i) – возвращает код курьера, ассоциированного со станцией метро с кодом i.&lt;br /&gt;
&lt;br /&gt;
GetNewNumber – Возвращает не занятый номер единицы корреспонденции в текущем заказе.&lt;br /&gt;
&lt;br /&gt;
==История изменений==&lt;br /&gt;
&lt;br /&gt;
=== Недавние изменения ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|2026.0.0.550 Доработка функций интерпретатора GetA4Printer, GetStickerPrinter, GetDuplexPrinter.&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|2026.0.0.547 Доработка функций ATTACHPDFTOTEXT и PRINTATTACHPDFPAGE, добавлена возможность указать путь к файлу&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.539 Добавлена поддержка отладчика AttachDebugger&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.534 Добавлена поддержка оператора CASE и класса TFunc&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 2021.0.0.57 от 18.06.2019 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TExcel добавлен метод ColumnDelete.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция InsertFirmAtt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
||В объект TExcel добавлен метод Align.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция CheckEan&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект функцию FillAdvPriceReport добавлены параметры ShowSumPrice,InsertColumns&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TSMS добавлен метод Log.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Добавлена функция Money.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция ValutaSign.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция GetPolygonByLatLon.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TTable добавлена функция SetMultiHeader, SetCustomHeader.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DownloadAttachment&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию SetRowHeight объекта TExcel добавлен параметр cnt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция AsString.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция SetSize.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TADO добавлена функция ParseForIn.&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|В объект TBaseUtils из TBase перенесена функция FillExcelDoc.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция CalcAddressPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Все функции класса TBaseSupport перенесены в TBaseUtils. Класс TBaseSupport больше не существует.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функции RowInsert и RowDelete объекта TExcel добавлен параметр count.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция SendToMeaSoft&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция RecalcSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Новая функция Reverse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 849 &amp;amp;nbsp; 22.02.2018 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TBaseUtils.TownByIndex добавлен параметр PriorityName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TBase добавлена функция GetNewPackagePos&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TSMS доработан метод ExtraResult, добавлен параметр ParamName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBase добавлена функция CalcAgentPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateAddressForActDelivery&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функция CalcTownDeliveryDate заменена на CalcDeliveryDate&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция SignatureUrl&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция LoadFromStr.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetPen.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetBrush.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена поддержка чтения в формате PNG.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TCanvas.DrawPic параметр Mode&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Свойство TPicture.Canvas&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DeleteFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 758 &amp;amp;nbsp; 29.03.2017 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция GetPolygonByAddress&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция ParamsCount&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Объект TZip&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функции CreateEAN и Create128 заменены одной функцией CreateBar, полностью совместимой с Create128, но добавлена поддержка EAN-13 и Interleaved 2-5 (для Почты России). В системе функции оставлены для обратной совместимости, но более не являются документированными и рекомендованными к использованию.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Параметр text в функцию Cell объекта TExcel&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция UrlEncode &lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция IncDay теперь может принимать параметр count&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функции FtpGet, FtpPut, TTable.SetCell()&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 452 &amp;amp;nbsp; 26.02.2014 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция Time&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция FixedIntToStr&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция TimePeriod&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена функция приёма смс -  ReceiveSMS&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция STR2UTF&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция SAVETOFILE&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.SetSheetName&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;FILESTR&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Расширены возможности объекта addressrecord в формулах тарифов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 308 &amp;amp;nbsp; 24.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В функции загрузки таблиц из TADO добавлено условие, что поля, названия которых начинаются с &amp;quot;-&amp;quot; не выгружаются. Таким образом можно скрывать служебные поля из результирующего набора.&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowAutoFit &lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowInsert &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 300 &amp;amp;nbsp; 01.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В объекте TCSVFile добавилась возможность запрашивать значения не только текущей записи через параметр сдвига&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;UPDOWN&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлен объект TCSVFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 266 &amp;amp;nbsp; 14.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена поддержка массивов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 265 &amp;amp;nbsp; 11.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция CreateTrans в интерпретатор&lt;br /&gt;
|-&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15771</id>
		<title>Руководство программиста</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15771"/>
				<updated>2026-01-16T13:25:39Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Объект TBase */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Основные положения ==&lt;br /&gt;
&lt;br /&gt;
В систему «MEASOFT» встроен внутренний интерпретируемый язык программирования. Среда состоит из базовой функциональности, и дополнительно создаваемых объектов. Некоторые объекты автоматически создаются средой перед запуском интерпретатора для предоставления доступа к контексту, в котором работает скрипт. Все типы данных приводятся друг к другу автоматически, иногда при необходимости можно использовать функции приведения типов. &lt;br /&gt;
&lt;br /&gt;
Как интерпретатор приводит типы:&lt;br /&gt;
&lt;br /&gt;
1.	При использовании значения как параметр функции интерпретатор автоматически приводит значение к типу, необходимому функции.&lt;br /&gt;
&lt;br /&gt;
2.	При операциях сложения, а также логических операциях, операнды приводятся к строке если хотя бы один из них имеет тип «строка». Например:&lt;br /&gt;
3.3+5		-&amp;gt;  8.3&lt;br /&gt;
‘3.3’+5		-&amp;gt;  ‘3.35’&lt;br /&gt;
подобную проблему можно решить принудительно преобразовав тип:&lt;br /&gt;
float(‘3.3’)+5	-&amp;gt;  8.3&lt;br /&gt;
&lt;br /&gt;
3.	При операциях умножения, деления и вычитания операнды приводятся к числу с плавающей точкой, однако если результат выполнения операции получается целым числом, то он приводится к целочисленному типу.&lt;br /&gt;
&lt;br /&gt;
Как работают функции приведения типов:&lt;br /&gt;
&lt;br /&gt;
1.	При преобразовании строки к числу: функция «читает» строку до первого символа, не позволяющего создать число с плавающей точкой, при этом разделителем целой и дробной частей может быть как точка так и запятая. Если приведение производится к целочисленному типу, то после этого происходит округление. Например:&lt;br /&gt;
float('3.6qwerty735')	-&amp;gt;  3.6&lt;br /&gt;
int('3.6qwerty735')	-&amp;gt;  4&lt;br /&gt;
&lt;br /&gt;
2.	При преобразовании к булевому типу ложью считается пустая строка либо число 0, все остальное - истина&lt;br /&gt;
&lt;br /&gt;
3.	При преобразовании булевого типа к числу истина преобразуется в 1, ложь – в 0. Такое преобразование позволяет использовать сложение и умножение в качестве логических «ИЛИ» и «И» соответственно:&lt;br /&gt;
if((5=5)+(6=7), &amp;lt;a&amp;gt;, [b]) – условие истинно, выполнится код «a».&lt;br /&gt;
&lt;br /&gt;
4.	При преобразовании булевого типа к строке сначала происходит преобразование к числу:&lt;br /&gt;
(5=5)+'qwerty'	-&amp;gt;  ‘1qwerty’&lt;br /&gt;
&lt;br /&gt;
== Описание синтаксиса ==&lt;br /&gt;
&lt;br /&gt;
Команды разделяются точкой с запятой. Параметры функций разделяются запятыми. Каждая команда (даже цикл while) является функцией, возвращающей некоторое значение. Результатом выполнения составной команды (последовательности функций, разделенных точкой с запятой), является результат выполнения последней функции. Имена переменных, функций, объектов, а также их свойств и методов не чувствительны к регистру.&lt;br /&gt;
Константы: константы бывают целочисленными, дробными и строковыми. Значения целочисленных и дробных констант указываются «как есть» (в этом случае разделитель целой и дробной частей – точка), шестнадцатеричные значения начинаются с символа «$» и, если первая цифра – буква, она упреждается цифрой 0, а строковые – в одинарных кавычках. При этом, если внутри строковой константы встречается символ одинарной кавычки он должен быть задвоен, для указания интерпретатору того, что он не является признаком конца константы.&lt;br /&gt;
Операции сравнения: &amp;gt;, &amp;lt;, =, !  - Больше, меньше, равно, не равно соответственно.&lt;br /&gt;
Логические операции: + (ИЛИ), *  (И).&lt;br /&gt;
Арифметические операции: +, -, *, /&lt;br /&gt;
Операция конкатенации строк: +&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Функциональность базового объекта ===&lt;br /&gt;
&lt;br /&gt;
'''SET($a, a)''' – присваивает переменной (1-й параметр) значение второго параметра. При отсутствии переменной – создает ее. Имена переменных должны начинаться с символа «$», а следующий символ не должен быть цифрой. Возвращает новое значение переменной. Функция используется только для задания значений переменных. Не допускается использования для задания значений свойств объектов. Для этого используются соответствующие методы этих объектов.&lt;br /&gt;
&lt;br /&gt;
'''IF(a,b,c)''' или '''IF(a,b)'''  – Условный оператор. В первом случае возвращает b, если a истинно (не равно нулю или пустой строке), иначе – c. Во втором случае – возвращает a, если оно истинно, иначе – b.&lt;br /&gt;
&lt;br /&gt;
'''WHILE(a, b)''' – Оператор цикла. Выполняет b пока a истинно:&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i&amp;gt;0, set($sum, $sum+$i); set($i, $i-1));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''FOR($a, b, c, d)''' – Оператор цикла. Выполняет d пока $a последовательно присваиваются значения от b до с включительно:&lt;br /&gt;
	set($sum, 0);&lt;br /&gt;
for($i, 1, 10, set($sum, $sum+$i));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''NEW(ClassName, InstanceName)''' – Создает экземпляр класса ClassName, назначает ему имя InstanceName. Возвращает порядковый номер созданного объекта. Доступ к свойствам и методам объектов осуществляется по имени объекта и имени свойства/метода, разделенным точкой. Именем объекта может быть и пустая строка, тогда доступ к его свойствам и методам будет осуществляться без указания имени, и, в случае совпадения имен свойств и/или методов со стандартными или свойствами/методами других объектов, использоваться будут соответствующие свойства/методы объекта, созданного ранее, а также такой объект невозможно уничтожить до окончания выполнения скрипта. Все объекты созданные во время выполнения скрипта уничтожаются автоматически после окончания его выполнения.&lt;br /&gt;
&lt;br /&gt;
'''FREE(InstanceName)''' – Уничтожает объект с именем InstanceName. Возвращает 0. В случае отсутствия объекта с заданным именем вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
'''ShowObjects''' – Возвращает список созданных объектов – названия классов и имена.&lt;br /&gt;
&lt;br /&gt;
'''ERROR(message)''' – Вызывает ошибку с текстом message.&lt;br /&gt;
&lt;br /&gt;
'''SHOWMESSAGE(message)''' – Отображает диалоговое окно с текстом message, останавливает выполнение скрипта до закрытия окна пользователем.&lt;br /&gt;
&lt;br /&gt;
'''SimpleAskUser(Message)''' – Выводит диалоговое окно с текстом Message и кнопками «Да» и «Нет». Возвращает 1, если  пользователь нажал кнопку «Да», иначе – 0.&lt;br /&gt;
&lt;br /&gt;
'''TRY(a)''' – Выполняет a в «защищенном от ошибки» режиме. Если в процессе выполнения a возникает ошибка, возвращает текст ошибки, иначе – 0 (ложь).&lt;br /&gt;
&lt;br /&gt;
'''REM(….)''' – Код в скобках игнорируется (комментарий).&lt;br /&gt;
&lt;br /&gt;
'''EXEC(FileName, Params, Wait, WindowState)''' – Запускает внешнее приложение FileName с параметрами Params. Если Wait истинно – ожидает завершение процесса. Для WindowState доступны следующие числовые значения:&lt;br /&gt;
	0 - SW_HIDE&lt;br /&gt;
	1 - SW_SHOWNORMAL (по-умолчанию)&lt;br /&gt;
	3 - SW_MAXIMIZE&lt;br /&gt;
	6 - SW_MINIMIZE&lt;br /&gt;
Функция возвращает истину если приложение запущено успешно. Иначе – Ложь.&lt;br /&gt;
В случае успеха, при параметре Wait – истина кладет в переменную $LastResult код завершения приложения.&lt;br /&gt;
&lt;br /&gt;
'''CASE''' - Оператор множественного выбора. Позволяет выполнить одно из нескольких действий в зависимости от условий. Синтаксис:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
  case(&lt;br /&gt;
    when(условие1, действие1);&lt;br /&gt;
    when(условие2, действие2);&lt;br /&gt;
    ...&lt;br /&gt;
    else(действие_по_умолчанию);&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 50);&lt;br /&gt;
&lt;br /&gt;
showmessage(&lt;br /&gt;
  case(&lt;br /&gt;
    when($a &amp;lt; 5, 50);&lt;br /&gt;
    when($a &amp;lt; 10, 100);&lt;br /&gt;
    when($a &amp;lt; 250, 200);&lt;br /&gt;
    else($a*$b);&lt;br /&gt;
  )  &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''AttachDebugger''' - Команда позволяет подключить открытый [[Отладчик_встроенных_скриптов]] к текущему скрипту. Команда AttachDebugger должна быть '''первой командой''' в скрипте. Добавьте её в самое начало скрипта:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Как работает:'''&lt;br /&gt;
# При выполнении команды AttachDebugger скрипт останавливается.&lt;br /&gt;
# Отладчик автоматически подключается к выполняющемуся скрипту.&lt;br /&gt;
# Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
# Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Если режим отслеживания не включён, команда `AttachDebugger` игнорируется.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Команда AttachDebugger должна быть первой командой в скрипте.&lt;br /&gt;
&lt;br /&gt;
=== Строковые функции ===&lt;br /&gt;
&lt;br /&gt;
'''UpCase(s)''' – возвращает строку s в верхнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''LCase(s)''' – возвращает строку s в нижнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''Len(s)''' – возвращает количество символов в строке s.&lt;br /&gt;
&lt;br /&gt;
'''Pos(s, substr [,start])''' – возвращает номер первого символа первого включения подстроки substr в строку s, возвращает 0, если включения подстроки отсутствуют. Параметр start - это позиция старта поиска, не обязательный параметр, по умолчанию равен 1. Поиск не чувствителен к регистру.&lt;br /&gt;
&lt;br /&gt;
'''Param(s, i)''' – возвращает i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''ParamsCount(s)''' - возвращает количество элементов строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''SetParam(s, p, i)''' – заменяет на значение p i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''Left(s, i [,full] )''' – возвращает i первых символов строки s. Параметр i, может быть строкой, тогда он считается разделителем и функция, возвращает строку слева от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Mid(s, i, j)''' - возвращает подстроку из s начиная с i символа и длиной j символов&lt;br /&gt;
&lt;br /&gt;
'''Right(s, i [,full])''' – возвращает i последних символов строки s. Параметр i, может быть строкой, тогда он считается разделителем, функция ищет разделитель с конца строки, и возвращает строку справа от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Reverse(s)''' - возвращает строку s задом-наперед. Полезно например для поиска с конца функций Pos().&lt;br /&gt;
&lt;br /&gt;
'''Char(i)''' – возвращает символ с кодом i.&lt;br /&gt;
&lt;br /&gt;
'''Ord(s)''' – возвращает код первого символа строки s.&lt;br /&gt;
&lt;br /&gt;
'''Replace(s, strFind1, strReplace1, [ strFind2, strReplace2, ... ], [caseInsensetive])''' - возвращает строку s, в которой все включения строк strFind заменены строкой strReplace. Параметры поиска и замены всегда должны быть в паре и их может быть несколько. caseInsensetive - неучитывать регистр, не обязательный параметр, по умолчанию включен.&lt;br /&gt;
&lt;br /&gt;
'''RemSpace(s)''' – возвращает сроку s без начальных и конечных запятых и пробелов, а также начальных точек.&lt;br /&gt;
&lt;br /&gt;
'''SumStr(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''с добавлением валюты'''. Необязательные параметры captions - позволяет изменить название валюты, формат строки может зависеть от текущего языка(посмотреть формат можно в &amp;quot;Справочники&amp;quot;-&amp;quot;Статусы&amp;quot;-&amp;quot;32 Валюты&amp;quot;, в разделе &amp;quot;Дополнительная информация&amp;quot;). Language - код языка на котором необходимо вывести сумму прописью. По умолчанию если не обязательные параметры опущены, используются региональные настройки в переменных.&lt;br /&gt;
&lt;br /&gt;
'''NumToStrSimple(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''без валюты'''. Параметры идентичны функции SUMSTR.&lt;br /&gt;
&lt;br /&gt;
'''FullNameToShort(Name)''' – Возвращает фамилию и инициалы по полному ФИО Name.&lt;br /&gt;
&lt;br /&gt;
'''MonthName1(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в именительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''MonthName2(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в родительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''StrForXML(s)''' - Подготавливает строку к парсингу как xml: Если находит в строке подстроку &amp;quot;UTF-8&amp;quot; - перекодирует ее из utf-8 в win-1251, убирает начальный знак вопроса, если такой встречается.&lt;br /&gt;
&lt;br /&gt;
'''FixedIntToStr(i, len[, char])''' - Возвращает целое число i дополненное слева символами char (по-умолчанию - &amp;quot;0&amp;quot;) до длины len.&lt;br /&gt;
&lt;br /&gt;
'''Translate(format, [param1, param2, ...])''' - Функция перевода строки format в язык пользователя. Строка format может содержать параметры %s, %d - строка и число соответственно. &lt;br /&gt;
&lt;br /&gt;
'''ExtractFileName(FilePath)''' - возвращает имя файла с расширением из полного пути к файлу FilePath.&lt;br /&gt;
&lt;br /&gt;
====Функции перекодировки====&lt;br /&gt;
'''DecodeStr(s, charset)''' - Производит перекодировку строки s в кодировку CP1251. Кодировка строки s должна быть заранее известна и может быть :&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866, UNICODE. Имя кодировки следует передавать в точности без лишних символов.&lt;br /&gt;
&lt;br /&gt;
'''EncodeStr(s, charset)''' - Производит перекодировку строки s в кодировку charset. Кодировка строки s должна быть CP1251, возможны следующие варианты перекодировки:&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Имя кодировки следует передавать в точности без лишних символов. UNICODE не работает с версии 2021, в ней строки по умолчанию в кодировке unicode.&lt;br /&gt;
&lt;br /&gt;
Функции EncodeBase64(s), DecodeBase64(s), UrlEncode(s), UTF8Encode(s), UTF8Decode(s), Str2UTF(s) - устарели, используйте EncodeStr, DecodeStr.&lt;br /&gt;
&lt;br /&gt;
====Транслитерация====&lt;br /&gt;
&lt;br /&gt;
'''Translit(s)''' - транслитерация строки русского текста s латиницей&lt;br /&gt;
&lt;br /&gt;
'''UnTranslit(s)''' - транслитерация строки s с латиницы на русский.&lt;br /&gt;
&lt;br /&gt;
==== Экранирование ====&lt;br /&gt;
&lt;br /&gt;
'''QUOTEDSTR(s)''' – квотирует строку s символом «\» (обратный слеш). Возвращает строку s, помещенную между символами одинарной кавычки, при этом все вхождения в строку s символов: «\», «&amp;quot;» и «'» экранируются квотирующим символом, а символы  #0, #10 и #13 заменяются на \0, \n и \r соответственно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SQLFloat(f)''' – Приводит число с плавающей точкой к виду, пригодному для SQL-запроса, т.е. к тексту с разделителем дробной части – точка.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextXML(s)''' - квотирует строку s для использования в XML. Производит замены спец. символов для корректности XML-синтаксиса.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextJSON(s)''' - переводит строку в формат JSON, экранирует служебные символы.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextBlob(s)''' - строка s содержит файл, функция перекодирует переданную строку в байты, используется для заполнения полей формата blob.&lt;br /&gt;
&lt;br /&gt;
====Хеширование ====&lt;br /&gt;
&lt;br /&gt;
'''HMACHash256(key, text)''' - создаёт хэш по алгоритму SHA256 для проверки целостности сообщения, key - секретный ключ, text - хэшируемое сообщение&lt;br /&gt;
&lt;br /&gt;
'''MD5Hash(text)''' - создаёт хеш по алгоритму MD5&lt;br /&gt;
&lt;br /&gt;
'''SignatureUrl(url)''' -  Подписывает переданный URL. Функция возвратит переданный URL с добавленным в конце параметром, в котором будет записана подпись.&lt;br /&gt;
&lt;br /&gt;
=== Функции работы с датой и временем ===&lt;br /&gt;
&lt;br /&gt;
'''CurrTime''' – возвращает текущее время&lt;br /&gt;
&lt;br /&gt;
'''CurrDate''' – возвращает текущую дату&lt;br /&gt;
&lt;br /&gt;
'''CurrMillisecond''' - Возвращает количество миллисекунд прошедших с начала текущего года. Используется для точного расчета временных интервалов.&lt;br /&gt;
&lt;br /&gt;
'''Today''' - возвращает текущую дату в числовом формате.&lt;br /&gt;
&lt;br /&gt;
'''Day(dt)''' – возвращает день месяца даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Month(dt)''' – возвращает месяц года даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Year(dt)''' – возвращает год даты dt.&lt;br /&gt;
&lt;br /&gt;
'''FirstDayOfMonth(dt)''' – Возвращает первый день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( FirstDayOfMonth( CurrDate() ) );&lt;br /&gt;
'''Полужирное начертание'''&lt;br /&gt;
'''LastDayOfMonth(dt)''' – Возвращает последний день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( LastDayOfMonth( CurrDate() ) );&lt;br /&gt;
&lt;br /&gt;
'''DaysInMonth(month, year)''' – Возвращает количество дней в указанном месяце.&lt;br /&gt;
&lt;br /&gt;
'''IncDay(dt, [count=1])''' – Возвращает дату, увеличенную на count дней.&lt;br /&gt;
&lt;br /&gt;
'''SQLDate(dt)''' – Пытается конвертировать dt в дату, вернуть в формате «'YYYY-MM-DD'» (с апострофами), если не удается – возвращает «NULL».&lt;br /&gt;
&lt;br /&gt;
'''SQLDateToDate(dt)''' – Переводит дату из SQL-формата в обычный.&lt;br /&gt;
&lt;br /&gt;
'''DAYSBETWEEN(dt1, dt2)''' – Возвращает количество дней между датами dt1 и dt2. В случае ошибки приведения dt1 или dt2 к дате возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''TimeBetween(t1, t2)''' - Возвращает количество минут между временем t1 и t2. Если t1 &amp;gt; t2 то будет показано количество минут между t2 и t1. Параметр t может быть как в формате &amp;quot;HH:MM&amp;quot;, так и в числовом. Если один из параметров не удалось привести к числовому типу возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''WorkDaysBetween(dt1, dt2, [DecreaseFirstDay=0], [DefaultHolidayVarNum=1])''' - Возвращает количество рабочих дней между датами dt1 и dt2. Параметр DecreaseFirstDay уменьшает dt1 на указанное количество дней (по умолчанию 0).  В случае ошибки приведения dt1 или dt2 к дате возвращает -1000. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней(по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''TimePeriod(time1, time2)''' - Оформляет временной период. Возвращаемое значение зависит от наличия значения в параметрах. Возможные варианты: &amp;quot;time1 - time2&amp;quot; , &amp;quot;С time1&amp;quot; , &amp;quot;ДО time2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''StrDateToFloat(s, [time=false])''' - Переводит строку с датой s в числовой тип. Если параметр time включен, то в строке s должно быть указано время. Дата должна быть в формате &amp;quot;DD.MM.YYYY&amp;quot;, а время &amp;quot;HH:NN&amp;quot;. Если строку перевести не удалось возвращает 0&lt;br /&gt;
&lt;br /&gt;
'''IsAWorkDay(dt)''' - Когда день dt является рабочим, возвращает true. Если произошла ошибка приведения даты возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''IncWorkDay(dt, [count=1],[DefaultHolidayVarNum=1])''' - Прибавляет count рабочих дней к дате dt. Возвращает дату в числовом формате, если произошла ошибка приведения даты возвращает -1000. По умолчанию параметр count равен 1 и не является обязательным. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней (по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''Sleep'''(n) - Задержка выполнения на n миллисекунд.&lt;br /&gt;
&lt;br /&gt;
=== Функции приведения типов ===&lt;br /&gt;
&lt;br /&gt;
'''INT(v)''' – возвращает значение типа “целое”, приводя вариантное значение v к числовому типу, а затем округляя его. В том числе используется как функция округления.&lt;br /&gt;
&lt;br /&gt;
'''FLOAT(v)''' – возвращает значение типа “число”, приводя вариантное значение v к числовому типу, переводя в число цепочку символов до первого нецифрового символа (либо точки или запятой).&lt;br /&gt;
&lt;br /&gt;
'''STR(v)''' – возвращает значение типа “строка”, приводя вариантное значение v к строковому типу.&lt;br /&gt;
&lt;br /&gt;
'''Date(v)''' – возвращает дату, либо пустую строку, если не удается конвертировать v в дату&lt;br /&gt;
&lt;br /&gt;
'''Time(v)''' – возвращает время, либо пустую строку, если не удается конвертировать v во время. Понимает числовое представление времени.&lt;br /&gt;
&lt;br /&gt;
=== Математические функции ===&lt;br /&gt;
&lt;br /&gt;
'''ROUNDUP(f)''' – округляет число f до ближайшего большего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''ROUNDDN(f)''' – округляет число f до ближайшего меньшего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''Money(f, CouldBeEmpty, ZeroFill, MakeSpace)''' - Округляет число f, до двух знаков после запятой. CouldBeEmpty - заменить число меньше 0,0001  на пустую строку. ZeroFill  - Следить чтобы после запятой было два знака, если будет один, то добавить ноль. MakeSpace - Разделить разряды пробелом.&lt;br /&gt;
''Подсказка: для простого округления используется функция int()''&lt;br /&gt;
&lt;br /&gt;
'''Abs(f)''' - возвращает модуль числа f.&lt;br /&gt;
&lt;br /&gt;
'''Mod(x, y)''' - возвращает остаток от деления целочисленного числа x на целочисленное число y.&lt;br /&gt;
&lt;br /&gt;
=== Константы ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Null''' – Возвращает пустое значение.&lt;br /&gt;
&lt;br /&gt;
'''Да''', '''True''', '''Нет''', '''False''' – константы, соответствующие булевым значениям.&lt;br /&gt;
&lt;br /&gt;
=== Прочие функции ===&lt;br /&gt;
&lt;br /&gt;
SetPhoneParams(CountryCode, TownCode) – Устанавливает глобальные настройки кода телефонных кодов страны и города соответственно. По-умолчанию код страны – 7, код города – 495.&lt;br /&gt;
&lt;br /&gt;
PhonesCount(s) – Возвращает количество корректных телефонных номеров, найденных в строке s.&lt;br /&gt;
&lt;br /&gt;
GetPhone(s[, n]) – Возвращает n-й корректный телефонный номер, найденный в строке s. Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
GetEmail(s) – Возвращает все корректные адреса email, найденный в строке s, разделенные запятыми (т.е. готовыми к передаче в функцию SendEmail).&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY).&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
GenEan(ID, Code) – Формирует штрих-код EAN 13 Состоящий из идентификатора типа сущности ID и кода сущности Code, Выравнивает до 13-ти символов, первый – «2», последний – контрольная сума.&lt;br /&gt;
&lt;br /&gt;
CheckEan(s) - Проверяет строку s, что она является кодом EAN13.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(FileName,s, encoding [, append])- Создает текстовый файл по пути, указанному в FileName (если по указанному пути существует файл с указанным именем, он удаляется и создается новый) и производит запись строки s в созданный текстовый файл. encoding - название кодировки, по умолчанию сохраняет в кодировке ANSI. Доступные названия кодировок: KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Если append = true, то производится дописывание данных в файл, а не перезаписывание (не обязательный, по умолчанию выключен).&lt;br /&gt;
&lt;br /&gt;
StrFromFile(FileName) - Читает файл FileName, возвращает в виде строки. При ошибке чтения вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
DownloadAttachment(code, [savefilepath, tablename='attachment', fieldBlob='file', fieldLDtime='ldtime', fieldUID='uid']) - Функция выкачивает аттачмент из базы, по внутреннему коду - Code, всегда возвращает содержимое файла в виде строки, а также может сохранить файл по указанному пути в параметре savefilepath. По умолчанию, функция настроена на таблицу attachment. Code - внутренний код вложения, tablename - название таблицы, fieldBlob - название поля с содержимым файла, fieldLDtime - название поля с временем последнего изменения строки (для работы кэша). Функция использует кэш и умеет выкачивать файлы зауженные на внешние серверы (http, ftp,sftp, measoft). Для выкачивания с сервера measoft обязательно необходимо указывать параметр fieldUID.&lt;br /&gt;
&lt;br /&gt;
DeleteFile(FileName) - Удаляет файл FileName с диска, возвращает истину, если операция прошла успешно и ложь - в противном случае.&lt;br /&gt;
&lt;br /&gt;
HTTPPOST(host, PostParams, Proxy, ContentType, HTTPUser, HTTPPass, Method, CustomHeader, Reconnects) - Отправляет HTTP запрос по адресу host с данными PostParams. Proxy - объект Proxy, задающий прокси-сервер (по-умолчанию - пусто - не использовать прокси). ContentType - Заголовок ContentType. По-умолчанию - &amp;quot;application/x-www-form-urlencoded; Charset=UTF-8&amp;quot;. HTTPUser и HTTPPass - данные для http-авторизации на сервере. Method - метод отправки запроса, по-умолчанию - &amp;quot;POST&amp;quot;. CustomHeader - Дополнительные заголовки HTTP запроса, передается в виде списка параметров через запятую и всегда образуют пару: 1 параметр - название заголовка, 2 параметр - значение. Если значение содержит запятую то его нужно экранировать в двойные кавычки. Reconnects - Количество попыток подключения (по-умолчанию - 2), если больше 100 - это таймаут единственной попытки подключения в миллисекундах.&lt;br /&gt;
Функция возвращает ответ сервера. &amp;lt;br&amp;gt;&lt;br /&gt;
''Обратите внимание:'' Для имитации отправки данных html-формы методом POST может понадобиться перед передаваемыми параметрами добавить &amp;quot;Data=&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
FTPPUT(host, User, Pass, FileName[, Active]) - Отправляет файл на FTP/SFTP-сервер. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
FTPGET(host, User, Pass, SourceFileName, DestFileName[, Active]) - Загружает файл SourceFileName с FTP/SFTP-сервера, сохраняет его в файл DestFileName. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
GetTempDir - Возвращает путь к временной папке.&lt;br /&gt;
&lt;br /&gt;
ApplicationDir - Возвращает путь к файлу программы.&lt;br /&gt;
&lt;br /&gt;
Interpretate(script) - Интерпретирует скрипт указанный в script. Выполнение происходит в текущем инстансе.&lt;br /&gt;
&lt;br /&gt;
LastHttpError - Выводит последний запрос выполненный с ошибкой в функции HttpPost. Содержит подробную информацию по запросу и ответу.&lt;br /&gt;
&lt;br /&gt;
LastHttpResponse - Выводит последний запрос и ответ от сервера после выполнения Http-запроса в функции HttpPost.&lt;br /&gt;
&lt;br /&gt;
== Объект TExcel ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к данным документов MS Excel. Требует установленного приложения MS Excel. Для работы без установленного MS Excel предусмотрен объект TDirectExcel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ввод данных'''''&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Если Headered истинно (по-умолчанию), таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Если TranslateHeader истинно, то заголовки таблицы будут автоматически переведены.&lt;br /&gt;
 &lt;br /&gt;
 MyDB.Open('select * from kurier');&lt;br /&gt;
 xl.LoadFromDB(MyDB.Self);&lt;br /&gt;
 xl.DoNotDestroy(true);&lt;br /&gt;
 xl.SetVisible(true);&lt;br /&gt;
&lt;br /&gt;
Post2Sheet(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) -  Почти полный аналог LoadFromDB. В отличии от LoadFromDB если есть открытый файл, выгрузка данных будет выполнена прямо в него.&lt;br /&gt;
&lt;br /&gt;
OpenFile(aFileName) – Выполняет функции SetFileName и Open. &lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
SetFileName(aFileName) – Задает значение свойства FileName.&lt;br /&gt;
&lt;br /&gt;
Open - Открывает файл с именем, заданным свойством FileName. Если имя файла не задано - создает чистую книгу.&lt;br /&gt;
&lt;br /&gt;
Close – Закрывает текущий файл.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ячейки'''''&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
Cell(x, y, text) – Возвращает значение ячейки, заданной координатами x, y. Необязательный булевый параметр text, в случае истинности, указывает на необходимость возврата данных с учетом формата ячейки, т.е. то, что пользователь видит на экране. Обратите внимание, что если в ячейке число, и ширина столбца не достаточна для отображения, Excel выводит &amp;quot;#####&amp;quot;, что и будет возвращено программе, если text=ИСТИНА. Поэтому перед таким использованием рекомендуется выполнить функцию AutoFit.&lt;br /&gt;
&lt;br /&gt;
SetCell(x, y, v[, x2, y2]) – Устанавливает значение ячейки, заданной координатами x и y, в значение v. Если заданы параметры x2, y2 - объединяет (merge) диапазон ячеек заданных координатами, устанавливает значение объединенной ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Строки'''''&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
RowAutoFit([y1, y2]) - Устанавливает автоматическую высоту строк. Аргументы y1 и y2 необязательны и если не указаны, то процедура будет выполнена для всей страницы, в ином случае только для строк от y1 до y2.&lt;br /&gt;
&lt;br /&gt;
SetRowHeight(r, h[, cnt]) – Устанавливает высоту cnt строк (по-умолчанию 1) начиная со строки r в h пикселей.&lt;br /&gt;
&lt;br /&gt;
GetRowHeight(r) – Возвращает высоту строки r в пикселях.&lt;br /&gt;
&lt;br /&gt;
RowInsert(i[, count]) - Вставляет count (по-умолчанию - 1) строк НАД строкой с номером i.&lt;br /&gt;
&lt;br /&gt;
RowDelete(i[, count]) - Удаляет count (по-умолчанию - 1) строк начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Столбцы'''''&lt;br /&gt;
&lt;br /&gt;
ColCount - Возвращает количество столбцов в листе.&lt;br /&gt;
&lt;br /&gt;
AutoFit – Устанавливает автоматическую ширину столбцов.&lt;br /&gt;
&lt;br /&gt;
ColumnDelete(i[, count]) - Удаляет count (по-умолчанию - 1) столбцов начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
SetColWidth (c, w) – Устанавливает ширину столбца c в w пикселей.&lt;br /&gt;
&lt;br /&gt;
GetColWidth (c) – Возвращает ширину столбца c в пикселях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Листы'''''&lt;br /&gt;
&lt;br /&gt;
SetSheet(No) – Устанавливает номер текущего листа. Если лист с таким номером не существует - он будет создан (и все листы до него). Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetSheetName(Name) - Устанавливает название текущего листа.&lt;br /&gt;
&lt;br /&gt;
SheetsCount – Возвращает количество листов в книге.&lt;br /&gt;
&lt;br /&gt;
CopySheetAfter([SheetFrom[, SheetAfter]]) - Копирует лист SheetFrom (по-умолчанию - текущий), создавая новый лист после листа SheetAfter (по-умолчанию - совпадает с копируемым).&lt;br /&gt;
&lt;br /&gt;
SheetDelete(i) - Удаляет лист с номером i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Форматирование'''''&lt;br /&gt;
&lt;br /&gt;
Align(x1, y1, x2, y2 [,HAlign, VAlign]) - Устанавливает выравнивание данных в указанном диапазоне. HAlign - горизонтальное выравнивание (0 – прижато влево , 1 – по центру , 2 – прижато вправо), VAlign - Вертикальное выравнивание (0 – прижато к верху , 1 – по центру , 2 – прижато к низу).&lt;br /&gt;
&lt;br /&gt;
WrapText(x1, y1, x2, y2, value) – Устанавливает перенос текста прямоугольника в значение value. Если координаты опущены, или 0 – устанавливает границы всей используемой области. Для Value значение по-умолчанию - true.&lt;br /&gt;
&lt;br /&gt;
NumberFormat(x1, y1, x2, y2, Format) - Устанавливает формат вывода чисел в указанном диапазоне ячеек. Например, если Format='0.00' - числа будут выводиться c обязательными 2 знаками после десятичного разделителя.&lt;br /&gt;
&lt;br /&gt;
SetBorders(x1, y1, x2, y2) – Устанавливает границы прямоугольника. Если координаты опущены, или 0 – устанавливает границы всей используемой области.&lt;br /&gt;
&lt;br /&gt;
SetFont(Font[, x1, y1[, x2, y2]]) - Устанавливает шрифт Font для ячеек диапазона. Можно указать координаты только одной ячейки, можно - вообще не указать, тогда будет использован последний выделенный диапазон. Шрифт задается как обычно: 'Arial, 16, T, T, T', порядок параметров: Имя шрифта, размер, жирное начертание, курсивное начертание, одиночное подчеркивание. Если параметры не заданы, то у текущего шрифта они меняться не будут. Примеры: SetFont('Arial, 10, T, F, F', 1,1) - в ячейке A1 будет установлен шрифт Arial жирным начертанием (не курсив и без подчеркивания). SetFont(', , , T, F', 2,1) - в ячейке B1 будет поменяется только начертание курсив и будет отменено подчеркивание (если оно было). &lt;br /&gt;
&lt;br /&gt;
SaveValuesOnly - убирает формулы на текущей странице и оставляет лишь их результативные статичные значения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Цвета'''''&lt;br /&gt;
&lt;br /&gt;
SetRowFontColor(Row,Color) - Устанавливает цвет шрифта в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetRowColor(Row,Color) - Устанавливает цвет фона в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetColumnFontColor(Col,Color) - Устанавливает цвет шрифта в столбце Col. Color -  целое значение (RGB) &lt;br /&gt;
&lt;br /&gt;
SetColumnColor(Col,Color) - Устанавливает цвет фона в столбце Col. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellFontColor(Row,Col,Color) -  Устанавливает цвет шрифта в ячейке с координатами [Row,Col]. Color -  целое значение, равное номеру цвета в палитре (ColorIndex,не RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellColor(Row,Col,Color) -  Устанавливает цвет фона в ячейке с координатами [Row,Col]. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
GetRowFontColor(Row)- Возвращает RGB значение цвета шрифта строки Row&lt;br /&gt;
&lt;br /&gt;
GetRowColor(Row)- Возвращает RGB значение цвета фона строки Row&lt;br /&gt;
&lt;br /&gt;
GetColumnFontColor(Col)- Возвращает RGB значение цвета шрифта столбца Col&lt;br /&gt;
&lt;br /&gt;
GetColumnColor(Col)- Возвращает RGB значение цвета фона столбца Col &lt;br /&gt;
&lt;br /&gt;
GetCellFontColor(Row,Col) - Возвращает номер цвета шрифта в палитре (ColorIndex) в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
GetCellColor(Row,Col) - Возвращает RGB значение цвета фона в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Копи-паст'''''&lt;br /&gt;
&lt;br /&gt;
Copy(x1, y1, x2, y2) - Копирует в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Cut(x1, y1, x2, y2) - Вырезает в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Paste(x1, y1) - Вставляет из буфера экселя. Команды copy-paste неразрывны, если что нибудь сделать в промежутке между ними, например вставить значение в ячейку, то копирование сброситься. (Последовательность использования: copy - paste, cut - paste)&lt;br /&gt;
&lt;br /&gt;
PasteStyle(x1, x2, y1, y2) - Вставляет только оформление из буфера экселя (Последовательность использования:  Copy - PasteStyle)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Изображения'''''&lt;br /&gt;
&lt;br /&gt;
InsertPicture(TPicture, [x=1, y=1, DispX=0, DispY=0, width=0, height=0]) - Функция вставляет рисунок на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки, width, height (не работает для DirectExcel) - ширина и высота области рисунка в пойнтах-единицах Excel &lt;br /&gt;
&lt;br /&gt;
InsertFirmLogo(FirmCode, [x=1, y=1, DispX=0, DispY=0]) - Функция вставляет логотип фирмы с кодом FirmCode на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Вывод'''''&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки. Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SheetFitPageWidth - устанавливает режим масштабирования печати, чтобы печатная форма помещалась в ширину на один лист.&lt;br /&gt;
&lt;br /&gt;
SetOrientation(value) - Устанавливает ориентацию страницы. True (по-умолчанию) - альбомная (ландшафтная), Ложь - портретная.&lt;br /&gt;
&lt;br /&gt;
PrintOut([copies]) - Печатает текущий лист на принтере по умолчанию. Параметр copies - количество копий, по умолчанию равен 1.&lt;br /&gt;
&lt;br /&gt;
Save(filename) - Сохраняет в файл filename. Если файл существует, в основной системе он будет перезаписан, в других проектах - вызовет ошибку &amp;quot;Файл уже существует&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SetVisible(b) – Устанавливает видимость приложения Excel для пользователя. По-умолчанию – false (не видимо).&lt;br /&gt;
&lt;br /&gt;
DoNotDestroy(b) – При уничтожении объекта TExcel (а он уничтожается, как и все остальные объекты автоматически при завершении выполнения скрипта), приложение Excel уничтожается вместе с ним. DoNotDestroy(true) отключает уничтожение приложения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования'''''&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'myxl');&lt;br /&gt;
 myxl.OpenFile('c:\asdf.xlsx');&lt;br /&gt;
 set($sum, 0);&lt;br /&gt;
 while (myxl.EOF=0, &lt;br /&gt;
      set($sum, $sum+int(myxl.c));&lt;br /&gt;
      myxl.next );&lt;br /&gt;
 $sum&lt;br /&gt;
 &lt;br /&gt;
 ''Возвращает сумму всех числовых данных столбца C файла 'c:\asdf.xlsx'''&lt;br /&gt;
&lt;br /&gt;
== Объект TDirectExcel ==&lt;br /&gt;
Объект позволяет работать с файлами Excel напрямую, без установленного пакета MsOffice. Применяется в сервисах и при отсутствии экселя. Он максимально совместим с объектом TExcel, однако некоторые методы могут быть не реализованы. &lt;br /&gt;
&lt;br /&gt;
== Объект TCSVFile ==&lt;br /&gt;
Предназначен для доступа к данным документов CSV. Разделителем столбцов является символ точка с запятой ;&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
OpenFile(FileName) – Открывает файл FileName.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=false]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO.&lt;br /&gt;
&lt;br /&gt;
LoadFromText(s) - Загружает таблицу из строки s.&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). &lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(Filename) - Сохраняет в файл с именем filename.&lt;br /&gt;
&lt;br /&gt;
== Объект TADO ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к базам данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|Connect(ConnectionString)&lt;br /&gt;
|Подключает к источнику данных. ConnectionString – Строка подключения ADO.&lt;br /&gt;
|-&lt;br /&gt;
|ConnectMySQL(DBServer, DBPort, DBUser, DBPass, DBName)&lt;br /&gt;
|Подключает к базе данных MySQL.&lt;br /&gt;
|-&lt;br /&gt;
|Open(Query)&lt;br /&gt;
|Открывает набор данных выполнив запрос Query.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByNo(i)&lt;br /&gt;
|Возвращает значение поля с номером i. Нумерация полей – с нуля.&lt;br /&gt;
|-&lt;br /&gt;
|FieldName(i)&lt;br /&gt;
|Возвращает имя поля с номером i.&lt;br /&gt;
|-&lt;br /&gt;
|FieldCount&lt;br /&gt;
|Возвращает количество  полей.&lt;br /&gt;
|-&lt;br /&gt;
|RecordCount&lt;br /&gt;
|Возвращает количество записей.&lt;br /&gt;
|-&lt;br /&gt;
|RecNo&lt;br /&gt;
|Возвращает номер текущей записи. ''ВНИМАНИЕ! В зависимости от способа подключения к БД нумерация может начинаться как с 0 так и с 1!''&lt;br /&gt;
|-&lt;br /&gt;
|EOF&lt;br /&gt;
|Возвращает признак достижения конца набора данных. Становится истиной когда выполняется команда Next на последней записи.&lt;br /&gt;
|-&lt;br /&gt;
|Next&lt;br /&gt;
|Переход на следующую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|First&lt;br /&gt;
|Переход на первую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|Last&lt;br /&gt;
|Переход на последнюю запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByName(FieldName)&lt;br /&gt;
|Возвращает значение поля по имени. Также возможно указание имени поля как свойства объекта.&lt;br /&gt;
|-&lt;br /&gt;
|Field(Table, ID, FieldName)&lt;br /&gt;
|Возвращает значение поля FieldName записи с кодом ID таблицы Table. Набор данных, если он открыт, при этом не закрывается. Первичный ключ таблицы должен называться «code». Гарантированно работает только с MYSQL!!!&lt;br /&gt;
|-&lt;br /&gt;
|GetSQLValue(Query)&lt;br /&gt;
|Выполняет SQL-запрос. Текст запроса должен начинаться с первого символа строки (перед запросом не должно быть пробелов, переносов строк, комментариев и т.д.). Если запрос Insert – возвращает ID вставленной записи. Если запрос – Update, Delete, Replace, Set, Start, Commit, Rollback – возвращает количество измененных записей (RowsAffected), иначе – Select – значение первого поля первой строки результата как текст.&lt;br /&gt;
|-&lt;br /&gt;
|FillText(s)&lt;br /&gt;
|Возвращает строку s с замененными названиями полей между знаками процента на соответствующие значения текущей записи. Так же в строке возможно использование интерпретируемого кода, заключенного между тегами &amp;quot;&amp;lt;?&amp;gt;&amp;quot; и &amp;quot;&amp;gt;&amp;quot;. При интерпретации система сначала производит замену полей с процентами на значения, потом интерпретирует код. ''Внимание! Функция не создает отельный контекст интерпретатора, а использует существующий, в нем доступны все объекты и переменные, вызывающего скрипта.'' Дополнительно автоматически создается объект TSelfADO, подключенный к той же БД, что и контекст, вызвавший функцию, с пустым именем, а так же с именем &amp;quot;dataset&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|Query(Query)&lt;br /&gt;
|Синоним GetSQLValue.&lt;br /&gt;
|-&lt;br /&gt;
|Close&lt;br /&gt;
|Закрывает набор данных.&lt;br /&gt;
|-&lt;br /&gt;
|Self&lt;br /&gt;
|Возвращает указатель на подключение к БД для использования в других объектах.&lt;br /&gt;
|-&lt;br /&gt;
|ParseForIn([FieldName='code']) &lt;br /&gt;
|Возвращает через запятую значения всех строк в указанном столбце. По умолчанию, используется столбец с именем code.&lt;br /&gt;
|-&lt;br /&gt;
|GetSQL&lt;br /&gt;
|Для отладки. Возвращает последний SQL запрос переданный в методы Open, Query, GetSQLValue&lt;br /&gt;
|-&lt;br /&gt;
|ExportExcel&lt;br /&gt;
|Для отладки. Выгружает в эксель содержимое датасета. Можно использовать в незнакомом окружении для понимания передаваемых полей в : шаблонах, печатных формах и т.д. Аналог команды %echo% в шаблонах, на случай если она не сработает.&lt;br /&gt;
|-&lt;br /&gt;
|OnGetText&lt;br /&gt;
|Функция подменяет текстовый вывод значения поля при выгрузке в эксель. Первый параметр это имя поля, которое надо подменить. Второй параметр это то что необходимо вывести. Работает только с текстовыми полями. &lt;br /&gt;
'''''Пример использования'''''  &lt;br /&gt;
  DB.OnGetText('Зона', IF((DB.FieldByName('-Lat') ! 0) * (DB.FieldByName('-Lon') ! 0),&lt;br /&gt;
       	GetPolygonByLatLon(DB.FieldByName('-Lat'), DB.FieldByName('-Lon'), 'TYPE = 1 AND IFNULL(zone, 0) &amp;gt; 0 AND PRICE = ' + DB.FieldByName('-price'), 'zone')&lt;br /&gt;
  ,&lt;br /&gt;
        ''&lt;br /&gt;
  ));&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования – см. TSelfADO&lt;br /&gt;
&lt;br /&gt;
== Объект TSelfADO ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наследник объекта TADO. Служит для подключения к «родной» для программы, в которой выполняется скрипт, базе данных. Обладает всеми свойствами и методами объекта TADO, кроме Connect. Иногда автоматически создается системой для обеспечения простого доступа к базе данных, а также иногда создается системой с уже открытым набором данных для передачи обрабатываемого системой набора данных в скрипт. В этом случае для скрипта недоступны функции Open и Close.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&lt;br /&gt;
 rem('Копируем данные из &amp;quot;родной&amp;quot; базы данных в базу MSSQL.');&lt;br /&gt;
 new('TSelfADO', 'MyDB');&lt;br /&gt;
 new('TADO', 'MSSQL');&lt;br /&gt;
 MSSQL.Connect('Provider=SQLOLEDB.1;Password=myPassword;Persist Security Info=True;User ID=myUsername;Initial Catalog=myDataBase;Data Source=myServerAddress');&lt;br /&gt;
 MyDB.Open('select code, name, passport from kurier where code&amp;gt;'+Int(MSSQL.Query('select max(code) from kurier'))+' order by code');&lt;br /&gt;
 While(MyDB.EOF=0,&lt;br /&gt;
      MSSQL.Query('insert kurier (code, name, passport) VALUES ('+MyDB.Code+', '+QuotedStr(MyDB.Name)+', '+QuotedStr(MyDB.Passport)+')');&lt;br /&gt;
      MyDB.Next;&lt;br /&gt;
      );&lt;br /&gt;
&lt;br /&gt;
== Объект TPrinter ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к принтерам.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
BeginDoc – Начинает новый документ.&lt;br /&gt;
&lt;br /&gt;
EndDoc – Закрывает документ&lt;br /&gt;
&lt;br /&gt;
PageHeight – Возвращает высоту страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageWidth – Возвращает ширину страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageNumber – Возвращает номер текущей страницы документа&lt;br /&gt;
&lt;br /&gt;
Orientation – Возвращает текущую ориентацию страницы (0 – портретная, 1 – ландшафтная)&lt;br /&gt;
&lt;br /&gt;
Printing – Возвращает истину если документ открыт&lt;br /&gt;
&lt;br /&gt;
SetOrientation(Orientation) – Устанавливает ориентацию страницы. При необходимости начинает новый документ, новую страницу.&lt;br /&gt;
&lt;br /&gt;
ShowDialog – Показывает пользовательский диалог печати. Возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
NewPage – Начинает новую страницу&lt;br /&gt;
&lt;br /&gt;
Canvas – Предоставляет доступ к объекту TCanvas, связанному с принтером.&lt;br /&gt;
&lt;br /&gt;
PrinterNames – Возвращает список принтеров, установленных в системе, разделенный переносами строк&lt;br /&gt;
&lt;br /&gt;
PrintersCount – Возвращает количество установленных в системе принтеров&lt;br /&gt;
&lt;br /&gt;
SetPrinter(Printer) – Устанавливает текущий принтер. Если передана строка – ищет принтер по названию, иначе – по номеру. Нумерация начинается с 0.&lt;br /&gt;
&lt;br /&gt;
PrintTable(Y, Table) – Выводит на печать таблицу Table типа TTable, начиная с координаты Y. При необходимости таблица печатается на нескольких страницах. Возвращает координату Y конца таблицы.&lt;br /&gt;
&lt;br /&gt;
GetDefaultPrinter - Возвращает имя текущего активного принтера.&lt;br /&gt;
&lt;br /&gt;
SetDefaultPrinter(Printer) – Запоминает предыдущий активный принтер и устанавливает новый текущий принтер. Printer - имя принтера. При необходимости нескольких последовательных вызовов SetDefaultPrinter рекомендуется между вызовами использовать RestoreDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
RestoreDefaultPrinter - Устанавливает активным принтер, который был текущим перед последним вызовом SetDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
== Объект TCanvas ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предоставляет доступ к холсту объекта для прорисовки изображения.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
DPIX – Возвращает разрешение холста по горизонтали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
DPIY – Возвращает разрешение холста по вертикали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
TextOut(x, y, s[, x1, y1, x2, y2]) – Выводит строку s начиная с точки с координатами x и y. Если указаны параметры x1, y1, x2, y2 – то выводимый текст ограничивается заданным прямоугольником.&lt;br /&gt;
&lt;br /&gt;
TextOutEx(x1, y1, x2, y2, Alignment, Font, s, Indent) – Выводит строку s в прямоугольнике с координатами x1, y1, x2, y2. По горизонтали строка выравнивается в соответствии с Alignment (0 – прижато влево, 1 – вправо, 2 – по центру), по вертикали выравнивается по центру. Используя шрифт Font (см описание ниже). Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату X фактического окончания текста (правой стороны – если строка прижата влево, и левой – в остальных случаях)&lt;br /&gt;
&lt;br /&gt;
MLTextOut(x1, y1, x2, y2, Alignment, VAlignment, Font, s, Heigth, Indent) – Выводит многострочный текст s в прямоугольнике с координатами x1, y1, x2, y2 с переносом по словам. По горизонтали строки выравниваются в соответствии с Alignment, по вертикали – в соответствии с VAlignment (0 – прижато вверх, 1 – по центру, 2 – прижато вниз). Используя шрифт Font (см описание ниже). Heigth – высота строки. Если опущено или равно нулю – высота определяется автоматически в соответствии с выбранным шрифтом. Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату Y фактического окончания текста (нижней границы последней строки текста. ''ВНИМАНИЕ! Функция использует координаты прямоугольника для позиционирования текста, однако она не ограничивает его верхней и нижней границами этого прямоугольника!''&lt;br /&gt;
&lt;br /&gt;
DrawPic(x1, y1, x2, y2, Pic, Style, Alignment, Mode) – Прорисовывает изображение Pic (ссылка на изображение TPicture.Self) в прямоугольник заданный координатами x1-y2. Style – стиль масштабирования. 0 – растянуть изображение до границ прямоугольника не сохраняя пропорции, 1 – вписать изображение в прямоугольник сохраняя пропорции – вероятно, останутся поля по вертикали или горизонтали, 2 – вписать сохраняя пропорции, обрезав при необходимости изображение по вертикали или горизонтали. Alignment – выравнивание по горизонтали. Работает только в случае если style=1 и при растягивании изображения получились вертикальные поля. 0 – разместить по центру, 1 – прижать влево, 2 – прижать вправо. Функция возвращает координату X правой стороны изображения кроме случая, когда Style=1 и Alignment=2 – в этом случае возвращается координата левой стороны изображения. Mode - способ наложения изображения. 0 (по-умолчанию) - копирование как есть. 1 - Наложение операцией AND (применяется для получения эффекта прозрачности изображения), 2 - наложение операцией XOR (Применяется для возможности повторной операцией убрать изображение), 3 - Наложение операцией OR.&lt;br /&gt;
&lt;br /&gt;
FillRect(x1, y1, x2, y2) – Рисует прямоугольник '''без границ''' и закрашивает цветом BrashColor&lt;br /&gt;
&lt;br /&gt;
Rect(x1, y1, x2, y2) – Рисует прямоугольник '''c границами''', задаваемыми текущим пером, и закрашивает цветом BrashColor &lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Устанавливает шрифт по-умолчанию.&lt;br /&gt;
&lt;br /&gt;
SetPen(Width, Color) - Устанавливает параметры &amp;quot;ручки&amp;quot; - толщину и цвет. Если любой параметр опустить, соответствующее значение не будет изменено.&lt;br /&gt;
&lt;br /&gt;
SetBrush(Color, Style) - Устанавливает параметры заливки - цвет и стиль. Если любой параметр опустить, соответствующее значение не будет изменено. Стили заливки: 0 - сплошная, 1 - отсутствует (прозрачная), 2-7 - различные виды штриховки (горизонтальные, вертикальные, в клеточку и т.д.).&lt;br /&gt;
&lt;br /&gt;
TextHeight(s) – Возвращает высоту текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
TextWidth(s) – Возвращает ширину текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
Использование шрифта (Font): У объекта TCanvas есть «глобальные» установки шрифта. Однако для некоторых функций возможно указание шрифта, отличающегося от глобального. Параметры шрифта – это текстовая строка, состоящая из 6-ти параметров, разделенных запятыми: Название, размер, жирный, курсив, подчеркнутый, цвет. Например:&lt;br /&gt;
&lt;br /&gt;
 'Times New Roman, 8, Y, N, N, 255'&lt;br /&gt;
&lt;br /&gt;
Любой параметр можно опустить, и тогда вместо него будет использовано значение по-умолчанию: шрифт: arial, размер – 10, не жирный, не курсив, не подчеркнутый, цвет – черный. Например: ', 7' – указывает, что по-умолчанию нужно взять все параметры кроме размера шрифта. Также можно вместо всей строки указать тире ('-') или пустую строку, и шрифт будет использоваться «глобальный».&lt;br /&gt;
&lt;br /&gt;
Объект можно создать отдельно, не создавая объект TPrinter. В таком случае объект создастся как ссылка на текущий холст принтера (принтер должен быть запущен и начат новый документ). Такой подход используется в доп. возможности PrintCustomSticker&lt;br /&gt;
&lt;br /&gt;
== Объект TPicture ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с графическими изображениями форматов BMP, GIF, JPEG и PNG, а также для формирования штрих-кодов. Обратите внимание, прозрачность изображений не поддерживается, однако в методе TCanvas.DrawPic есть параметр Mode, призванный создавать эффект прозрачности.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(FileName) – Загружает изображение из файла FileName. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB, Query) – Загружает изображение из базы данных. DB – ссылка на подключение к базе данных TADO.Self, Query – текст запроса. Запрос должен вернуть в первом поле первой строки BLOB-поле с изображением, все остальные данные возвращаемые запросом игнорируются. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromStr($s) – Загружает изображение из строки $s. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
CreateBar(Width, Height, BarCode, Textless, Type) – Формирует штрих-код шириной Width и высотой Height с типом кодирования Type. BarCode – текст штрих-кода. Булево значение Textless указывает, что в штрих-коде не должно быть человеко-читаемых символов если истинно. Type указывает тип кодирования: 0 (по-умолчанию) CODE128, 1 - EAN-13, 2 - Interleaved 2-5, 3-DataMatrix, 4-QRCode.&lt;br /&gt;
Штрихкод должен быть: Для EAN-13 цифровым 12 или 13 символов (13-й, контрольная сумма рассчитывается автоматически), для CODE128 - должен иметь состоять из допустимого для этого кодирования набора символов. Для Interleaved - должен состоять из четного числа цифр, контрольная сумма автоматически не рассчитывается. Если для Interleaved кода указано значение из 14-ти знаков, подпись цифр выводится в формате Почты России.&lt;br /&gt;
Внимание! Для кодов EAN-13 и Interleaved ширина штрих-кода Width не является точным значением получаемого на выходе изображения. Ширина изображения рассчитывается как максимальное кратное минимально возможной ширине, но не меньше минимально возможной. Конечную ширину можно получить в соответствующем свойстве объекта. Для кода CODE128 штрих-код на выходе может оказаться пустым, если указанной ширины штрих-кода не достаточно для его формирования.&lt;br /&gt;
Для кода DataMatrix можно установить режим для печати скрытых символов с кодами 29(GS) и 232(FCN1), которые требуются для формирования Честного Знака. Для этого необходимо в начале строки указать символ &amp;quot;[&amp;quot; и все разделители 01, 21, 91, 92 так же экранировать этими скобками. Должно получиться [01]02900002317701[21]k3LInNbH_oG0Q[91]EE06[92]YXiyKfiHjE4YE8b+YVMC1O5r8VtpplA3AwcCqrcG9Dk= . При формировании кода, включится режим формирования штрих-кода DataMatrix GS1, в начале будет добавлен символ с кодом 232 (FCN1), а потом будут добавлены разделители с кодом 29 (GS)&lt;br /&gt;
Функция возвращает 1 в случае успеха, или текст ошибки, если такая произошла.&lt;br /&gt;
&lt;br /&gt;
SetSize(Width, Height) - Устанавливает размер изображения.&lt;br /&gt;
&lt;br /&gt;
AsString([ImageFormat]) - Возвращает изображение в виде строки с двоичными данными. ImageFormat принимает значения 1 - Bitmap (по-умолчанию), 2 - jpeg, 3 - png, 4 - gif.&lt;br /&gt;
&lt;br /&gt;
Width – Возвращает ширину изображения.&lt;br /&gt;
&lt;br /&gt;
Height – Возвращает высоту изображения.&lt;br /&gt;
&lt;br /&gt;
Rotate(Angle) – Поворачивает изображение по часовой стрелке на угол Angle. Угол указывается в градусах и может принимать любые значения.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с изображением, используется в качестве параметра для функций, работающих с изображениями из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Canvas - ссылка на объект TCanvas холста изображения.&lt;br /&gt;
&lt;br /&gt;
== Объект TTable ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с таблицами. Удобен для печати таблицы на принтере. Алгоритм таков: Загружаем датасет в таблицу, настраиваем ее (шрифты, штрих-коды и т.д.), потом выводим на принтер функцией TPrinter.PrintTable.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Заголовок – это первая строка таблицы.&lt;br /&gt;
&lt;br /&gt;
Cell(С, R) – Возвращает значение ячейки таблицы с координатами (C, R). Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetCell(С, R, Value) – Устанавливает значение ячейки таблицы с координатами (C, R) в Value. Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
RowCount – Возвращает количество строк в таблице.&lt;br /&gt;
&lt;br /&gt;
ColCount – Возвращает количество столбцов в таблице.&lt;br /&gt;
&lt;br /&gt;
SetTitleFont(Font) – Задает шрифт заголовка таблицы (первой строки).&lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Задает шрифт всей таблицы кроме заголовка.&lt;br /&gt;
&lt;br /&gt;
SetColFont(C, Font) - Устанавливает шрифт столбца C.&lt;br /&gt;
&lt;br /&gt;
SetIndent(Indent) – Задает отступ от границы ячейки до текста в процентах от ширины страницы. По-умолчанию значение 0.3&lt;br /&gt;
&lt;br /&gt;
SetWidth(С, Width) – Задает значение ширины столбца C в процентах от ширины страницы.&lt;br /&gt;
&lt;br /&gt;
SetMinRowHeght (Heght) – Задает значение минимальной высоты строки в пикселях. &lt;br /&gt;
&lt;br /&gt;
SetBarCode(Col, Type) - Указывает, что данные из столбца Col должны печататься в виде штрих-кода. Тип штрих-кода - Type. Значение '''&amp;quot;1&amp;quot; - EAN13'''. Для кода EAN13 первая строка данных в ячейке должна иметь вид &amp;quot;тип штрих-кода, номер&amp;quot;, например &amp;quot;7, 123&amp;quot; (без кавычек, конечно). В этом случае система сформирует штрих-код: &amp;quot;2700000001233&amp;quot;. Первая цифра - всегда 2, далее - указанный тип штрих-кода, нули, чтобы получилось 13 символов, номер, указанный в таблице, и один символ - контрольная сумма. Значение '''&amp;quot;2&amp;quot; - CODE128''' (с версии 734). Данные из первой строки ячейки таблицы печатаются в штрих-коде &amp;quot;как есть&amp;quot;. Для всех видов штрих-кода (с версии 734) последующие строки печатаются под штрих-кодом в виде текста.&lt;br /&gt;
&lt;br /&gt;
SetMultiHeader(Active) - Включает печать заголовка при переносе таблицы на несколько страниц. По умолчанию отключено.&lt;br /&gt;
&lt;br /&gt;
SetCustomHeader(script) - Включает печать пользовательского заголовка. Script - это код интерпретатора, который должен печатать заголовок на канву. Печать таблицы может происходить на нескольких листах, по этому скрипт будет вызван для каждого листа. При использовании этого метода, автоматически инициализируются переменные: $TablePageNo - номер страницы, нумерация начинается с нуля; $TableY - координата по оси Y, от которой рисуется заголовок. Чтобы таблица была под заголовком необходимо значение переменной $TableY увеличить на высоту заголовка.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с таблицей, используется в качестве параметра для функций, работающих с таблицами из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 &amp;lt;?&amp;gt;&lt;br /&gt;
 NEW('TPrinter', 'Prn');&lt;br /&gt;
 If(prn.ShowDialog,&lt;br /&gt;
  NEW('TTable', 'Tbl'); &lt;br /&gt;
  NEW('TSelfADO', 'MyDB'); &lt;br /&gt;
  MyDB.Open('SELECT concat(&amp;quot;7&amp;quot;, &amp;quot;, &amp;quot;,  a.code, &amp;quot;\r\n&amp;quot;, a.client_id, &amp;quot;\r\n&amp;quot;, a.zakaz, &amp;quot;-&amp;quot;, a.number) as &amp;quot;Штрих-код&amp;quot;, a.target AS &amp;quot;Заказик&amp;quot;, address, phone, vlog, poruch FROM address a order by code desc limit 10');&lt;br /&gt;
  Tbl.LoadFromDB(MyDB.Self); &lt;br /&gt;
  Tbl.SetBarcode(1, 1);&lt;br /&gt;
  Tbl.SetCustomHeader(     &lt;br /&gt;
    if($TablePageNo&amp;gt;0,&lt;br /&gt;
      Prn.Canvas.TextOut(Prn.Canvas.DPIX*0.1, $TableY, 'Продолжение таблицы');&lt;br /&gt;
      set($TableY, $TableY + Prn.Canvas.TextHeight('H'));&lt;br /&gt;
    ,0)&lt;br /&gt;
  );&lt;br /&gt;
  Prn.BeginDoc; &lt;br /&gt;
  Prn.PrintTable(0, Tbl.Self);   &lt;br /&gt;
  Prn.EndDoc&lt;br /&gt;
 , );&lt;br /&gt;
&lt;br /&gt;
== Объект TBaseUtils ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции, базирующиеся на БД системы «MEASOFT». По-умолчанию, при создании подключается к основной базе данных модуля, в котором выполняется скрипт, если такая определена контекстом, однако это можно изменить, см SetConnection.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
'''MakeAddress(s[,town])''' – возвращает значение, полученное путем преобразований адреса s для приведения его к внутреннему формату программы. В процессе преобразования до нескольких раз происходит замена буквосочетаний по таблице замены (ее редактирование доступно по нажатию кнопки «Автозамена» в интерфейсе импорта БД из Excel системы (см. Руководство пользователя)), поиск улиц по базе КЛАДР с точностью до одного знака, и некоторые другие операции, нацеленные на исправление ошибок в написании адреса.&lt;br /&gt;
&lt;br /&gt;
С версии программы 2008.0.0.615, при вызове функции в формулах загрузки реестра, в первую очередь происходит проверка строки s на условия:&lt;br /&gt;
* в строке s записано  число; &lt;br /&gt;
* строка s начинается с &amp;quot;ПВЗ &amp;quot;. &lt;br /&gt;
Если одно из этих условий выполняется, то функция пытается установить пункт самовывоза - т.е она сама в загружаемой карточке корреспонденции укажет: адрес ПВЗ, город ПВЗ и установит галку самовывоз. &amp;lt;br/&amp;gt;Правила поиска ПВЗ:&lt;br /&gt;
* Если s число -  считаем его внутренним кодом филиала;&lt;br /&gt;
* Если s начинается с &amp;quot;ПВЗ &amp;quot; - Например в адресе передана строка &amp;quot;ПВЗ На Ленинском проспекте&amp;quot;, то искать будем филиал с названием &amp;quot;На Ленинском проспекте&amp;quot; который подчиненный, активный, с галкой ПВЗ и в городе town. Если город не указан, то ищем филиал во всех городах, и считаем его найденным если найдем только один филиал. &lt;br /&gt;
* Если филиалы найти не удалось, функция makeaddress работает как обычно и выполняет преобразование адреса.&lt;br /&gt;
&lt;br /&gt;
Если адрес не содержит русских букв, только латиница, и курьерская служба находится в одной из стран Россия, Белоруссия, Казахстан или Украина, и город-получатель (второй параметр, town) находится так же в одной из этих стран, функция автоматически делает транслитерацию адреса на русский язык.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''SetConnection(DB) – Подключает объект к базе данных DB, где DB – ссылка на объект TADO.Self.'' '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
''SetTown(Town) – Устанавливает код текущего города (используется в некоторых функциях объекта) в значение Town. По-умолчанию текущий город – 1.''  '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
'''SetIndexLength(Length)''' – Устанавливает длину почтового индекса. По-умолчанию – 6.&lt;br /&gt;
&lt;br /&gt;
'''GetIndex(Address)''' – Возвращает почтовый индекс из адреса.&lt;br /&gt;
&lt;br /&gt;
'''GetStreet(Address)''' - Возвращает улицу до первой запятой.&lt;br /&gt;
&lt;br /&gt;
'''GetHome(Address)''' - Возвращает номер дома до второй запятой, но не более пяти символов.&lt;br /&gt;
&lt;br /&gt;
'''GetKurierByStation(station, Mass, Cash, Date_Putn)'''&lt;br /&gt;
&lt;br /&gt;
'''TownByIndex(Index[, PriorityName][, PriorityCountry])''' – Возвращает код города по индексу. В случае ошибки поиска – код текущего города. Если нашлось несколько населенных пунктов, и указано приоритетное название - выбирается населенный пункт, название которого начинается с PriorityName (если есть).&lt;br /&gt;
&lt;br /&gt;
'''TownByName(Name[,NotNeedCL=False, City=0])''' – Возвращает код города по имени. В случае ошибки поиска – возвратит код текущего города. Если параметр NotNeedCL (параметр не обязательный) установить в TRUE, тогда функция возвратит 0, если город не удалось найти. Параметр City (код региона) позволяет ограничить поиск одной областью (не обязательный, по умолчанию не используется).&lt;br /&gt;
&lt;br /&gt;
'''FillClientInfo(Excel, client, Sheet, Row, Col)''' – Выводит в эксель информацию о клиенте с кодом client на лист sheet начиная со строки row и столбца col.&lt;br /&gt;
&lt;br /&gt;
'''SavePrintFormToFile(FormType, FormNumber)''' - Сохраняет на диске файл печатной формы и возвращает путь к нему&lt;br /&gt;
&lt;br /&gt;
'''CreateTrans(Address[, Store][, Operator][,Correction])''' - Формирует запись для печати кассового чека для корреспонденции с кодом Address, для выбора кассового аппарата используется код склада Store. Если Store не указано - при исполнении в среде клиентского модуля системы использует склад, указанный пользователем в окне [[Настройка параметров рабочего места|&amp;quot;Настройка&amp;quot; - &amp;quot;Параметры&amp;quot;]], в остальных модулях - код текущего склада из [[Настройка глобальных параметров|переменной]] &amp;quot;CL&amp;quot; (&amp;quot;Текущий филиал&amp;quot;). Поле Operator позволяет указать кассира (передается код справочника сотрудников). Если не указан, в основной системе будет использован код авторизованного пользователя, в других модулях - 1.&lt;br /&gt;
Поле Correction позволяет указать данные для корректировочного чека, используется в системе Штрих-М. По умолчанию пустая строка. Возвращает идентификаторы записей чеков. Может вернуть пустую строку, если чек создавать не понадобилось, один или несколько кодов через запятую, если создано несколько чеков. В случае ошибки вызывает ошибку, поэтому рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CreateReturnTrans(Address)''' - формирует запись для печати чека возврата для корреспонденции с кодом Address. Чек возврата печатается на полную сумму и с теми же атрибутами, что и чек продажи. Возвращает идентификатор записи чека возврата. В случае ошибки вызывает ошибку, поэтому, как и с CreateTrans,  рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownDeliveryDays(Source, Mode, TownTo, TownFrom)''' - возвращает количество дней необходимых на доставку отправления, только для межгорода. Source - код клиента, Mode - режим срочности, TownFrom - код города отправителя, TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcDeliveryDate(Source, Mode, TownTo, TownFrom, Date_Beg, Time_beg)''' - Возвращает планируемую дату доставки с учетом сроков доставки. Работает при городской и междугородней доставке. Для межгорода сроки доставки берутся из зон. Для городской доставки, из дополнительных параметров статуса (17 статус, 1 параметр в доп. информации)  Если рассчитать дату планируемой доставки не удалось, возвращает пустую строку. Параметры: Source - код клиента, Mode - режим срочности, TownTo - город получатель, TownFrom - город отправитель, date_beg - дата заказа (может быть передана строкой в формате DD.MM.YYYY или в числовом), time_beg - время заказа. &lt;br /&gt;
&lt;br /&gt;
'''GenSpecialSMA(DirectExcel, Code)''' - функция для генерации отчета о доставке по акту передачи денег. Первый параметр - указатель на TDirectExcel, второй параметр - код акта передачи денег. АПД выводится на текущий лист объекта TDirectExcel.&lt;br /&gt;
&lt;br /&gt;
'''CreateSpecialSMA(ClientCode, DateTo)''' - Функция создает исходящий акт передачи денег (АПД). Требует ClientCode - код клиента, DateTo - дату акта. Функция возвращает коды созданных актов. Если возвращаемых параметров два, значит функция пыталась создать два АПД: первым, идет код АПД с наличной оплатой, а вторым с безналичной. Примеры возвращаемого результата: '0'- акт не был создан, отсутствуют корреспонденции; '124' - код созданного акта; '0,0' - пытались создать два акта, но отсутствуют данные; '4556,0' - создан только наличный АПД; '0,445' - создан только безнал.; '4556,445' - созданы нал. и безнал.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressForActDelivery(ActCode, [DeliveryDateMode=0, Delivery=True])''' - Функция создает корреспонденцию на доставку акта. ActCode - код акта; DeliveryDateMode: 0 - установить план. дату доставки текущим рабочим днем, 1 - установить план. дату доставки следующим рабочим днем, 2 - установить план. дату доставки равной планируемой дате оплаты АПД; Delivery - создать корр. на доставку АПД или создать корреспонденцию на забор АПД (по умолчанию, доставка АПД). Работа функции может быть изменена системной доп. возможностью OnCreateAddressForActDelivery.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressTransferAct(ClientCode, Store, DateTo, [AdditionalParam])''' - Функция создает исходящий акт передачи корреспонденции (АПК). Требует  ClientCode - код клиента, Store - код филиала, для которого будет создан акт, DateTo - дату, до которой в акт попадут возвраты, AdditionalParam - дополнительный строковый параметр для передачи в системную доп. возможность ExceptionsForAPK, позволяющий отобрать в акт, например, только полные возвраты.   Возвращает код созданного акта. ВНИМАНИЕ: при создании АПК используется системная функция ExceptionsForAPK. Если в ней используются интерактивные функции (вывод сообщений, диалоговые окна, выполнение скриптов), то акт сформирован не будет, а функция CREATEADDRESSTRANSFERACT вернет ошибку.     &lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByAddress(Address, TownCode, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попал адрес. Если полигон найти не удалось, функция возвратит пустую строку. Address - адрес корреспонденции текстом; TownCode - код города; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByAddress(addressrecord.address, if((addressrecord.number=0)*(addressrecord.strbarcode=&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;), addressrecord.townfrom, addressrecord.townto), '`schema`=1') - пытаемся найти вхождение адреса в полигоны 1 схемы, при выборе города учитывается корр. на забор, у нее нужно использовать город-отправитель (а для обычной корр. нужен город-получатель).&lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByLatLon(Lat, Lon, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попали GPS координаты. Если полигон найти не удалось, функция возвратит пустую строку. Lat - широта  текстом; Lon - долгота текстом; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByLatLon('55.769064','37.590713','zone is not null and price=0') - пытаемся найти вхождение координат в полигоны, где задана зона, для всех клиентских и курьерских зон.&lt;br /&gt;
&lt;br /&gt;
'''GetLatLonByAddress(AddressText, TownCode)''' - возвращает географические координаты вида lat,lon указанного в AddressText адреса. Поиск производится в городе, имеющем код TownCode в таблице Town.&lt;br /&gt;
&lt;br /&gt;
'''GetRouteCode(AddressText, TownCode, LatLon[, Lon])''' - для адреса AddressText в городе с кодом TownCode (из таблицы Town) по географическим координатам lat, lon возвращает код роута (записи, хранящей координаты адреса в городе). Если роут не найден (для адреса в городе не найдено записи с указанными координатами) - создает новый роут и возвращает его код, если роут найден (был создан ранее) - обновляет у роута координаты. Если параметр Lon задан, то параметр LatLon должен содержать одну координату, иначе LatLon должен содержать строку вида 'lat, lon'.&lt;br /&gt;
В случае ошибки возвращает Null.&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode(address, townto, '55.114034, 36.592397'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Троицк, Полковника милиции Курочкина ул., 11', 1, '37.467446, 55.740537'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Обнинск, Маркса пр., 20', TownByName('Обнинск'), 55.114034, 36.592397));&lt;br /&gt;
&lt;br /&gt;
'''CalcAgentPrice(AddressCode, AgentCode, TownFrom, TownTo, Mode, [, Count=1])''' - функция возвращает стоимость доставки рассчитанную по тарифу агента. AddressCode - код адреса, AgenCode - код филиала (агента), TownFrom - код города отправителя, TownTo - код города получателя, Mode - режим срочности, count - тарифная сетку от указанного количества отправлений (по умолчанию 1)&lt;br /&gt;
&lt;br /&gt;
'''SetAddrKol_vo(address, getkol_vo)''' - функция делает прием корреспонденции в текущем ответственном филиале. address - внутренний код адреса, getkol_vo - количество принимаемых мест, может принимать значения: &amp;quot;kol_vo&amp;quot; - принять все места, &amp;quot;getKol_vo+1&amp;quot; - принять еще одно место, &amp;quot;число&amp;quot; - сделать количество принятых мест равным указанному числу.&lt;br /&gt;
&lt;br /&gt;
'''CalcClientCnt(client_code, date, is_intown [, date_put=CurrDate(), skipajust=false])''' - функция расчета количество доставленных корреспонденций у клиента с кодом client_code за предыдущий месяц от даты date (Или за текущий месяц, подробнее смотри переменную UseCurrentMonthCount) среди внутригородских (is_intown = true) либо междугородних (is_intown = false) корреспонденций, date_put - дата доставки (для альтернативного способа подсчета, включаемого переменной UseDatePutForCalcCnt), skipajust - не учитывать принудительно введенные количества (таблица priceclientadjust типы записей 0 и 1).&lt;br /&gt;
&lt;br /&gt;
'''GetBasePrice''' - возвращает базовую стоимость доставки посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов,зоны,типа,срочности,массы, расстояния. В системах с выключенными доп. услугами также считает проценты от суммы и страховки. &lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset._self&amp;quot;.&lt;br /&gt;
  Описание некоторых полей датасета:&lt;br /&gt;
    pmoney - процент от суммы;&lt;br /&gt;
    pmoneycard - процент от суммы при оплате картой;&lt;br /&gt;
    pricecode - код прайса (таблица Price) ;&lt;br /&gt;
    distarea - район метро получателя (актуально при отключённом едином районировании, как правило район от 200 до 299 является признаком области);&lt;br /&gt;
    region - признак области при включенном едином районировании;&lt;br /&gt;
    distareaFrom и regionFrom  - аналог distarea, region только для отправителя;&lt;br /&gt;
    pcncode - код записи таблицы pricecnt &amp;quot;количество от&amp;quot;;&lt;br /&gt;
    Запрос содержит поля таблицы pricelinesnew - начальная стоимость по тарифной сетки, найденные без учета массы,только по типу срочности и режиму.&lt;br /&gt;
    Запрос содержит поля таблицы price.&lt;br /&gt;
&lt;br /&gt;
*addressrecord - ссылка на объектную модель карточки корреспонденции, следует использовать уже созданную addressrecord._self&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*type - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*wait - количество минут ожидания (не учитывается при доп. услугах, есть системная услуга &amp;quot;ожидание&amp;quot;);&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*rur - сумма передаваемых денег (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от суммы&amp;quot;);&lt;br /&gt;
*inshprice - сумма страховки (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от объявленной стоимости&amp;quot;);&lt;br /&gt;
*distance - расстояние до места доставки, обычно поле заполняется при доставке в область (регион в едино районировании). Дополнительная наценка к стоимости доставки;&lt;br /&gt;
*forward - направление доставки: true - туда; false - обратно;&lt;br /&gt;
*Collection - признак заборной корреспонденции: true - забор, false - доставка (В тарифе есть возможность указать стоимость для забора);&lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
В тарифе есть возможность указать формулу, которая может влиять на базовый расчет. Формула может объявить служебные переменные, которые:&lt;br /&gt;
*$FormulaReplace - если true – возвращаемое значение полностью заменяет базовый расчет;&lt;br /&gt;
*$FormulaKoeff - коэффициент на который будет помножена базовая стоимость.&lt;br /&gt;
Также внутри формулы объявлены следующие объекты dataset, addressrecord и переменные:&lt;br /&gt;
*$ForceIntown - Переменная становится истиной, если междугородний расчет был отменен, т.к. адрес попал в нарисованную зону на карте.&lt;br /&gt;
*а также: $forward, $distance, $Count, $Collection, $Wait, $FormulaKoeff, $PriceCode - описание есть выше.&lt;br /&gt;
&lt;br /&gt;
Для направления &amp;quot;туда&amp;quot;, Функция GetBasePrice вызывается  через доп. услугу &amp;quot;База&amp;quot; (при включенных доп. услугах), для направления &amp;quot;Обратно&amp;quot; всегда вызывается напрямую (т.к. доп. услуги работают только в для направления &amp;quot;туда&amp;quot;).&lt;br /&gt;
На расчет этой функции влияют следующие переменные: &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Расчет стоимости по адресу&amp;quot;, &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Зона клиента по умолчанию&amp;quot;,  &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Подсчет кол-ва отправлений за месяц&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownPrice''' - возвращает базовую стоимость междугородней доставки, посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов, типа, срочности, массы, расстояния.&lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset.self&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*tp - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcAddressPrice(AddressCode, [,ZakazCount])''' - полностью пересчитывает стоимость доставки корреспонденции по тарифу клиента. AddressCode - внутренний код адреса, ZakazCount - не обязательный параметр, кол-во заказов от клиента.&lt;br /&gt;
&lt;br /&gt;
'''GetStationCode(s [,town])''' – возвращает код станции метро, ассоциированный в системе с адресом s. В случае невозможности идентифицировать станцию метро – возвращает 0. &lt;br /&gt;
Когда включено районирование по карте, необходим второй параметр &amp;quot;town&amp;quot; - код города в котором нужно искать адрес.  Возвращает код района если удалось его найти; код станции меж-города - если адрес удалось геокодировать, но район не нашли; код 0 - когда не удалось геокодировать адрес.&lt;br /&gt;
&lt;br /&gt;
'''RecalcSpecialSMA(ActCode)''' - пересчитать акт передачи денег (АПД). Также, у корреспонденций входящих в АПД будет пересчитана стоимость доставки. Для Входящего АПД сумма акта не пересчитывается. Параметр ActCode - внутренний код акта, коды можно перечислять через запятую.&lt;br /&gt;
&lt;br /&gt;
'''UserCode''' - Возвращает код текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserName''' - Возвращает имя текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserPass''' - Возвращает пароль текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''UserBaseCode''' – Возвращает код текущего пользователя из таблицы «Сотрудники» (kurier).&lt;br /&gt;
&lt;br /&gt;
'''UserEmail''' - Возвращает e-mail текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''CurrentTown''' – Возвращает код текущего города (из таблицы town).&lt;br /&gt;
&lt;br /&gt;
'''CurrentCity''' – Возвращает код текущего региона (из таблицы city).&lt;br /&gt;
&lt;br /&gt;
'''CurrentLocation''' – Возвращает код текущего филиала (из таблицы store).&lt;br /&gt;
&lt;br /&gt;
'''FromEmailStr''' - строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
'''FillExcelDoc'''(Excel, Dataset, FormType, FormNumber,Print,[printer]) - Выполняет указанную печатную форму в объекте excel. Excel объект можно не указывать, тогда функция сама создаст объект экселя и разрушит его, полезно когда книгу &lt;br /&gt;
нужно распечатать или отправить по email (на листе данных в ячейке 1,1 укажите ключевое слово email). Dataset объект с данными для скрипта в печатной форме, может быть null. Dataset передавать можно так db.self, тогда переданный dataset внутри печатной формы будет доступен по имени dataset. Print - печатает книгу на принтере, после печати объект excel разрушается, при использовании параметра не указываете объект excel. Printer - имя принтера, на котором печатать (по умолчанию пустая строка, что означает &amp;quot;печатать на принтере по умолчанию&amp;quot;). Например:&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'excel');&lt;br /&gt;
 FillExcelDoc(excel.self, null, 12, 1);&lt;br /&gt;
 excel.DoNotDestroy(true);&lt;br /&gt;
 excel.SetVisible(true);&lt;br /&gt;
 ''Покажет эксель с выполненной печатной формой''&lt;br /&gt;
&lt;br /&gt;
'''ValutaSign''' – Возвращает название валюты для суммы.&lt;br /&gt;
&lt;br /&gt;
'''SendToMeasoft(xml)''' - Отправляет запрос в клиентское API Measoft. Автоматически добавляет начальный &amp;quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''InsertFirmAtt(excel, sheet, firmcode)''' - Вставляем на лист эксель по коду фирмы: печать, подпись, подпись бухгалтера, логотип. Тэги &amp;lt;STAMP&amp;gt;, &amp;lt;DIR&amp;gt;, &amp;lt;BUH&amp;gt;, &amp;lt;LOGO&amp;gt; соответственно. После тега можно указать размеры изображения в символах Microsoft Excel. Формат записи: &amp;lt;STAMP&amp;gt; 16, 16&lt;br /&gt;
&lt;br /&gt;
'''PreCalcSalary(kurier, addressCodes)''' - Рассчитывает предварительную зарплату. Kurier - код курьера, используется для определения тарифа. addressCodes - коды адресов, через запятую для которых необходимо посчитать зарплату. Результаты расчета будут записаны в таблицу kurierpaydetail, так как расчет предварительный то записи не будут прикреплены к конкретному начислению. &lt;br /&gt;
&lt;br /&gt;
  select a.code, kpd.price as &amp;quot;туда&amp;quot;, kpd2.price as &amp;quot;обратно&amp;quot; from address a &lt;br /&gt;
  left join kurierpaydetail kpd on kpd.sourcetable=3 and kpd.sourcecode=a.code and kpd.rectype = 1 &lt;br /&gt;
  left join kurierpaydetail kpd2 on kpd2.sourcetable=3 and kpd2.sourcecode=a.code and kpd2.rectype = 2&lt;br /&gt;
  where a.code in (...)&lt;br /&gt;
&lt;br /&gt;
'''CalcSalary(DateTo, [Filter=0, KurierCode = 0, ManagerCode = 0])''' - Полный расчет зарплаты курьерам. DateTo  - дата до которой создается начисление. Условия отбора курьеров для начисления. Filter - роль сотрудника: 0 - Все, 1 - курьеры, 2 - менеджеры; KurierCode - код курьера, ограничить расчет зарплаты одним курьером;ManagerCode - код курьера, ограничить расчет зарплаты курьерами указанного менеджера. Внимание фильтры Filter, KurierCode и ManagerCode накладываются друг на друга. Результатом функции является SubSQL с информацией по созданным начислениям. &lt;br /&gt;
  поля ответа: код курьера, код менеджера, начислено, бонусы, штрафы, аванс, итого;&lt;br /&gt;
  select kurier, manager, profit, bonus, shtraf, prepay, total  [union select ...]&lt;br /&gt;
&lt;br /&gt;
'''SelDistAddr(s)''' – Возвращает строку для вставки в select запрос, для вывода поля с упрощенным адресом. Принимает один необязательный строковый параметр - алиас таблицы из которой будет упрощаться поле address, по умолчанию &amp;quot;a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''VoiceReadStr(str)''' – Озвучивает фразу str голосовым уведомлением доступными словами из базы. Может содержать тег &amp;quot;{break_off}&amp;quot; для того, чтобы сделать эту фразу не пропускаемой в очереди воспроизведения.&lt;br /&gt;
&lt;br /&gt;
'''CalcStorageCost(ClientCodes, DateFrom, DateTo, NeedReport[, Store])''' – рассчитывает стоимость хранения на складе для выбранных клиентов (ClientCodes - коды клиентов через запятую), в период дат с DateFrom до DateTo, с прикреплением к корреспонденции отчета в зависимости от выставленного параметра NeedReport. Может содержать параметр Store - код филиала, по умолчанию пустой (расчет выполняется для всех филиалов). Возвращает коды созданных корреспонденций через запятую.&lt;br /&gt;
&lt;br /&gt;
'''WriteOut(DocId, ItemId, Date, Cnt[, BC])''' – производит списание товара со склада. DocId - код (docs.code) документа списания, ItemId - код товара (item.code), Date - дата операции, Cnt - количество списываемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер. Если указан BC, то параметр ItemId игнорируется и поиск номенклатуры происходит исключительно по штрих-коду. В случае успеха, функция возвращает строку вида: код номенклатуры, списанное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''IncomePurch(DocId, ItemId, Date, Cnt[, BC, Location = CurrentLocation])''' – производит приход товара на склад. DocId - код (docs.code) приходной накладной, ItemId - код товара (item.code), Date - дата операции, Cnt - количество приходуемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер, Location - код склада (store.code).  В случае успеха, функция возвращает строку вида: код номенклатуры, введенное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''CreateLedgerDoc(Date, Client, UserCode, Type[, ExtNumber, Message])''' - создает складской документ и возвращает код этого документа. Date - дата документа. Client - код клиента. UserCode - код пользователя, создавшего документ. Type - тип документа (statetype = 13). ExtNumber - номер у поставщика для документов прихода и расхода. Message - комментарий к документу. Последние два аргумента не обязательные и могут быть пустыми.&lt;br /&gt;
&lt;br /&gt;
== Объект TINIFile ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции работы с ini-файлами. В некоторых контекстах создается автоматически для предоставления доступа к настроечному файлу модуля, выполняющего скрипт.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
IniParam(s[,section='common']) – Существует только если имя экземпляра объекта пустое. Возвращает значение параметра s ini-файла секции «common», изменить секцию можно не обязательным параметром section. В случае отсутствия параметра в файле возвращает пустую строку. &lt;br /&gt;
&lt;br /&gt;
Param(s) – Синоним IniParam с тем отличием, что существует только если имя объекта непустое.&lt;br /&gt;
&lt;br /&gt;
SetText(s) - Загружает ini файл из строки s. Если в файле нет секции «common», то принудительно объявляет ее в начале.&lt;br /&gt;
&lt;br /&gt;
== Объект TSMS ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для отправки SMS, а также проверки статуса их доставки.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetProxy(Server, Port, User, Pass) - Устанавливает настройки прокси-сервера.&lt;br /&gt;
&lt;br /&gt;
Connect(Provider, Host, User, Pass, SenderName, SMSPrefix) – Подключает объект к провайдеру provider, используя адрес Host, имя пользователя User и пароль Pass. Значение SMSPrefix предназначено для того, чтобы провайдер мог различить сообщения от разных филиалов, если этими филиалами используется одно подключение. Если необходимости разделять сообщения нет - значение SMSPrefix можно не указывать.&lt;br /&gt;
Для провайдера доступны значения 'mirsms', 'sms16', 'websms', 'epochta', 'zanzara', 'SMSManager', 'f1sms', 'BitCall', 'mirsmsGET', 'AMD' и другие, либо можно указать числовые значения номера протокола, от 1 до &amp;lt;rspoiler text=&amp;quot;20&amp;quot;&amp;gt;Набор провайдеров все время дополняется, количество и номера можно смотреть в Справочники - Переменные - Подключения - SMS&amp;lt;/rspoiler&amp;gt; соответственно. Эти значения соответствуют значениям переменной SMSProtocol таблицы &amp;quot;Value&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SendSMS(Phone, Text, [ID]) – Отправляет SMS с текстом Text на телефон Phone. Для некоторых провайдеров необходим уникальный идентификатор сообщения ID (для провайдера iVoice - идентификатор сценария (кампании)). Возвращает ID провайдера для последующей проверки статуса доставки.&lt;br /&gt;
&lt;br /&gt;
CheckSMS(ProviderID) – Проверяет состояние доставки сообщения с идентификатором ProviderID. Возвращает: 0 – доставляется, 1 – успешно доставлено, 2 – не доставлено.&lt;br /&gt;
&lt;br /&gt;
ReceiveSMS(InboxID, DateFrom, DateTo, NewOnly) - Получает входящие SMS, с ящика InboxID (идентификатор выдаётся провайдером). DateFrom, DateTo - задается временной интервал в котором были приняты сообщения(формат 08.04.2013 18:00:00 'DD.MM.YYYY HH:NN:SS'). Чтобы получать только новые сообщение поле NewOnly должно быть True. Возвращает XML с сообщениями.&lt;br /&gt;
&lt;br /&gt;
ExtraResult([ParamName='']) - Вызывается после CheckSMS, возвращает дополнительную информацию по последнему статусу смс. В настоящее время работает только для провайдеров BitCall и iVoice. Для BitCall по умолчанию возвращает кнопки, нажатые абонентом во время работы с голосовым меню. Если в paramname указать 'IdentifyText' то будет возвращен JSON  с ответами абонента на заданные вопросы(используется в случае звонков с индивидуальным сценарием). Для iVoice по умолчанию подразумевается параметр 'response', при этом будет возвращен JSON  с ответами абонента на заданные вопросы (в зависимости от сценария)&lt;br /&gt;
&lt;br /&gt;
Log - Возвращает последний HTTP запрос и ответ от сервера смс.&lt;br /&gt;
&lt;br /&gt;
== Объект TXML ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга XML-данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст XML документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию. Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля.&lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
AttribCount – Возвращает количество атрибутов текущего элемента.&lt;br /&gt;
&lt;br /&gt;
AttribName(i) – Возвращает имя атрибута с номером i.&lt;br /&gt;
&lt;br /&gt;
Attrib(V) – Ищет атрибут и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
== Объект TJSON ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга JSON-данных. &lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст JSON документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля. &lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Можно проверять наличие элементов, если элемента нет, вернется пустая строка.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
isArray - Возвращает true, если текущий элемент является массивом (доступ к дочерним элементам возможен только по индексу, нумерация элементов начинается с нуля)&lt;br /&gt;
&lt;br /&gt;
==Объект TZip==&lt;br /&gt;
Предназначен для работы с Zip архивом. &lt;br /&gt;
&lt;br /&gt;
SetZip(s) - Загружает архив в объект из строки s;&lt;br /&gt;
&lt;br /&gt;
GetZip - Возвращает архив в виде строки;&lt;br /&gt;
&lt;br /&gt;
AddFromFile(SrcPath, ZipPath) - Добавляет файл SrcPath в архив и располагает его по пути ZipPath. ZipPath содержит имя файла в архиве, при необходимости можно указать каталог; &lt;br /&gt;
&lt;br /&gt;
AddFromStr(Data, /*ZipPath*/) - '''параметр ZipPath временно не работает'''. Добавляет файл из строки Data в архив и располагает его по пути ZipPath.  -ZipPath содержит имя файла в архиве, при необходимости можно указать каталог;&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(path) - Загружает архив из файла path;&lt;br /&gt;
&lt;br /&gt;
SaveToFile(path) - Сохраняет архив в файл path;&lt;br /&gt;
&lt;br /&gt;
Count - Возвращает кол-во файлов в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByIndex(index) - Возвращает распакованный файл в виде строки. Index - номер файла в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByName(ZipPath) - Возвращает распакованный файл в виде строки. ZipPath - путь к файлу в архиве, может содержать каталоги;&lt;br /&gt;
&lt;br /&gt;
FileName(index) - По номеру файла, функция возвращает полный путь файла в архиве.&lt;br /&gt;
&lt;br /&gt;
==Объект TBase==&lt;br /&gt;
&lt;br /&gt;
'''Функции общего назначения''':&lt;br /&gt;
&lt;br /&gt;
'''ExecSimpleScript(Caption, Text)''' - Выполняет скрипт &amp;quot;Дополнительных возможностей&amp;quot;. Возвращаемые значения, введенные пользователем устанавливает в переменные $scriptvar1..$scriptvarN, Значения кодов списочных переменных - в переменных $scriptvar1codes..$scriptvarNcodes. Функция возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot; в диалоговом окне.&lt;br /&gt;
&lt;br /&gt;
'''FillAdvPriceReport(Excel, AddressCodes, StartLine, StartCol, [ShowSumPrice,InsertColumns,ShowAll])''' - добавляет отчёт по дополнительным услугам. В AddressCodes - указаны коды адресов через запятую, каждый код это отдельная строка отчета. Адреса будут показаны в порядке перечисления их в AddressCodes. Если в отчет нужно добавить пустую строку, то можно указать код адреса -1000. StartLine, StartCol - верхний левый угол выгружаемой таблицы. ShowSumPrice - добавить столбец итоговый столбец с суммой всех услуг, по умолчанию выключено. InsertColumns - раздвинуть таблицу перед вставкой отчета, позволяет встраивать отчет посередине выгрузки, по умолчанию выключено. ShowAll - показать все дополнительные услуги, по умолчанию false и показывает только услуги с начислениями. Функция возвращает количество использованных столбцов.&lt;br /&gt;
&lt;br /&gt;
'''PrintSticker(Codes, [ToBoxes=False])'''&lt;br /&gt;
&lt;br /&gt;
'''PrintBlanc(Codes, BlancNumber)''' - печатать форму из раздела &amp;quot;Заполнить бланк&amp;quot;. Codes - коды корреспонденций, BlancNumber - номер формы из раздела &amp;quot;Бланки для корреспонденции&amp;quot; (3)&lt;br /&gt;
&lt;br /&gt;
'''GetItemByName(Name)'''&lt;br /&gt;
&lt;br /&gt;
'''GetA4Printer([GetPrinterPort=False])''' - возвращает имя принтера выбранного для печати документов. GetPrinterPort - попытаться по имени принтера найти порт принтера. Определение порта работает только с физическими устройствами LPT, USB, TCPIP. &lt;br /&gt;
&lt;br /&gt;
'''GetStickerPrinter([GetPrinterPort=False])''' - возвращает имя принтера выбранного для печати стикеров. GetPrinterPort - попытаться по имени принтера найти порт принтера. Определение порта работает только с физическими устройствами LPT, USB, TCPIP. &lt;br /&gt;
&lt;br /&gt;
'''GetDuplexPrinter([GetPrinterPort=False])''' - возвращает имя принтера выбранного для двусторонней печати, если принтер не выбран, возвращает пустую строку. GetPrinterPort - попытаться по имени принтера найти порт принтера. Определение порта работает только с физическими устройствами LPT, USB, TCPIP. &lt;br /&gt;
&lt;br /&gt;
'''PrintAttachPDFPage(Code, FileName, Page, Printer)''' - печатает страницу из вложенного файла PDF. Code - код вложения (attachment) или путь к файлу, Page - номер страницы, Printer - 0 = принтер A4, 1 = принтер этикеток. &lt;br /&gt;
&lt;br /&gt;
'''AttachPDFToText(Code, [TextFileName])''' - преобразует файл PDF из вложений в текст. Code - код вложения (attachment) или путь к файлу, TextFileName - имя текстового файла, в который записывается результат (если не указан, используется временный файл). Возвращает текст в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''GhostScript(GScript, Code)''' — функция для выполнения консольных команд утилиты [https://ghostscript.readthedocs.io/en/latest/Use.html ghostscript]. Где, GScript — строка с командами Ghostscript; Code — код вложения или путь к PDF-файлу, предназначенному для обработки. В командах доступен специальный тег %MeasoftInFile%, который автоматически заменяется на путь к предварительно загруженному файлу (Code). Если в команде необходимо указать путь для сохранения результата обработки, используйте тег %MeasoftOutFile%. В этом случае функция на основании параметра Code автоматически сформирует имя временного выходного файла. После успешного выполнения команд функция возвращает путь к сгенерированному выходному файлу -  %MeasoftOutFile%.&lt;br /&gt;
&lt;br /&gt;
'''GetActiveForm([SkipFormName])''' - возвращает код активной формы в программе где происходит сканирование. SkipFormName - не обязательны параметр, имя формы которую нужно пропустить при определении интерфейса.&lt;br /&gt;
 '''Список интерфейсов''': &lt;br /&gt;
 0 - неопределенный; &lt;br /&gt;
 1 - прием корреспонденции на склад; &lt;br /&gt;
 2 - АПД; &lt;br /&gt;
 3 - комплектация адресов (ShelfingForm); &lt;br /&gt;
 4 - доска приема; &lt;br /&gt;
 9 - вкладка «Манифесты»; &lt;br /&gt;
 10 - Инвентаризация корреспонденции; &lt;br /&gt;
 11 - АПК; &lt;br /&gt;
 12 - вкладка «Адреса»; &lt;br /&gt;
 13 - вкладка «Выдача»; &lt;br /&gt;
 14 - вкладка «Склад»; &lt;br /&gt;
 15 - Список номенклатуры; &lt;br /&gt;
 16 - Инвентаризация склада; &lt;br /&gt;
 17 - Приходная накладная; &lt;br /&gt;
 18 - Списание товара; &lt;br /&gt;
 19 - Карточка корреспонденции.&lt;br /&gt;
&lt;br /&gt;
'''AddAddressScanLog(Code[, StrBarCode, IsManual, FromInterface, ExtraInfo])''' - добавляет событие сканирование для корреспонденции с кодом Code. Необязательные параметры: StrBarCode - сканируемый ШК корреспонденции (по умолчанию пустой), IsManual - галка ручного сканирования (по умолчанию false), FromInterface - код интерфейса сканирования (StateType=81, по умолчанию 0 - неопределенный), ExtraInfo - текстовый комментарий события.&lt;br /&gt;
&lt;br /&gt;
'''RuleName(alias)''' - Выдает полный путь в дерева прав по псевдониму права.&lt;br /&gt;
&lt;br /&gt;
'''ShowText(Caption:string, Value:string)''' - показывает пользователю окно с заголовком Caption и с многострочным полем со значением Value. Может быть полезен при отображении логов выполненной операции. &lt;br /&gt;
&lt;br /&gt;
'''ShowScanError(msg [, Speek, Color, Abort])''' - выдает пользователю окно с текстом msg блокируя последующие действия сканирования. Если Speek - истинно, то сообщение проговаривается голосовым движком, по умолчанию выключено. Color - целочисленное число цвета, в который будет окрашен фон сообщения (по умолчанию = -1, стандартный). Abort  - прервать выполнение скрипта, не показывая ошибку.&lt;br /&gt;
&lt;br /&gt;
'''CheckRule(alias)''' - функция проверки разрешения у текущего пользователя системы, alias - псевдоним права. Возвращает 1, если право есть и 0, если права нет. &lt;br /&gt;
 Пример: if(CheckRule('RSE'), ShowMessage('У пользователя есть право изменять счета'), ShowMessage('У пользователя нет права изменять счета'));&lt;br /&gt;
&lt;br /&gt;
'''GetKurierMoney(KurierCode, DateEnd, NonCash)''' - возвращает баланс курьера с кодом KurierCode на дату DateEnd. NonCash - булевый флаг, если истинно, то будет рассчитан безнальный баланс; &lt;br /&gt;
&lt;br /&gt;
'''Функции, работающие только в импорте БД из эксель:'''&lt;br /&gt;
&lt;br /&gt;
ReplaceAddress&lt;br /&gt;
&lt;br /&gt;
GetItemByCode - Поиск товара по артикулу. Внимание: в пределах одного клиента может быть несколько товаров с одинаковыми артикулами. В этом случае функция найдет последний заведенный товар.&lt;br /&gt;
&lt;br /&gt;
GetPrice&lt;br /&gt;
&lt;br /&gt;
GetNewNumber - используется при импорте реестра, возвращает номер конверта в загружаемом заказе&lt;br /&gt;
&lt;br /&gt;
GetNewPos - используется при импорте реестра, возвращает порядковый номер вложения&lt;br /&gt;
&lt;br /&gt;
GetNewPackagePos- используется при импорте реестра, возвращает порядковый номер места&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zakaz - возвращает номер заказа куда происходит импорт реестра&lt;br /&gt;
&lt;br /&gt;
addresscode  -  используется при импорте реестра, код созданного адреса&lt;br /&gt;
&lt;br /&gt;
Source  - код заказчика&lt;br /&gt;
&lt;br /&gt;
ClientTown - Узнаем город клиента, через филиал с которым он работает. Сам клиент берется из заказа указанного в окне &amp;quot;Импорт БД из Excel&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Объект TFieldObject ==&lt;br /&gt;
Создается только автоматически. Объект для доступа к записям, используется в картах и дополнительных услугах (addressrecord) и событиях карточки корреспонденции (fieldlist). Методы объекта:&lt;br /&gt;
&lt;br /&gt;
'''_GetTableInfo''' - возвращает данные о полях и примеры данных объекта.&lt;br /&gt;
&lt;br /&gt;
'''_Self''' - возвращает ссылку на объект.&lt;br /&gt;
&lt;br /&gt;
'''_Set(fieldname, fieldvalue [, DoUpdateForm])''' - Если базовый объект строка. Устаналивает для поля fieldname значение fieldvalue. DoUpdateForm по уолчанию false, если указать true то обновление поля будет не только в объекте но и пользовательском интерфейсе. Обновление работает только в карточке корреспнденции для ограниченного набора полей: vlog, mode, type, date_put, time_put, message, kurier, state1.&lt;br /&gt;
&lt;br /&gt;
'''_Set(keyfield, keyvalue, filed, value)''' - Если базовый объект таблица (addressrecord.boxes). Работает перегруженная версия метода _set, cначала происходит поиск строки по ключу, далее меняется значение указанного столбца. keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца.  Пример, отключение услуги база:&lt;br /&gt;
&lt;br /&gt;
 addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
 priceconf - поле где записан код услуги;&lt;br /&gt;
 1 - услуга База;&lt;br /&gt;
 active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
== Объект TMessage ==&lt;br /&gt;
Создается только автоматически. Объект используется для скриптовой обработки письма в [https://wiki.courierexe.ru/index.php/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8#.D0.98.D0.BC.D0.BF.D0.BE.D1.80.D1.82_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85| заданиях импорта данных]. В себе содержит текст письма в очищенном формате и оригинальном формате HTML, отправитель письма, тему письма, дата получения и список прикрепленных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.Text''' - возвращает очищенный от HTML-тегов текст письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.HTMLText''' - возвращает оригинальный текст письма со всеми HTML-тегами.&lt;br /&gt;
&lt;br /&gt;
'''Message.Sender''' - возвращает email-адрес отправителя письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.AttachmentsCount''' - возвращает количество вложенных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.DateTime''' - возвращает дату и время получения письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.Subject''' - возвращает тему письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentDataString(Number)''' - возвращает вложенный файл под номером Number в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentName(Number)''' - возвращает имя вложенного файла под номером Number.&lt;br /&gt;
&lt;br /&gt;
== Объект TStringList ==&lt;br /&gt;
Может использоваться для построчной обработки многостраничных файлов либо для организации текстовых данных. Номер строк начинается с 0. &lt;br /&gt;
Имеет следующий функционал:&lt;br /&gt;
&lt;br /&gt;
'''Count''' - возвращает количество строк в списке.&lt;br /&gt;
&lt;br /&gt;
'''Add(Value:string)''' - добавляет значение Value в конец списка.&lt;br /&gt;
&lt;br /&gt;
'''SetText(Value:string)''' - устанавливает значение списка в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Insert(Number:integer, Value:string)''' - добавляет строку Value в позицию Number.&lt;br /&gt;
&lt;br /&gt;
'''Delete(Number:integer)''' - удаляет строку из списка в позиции Number.&lt;br /&gt;
&lt;br /&gt;
'''Clear''' - очищает элементы списка.&lt;br /&gt;
&lt;br /&gt;
'''LoadFromFile(Path:string)''' - загружает текстовый файл по пути Path.&lt;br /&gt;
&lt;br /&gt;
'''Strings(Number:integer)''' - возвращает строку с номером Number.&lt;br /&gt;
&lt;br /&gt;
'''SetString(Number:integer, Value:string)''' - устанавливает значение строки с номером Number в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Text''' - возвращает полный список строк в виде текста.&lt;br /&gt;
&lt;br /&gt;
'''CommaText([Quoted:boolean])''' - возвращает список значений через запятую. Если Quoted = true, то квотирует элементы списка. По умолчанию равен false.&lt;br /&gt;
&lt;br /&gt;
'''SetCommaText(Value: string)''' - разбивает значение Value на отдельные строки и кладет в список. Разделитель - запятые.&lt;br /&gt;
&lt;br /&gt;
'''IndexOf(Value:string)''' - ищет значение Value среди элементов списка и если находит, то возвращает номер строки. Возвращает -1 если значение не было найдено.&lt;br /&gt;
&lt;br /&gt;
'''Sorted(Value:boolean)''' - устанавливает флаг отсортированности списка в Value. Если Value = true, то сразу же его сортирует. По умолчанию Value = false.&lt;br /&gt;
&lt;br /&gt;
'''Exchange(Pos1:integer, Pos2:integer)''' - меняет элементы списка с позициями Pos1 и Pos2 местами.&lt;br /&gt;
&lt;br /&gt;
'''Duplicates(Value:integer)''' - изменяет параметр управления дубликатами в списке. Если Value = 0 (значение по умолчанию), то список не реагирует на дубликаты. Если Value = 1, то список при добавлении будет игнорировать дубликаты. Если Value = 2, то список будет выдавать исключение, при добавлении дубликата в список.&lt;br /&gt;
&lt;br /&gt;
'''ParamName(Number:integer[, Delimiter:string])''' - возвращает текст до первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает пустоту.&lt;br /&gt;
&lt;br /&gt;
'''ParamValue(Number:integer[, Delimiter:string])''' - возвращает текст после первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает всю строку.&lt;br /&gt;
&lt;br /&gt;
== Объект TFunc ==&lt;br /&gt;
Объект реализует создание и использование функций в скриптовом языке. Позволяет определять переиспользуемые блоки кода с параметрами.&lt;br /&gt;
Важно учитывать, что внтури функции создается свой инстанс интерпретатора и от туда не доступны никакие переменные\объекты кроме переданных в функцию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные методы:&lt;br /&gt;
&lt;br /&gt;
'''New'''(FuncName, Param1, Param2, ..., Body) — создание новой функции.Функция возвращает результат выполнения последней команды в теле функции. Аргументы:&lt;br /&gt;
* `FuncName` — имя функции (строка)&lt;br /&gt;
* `Param1, Param2, ...` — имена параметров функции (переменные начинаются с `$`, объекты — без префикса)&lt;br /&gt;
* `Body` — тело функции (скрипт, выполняемый при вызове)&lt;br /&gt;
&lt;br /&gt;
'''FuncName'''(Arg1, Arg2, ...) — вызов созданной функции по имени. Если в объявлении была указана тип переменная, то и подставлять в аргумент надо обязательно переменную. Будет передано значение этой переменной (переменные словарине поддерживаются!). Если был объявлен объект, то указатель на объект должен быть получен через метод '''_self'''. C функциями поддерживают работу следующие классы: TExcel, TDirectExcel, TCSVFile, TADO, TSelfADO, TPrinter, TCanvas, TPicture, TTable, TINIFile, TSMS, TXML, TJSON, TZip, TStringList, TBaseUtils, а также объект addressrecord (TFieldObject). Результатом работы функции может быть число или строка.&lt;br /&gt;
&lt;br /&gt;
Пример 1, обработка результатов функции:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'calc');&lt;br /&gt;
calc.new('Sum', '$a', '$b',&lt;br /&gt;
  $a + $b&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
set($x, 10);&lt;br /&gt;
set($y, 20);&lt;br /&gt;
showmessage(calc.Sum($x, $y));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример 2, передача объекта в функцию:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'utils');&lt;br /&gt;
utils.new('ProcessDB', 'dbConn', '$value',&lt;br /&gt;
  showmessage($value);&lt;br /&gt;
  dbConn.open('SELECT * FROM address limit 3 ');&lt;br /&gt;
  if(dbConn.recordcount &amp;gt; 0,&lt;br /&gt;
    showmessage('Найдено записей: ' + dbConn.recordcount);&lt;br /&gt;
    dbConn.first;&lt;br /&gt;
    while(dbConn.eof = 0,&lt;br /&gt;
      showmessage(dbConn.fieldbyname('code'));&lt;br /&gt;
      dbConn.next&lt;br /&gt;
    )&lt;br /&gt;
  ,0)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
utils.ProcessDB(db._self,'test!');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Применение языка формул ==&lt;br /&gt;
'''в различных контекстах системы «MEASOFT» и сопутствующих проектах'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MEASOFT ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительная информация на чеке ====&lt;br /&gt;
&lt;br /&gt;
В карточке клиента на закладке «Касса» имеется поле для ввода текста, который будет отображаться на кассовых чеках, печатаемых для корреспонденции от данного клиента. В поле может быть введен как просто текст, так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TSelfDB с открытым набором данных со строчкой корреспонденции, заказа и клиента, на которую печатается чек&lt;br /&gt;
&lt;br /&gt;
TBaseSupport&lt;br /&gt;
&lt;br /&gt;
TBaseValue&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Так же система записывает в переменную $CashRegisterID вычисленный код фискального регистратора, на котором предполагается печать чека.&lt;br /&gt;
&lt;br /&gt;
Результат работы скрипта печатается на создаваемом чеке, если скрипт не возвращает значение “-1” (число или текст) – в этом случае система чек не создает. Подразумевается, что либо скриптом было принято решение об отсутствии необходимости формирования чека, либо скрипт взял эту функцию на себя.&lt;br /&gt;
&lt;br /&gt;
==== Заполнение шаблонов печатных форм ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительные возможности ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Импорт БД из Excel ====&lt;br /&gt;
В окружении интерпретатора создается объект ZakazRecord, он является списком со значениями таблицы zakaz. Именно в этот заказ будут загружены данные. Из этого объекта также доступно :&amp;lt;br&amp;gt;&lt;br /&gt;
*ZakazRecord.userfields - пользовательские поля заказа;&lt;br /&gt;
*ZakazRecord.Clients - данные таблицы clients;&lt;br /&gt;
*ZakazRecord.Clients.userfields - пользовательские поля заказчика.&lt;br /&gt;
&lt;br /&gt;
==== Прайс лист клиента ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в валюте клиента для каждой поездки (туда или обратно) единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Помимо стандартных объектов, система создает объект AddressRecord, в котором, как свойства, доступны все поля текущей записи. Так же она выставляет значение переменной $Forward в 1 (истина), если необходимо произвести расчет для направления &amp;quot;Туда&amp;quot; и 0 (ложь) - если обратно. ВНИМАНИЕ! Как и во всех остальных местах, после формулы нельзя ставить &amp;quot;;&amp;quot;, иначе скрипт вернет 0!&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 if(int(AddressRecord.Time_Put_Max)&amp;gt;19, 100, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Прибавляет 100 рублей в случае, если максимальный срок доставки 20 часов или более''&lt;br /&gt;
&lt;br /&gt;
 if(pos(AddressRecord.Address, 'Аренда')&amp;gt;0, &lt;br /&gt;
           set($FormulaReplace, 1); &lt;br /&gt;
           1500&lt;br /&gt;
 , 0)&lt;br /&gt;
 &lt;br /&gt;
 ''В случае наличия подстроки &amp;quot;Аренда&amp;quot; в адресе заменяет штатное ценообразование на 1500 рублей''&lt;br /&gt;
&lt;br /&gt;
Объект AddressRecord может предоставить доступ к связанным таблицам :&lt;br /&gt;
* addressrecord.boxes&lt;br /&gt;
* addressrecord.packages&lt;br /&gt;
* addressrecord.clients&lt;br /&gt;
* addressrecord.price&lt;br /&gt;
* addressrecord.advprice&lt;br /&gt;
* addressrecord.userfields&lt;br /&gt;
* addressrecord.addressfld&lt;br /&gt;
* addressrecord.clients.userfields&lt;br /&gt;
* addressrecord.price.userfields&lt;br /&gt;
* addressrecord.zakaz&lt;br /&gt;
* addressrecord.zakaz.userfields&lt;br /&gt;
 &lt;br /&gt;
Чтобы получить доступ к полю VarCode из таблицы userfields необходимо записать AddressRecord.Userfields.VarCode. В присоединённой таблице может быть несколько записей чтобы получить к ним доступ предусмотрены функции _First, _EOF, _Next, _RecordCount, _Set.&lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
 set($value1, 0); set($value2, 0);&lt;br /&gt;
 while(AddressRecord.userfields._EOF=0,&lt;br /&gt;
   if(AddressRecord.userfields.varCode=1, &lt;br /&gt;
     set($value1, if(AddressRecord.userFields.VarValue='Праздничная упаковка', 150, 0)), ''''''');&lt;br /&gt;
   if(AddressRecord.userfields.varCode=2, &lt;br /&gt;
     set($value2, AddressRecord.userFields.VarValue), ''''''');&lt;br /&gt;
   AddressRecord.userFields._Next;&lt;br /&gt;
 );&lt;br /&gt;
 int($value1) + int($value2)&lt;br /&gt;
&lt;br /&gt;
Пример делающий тоже самое что и выше но через поиск Locate:&lt;br /&gt;
 set($value1, if(addressrecord.userfields.VarValue('VarCode', 1)='Праздничная упаковка', 150, 0));&lt;br /&gt;
 set($value2, int(addressrecord.userfields.VarValue('VarCode', 2)));&lt;br /&gt;
 $value1 + $value2&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
В скрипте доступны переменные: &lt;br /&gt;
«$FormulaKoeff» - это коэффициент на который умножится конечная цена (по умолчанию равна 1);&lt;br /&gt;
«$PriceCode»  - код прайса;&lt;br /&gt;
«$CurrentPriceConf»  - код услуги;&lt;br /&gt;
«$BasePrice» - стоимость всех услуг с уровнем (pricelevel) меньше текущего.&lt;br /&gt;
&lt;br /&gt;
Для вызова функции CalcBasePrice (Расчёт базовой цены) в скрипте объявленны переменные: $Count,$Collection,$Distance,$Wait.&lt;br /&gt;
&lt;br /&gt;
Существует поиск по ключевому полю (поиск регистронезависимый), например чтобы найти в таблице advprice введённое значение для текущей услуги, нужно сделать такую запись  addressrecord.advprice.value('priceconf', $CurrentPriceConf) - Первый параметр это ключевое поле, второй искомое значение. Если запись найдётся будет возвращено значение поле value, если нет функция вернёт значение 0.&lt;br /&gt;
 &lt;br /&gt;
Пример &lt;br /&gt;
 if(addressrecord.advprice.active('priceconf', 3)='T', addressrecord.advprice.price, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Смотрим включена ли услуга и если да, возвращаем рассчитанную стоимость&lt;br /&gt;
&lt;br /&gt;
Чтобы изменить значение записанное в объект addressrecord, нужно воспользоваться методом _set(keyfield, keyvalue, filed, value). Параметр keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца. Сначала происходит поиск строки по ключу, далее меняется значение указанного столбца.&lt;br /&gt;
Пример, отключение услуги база:&lt;br /&gt;
  addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
  priceconf - поле где записан код услуги;&lt;br /&gt;
  1 - услуга База;&lt;br /&gt;
  active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
Также существует упрощенный метод _set, с двумя параметрами filed, value - он используется в шаблонах загрузки или в системных доп. возможностях где доступен объект addressrecord.&lt;br /&gt;
&lt;br /&gt;
==== Зарплата курьеров ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в основной валюте для каждой единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Переменные «$FormulaTablKoeff» и «$FormulaMoneyKoeff»  позволяют установить повышающий или понижающий коэффициент на стоимость доставки (по тарифной сетке) и услуги соответственно (процент от суммы, процент от стоимости доставки, ожидание).  Переменная «$UsingZoneName» и «$KurierZone» содержат название и код зоны соответственно, есть возможность поменять название зоны для отчета.&lt;br /&gt;
&lt;br /&gt;
=== Планировщик ===&lt;br /&gt;
&lt;br /&gt;
В поле текста задания может быть введен как текст с командами планировщика (см ниже), так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TIniFile, Указывает на настроечный ini-файл планировщика.&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Для записи в лог планировщика нужно использовать функцию Print&lt;br /&gt;
&lt;br /&gt;
=== Репликатор ===&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
ReplaceAddress(target, address) – Возвращает адрес последней доставки корреспонденции получателю target по адресу address от текущего клиента. При отсутствии такой доставки, возвращает address.&lt;br /&gt;
&lt;br /&gt;
GetPrice –возвращает рассчитанное значение цены, на основе прайс-листа клиента и данных о корреспонденции.&lt;br /&gt;
&lt;br /&gt;
GetKurierByStation(i) – возвращает код курьера, ассоциированного со станцией метро с кодом i.&lt;br /&gt;
&lt;br /&gt;
GetNewNumber – Возвращает не занятый номер единицы корреспонденции в текущем заказе.&lt;br /&gt;
&lt;br /&gt;
==История изменений==&lt;br /&gt;
&lt;br /&gt;
=== Недавние изменения ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|2026.0.0.550 Доработка функций интерпретатора GetA4Printer, GetStickerPrinter, GetDuplexPrinter.&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|2026.0.0.547 Доработка функций ATTACHPDFTOTEXT и PRINTATTACHPDFPAGE, добавлена возможность указать путь к файлу&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.539 Добавлена поддержка отладчика AttachDebugger&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.534 Добавлена поддержка оператора CASE и класса TFunc&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 2021.0.0.57 от 18.06.2019 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TExcel добавлен метод ColumnDelete.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция InsertFirmAtt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
||В объект TExcel добавлен метод Align.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция CheckEan&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект функцию FillAdvPriceReport добавлены параметры ShowSumPrice,InsertColumns&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TSMS добавлен метод Log.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Добавлена функция Money.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция ValutaSign.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция GetPolygonByLatLon.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TTable добавлена функция SetMultiHeader, SetCustomHeader.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DownloadAttachment&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию SetRowHeight объекта TExcel добавлен параметр cnt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция AsString.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция SetSize.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TADO добавлена функция ParseForIn.&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|В объект TBaseUtils из TBase перенесена функция FillExcelDoc.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция CalcAddressPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Все функции класса TBaseSupport перенесены в TBaseUtils. Класс TBaseSupport больше не существует.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функции RowInsert и RowDelete объекта TExcel добавлен параметр count.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция SendToMeaSoft&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция RecalcSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Новая функция Reverse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 849 &amp;amp;nbsp; 22.02.2018 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TBaseUtils.TownByIndex добавлен параметр PriorityName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TBase добавлена функция GetNewPackagePos&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TSMS доработан метод ExtraResult, добавлен параметр ParamName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBase добавлена функция CalcAgentPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateAddressForActDelivery&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функция CalcTownDeliveryDate заменена на CalcDeliveryDate&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция SignatureUrl&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция LoadFromStr.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetPen.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetBrush.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена поддержка чтения в формате PNG.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TCanvas.DrawPic параметр Mode&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Свойство TPicture.Canvas&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DeleteFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 758 &amp;amp;nbsp; 29.03.2017 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция GetPolygonByAddress&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция ParamsCount&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Объект TZip&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функции CreateEAN и Create128 заменены одной функцией CreateBar, полностью совместимой с Create128, но добавлена поддержка EAN-13 и Interleaved 2-5 (для Почты России). В системе функции оставлены для обратной совместимости, но более не являются документированными и рекомендованными к использованию.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Параметр text в функцию Cell объекта TExcel&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция UrlEncode &lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция IncDay теперь может принимать параметр count&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функции FtpGet, FtpPut, TTable.SetCell()&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 452 &amp;amp;nbsp; 26.02.2014 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция Time&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция FixedIntToStr&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция TimePeriod&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена функция приёма смс -  ReceiveSMS&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция STR2UTF&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция SAVETOFILE&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.SetSheetName&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;FILESTR&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Расширены возможности объекта addressrecord в формулах тарифов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 308 &amp;amp;nbsp; 24.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В функции загрузки таблиц из TADO добавлено условие, что поля, названия которых начинаются с &amp;quot;-&amp;quot; не выгружаются. Таким образом можно скрывать служебные поля из результирующего набора.&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowAutoFit &lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowInsert &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 300 &amp;amp;nbsp; 01.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В объекте TCSVFile добавилась возможность запрашивать значения не только текущей записи через параметр сдвига&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;UPDOWN&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлен объект TCSVFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 266 &amp;amp;nbsp; 14.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена поддержка массивов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 265 &amp;amp;nbsp; 11.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция CreateTrans в интерпретатор&lt;br /&gt;
|-&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D0%B1%D0%BE%D1%80%D1%83%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=15770</id>
		<title>Оборудование</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D0%B1%D0%BE%D1%80%D1%83%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=15770"/>
				<updated>2026-01-16T06:50:30Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Аппаратные требования к рабочей станции */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Аппаратные требования к рабочей станции ==&lt;br /&gt;
* Работа под управлением ОС Windows 32/64 Bit: Win7, Win8; Win10; Win11.&lt;br /&gt;
* Установленный и активированный пакет Microsoft Office 2007 или выше '''кроме «Office 2010 Starter»'''.&lt;br /&gt;
* Процессор: любой, удовлетворяющий рабочим требованиям линейки ОС Windows.&lt;br /&gt;
* Оперативное запоминающее устройство (ОЗУ): от 2 Gb и выше.&lt;br /&gt;
* Запоминающее устройство HDD или SSD: от 60 GB и выше.&lt;br /&gt;
* Сетевой интерфейс: проводной/беспроводной Ethernet интерфейс.&lt;br /&gt;
* Монитор: диагональ, обеспечивающая разрешающую способность экрана не менее 1024*768 пикселей.&lt;br /&gt;
* Периферийные порты ввода-вывода USB, RS232 (при необходимости наличия таковых): для подключения периферийного оборудования (сканер штрихкодов, &amp;lt;br&amp;gt;фискальный регистратор, термопринтер).&lt;br /&gt;
* Клавиатура, манипулятор мышь.&lt;br /&gt;
&lt;br /&gt;
== Выбор сервера для системы ==&lt;br /&gt;
&lt;br /&gt;
=== Выбор серверного оборудования ===&lt;br /&gt;
Система MeaSoft нетребовательна к аппаратным ресурсам сервера.&lt;br /&gt;
&lt;br /&gt;
Что касается '''производительности''', то для небольшой компании, человек 10 в офисе, как правило, производительности бытового ноутбука, установленного в качестве сервера, будет более, чем достаточно. То есть серверную часть можно установить на любую машину, за которой работает пользователь. Для компаний до 20 сотрудников мы рекомендуем использовать бытовой компьютер, но «назначенный» сервером, то есть чтобы он стоял отдельно работал круглосуточно, и им никто не пользовался в качестве рабочей станции. Для компаний более 20 человек — лучше использовать именно серверное оборудование, хотя у нас есть установка, где на бытовом Core i3 одновременно работает 80 человек.&lt;br /&gt;
&lt;br /&gt;
'''Объем диска''': Изначально при установке БД занимает около 1 Gb. Далее она увеличивается в зависимости от использования. Если компания доставляет 20000 отправлений в месяц, через 3 года объем базы будет 10 Gb с одной оговоркой: Больше всего места в БД занимают файлы, такие, как архив отсканированных накладных, отправленные по почте отчеты и счета, и т. д. Здесь, если компания использует эти возможности, она за год может накопить и 100 и 200 Gb. Так же необходимо учитывать некоторый объем свободного места, необходимый для создания резервных копий, а так же для работы самой ОС.&lt;br /&gt;
&lt;br /&gt;
Самое главное требование системы к серверу — это его '''надежность'''. Надо понимать, что при поломке сервера приостановится работа всей компании. В худшем случае — можно потерять данные, введенные с момента последней резервной копии. Для сокращения возможных рисков, нужно стараться, по возможности, делать сервер максимально надежным:&lt;br /&gt;
&lt;br /&gt;
* Мы не рекомендуем устанавливать сервер на ноутбук, так как его форм-фактор предполагает некоторую степень мобильности. Есть соблазн взять его куда-то с собой. А при перемещении велик риск его потери, кражи, его можно уронить и разбить. Еще один фактор низкой надежности ноутбуков — они часто умирают от пролитого на них чая/кофе/пива.&lt;br /&gt;
* Мы не рекомендуем устанавливать серверную часть на компьютер, за которым работает пользователь. Здесь главный фактор риска — это заражение компьютера вирусами, которые пользователь, по неграмотности, скачивает из интернета, приносит на флешках и т. д. Антивирус никакой от этого не спасает.&lt;br /&gt;
* Мы рекомендуем устанавливать на серверный компьютер [https://ru.wikipedia.org/wiki/RAID Raid-1] массивы для снижения вероятности выхода из строя/потери данных в случае поломки жесткого диска. Однако нужно понимать, что это тоже не панацея: жесткие диски достаточно часто выходят из строя все одновременно, например, при поломке блока питания, когда напряжение «пробивает» через него и приводит к выгоранию всех компонентов компьютера, В случае стихийных бедствий и несчастных случаев (прорывы в трубах, например), или просто от того, что 2 HDD одной модели, купленные одновременно имеют одинаковый ресурс наработки на отказ.&lt;br /&gt;
* Мы рекомендуем устанавливать [https://ru.wikipedia.org/wiki/Источник_бесперебойного_питания ИБП] на сервер для предохранения его от скачков напряжения в сети и/или аварийного завершения работы при отключении питания.&lt;br /&gt;
* Мы рекомендуем использовать специализированное серверное оборудование, так как оно по определению гораздо надежнее, вплоть до резервирования блоков питания. Но такое оборудование достаточно дорогое, и его использование носит исключительно рекомендательный характер.&lt;br /&gt;
&lt;br /&gt;
Некоторые наши клиенты не удовлетворяются вышеизложенными рекомендациями по выбору серверного оборудования и просят нас предоставить формальные требования к серверу. Вот они:&lt;br /&gt;
&lt;br /&gt;
1.	Работа под управлением ОС Windows 2012 Server R2;&amp;lt;br&amp;gt;&lt;br /&gt;
2.	Процессор: многоядерный, удовлетворяющий требованиям ОС;&amp;lt;br&amp;gt;&lt;br /&gt;
3.	Оперативное запоминающее устройство (ОЗУ): от 4 GB;&amp;lt;br&amp;gt;&lt;br /&gt;
4.	Запоминающее устройство HDD: от 360 Gb, Raid-1;&amp;lt;br&amp;gt;&lt;br /&gt;
5.	Сетевой интерфейс: проводной Ethernet интерфейс — 100 Mbit.;&amp;lt;br&amp;gt;&lt;br /&gt;
6.	Монитор, с разрешением минимум 1024*768;&amp;lt;br&amp;gt;&lt;br /&gt;
7.	Клавиатура microsoft минимум 103 клавиши;&amp;lt;br&amp;gt;&lt;br /&gt;
8.	Мышь оптическая;&amp;lt;br&amp;gt;&lt;br /&gt;
9.	Колонки активные минимум 2 Вт;&amp;lt;br&amp;gt;&lt;br /&gt;
10.	Коврик для мыши силиконовый :-)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Выбор серверной операционной системы ===&lt;br /&gt;
Серверная часть MeaSoft работает практически на любой операционной системе. Исключение — модуль интеграции с внешними системами.&lt;br /&gt;
&lt;br /&gt;
При выборе ОС нужно рассмотреть все плюсы и минусы. Обычно выбор стоит между Windows и Linux.&lt;br /&gt;
&lt;br /&gt;
Windows — платная система. Серверная Windows стоит 40-45 т.р. Система прекрасно работает, например, на Windows 7 (желательно только не домашнюю версию), которая стоит в разы меньше. Ограничение на количество подключений к ней не имеет отношения к нашей системе.&lt;br /&gt;
&lt;br /&gt;
Linux — «бесплатная» система. Почему в кавычках? Потому что стоимость владения им гораздо выше: для администрирования системы linux необходим системный администратор с глубокими познаниями этой ОС, а такие специалисты стоят в 2 раза дороже, чем администраторы Windows.&lt;br /&gt;
&lt;br /&gt;
Таким образом даже «дорогая» серверная Windows окупается за пару месяцев. Linux можно выбирать только в том случае, если в вашей компании и так уже работает несколько системных администраторов Linux, которые смогут решать возможные проблемы с ней. Наша компания оказывает необходимую для работы системы помощь в администрировании windows-серверов, но с linux эта функция полностью ложится на заказчика. Почему мы говорим, что должно быть несколько администраторов в случае с Linux? Потому что в случае увольнения единственного администратора, как правило, компанию ждут времена несчастий, пока не найдется новый ТОЛКОВЫЙ системный администратор.&lt;br /&gt;
&lt;br /&gt;
Резюме: Выбирайте Linux только в том случае, если вы точно уверены в том, что делаете. В противном случае — только Windows.&lt;br /&gt;
&lt;br /&gt;
=== Размещение сервера ===&lt;br /&gt;
Для классической архитектуры системы, когда офис-склад консолидированы в одном месте, мы рекомендуем размещение сервера в офисе. То есть в точке максимального использования системы. Это обеспечивает максимальную скорость и надежность. При этом при необходимости удаленного доступа к системе — достаточно, имея внешний статичный IP-адрес, «пробросить» порт 3306 на сервер.&lt;br /&gt;
&lt;br /&gt;
В последнее время все больше популярность приобретает размещение сервера «в облаке». На самом деле формально — это, конечно, не [https://ru.wikipedia.org/wiki/Облачное_хранилище_данных облако] в широком понимании, а [https://ru.wikipedia.org/wiki/VPS сервер], физический или виртуальный, находящийся в дата-центре. При выборе такого варианта установки программы следует учесть ряд факторов:&lt;br /&gt;
* '''Скорость доступа''' Наша система очень чувствительна к скорости доступа. Некоторые операции могут вызывать несколько обращений к серверу, и увеличение времени одного обращения на несколько миллисекунд существенно снижает общую производительность системы на рабочем месте. При размещении сервера в дата-центрах Европы, например, скорость доступа ([https://ru.wikipedia.org/wiki/Ping ping]) из Москвы составляет 50-60 мс. Это — на грани возможности использования программы. При размещении в дата-центре того же города, где находятся пользователи, время доступа — порядка 3-5 мс. Для сравнения — доступ по локальной сети — менее 1 мс.&lt;br /&gt;
* '''Надежность интернет-канала''' Нужно понимать, что в случае размещения сервера в интернете система не будет работать у вас в офисе и/или на складе в случае отсутствия доступа в интернет. Желательно обеспечить резервирование канала, причем, желательно, не 3G-«свистком» (см. следующие 2 пункта).&lt;br /&gt;
* '''Пропускная способность интернет-канала''' При разработке системы мы стараемся минимизировать объемы информации, передаваемые между рабочим местом и сервером. Но если доступ происходит через интернет, на одном канале работает несколько человек, на котором работает и программа и телефоны, а кто-то смотрит видео в ютубе, а кто-нибудь еще придумает пользоваться торрентами — работа остановится.&lt;br /&gt;
* '''Стабильность интернет-канала''' При доступе к серверу не должны теряться пакеты. Если на канале происходят потери — программа будет закрываться с сообщением о том, что произошла потеря соединения с сервером. Потери пакетов можно проанализировать командой ping -t &amp;lt;имя_сервера, например ya.ru&amp;gt;.&lt;br /&gt;
* '''Надежность дата-центра''' Теоретически — в дата-центре обеспечивается резервирование и электропитания, и каналов передачи данных. Естественно, в них стоят и промышленные климатические системы, поддерживающие заданную рабочую температуру всего оборудования. Но на практике часто бывает, что сервер оказывается недоступным на время от нескольких минут до нескольких дней. Техподдержка (если ее телефон вообще отвечает, а часто как раз в эти моменты она не работает — либо потому, что телефония работает на том же канале, который у них и «упал», либо потому, что тысячи пользователей серверов, обнаружив неполадки, начали им одновременно звонить) скажет «да, в вашем сегменте технические неполадки, мы устраняем», и больше сделать вы ничего не сможете. В случае, если сервер стоит у вас в офисе — вы сами принимаете моментальные меры. Вплоть до того, что можно вынуть из сгоревшего сервера жесткий диск, подключить к другому компьютеру, и восстановить работу системы.&lt;br /&gt;
* '''Стоимость''' При размещении на linux-VDS серверах стоимость на текущий момент — [http://firstvds.ru/products/vds_vps_hosting 600-900 руб/мес], Windows — [https://masterhost.ru/service/hosting/vps/ 4000 руб/мес]. По поводу выбора ОС читайте соответствующий раздел этой же статьи.&lt;br /&gt;
&lt;br /&gt;
Отсюда вывод:&lt;br /&gt;
Мы рекомендуем устанавливать сервер «в облаке» только в случае сильно распределенной структуры компании. Когда максимальную скорость и надежность нужно обеспечить множеству удаленных пользователей, а не в одном конкретном месте.&lt;br /&gt;
&lt;br /&gt;
== Доступ для установки системы ==&lt;br /&gt;
&lt;br /&gt;
Для установки системы программисту MeaSoft требуется доступ к вашему серверу с правами администратора. В процессе установки потребуется устанавливать службы, запускать и останавливать их, а также производить запуск приложений от имени администратора.  Доступ можно предоставить одним из способов:&lt;br /&gt;
* по [https://remontka.pro/microsoft-remote-desktop/ RDP] — передайте нам IP-адрес сервера, порт (если он отличается от стандартного), логин и пароль для подключения;&lt;br /&gt;
* через [https://www.teamviewer.com/ru/info/remote-desktop/ TeamViewer] — установите и запустите программу на сервере и передайте нам ID и пароль подключения.&lt;br /&gt;
&lt;br /&gt;
== Рекомендованное периферийное оборудование ==&lt;br /&gt;
&lt;br /&gt;
=== Сканер штрихкодов ===&lt;br /&gt;
Рекомендуются к приобретению сканеры, официально ввезенные в вашу страну, адаптированные для местного рынка, имеющие здесь официальных поставщиков.&lt;br /&gt;
&lt;br /&gt;
Мы рекомендуем:&lt;br /&gt;
* Zebex Z-3000 (CCD-сканер) — дешевый;&lt;br /&gt;
* Honeywell (Metrologic) 5145 Eclipse — лазерный;&lt;br /&gt;
* Honeywell (Metrologic) DS6707 — image, позволяет сканировать 2D-штрихкоды;&lt;br /&gt;
* Honeywell (Metrologic) 1202g Voyager BT — радиосканер, позволяет сканировать на расстоянии от компьютера.&lt;br /&gt;
&lt;br /&gt;
Рекомендуются к приобретению сканеры с типом подключения USB HID.&lt;br /&gt;
&lt;br /&gt;
Вы можете скачать наше бесплатное мобильное приложение [[Кладовщик — мобильное приложение для Android|Кладовщик]], которое работает как сканер штрихкодов.&lt;br /&gt;
&lt;br /&gt;
Если вы определились с моделью сканера, то тип подключения не играет существенной роли: наша программа позволяет работать с любой из списка поддерживаемых моделей (проводной или беспроводной). Выбор интерфейса, скорее всего, зависит от наличия и доступности соответствующего порта на компьютере пользователя (так, интерфейс RS-232 предполагает наличие COM-порта, а интерфейс KBW, как правило, PS/2). Очевидным является тот факт, что наиболее универсальным будет сканер, работающий через интерфейс USB (USB HID).&lt;br /&gt;
&lt;br /&gt;
Проводной или беспроводной сканер имеет такое же примерно значение, как проводная или беспроводная мышь: если вам нужно работать удаленно от управляющего устройства (компьютера), то для этого стоит выбирать беспроводную модель. Все беспроводные модели сканеров (обычно работающие через технологию Bluetooth) имеют аккумуляторные батареи и зарядные устройства, которые часто выполнены в виде базовой станции (приемно-передающего устройства) с функцией зарядки переносной части сканера.&lt;br /&gt;
&lt;br /&gt;
При выборе сканера обратите внимание на то, что при типе подключения USB HID (рекомендуется) или «разрыв клавиатуры» сканер требует некоторой настройки. [[#Подключение и настройка сканеров штрихкодов|В разделе ниже]] приведены программирующие листы для различных моделей сканеров. Если вы покупаете сканер не из списка, для которого есть программирующий лист, будьте готовы к тому, что потребуется создание такого листа. Для его создания нужно полное руководство по программированию конкретного сканера на русском или английском языках. С этим часто бывают проблемы, если вы покупаете сканеры с доставкой из Китая — они, как правило, настолько китайские, что у них нет ни документации, ни сайта производителя. В таком случае остается уповать только на везение.&lt;br /&gt;
&lt;br /&gt;
=== Термопринтер ===&lt;br /&gt;
Поддерживаются любые термо- и термо-трансферные принтеры.&amp;lt;br&amp;gt;&lt;br /&gt;
Рекомендуется термопринтер Zebra ZD410 — у него ширина печатающей головки 60 мм, поэтому ленту такой же ширины сложно вставить неправильно. Очень прост в обслуживании и заправке ленты. &amp;lt;br&amp;gt;&lt;br /&gt;
'''ВНИМАНИЕ!''' При покупке следует учитывать, что термопринтеры не комплектуются USB-шнуром и этикетками, поэтому их необходимо приобрести отдельно. Рекомендуем этикетки размером 58×40 мм.&lt;br /&gt;
&lt;br /&gt;
=== Весы ===&lt;br /&gt;
Поддерживаемые весы:&lt;br /&gt;
* [[#Настройка весов МЕРА|МЕРА]] — подходят модели, которые поддерживают протоколы «ОКА», «9 байт» или «Mera Avto». По нашим сведениям, протоколы ОКА и Mera Avto поддерживают весы, у которых есть цифровая клавиатура 0-9. Но лучше уточняйте у продавца. Протокол «9 байт» в силу своей низкоуровневой работы с COM-портом может не работать через USB-переходники. Рекомендуем весы Мера ВП-3/30 — небольшие, точные, недорогие.&amp;lt;br&amp;gt;&lt;br /&gt;
* [[#Настройка весов НЕВА|Нева]]&lt;br /&gt;
* ExpressCube&lt;br /&gt;
* Масса-К&lt;br /&gt;
* InSize&lt;br /&gt;
* Мастер-Кит&lt;br /&gt;
* CAS HD 57583&lt;br /&gt;
* UIS Metrix&lt;br /&gt;
&lt;br /&gt;
При покупке весов обратите внимание на то, что они могут подключаться к COM-порту, который отсутствует на многих компьютерах. Для весов существуют провода в USB-порт, эмулирующие COM-порт. В продаже есть переходники и платы расширения компьютеров, позволяющие добавить COM-порты.&lt;br /&gt;
&lt;br /&gt;
Инструкцию по настройке и подключению весов смотрите в этой статье [[#Настройка весов|ниже]].&lt;br /&gt;
&lt;br /&gt;
=== Фискальный регистратор ===&lt;br /&gt;
В рамках 54-ФЗ поддерживается и рекомендуется работа с сервисом удаленной фискализации LIFE PAY.&lt;br /&gt;
&lt;br /&gt;
Поддерживаются все фискальные регистраторы фирмы «Штрих-М»&lt;br /&gt;
&lt;br /&gt;
Рекомендуется ШТРИХ-LIGHT-ФР-К (cамый бюджетный)&lt;br /&gt;
&lt;br /&gt;
При покупке ФР обратите внимание на то, что они могут подключаться к COM-порту, который отсутствует на многих компьютерах. Для них существуют провода в USB-порт, эмулирующие COM-порт. Также в продаже имеются переходники и платы расширения компьютеров, позволяющие добавить COM-порты.&lt;br /&gt;
&lt;br /&gt;
=== Банковский POS-терминал ===&lt;br /&gt;
[https://ru.wikipedia.org/wiki/POS-%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B0%D0%BB POS-терминал].&lt;br /&gt;
Мобильное приложение поддерживает интеграцию с сервисами IBox, LIFE PAY, а также поддерживается работа с независимыми POS-терминалами.&lt;br /&gt;
&lt;br /&gt;
=== Планшетный сканер ===&lt;br /&gt;
Применяется для сканирования ведомостей с подписью, после чего полученные документы вы можете прикрепить в программе к соответствующей корреспонденции.&amp;lt;br&amp;gt;&lt;br /&gt;
Рекомендуются сканеры с автоматической подачей.&amp;lt;br&amp;gt;&lt;br /&gt;
При выборе устройства обратите внимание на следующие характеристики:&lt;br /&gt;
* Скорость сканирования;&lt;br /&gt;
* Наличие функции обнаружения подачи двух листов;&lt;br /&gt;
* Двухстороннее сканирование;&lt;br /&gt;
* Количество сканирований до отказа.&lt;br /&gt;
&lt;br /&gt;
=== Монитор ноутбука/нетбука/компьютера ===&lt;br /&gt;
Рабочее место пользователя для работы с MeaSoft должно оснащаться монитором с разрешающей способностью экрана не менее 1024*768 пикселей. При работе на портативных устройствах, таких как нетбуки, у которых разрешение ниже рекомендуемого, в экран могут не помещаться некоторые окна.&lt;br /&gt;
&lt;br /&gt;
=== Штрихкодовая линейка-угол ===&lt;br /&gt;
Штрихкодовая линейка-угол применяется для обмера габаритов отправления. Обмер можно производить при приеме корреспонденции на склад (F10 на вкладке «Заказы»). Каждое деление (1, 5 или 10 миллиметров) линейки промаркировано своим штрихкодом. Прикладывая товар к линейке и сканируя штрихкод, соответствующий краю товара, получаем размеры. Чтобы включить поддержку штрихкодированной линейки, нужно в окне приема, нажать кнопку «Настройки» и установить галку «Включить поддержку штрихкодированной линейки». Для работы с линейкой удобнее использовать лазерные сканеры, у них полоса считывания наводится точно на нужный штрихкод. Реализована поддержка производителя [http://cortes.ru/shtrihcode/barcodeline.php Кортес]. Перед покупкой нужно проверять модель на совместимость с системой. Система поддерживает следующий формат ШК:&amp;lt;br&amp;gt;&lt;br /&gt;
Длина ШК 7 символов, начинается всегда на «29», например: 291XXXX, 292XXXX, 293XXXX&amp;lt;br&amp;gt;&lt;br /&gt;
где: XXXX — значение в милиметрах, 3-й знак — направление измерения от 1 до 3, то есть координата (длина, ширина, высота).&lt;br /&gt;
&lt;br /&gt;
=== Терминал сбора данных ===&lt;br /&gt;
Терминал сбора данных (ТСД) под управлением Android может работать совместно с MeaSoft как сканер штрихкодов или ТСД. Для этого установите на ТСД наше приложение [[Мобильное приложение кладовщика для Android|Кладовщик]] и выберите нужный режим работы.&lt;br /&gt;
&lt;br /&gt;
== Подключение и настройка сканеров штрихкодов ==&lt;br /&gt;
MeaSoft поддерживает все виды [http://ru.wikipedia.org/wiki/Сканер_штрихкода сканеров штрихкодов], поэтому при выборе сканера следует учитывать особенности штрихкодов, которыми заказчики маркируют корреспонденцию. В частности, контактные светодиодные сканеры можно использовать для считывания штрихкодов длиной не более 5-7 см (в зависимости от модели сканера), а для двухмерных штрихкодов необходим image-сканер.&lt;br /&gt;
&lt;br /&gt;
При подключении в разрыв клавиатуры или в порт USB в режиме эмуляции разрыва клавиатуры требуется небольшая дополнительная настройка сканера. Для этого существуют специальные программирующие листы (см. ниже) для разных моделей сканеров, на которых напечатаны штрихкоды в определенной последовательности. Просканируйте их в том порядке, в котором они расположены на листе. Как правило, для сканеров одной фирмы подходят одни и те же штрихкоды.&lt;br /&gt;
В результате этих действий при каждом сканировании перед штрихкодом вставляется определенный префикс, наличие которого для программы является признаком того, что данная последовательность символов введена с помощью сканера. Для использования в качестве префикса в программе зарезервирована клавиша с буквой «ё», что накладывает некоторое ограничение: невозможно ввести с клавиатуры символы «ё», «Ё», «`», «~».&lt;br /&gt;
&lt;br /&gt;
В данном разделе приведены программирующие листы для популярных моделей сканеров штрихкодов. Если в этом списке не оказалось модели вашего сканера, попробуйте использовать лист от другой модели того же производителя. Сообщите, пожалуйста, нам, мы внесем изменения в список моделей, для которых подходит этот лист. Если никакой лист не подошел — сообщите, пожалуйста, об этом нам, мы подготовим лист для вашего сканера.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 60%&lt;br /&gt;
!style=&amp;quot;width: 30%;&amp;quot;|Бренд&lt;br /&gt;
!style=&amp;quot;width: 70%;&amp;quot;|Модель&lt;br /&gt;
|-&lt;br /&gt;
|Argox&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Argox.doc ArgoScan 8000/8110/8120/8150/8250/8310/8312, argox as-8020cl (usb))]&lt;br /&gt;
|-&lt;br /&gt;
|Champtek&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Champtek.doc Champtek]&lt;br /&gt;
|-&lt;br /&gt;
|Cino&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Cino.doc F680BT]&lt;br /&gt;
|-&lt;br /&gt;
|Cipherlab&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Cipherlab_1021_(simple).doc 1021 (simple)]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Cipherlab_1021_(simple)_and_back.doc 1021 с переключением обратно]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Cipherlab_1560,_1562,_1070_(bluetooth).doc 1560, 1562, 1070 (bluetooth)]&lt;br /&gt;
|-&lt;br /&gt;
|Metrologic/Eclipse/Honeywell/Motorola/Symbol/Youjie&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Honeywell_Xenon_1900.doc Xenon 1900, Voyager 1202g, YJ4600]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Metrologic,_Eclipse,_Honeywell,_ms9520,_ms9540.doc MS5145, MS9520, MS9540, HH440]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Symbol_ls1203,_LS2208.doc LS1203, LS2208] (подходит для li4278, Zebra DS2278)&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Symbol_ds6707.doc DS6707]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/honeywell_1452g.docx Honeywell Voyager 1452G]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/honeywell_1472g.docx Honeywell 1472g]&lt;br /&gt;
|-&lt;br /&gt;
|PayTor&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Paytor%20DS%201009.docx DS 1009]&lt;br /&gt;
|-&lt;br /&gt;
|Proton&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Proton.doc Proton]&lt;br /&gt;
[https://www.courierexe.ru/download/scaner/Proton_2.doc IMS3190, беспроводной)]&lt;br /&gt;
|-&lt;br /&gt;
|Datalogic&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/PSC,_Datalogic_QS2500.doc PSC, Datalogic QS2500]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/qd2100.doc QD2100]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.courierexe.ru/download/scaner/datalogic800i.docx Magellan 800i]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.courierexe.ru/download/scaner/QuickScanMobile.doc Mobile: QM2100, M2]&lt;br /&gt;
|-&lt;br /&gt;
|Scanport&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Scanport_T600.bmp T600]&lt;br /&gt;
|-&lt;br /&gt;
|Zebex&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Zebex_4.bmp Zebex]&lt;br /&gt;
|-&lt;br /&gt;
|Godex&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/godex.doc GS550U]&lt;br /&gt;
|-&lt;br /&gt;
|Mercury&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/mercury.doc CL-200]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Mercury_1100PL.docx 1100PL]&lt;br /&gt;
|-&lt;br /&gt;
|Если у вас китайский безымянный (беспроводной?) сканер, попробуйте этот лист&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Vioteh.doc Vioteh VT2208R, Dudian CT980N, bp8150s, Heroje B120G]&lt;br /&gt;
|-&lt;br /&gt;
|Vioteh&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/VT2205_VT2209.docx VT2205 VT2209]&lt;br /&gt;
|-&lt;br /&gt;
|Heroje&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Heroje_H018.doc H018]&lt;br /&gt;
|-&lt;br /&gt;
|Производитель Китай под российским брендом АТОЛ.&amp;lt;br&amp;gt;&lt;br /&gt;
Cканер не рекомендуется к покупке. Атол выпускает несколько разных версий сканера под одной моделью SB1101. К сожалению, не все модели поддаются настройке.&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Atol_SB_1101.docx SB 1101]&amp;lt;br&amp;gt;[https://www.courierexe.ru/download/scaner/Atol_SB_1103.docx 1103]&lt;br /&gt;
|-&lt;br /&gt;
|Radall&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Radall_RD-h8_2d.docx RD-h8 2d]&lt;br /&gt;
|-&lt;br /&gt;
|NETUM&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/NETUM_W6.docx W6, C750]&lt;br /&gt;
|-&lt;br /&gt;
|DBS&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/DBS_HC-3208SR.docx HC-3208SR (Подходите также к МSC-3208 WEC2D V.2)]&lt;br /&gt;
|-&lt;br /&gt;
|Winson&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Winson_WNL_WNC_6003_6083.docx WNL/WNC 6003, 6083, 5083]&lt;br /&gt;
|-&lt;br /&gt;
|Global-pos&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/GP-9400B.docx Global-pos GP-9400B]&lt;br /&gt;
|-&lt;br /&gt;
|Mertech&lt;br /&gt;
|[https://courierexe.ru/download/scaner/Mertech_cl-2300.docx CL-2300]&lt;br /&gt;
|-&lt;br /&gt;
|Space&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/Space_x-2020rc.docx]&lt;br /&gt;
|-&lt;br /&gt;
|Bluetooth-кольцо&lt;br /&gt;
|[https://courierexe.ru/download/scaner/GP-1901B.docx GP-1901B]&lt;br /&gt;
|-&lt;br /&gt;
|Mindeo&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/mindeo_md6600.docx MD6600]&lt;br /&gt;
[https://www.courierexe.ru/download/scaner/Mindeo_cs2290_hd_bt.docx CS2290HD(BT)]&lt;br /&gt;
|-&lt;br /&gt;
|Holyhah a30d, Hstem a30d&lt;br /&gt;
|[https://courierexe.ru/download/scaner/holyhah_a30d_hstem_a30d.docx a30d]&lt;br /&gt;
|-&lt;br /&gt;
|Urovo R70 (71) сканер-кольцо &lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/R70-71.docx R70(71)]&lt;br /&gt;
|-&lt;br /&gt;
|DATAMAX A-7710 B&lt;br /&gt;
|[https://www.courierexe.ru/download/scaner/DATAMAX_A-7710_B.docx A-7710 B] (если штрих-коды с листа плохо читаются, отсканируйте их же с приложенной к сканеру инструкции)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;!-- [https://www.courierexe.ru/download/scaner/Honeywell_hh400.docx Honeywell hh400] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечание'''. Для некоторых беспроводных моделей сканеров штрихкодов перед началом работы требуется обязательно выполнить привязку базовой станции сканера с переносным мобильным считывателем — отсканировать наклейку штрихкода на базовой станции переносной частью сканера. В частности, этот алгоритм касается сканеров фирмы Zebex.&lt;br /&gt;
&lt;br /&gt;
'''Примечание 2'''. В некоторых моделях сканеров, особенно это касается DATAMAX, по умолчанию устанавливается неверная кодировка символов. Даже если вы правильно настроите сканер (установите префикс в виде знака тильды), при сканировании, на выходе такой сканер может отдавать совсем другой префикс (например, вместо ~ или Ё, будет /). Чтобы решить эту проблему, измените в настройках сканера местоположение или язык на English (или любой другой, где доступно ASC2 code keyboard input) путем считывания специального управляющего кода из инструкции к сканеру.&lt;br /&gt;
&lt;br /&gt;
Cписок '''неподдерживаемого системой оборудования''':&lt;br /&gt;
* CT10 Barcode Scanner (Производитель CILICO Electronics Co., Ltd Китай);&lt;br /&gt;
* Аlanda 2.4G Barcode Scanner (производитель Китай).&lt;br /&gt;
* Birch bd — 388 iiib (производитель Китай);&lt;br /&gt;
&lt;br /&gt;
Это оборудование не позволяет установить требуемый префикс для работы с MeaSoft. Список далеко не полный.&lt;br /&gt;
&lt;br /&gt;
'''Мы рекомендуем покупать сканеры, официально ввезенные в Россию, адаптированные для российского рынка, имеющие здесь официальных поставщиков.'''&lt;br /&gt;
&lt;br /&gt;
При выборе сканера обратите внимание на то, что при типе подключения USB HID (этот режим рекомендуется) или «разрыв клавиатуры» сканер требует некоторой настройки. В разделе описания выше приведены программирующие листы для различных моделей сканеров. Если вы покупаете сканер не из списка, для которого уже есть программирующий лист, будьте готовы к тому, что потребуется создание такого листа. Для его создания нужно полное руководство по программированию конкретного сканера на русском или английском языках. С наличием инструкции очень часто возникают проблемы, если вы покупаете сканеры с доставкой из Китая — они, как правило, настолько не адаптированы к работе, что у них нет ни документации, ни сайта производителя. В таком случае остается уповать только на везение.&lt;br /&gt;
&lt;br /&gt;
Если ваш новый сканер не поддерживается нашей системой, можно попытаться выяснить, может ли он работать в режиме эмуляции COM-порта. Наличие возможности работы в таком режиме — последний шанс использовать купленное оборудование:&lt;br /&gt;
# Переведите сканер в режим USB virtual COM по инструкции.&lt;br /&gt;
# Установите бесплатные драйверы COM-порта Nuvoton.&lt;br /&gt;
# В MeaSoft программе выберите '''Настройка''' &amp;gt; '''Параметры''' &amp;gt; '''Оборудование''' &amp;gt; '''Использовать COM-сканер''', укажите номер виртуального COM-порта, созданного драйвером (см. в диспетчере устройств Windows).&lt;br /&gt;
Обратите внимание, что при переключении сканера в другой USB-порт может меняться номер COM-порта, и настройку программы нужно делать заново.&lt;br /&gt;
&lt;br /&gt;
===Возможные проблемы при работе сканеров с маркировкой Честный Знак===&lt;br /&gt;
&lt;br /&gt;
В некоторых сканерах по умолчанию может быть включена настройка, которая пытается компенсировать работу CapsLock, если тот включен, чтобы, например, в блокнот всегда печатался одинаковый код. Наша программа не учитывает CapsLock при сканировании и берет только те значения, которые передает сканер. Поэтому, при нажатом CapsLock может предаваться код маркировки с измененными регистрами букв, что затем будет мешать в работе с маркировкой. Чтобы этого избежать, нужно отключить опцию, компенсирующую работу CapsLock. Например, для сканера Sunlux XL-3200 данная настройка называется '''Caps Lock Off''': [[Файл:CapsOnScanner.png|none|700px]]&lt;br /&gt;
&lt;br /&gt;
== Настройка весов ==&lt;br /&gt;
&lt;br /&gt;
=== Общие сведения ===&lt;br /&gt;
MeaSoft поддерживает работу с различными видами весов. Весы могут подключаться через сетевой порт, COM- или USB-порт. &lt;br /&gt;
&lt;br /&gt;
При подключении через USB установите на компьютер драйвер USB-COM конвертера. Драйвер поставляется производителем весов либо переходника, через который вы подключаете весы. После установки драйвера в «Диспетчере устройств» вашего компьютера должен появиться новый COM-порт, через который и будет осуществляться дальнейшее взаимодействие с весами. Обратите внимание: при подключении USB-шнура к другому USB-разъему компьютера может измениться номер COM-порта, который привязан к шнуру. В этом случае укажите в программе новый номер порта.&lt;br /&gt;
&lt;br /&gt;
Чтобы начать использовать весы, подключите их к компьютеру, затем в пункте основного меню '''Настройка &amp;gt; '''Параметры''' &amp;gt; '''[[Настройка параметров рабочего места#Оборудование|Оборудование]]''' установите флажок '''Использовать весы''', выберите тип весов и укажите порт.&lt;br /&gt;
&lt;br /&gt;
После успешного подключения весов откройте карточку корреспонденции (или окно «Прием» в заказах). Возле поля '''Масса''' появится кнопка весов. Чтобы программа показывала вес с весов, эта кнопка должна быть нажата.&lt;br /&gt;
&lt;br /&gt;
Особенности настройки различных моделей весов приведены ниже.&lt;br /&gt;
&lt;br /&gt;
=== Настройка весов МЕРА ===&lt;br /&gt;
Для связи с весами мера система использует протоколы «9байт», «ОКА» и «MERA-AUTO» и «Сетевые».&lt;br /&gt;
&lt;br /&gt;
Какой выбрать:&lt;br /&gt;
* 9байт — установлен в весах по умолчанию. Он позволяет передавать нестабильный вес, что хорошо влияет на скорость работы оператора. Однако это протокол использует низкоуровневую работу с COM-портом, что может не поддерживаться USB-COM переходниками. Выбирайте этот протокол если весы подключены к настоящему, аппаратному COM-порту. Так же этот протокол, вероятно, единственный, который можно использовать в весах, у которых нет цифровой клавиатуры (см. ниже — без нее весы просто невозможно переключить на другой протокол);&lt;br /&gt;
* ОКА — во многих моделях весов не поддерживает передачу нестабильного веса, так что работать с ним — медленнее, чем возможно. Но этот протокол поддерживают все весы «МЕРА» с цифровой клавиатурой;&lt;br /&gt;
* MERA-AUTO — наиболее продвинутый, рекомендованный производителем протокол. Позволяет передавать нестабильный вес. Однако весы нужно на него переключать (см. ниже), также он поддерживается не всеми весами;&lt;br /&gt;
* Сетевые — для весов, подключающихся не к COM-порту, а непосредственно к локальной сети.&lt;br /&gt;
&lt;br /&gt;
Выбор протокола в весах: воспользуйтесь выдержкой из их [http://courierexe.ru/download/scale/mera/MERA-VTP_VT-1A_2007.pdf руководства пользователя] или [http://courierexe.ru/download/scale/mera/servmanpvm2007.pdf другой версии руководства]:&lt;br /&gt;
&lt;br /&gt;
  9.1 Выбор протокола&lt;br /&gt;
  9.1.1 Удерживая нажатой кнопку «5» клавиатуры терминала, кратковременным нажатием кнопки «[[Файл:PowerOn.png]]» включить весы. &lt;br /&gt;
        Используя ту же клавиатуру набрать код 39654 и затем нажать клавишу ввода «[[Файл:Enter.png]]» или «T» (Тара). &lt;br /&gt;
        При правильно выполненном действии будет активизирован режим настройки и на дисплее появится сообщение «_____9». &lt;br /&gt;
  9.1.2 Последовательно нажать кнопки «1» и «4» и ввести кодовый номер требуемого протокола '' '''(для протокола &amp;quot;9байт&amp;quot; - «0», &amp;quot;ОКА&amp;quot; - «1», &amp;quot;MERA-AUTO&amp;quot; - «5»)''' '' из таблицы кодов нажатием одной из кнопок «0»…«9». &lt;br /&gt;
  9.1.3 Нажатием кнопки «9» зафиксировать результат. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Обратите внимание''' на то, что в этой инструкции подразумевается наличие полной цифровой клавиатуры с кнопками «0»..&amp;quot;9&amp;quot;. Если у ваших весов такой клавиатуры нет — они не поддерживают изменение протокола, и переключить их не удастся.&lt;br /&gt;
&lt;br /&gt;
В программе нажмите «Настройка» — «Параметры» — «Оборудование». Поставьте галку «Использовать весы», выберите протокол и порт весов. После настройки обязательно перезагрузите программу и весы.&lt;br /&gt;
&lt;br /&gt;
Для проверки работоспособности подключения можно использовать официальную [http://courierexe.ru/download/scale/mera/Oka.exe программу МЕРА]. Обратите внимание, что эта программа не будет работать, если открыта программа MeaSoft с включенным использованием весов, и наоборот. В один момент времени к весам может подключаться только одна программа.&lt;br /&gt;
&lt;br /&gt;
=== Настройка весов НЕВА ===&lt;br /&gt;
По нашему опыту работы с весами «НЕВА» складывается интересная ситуация: производитель заявляет, что все модели их весов работают по разным протоколам. Протокол зависит от модели «пульта» — такой штуки, с индикатором и кнопками. При этом по конкретной модели пульта они передали протокол, который не соответствует действительности. В итоге конкретные весы, имевшиеся в наличии, к программе подключены (методом [https://ru.wikipedia.org/wiki/Обратная_разработка обратного инжиниринга] протокола), в списке видов весов в настройке оборудования они присутствуют, но мы не можем дать никаких гарантий того, что конкретные весы, приобретенные вами, будут работать с программой. Мы не рекомендуем этот тип весов к приобретению, но если они у вас уже есть и система с ними не работает — звоните, будем думать, что с этим можно сделать.&lt;br /&gt;
&lt;br /&gt;
=== Настройка весов МАССА-К ===&lt;br /&gt;
Для поддержки весов Масса-К в системе предусмотрена поддержка «Протокола № 2». Этот протокол по умолчанию включен в весовых терминалах [https://courierexe.ru/download/scale/massa/TB_A_r6.2_2017.pdf А/ТВ] и [https://courierexe.ru/download/scale/massa/TB_T_r3.2_2016.pdf Т/ТВ]&lt;br /&gt;
&lt;br /&gt;
=== Настройка весов CAS ===&lt;br /&gt;
&lt;br /&gt;
В программе поддерживаются весы CAS с протоколом AD. Известно, что протокол AD используется во всех моделях линейки HD, DB, но у него есть несколько версий. Чтобы весы начали передавать вес в программу, необходимо в настройках весов, через специальное меню настроек (описание есть в документации к весам), включить режим автоматической передачи данных по стабилизации.&lt;br /&gt;
&lt;br /&gt;
Примеры настройки:&lt;br /&gt;
*Для весов CAS DB-1H в программе выберите  ротокол '''CAS DB-H'''. В настройках весов обязательно включите режим '''Pr off'''. Скорость передачи 9600;&lt;br /&gt;
*Для весов CAS HD (300, 4050) в программе выберите  протокол '''CAS HD''';&lt;br /&gt;
&lt;br /&gt;
=== Настройка весов Mettler Toledo ===&lt;br /&gt;
&lt;br /&gt;
Для поддержки весов TLX Mettler Toledo в программу добавлен протокол TLX Mettler Toledo (TCP/IP Client), весы настроены в качестве сервера, программа подключается к весам и обрабатывает сообщения с данными измерений. Поддерживается передача: штрих-кода, веса, длины , ширины, высоты.&lt;br /&gt;
&lt;br /&gt;
=== Настройка порядка цены деления для весов ===&lt;br /&gt;
В случае ошибочного определения веса, когда порядок величины в несколько раз меньше или больше реального веса, в программе предусмотрена возможность коррекции значения.&lt;br /&gt;
&lt;br /&gt;
Настройка порядка цены деления весов доступна через главное меню '''Настройка''' &amp;gt; '''Параметры''' &amp;gt; '''Оборудование''', поле '''Порядок цены деления'''.&lt;br /&gt;
&lt;br /&gt;
Доступные значения поля '''Порядок цены деления''':&lt;br /&gt;
&lt;br /&gt;
'''0''' — 1 грамм;&lt;br /&gt;
&lt;br /&gt;
'''1''' — 10 грамм;&lt;br /&gt;
&lt;br /&gt;
'''2''' — 100 грамм.&lt;br /&gt;
&lt;br /&gt;
Таким образом, если весы показывают в 10 раз меньше, чем на самом деле, установите '''Порядок цены деления''' равным 1.&lt;br /&gt;
&lt;br /&gt;
== Настройка фискальных регистраторов ==&lt;br /&gt;
Все фискальные регистраторы должны вноситься в справочник '''[[Фирмы]]'''. Для корректной работы ФР необходимо регистрировать ее в налоговой с нужным признаком агента, а потом прописывать его в системе.&lt;br /&gt;
&lt;br /&gt;
=== Стационарные Штрих-М ===&lt;br /&gt;
&lt;br /&gt;
=== Облачные LIFE PAY ===&lt;br /&gt;
&lt;br /&gt;
=== Облачные Webkassa ===&lt;br /&gt;
&lt;br /&gt;
Для начала работы необходимо установить чековую службу с нужными параметрами и добавить фискальный регистратор, для которого указать логин и пароль от webkassa в поле Серийный номер через запятую, а также выбрать тип WebKassa&lt;br /&gt;
&lt;br /&gt;
Закрытие смены происходит через ЛК WebKassa&lt;br /&gt;
&lt;br /&gt;
== Мобильные устройства курьеров ==&lt;br /&gt;
Процесс выбора оборудования, установки и настройки приложения для мобильного устройства курьера подробно рассмотрен в статьях «[[Мобильное приложение курьера для Android]]» и «[[Мобильное приложение курьера для IPhone]]».&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15769</id>
		<title>Руководство программиста</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15769"/>
				<updated>2026-01-15T15:29:52Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Недавние изменения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Основные положения ==&lt;br /&gt;
&lt;br /&gt;
В систему «MEASOFT» встроен внутренний интерпретируемый язык программирования. Среда состоит из базовой функциональности, и дополнительно создаваемых объектов. Некоторые объекты автоматически создаются средой перед запуском интерпретатора для предоставления доступа к контексту, в котором работает скрипт. Все типы данных приводятся друг к другу автоматически, иногда при необходимости можно использовать функции приведения типов. &lt;br /&gt;
&lt;br /&gt;
Как интерпретатор приводит типы:&lt;br /&gt;
&lt;br /&gt;
1.	При использовании значения как параметр функции интерпретатор автоматически приводит значение к типу, необходимому функции.&lt;br /&gt;
&lt;br /&gt;
2.	При операциях сложения, а также логических операциях, операнды приводятся к строке если хотя бы один из них имеет тип «строка». Например:&lt;br /&gt;
3.3+5		-&amp;gt;  8.3&lt;br /&gt;
‘3.3’+5		-&amp;gt;  ‘3.35’&lt;br /&gt;
подобную проблему можно решить принудительно преобразовав тип:&lt;br /&gt;
float(‘3.3’)+5	-&amp;gt;  8.3&lt;br /&gt;
&lt;br /&gt;
3.	При операциях умножения, деления и вычитания операнды приводятся к числу с плавающей точкой, однако если результат выполнения операции получается целым числом, то он приводится к целочисленному типу.&lt;br /&gt;
&lt;br /&gt;
Как работают функции приведения типов:&lt;br /&gt;
&lt;br /&gt;
1.	При преобразовании строки к числу: функция «читает» строку до первого символа, не позволяющего создать число с плавающей точкой, при этом разделителем целой и дробной частей может быть как точка так и запятая. Если приведение производится к целочисленному типу, то после этого происходит округление. Например:&lt;br /&gt;
float('3.6qwerty735')	-&amp;gt;  3.6&lt;br /&gt;
int('3.6qwerty735')	-&amp;gt;  4&lt;br /&gt;
&lt;br /&gt;
2.	При преобразовании к булевому типу ложью считается пустая строка либо число 0, все остальное - истина&lt;br /&gt;
&lt;br /&gt;
3.	При преобразовании булевого типа к числу истина преобразуется в 1, ложь – в 0. Такое преобразование позволяет использовать сложение и умножение в качестве логических «ИЛИ» и «И» соответственно:&lt;br /&gt;
if((5=5)+(6=7), &amp;lt;a&amp;gt;, [b]) – условие истинно, выполнится код «a».&lt;br /&gt;
&lt;br /&gt;
4.	При преобразовании булевого типа к строке сначала происходит преобразование к числу:&lt;br /&gt;
(5=5)+'qwerty'	-&amp;gt;  ‘1qwerty’&lt;br /&gt;
&lt;br /&gt;
== Описание синтаксиса ==&lt;br /&gt;
&lt;br /&gt;
Команды разделяются точкой с запятой. Параметры функций разделяются запятыми. Каждая команда (даже цикл while) является функцией, возвращающей некоторое значение. Результатом выполнения составной команды (последовательности функций, разделенных точкой с запятой), является результат выполнения последней функции. Имена переменных, функций, объектов, а также их свойств и методов не чувствительны к регистру.&lt;br /&gt;
Константы: константы бывают целочисленными, дробными и строковыми. Значения целочисленных и дробных констант указываются «как есть» (в этом случае разделитель целой и дробной частей – точка), шестнадцатеричные значения начинаются с символа «$» и, если первая цифра – буква, она упреждается цифрой 0, а строковые – в одинарных кавычках. При этом, если внутри строковой константы встречается символ одинарной кавычки он должен быть задвоен, для указания интерпретатору того, что он не является признаком конца константы.&lt;br /&gt;
Операции сравнения: &amp;gt;, &amp;lt;, =, !  - Больше, меньше, равно, не равно соответственно.&lt;br /&gt;
Логические операции: + (ИЛИ), *  (И).&lt;br /&gt;
Арифметические операции: +, -, *, /&lt;br /&gt;
Операция конкатенации строк: +&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Функциональность базового объекта ===&lt;br /&gt;
&lt;br /&gt;
'''SET($a, a)''' – присваивает переменной (1-й параметр) значение второго параметра. При отсутствии переменной – создает ее. Имена переменных должны начинаться с символа «$», а следующий символ не должен быть цифрой. Возвращает новое значение переменной. Функция используется только для задания значений переменных. Не допускается использования для задания значений свойств объектов. Для этого используются соответствующие методы этих объектов.&lt;br /&gt;
&lt;br /&gt;
'''IF(a,b,c)''' или '''IF(a,b)'''  – Условный оператор. В первом случае возвращает b, если a истинно (не равно нулю или пустой строке), иначе – c. Во втором случае – возвращает a, если оно истинно, иначе – b.&lt;br /&gt;
&lt;br /&gt;
'''WHILE(a, b)''' – Оператор цикла. Выполняет b пока a истинно:&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i&amp;gt;0, set($sum, $sum+$i); set($i, $i-1));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''FOR($a, b, c, d)''' – Оператор цикла. Выполняет d пока $a последовательно присваиваются значения от b до с включительно:&lt;br /&gt;
	set($sum, 0);&lt;br /&gt;
for($i, 1, 10, set($sum, $sum+$i));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''NEW(ClassName, InstanceName)''' – Создает экземпляр класса ClassName, назначает ему имя InstanceName. Возвращает порядковый номер созданного объекта. Доступ к свойствам и методам объектов осуществляется по имени объекта и имени свойства/метода, разделенным точкой. Именем объекта может быть и пустая строка, тогда доступ к его свойствам и методам будет осуществляться без указания имени, и, в случае совпадения имен свойств и/или методов со стандартными или свойствами/методами других объектов, использоваться будут соответствующие свойства/методы объекта, созданного ранее, а также такой объект невозможно уничтожить до окончания выполнения скрипта. Все объекты созданные во время выполнения скрипта уничтожаются автоматически после окончания его выполнения.&lt;br /&gt;
&lt;br /&gt;
'''FREE(InstanceName)''' – Уничтожает объект с именем InstanceName. Возвращает 0. В случае отсутствия объекта с заданным именем вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
'''ShowObjects''' – Возвращает список созданных объектов – названия классов и имена.&lt;br /&gt;
&lt;br /&gt;
'''ERROR(message)''' – Вызывает ошибку с текстом message.&lt;br /&gt;
&lt;br /&gt;
'''SHOWMESSAGE(message)''' – Отображает диалоговое окно с текстом message, останавливает выполнение скрипта до закрытия окна пользователем.&lt;br /&gt;
&lt;br /&gt;
'''SimpleAskUser(Message)''' – Выводит диалоговое окно с текстом Message и кнопками «Да» и «Нет». Возвращает 1, если  пользователь нажал кнопку «Да», иначе – 0.&lt;br /&gt;
&lt;br /&gt;
'''TRY(a)''' – Выполняет a в «защищенном от ошибки» режиме. Если в процессе выполнения a возникает ошибка, возвращает текст ошибки, иначе – 0 (ложь).&lt;br /&gt;
&lt;br /&gt;
'''REM(….)''' – Код в скобках игнорируется (комментарий).&lt;br /&gt;
&lt;br /&gt;
'''EXEC(FileName, Params, Wait, WindowState)''' – Запускает внешнее приложение FileName с параметрами Params. Если Wait истинно – ожидает завершение процесса. Для WindowState доступны следующие числовые значения:&lt;br /&gt;
	0 - SW_HIDE&lt;br /&gt;
	1 - SW_SHOWNORMAL (по-умолчанию)&lt;br /&gt;
	3 - SW_MAXIMIZE&lt;br /&gt;
	6 - SW_MINIMIZE&lt;br /&gt;
Функция возвращает истину если приложение запущено успешно. Иначе – Ложь.&lt;br /&gt;
В случае успеха, при параметре Wait – истина кладет в переменную $LastResult код завершения приложения.&lt;br /&gt;
&lt;br /&gt;
'''CASE''' - Оператор множественного выбора. Позволяет выполнить одно из нескольких действий в зависимости от условий. Синтаксис:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
  case(&lt;br /&gt;
    when(условие1, действие1);&lt;br /&gt;
    when(условие2, действие2);&lt;br /&gt;
    ...&lt;br /&gt;
    else(действие_по_умолчанию);&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 50);&lt;br /&gt;
&lt;br /&gt;
showmessage(&lt;br /&gt;
  case(&lt;br /&gt;
    when($a &amp;lt; 5, 50);&lt;br /&gt;
    when($a &amp;lt; 10, 100);&lt;br /&gt;
    when($a &amp;lt; 250, 200);&lt;br /&gt;
    else($a*$b);&lt;br /&gt;
  )  &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''AttachDebugger''' - Команда позволяет подключить открытый [[Отладчик_встроенных_скриптов]] к текущему скрипту. Команда AttachDebugger должна быть '''первой командой''' в скрипте. Добавьте её в самое начало скрипта:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Как работает:'''&lt;br /&gt;
# При выполнении команды AttachDebugger скрипт останавливается.&lt;br /&gt;
# Отладчик автоматически подключается к выполняющемуся скрипту.&lt;br /&gt;
# Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
# Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Если режим отслеживания не включён, команда `AttachDebugger` игнорируется.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Команда AttachDebugger должна быть первой командой в скрипте.&lt;br /&gt;
&lt;br /&gt;
=== Строковые функции ===&lt;br /&gt;
&lt;br /&gt;
'''UpCase(s)''' – возвращает строку s в верхнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''LCase(s)''' – возвращает строку s в нижнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''Len(s)''' – возвращает количество символов в строке s.&lt;br /&gt;
&lt;br /&gt;
'''Pos(s, substr [,start])''' – возвращает номер первого символа первого включения подстроки substr в строку s, возвращает 0, если включения подстроки отсутствуют. Параметр start - это позиция старта поиска, не обязательный параметр, по умолчанию равен 1. Поиск не чувствителен к регистру.&lt;br /&gt;
&lt;br /&gt;
'''Param(s, i)''' – возвращает i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''ParamsCount(s)''' - возвращает количество элементов строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''SetParam(s, p, i)''' – заменяет на значение p i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''Left(s, i [,full] )''' – возвращает i первых символов строки s. Параметр i, может быть строкой, тогда он считается разделителем и функция, возвращает строку слева от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Mid(s, i, j)''' - возвращает подстроку из s начиная с i символа и длиной j символов&lt;br /&gt;
&lt;br /&gt;
'''Right(s, i [,full])''' – возвращает i последних символов строки s. Параметр i, может быть строкой, тогда он считается разделителем, функция ищет разделитель с конца строки, и возвращает строку справа от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Reverse(s)''' - возвращает строку s задом-наперед. Полезно например для поиска с конца функций Pos().&lt;br /&gt;
&lt;br /&gt;
'''Char(i)''' – возвращает символ с кодом i.&lt;br /&gt;
&lt;br /&gt;
'''Ord(s)''' – возвращает код первого символа строки s.&lt;br /&gt;
&lt;br /&gt;
'''Replace(s, strFind1, strReplace1, [ strFind2, strReplace2, ... ], [caseInsensetive])''' - возвращает строку s, в которой все включения строк strFind заменены строкой strReplace. Параметры поиска и замены всегда должны быть в паре и их может быть несколько. caseInsensetive - неучитывать регистр, не обязательный параметр, по умолчанию включен.&lt;br /&gt;
&lt;br /&gt;
'''RemSpace(s)''' – возвращает сроку s без начальных и конечных запятых и пробелов, а также начальных точек.&lt;br /&gt;
&lt;br /&gt;
'''SumStr(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''с добавлением валюты'''. Необязательные параметры captions - позволяет изменить название валюты, формат строки может зависеть от текущего языка(посмотреть формат можно в &amp;quot;Справочники&amp;quot;-&amp;quot;Статусы&amp;quot;-&amp;quot;32 Валюты&amp;quot;, в разделе &amp;quot;Дополнительная информация&amp;quot;). Language - код языка на котором необходимо вывести сумму прописью. По умолчанию если не обязательные параметры опущены, используются региональные настройки в переменных.&lt;br /&gt;
&lt;br /&gt;
'''NumToStrSimple(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''без валюты'''. Параметры идентичны функции SUMSTR.&lt;br /&gt;
&lt;br /&gt;
'''FullNameToShort(Name)''' – Возвращает фамилию и инициалы по полному ФИО Name.&lt;br /&gt;
&lt;br /&gt;
'''MonthName1(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в именительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''MonthName2(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в родительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''StrForXML(s)''' - Подготавливает строку к парсингу как xml: Если находит в строке подстроку &amp;quot;UTF-8&amp;quot; - перекодирует ее из utf-8 в win-1251, убирает начальный знак вопроса, если такой встречается.&lt;br /&gt;
&lt;br /&gt;
'''FixedIntToStr(i, len[, char])''' - Возвращает целое число i дополненное слева символами char (по-умолчанию - &amp;quot;0&amp;quot;) до длины len.&lt;br /&gt;
&lt;br /&gt;
'''Translate(format, [param1, param2, ...])''' - Функция перевода строки format в язык пользователя. Строка format может содержать параметры %s, %d - строка и число соответственно. &lt;br /&gt;
&lt;br /&gt;
'''ExtractFileName(FilePath)''' - возвращает имя файла с расширением из полного пути к файлу FilePath.&lt;br /&gt;
&lt;br /&gt;
====Функции перекодировки====&lt;br /&gt;
'''DecodeStr(s, charset)''' - Производит перекодировку строки s в кодировку CP1251. Кодировка строки s должна быть заранее известна и может быть :&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866, UNICODE. Имя кодировки следует передавать в точности без лишних символов.&lt;br /&gt;
&lt;br /&gt;
'''EncodeStr(s, charset)''' - Производит перекодировку строки s в кодировку charset. Кодировка строки s должна быть CP1251, возможны следующие варианты перекодировки:&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Имя кодировки следует передавать в точности без лишних символов. UNICODE не работает с версии 2021, в ней строки по умолчанию в кодировке unicode.&lt;br /&gt;
&lt;br /&gt;
Функции EncodeBase64(s), DecodeBase64(s), UrlEncode(s), UTF8Encode(s), UTF8Decode(s), Str2UTF(s) - устарели, используйте EncodeStr, DecodeStr.&lt;br /&gt;
&lt;br /&gt;
====Транслитерация====&lt;br /&gt;
&lt;br /&gt;
'''Translit(s)''' - транслитерация строки русского текста s латиницей&lt;br /&gt;
&lt;br /&gt;
'''UnTranslit(s)''' - транслитерация строки s с латиницы на русский.&lt;br /&gt;
&lt;br /&gt;
==== Экранирование ====&lt;br /&gt;
&lt;br /&gt;
'''QUOTEDSTR(s)''' – квотирует строку s символом «\» (обратный слеш). Возвращает строку s, помещенную между символами одинарной кавычки, при этом все вхождения в строку s символов: «\», «&amp;quot;» и «'» экранируются квотирующим символом, а символы  #0, #10 и #13 заменяются на \0, \n и \r соответственно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SQLFloat(f)''' – Приводит число с плавающей точкой к виду, пригодному для SQL-запроса, т.е. к тексту с разделителем дробной части – точка.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextXML(s)''' - квотирует строку s для использования в XML. Производит замены спец. символов для корректности XML-синтаксиса.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextJSON(s)''' - переводит строку в формат JSON, экранирует служебные символы.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextBlob(s)''' - строка s содержит файл, функция перекодирует переданную строку в байты, используется для заполнения полей формата blob.&lt;br /&gt;
&lt;br /&gt;
====Хеширование ====&lt;br /&gt;
&lt;br /&gt;
'''HMACHash256(key, text)''' - создаёт хэш по алгоритму SHA256 для проверки целостности сообщения, key - секретный ключ, text - хэшируемое сообщение&lt;br /&gt;
&lt;br /&gt;
'''MD5Hash(text)''' - создаёт хеш по алгоритму MD5&lt;br /&gt;
&lt;br /&gt;
'''SignatureUrl(url)''' -  Подписывает переданный URL. Функция возвратит переданный URL с добавленным в конце параметром, в котором будет записана подпись.&lt;br /&gt;
&lt;br /&gt;
=== Функции работы с датой и временем ===&lt;br /&gt;
&lt;br /&gt;
'''CurrTime''' – возвращает текущее время&lt;br /&gt;
&lt;br /&gt;
'''CurrDate''' – возвращает текущую дату&lt;br /&gt;
&lt;br /&gt;
'''CurrMillisecond''' - Возвращает количество миллисекунд прошедших с начала текущего года. Используется для точного расчета временных интервалов.&lt;br /&gt;
&lt;br /&gt;
'''Today''' - возвращает текущую дату в числовом формате.&lt;br /&gt;
&lt;br /&gt;
'''Day(dt)''' – возвращает день месяца даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Month(dt)''' – возвращает месяц года даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Year(dt)''' – возвращает год даты dt.&lt;br /&gt;
&lt;br /&gt;
'''FirstDayOfMonth(dt)''' – Возвращает первый день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( FirstDayOfMonth( CurrDate() ) );&lt;br /&gt;
'''Полужирное начертание'''&lt;br /&gt;
'''LastDayOfMonth(dt)''' – Возвращает последний день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( LastDayOfMonth( CurrDate() ) );&lt;br /&gt;
&lt;br /&gt;
'''DaysInMonth(month, year)''' – Возвращает количество дней в указанном месяце.&lt;br /&gt;
&lt;br /&gt;
'''IncDay(dt, [count=1])''' – Возвращает дату, увеличенную на count дней.&lt;br /&gt;
&lt;br /&gt;
'''SQLDate(dt)''' – Пытается конвертировать dt в дату, вернуть в формате «'YYYY-MM-DD'» (с апострофами), если не удается – возвращает «NULL».&lt;br /&gt;
&lt;br /&gt;
'''SQLDateToDate(dt)''' – Переводит дату из SQL-формата в обычный.&lt;br /&gt;
&lt;br /&gt;
'''DAYSBETWEEN(dt1, dt2)''' – Возвращает количество дней между датами dt1 и dt2. В случае ошибки приведения dt1 или dt2 к дате возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''TimeBetween(t1, t2)''' - Возвращает количество минут между временем t1 и t2. Если t1 &amp;gt; t2 то будет показано количество минут между t2 и t1. Параметр t может быть как в формате &amp;quot;HH:MM&amp;quot;, так и в числовом. Если один из параметров не удалось привести к числовому типу возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''WorkDaysBetween(dt1, dt2, [DecreaseFirstDay=0], [DefaultHolidayVarNum=1])''' - Возвращает количество рабочих дней между датами dt1 и dt2. Параметр DecreaseFirstDay уменьшает dt1 на указанное количество дней (по умолчанию 0).  В случае ошибки приведения dt1 или dt2 к дате возвращает -1000. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней(по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''TimePeriod(time1, time2)''' - Оформляет временной период. Возвращаемое значение зависит от наличия значения в параметрах. Возможные варианты: &amp;quot;time1 - time2&amp;quot; , &amp;quot;С time1&amp;quot; , &amp;quot;ДО time2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''StrDateToFloat(s, [time=false])''' - Переводит строку с датой s в числовой тип. Если параметр time включен, то в строке s должно быть указано время. Дата должна быть в формате &amp;quot;DD.MM.YYYY&amp;quot;, а время &amp;quot;HH:NN&amp;quot;. Если строку перевести не удалось возвращает 0&lt;br /&gt;
&lt;br /&gt;
'''IsAWorkDay(dt)''' - Когда день dt является рабочим, возвращает true. Если произошла ошибка приведения даты возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''IncWorkDay(dt, [count=1],[DefaultHolidayVarNum=1])''' - Прибавляет count рабочих дней к дате dt. Возвращает дату в числовом формате, если произошла ошибка приведения даты возвращает -1000. По умолчанию параметр count равен 1 и не является обязательным. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней (по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''Sleep'''(n) - Задержка выполнения на n миллисекунд.&lt;br /&gt;
&lt;br /&gt;
=== Функции приведения типов ===&lt;br /&gt;
&lt;br /&gt;
'''INT(v)''' – возвращает значение типа “целое”, приводя вариантное значение v к числовому типу, а затем округляя его. В том числе используется как функция округления.&lt;br /&gt;
&lt;br /&gt;
'''FLOAT(v)''' – возвращает значение типа “число”, приводя вариантное значение v к числовому типу, переводя в число цепочку символов до первого нецифрового символа (либо точки или запятой).&lt;br /&gt;
&lt;br /&gt;
'''STR(v)''' – возвращает значение типа “строка”, приводя вариантное значение v к строковому типу.&lt;br /&gt;
&lt;br /&gt;
'''Date(v)''' – возвращает дату, либо пустую строку, если не удается конвертировать v в дату&lt;br /&gt;
&lt;br /&gt;
'''Time(v)''' – возвращает время, либо пустую строку, если не удается конвертировать v во время. Понимает числовое представление времени.&lt;br /&gt;
&lt;br /&gt;
=== Математические функции ===&lt;br /&gt;
&lt;br /&gt;
'''ROUNDUP(f)''' – округляет число f до ближайшего большего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''ROUNDDN(f)''' – округляет число f до ближайшего меньшего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''Money(f, CouldBeEmpty, ZeroFill, MakeSpace)''' - Округляет число f, до двух знаков после запятой. CouldBeEmpty - заменить число меньше 0,0001  на пустую строку. ZeroFill  - Следить чтобы после запятой было два знака, если будет один, то добавить ноль. MakeSpace - Разделить разряды пробелом.&lt;br /&gt;
''Подсказка: для простого округления используется функция int()''&lt;br /&gt;
&lt;br /&gt;
'''Abs(f)''' - возвращает модуль числа f.&lt;br /&gt;
&lt;br /&gt;
'''Mod(x, y)''' - возвращает остаток от деления целочисленного числа x на целочисленное число y.&lt;br /&gt;
&lt;br /&gt;
=== Константы ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Null''' – Возвращает пустое значение.&lt;br /&gt;
&lt;br /&gt;
'''Да''', '''True''', '''Нет''', '''False''' – константы, соответствующие булевым значениям.&lt;br /&gt;
&lt;br /&gt;
=== Прочие функции ===&lt;br /&gt;
&lt;br /&gt;
SetPhoneParams(CountryCode, TownCode) – Устанавливает глобальные настройки кода телефонных кодов страны и города соответственно. По-умолчанию код страны – 7, код города – 495.&lt;br /&gt;
&lt;br /&gt;
PhonesCount(s) – Возвращает количество корректных телефонных номеров, найденных в строке s.&lt;br /&gt;
&lt;br /&gt;
GetPhone(s[, n]) – Возвращает n-й корректный телефонный номер, найденный в строке s. Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
GetEmail(s) – Возвращает все корректные адреса email, найденный в строке s, разделенные запятыми (т.е. готовыми к передаче в функцию SendEmail).&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY).&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
GenEan(ID, Code) – Формирует штрих-код EAN 13 Состоящий из идентификатора типа сущности ID и кода сущности Code, Выравнивает до 13-ти символов, первый – «2», последний – контрольная сума.&lt;br /&gt;
&lt;br /&gt;
CheckEan(s) - Проверяет строку s, что она является кодом EAN13.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(FileName,s, encoding [, append])- Создает текстовый файл по пути, указанному в FileName (если по указанному пути существует файл с указанным именем, он удаляется и создается новый) и производит запись строки s в созданный текстовый файл. encoding - название кодировки, по умолчанию сохраняет в кодировке ANSI. Доступные названия кодировок: KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Если append = true, то производится дописывание данных в файл, а не перезаписывание (не обязательный, по умолчанию выключен).&lt;br /&gt;
&lt;br /&gt;
StrFromFile(FileName) - Читает файл FileName, возвращает в виде строки. При ошибке чтения вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
DownloadAttachment(code, [savefilepath, tablename='attachment', fieldBlob='file', fieldLDtime='ldtime', fieldUID='uid']) - Функция выкачивает аттачмент из базы, по внутреннему коду - Code, всегда возвращает содержимое файла в виде строки, а также может сохранить файл по указанному пути в параметре savefilepath. По умолчанию, функция настроена на таблицу attachment. Code - внутренний код вложения, tablename - название таблицы, fieldBlob - название поля с содержимым файла, fieldLDtime - название поля с временем последнего изменения строки (для работы кэша). Функция использует кэш и умеет выкачивать файлы зауженные на внешние серверы (http, ftp,sftp, measoft). Для выкачивания с сервера measoft обязательно необходимо указывать параметр fieldUID.&lt;br /&gt;
&lt;br /&gt;
DeleteFile(FileName) - Удаляет файл FileName с диска, возвращает истину, если операция прошла успешно и ложь - в противном случае.&lt;br /&gt;
&lt;br /&gt;
HTTPPOST(host, PostParams, Proxy, ContentType, HTTPUser, HTTPPass, Method, CustomHeader, Reconnects) - Отправляет HTTP запрос по адресу host с данными PostParams. Proxy - объект Proxy, задающий прокси-сервер (по-умолчанию - пусто - не использовать прокси). ContentType - Заголовок ContentType. По-умолчанию - &amp;quot;application/x-www-form-urlencoded; Charset=UTF-8&amp;quot;. HTTPUser и HTTPPass - данные для http-авторизации на сервере. Method - метод отправки запроса, по-умолчанию - &amp;quot;POST&amp;quot;. CustomHeader - Дополнительные заголовки HTTP запроса, передается в виде списка параметров через запятую и всегда образуют пару: 1 параметр - название заголовка, 2 параметр - значение. Если значение содержит запятую то его нужно экранировать в двойные кавычки. Reconnects - Количество попыток подключения (по-умолчанию - 2), если больше 100 - это таймаут единственной попытки подключения в миллисекундах.&lt;br /&gt;
Функция возвращает ответ сервера. &amp;lt;br&amp;gt;&lt;br /&gt;
''Обратите внимание:'' Для имитации отправки данных html-формы методом POST может понадобиться перед передаваемыми параметрами добавить &amp;quot;Data=&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
FTPPUT(host, User, Pass, FileName[, Active]) - Отправляет файл на FTP/SFTP-сервер. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
FTPGET(host, User, Pass, SourceFileName, DestFileName[, Active]) - Загружает файл SourceFileName с FTP/SFTP-сервера, сохраняет его в файл DestFileName. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
GetTempDir - Возвращает путь к временной папке.&lt;br /&gt;
&lt;br /&gt;
ApplicationDir - Возвращает путь к файлу программы.&lt;br /&gt;
&lt;br /&gt;
Interpretate(script) - Интерпретирует скрипт указанный в script. Выполнение происходит в текущем инстансе.&lt;br /&gt;
&lt;br /&gt;
LastHttpError - Выводит последний запрос выполненный с ошибкой в функции HttpPost. Содержит подробную информацию по запросу и ответу.&lt;br /&gt;
&lt;br /&gt;
LastHttpResponse - Выводит последний запрос и ответ от сервера после выполнения Http-запроса в функции HttpPost.&lt;br /&gt;
&lt;br /&gt;
== Объект TExcel ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к данным документов MS Excel. Требует установленного приложения MS Excel. Для работы без установленного MS Excel предусмотрен объект TDirectExcel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ввод данных'''''&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Если Headered истинно (по-умолчанию), таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Если TranslateHeader истинно, то заголовки таблицы будут автоматически переведены.&lt;br /&gt;
 &lt;br /&gt;
 MyDB.Open('select * from kurier');&lt;br /&gt;
 xl.LoadFromDB(MyDB.Self);&lt;br /&gt;
 xl.DoNotDestroy(true);&lt;br /&gt;
 xl.SetVisible(true);&lt;br /&gt;
&lt;br /&gt;
Post2Sheet(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) -  Почти полный аналог LoadFromDB. В отличии от LoadFromDB если есть открытый файл, выгрузка данных будет выполнена прямо в него.&lt;br /&gt;
&lt;br /&gt;
OpenFile(aFileName) – Выполняет функции SetFileName и Open. &lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
SetFileName(aFileName) – Задает значение свойства FileName.&lt;br /&gt;
&lt;br /&gt;
Open - Открывает файл с именем, заданным свойством FileName. Если имя файла не задано - создает чистую книгу.&lt;br /&gt;
&lt;br /&gt;
Close – Закрывает текущий файл.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ячейки'''''&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
Cell(x, y, text) – Возвращает значение ячейки, заданной координатами x, y. Необязательный булевый параметр text, в случае истинности, указывает на необходимость возврата данных с учетом формата ячейки, т.е. то, что пользователь видит на экране. Обратите внимание, что если в ячейке число, и ширина столбца не достаточна для отображения, Excel выводит &amp;quot;#####&amp;quot;, что и будет возвращено программе, если text=ИСТИНА. Поэтому перед таким использованием рекомендуется выполнить функцию AutoFit.&lt;br /&gt;
&lt;br /&gt;
SetCell(x, y, v[, x2, y2]) – Устанавливает значение ячейки, заданной координатами x и y, в значение v. Если заданы параметры x2, y2 - объединяет (merge) диапазон ячеек заданных координатами, устанавливает значение объединенной ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Строки'''''&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
RowAutoFit([y1, y2]) - Устанавливает автоматическую высоту строк. Аргументы y1 и y2 необязательны и если не указаны, то процедура будет выполнена для всей страницы, в ином случае только для строк от y1 до y2.&lt;br /&gt;
&lt;br /&gt;
SetRowHeight(r, h[, cnt]) – Устанавливает высоту cnt строк (по-умолчанию 1) начиная со строки r в h пикселей.&lt;br /&gt;
&lt;br /&gt;
GetRowHeight(r) – Возвращает высоту строки r в пикселях.&lt;br /&gt;
&lt;br /&gt;
RowInsert(i[, count]) - Вставляет count (по-умолчанию - 1) строк НАД строкой с номером i.&lt;br /&gt;
&lt;br /&gt;
RowDelete(i[, count]) - Удаляет count (по-умолчанию - 1) строк начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Столбцы'''''&lt;br /&gt;
&lt;br /&gt;
ColCount - Возвращает количество столбцов в листе.&lt;br /&gt;
&lt;br /&gt;
AutoFit – Устанавливает автоматическую ширину столбцов.&lt;br /&gt;
&lt;br /&gt;
ColumnDelete(i[, count]) - Удаляет count (по-умолчанию - 1) столбцов начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
SetColWidth (c, w) – Устанавливает ширину столбца c в w пикселей.&lt;br /&gt;
&lt;br /&gt;
GetColWidth (c) – Возвращает ширину столбца c в пикселях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Листы'''''&lt;br /&gt;
&lt;br /&gt;
SetSheet(No) – Устанавливает номер текущего листа. Если лист с таким номером не существует - он будет создан (и все листы до него). Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetSheetName(Name) - Устанавливает название текущего листа.&lt;br /&gt;
&lt;br /&gt;
SheetsCount – Возвращает количество листов в книге.&lt;br /&gt;
&lt;br /&gt;
CopySheetAfter([SheetFrom[, SheetAfter]]) - Копирует лист SheetFrom (по-умолчанию - текущий), создавая новый лист после листа SheetAfter (по-умолчанию - совпадает с копируемым).&lt;br /&gt;
&lt;br /&gt;
SheetDelete(i) - Удаляет лист с номером i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Форматирование'''''&lt;br /&gt;
&lt;br /&gt;
Align(x1, y1, x2, y2 [,HAlign, VAlign]) - Устанавливает выравнивание данных в указанном диапазоне. HAlign - горизонтальное выравнивание (0 – прижато влево , 1 – по центру , 2 – прижато вправо), VAlign - Вертикальное выравнивание (0 – прижато к верху , 1 – по центру , 2 – прижато к низу).&lt;br /&gt;
&lt;br /&gt;
WrapText(x1, y1, x2, y2, value) – Устанавливает перенос текста прямоугольника в значение value. Если координаты опущены, или 0 – устанавливает границы всей используемой области. Для Value значение по-умолчанию - true.&lt;br /&gt;
&lt;br /&gt;
NumberFormat(x1, y1, x2, y2, Format) - Устанавливает формат вывода чисел в указанном диапазоне ячеек. Например, если Format='0.00' - числа будут выводиться c обязательными 2 знаками после десятичного разделителя.&lt;br /&gt;
&lt;br /&gt;
SetBorders(x1, y1, x2, y2) – Устанавливает границы прямоугольника. Если координаты опущены, или 0 – устанавливает границы всей используемой области.&lt;br /&gt;
&lt;br /&gt;
SetFont(Font[, x1, y1[, x2, y2]]) - Устанавливает шрифт Font для ячеек диапазона. Можно указать координаты только одной ячейки, можно - вообще не указать, тогда будет использован последний выделенный диапазон. Шрифт задается как обычно: 'Arial, 16, T, T, T', порядок параметров: Имя шрифта, размер, жирное начертание, курсивное начертание, одиночное подчеркивание. Если параметры не заданы, то у текущего шрифта они меняться не будут. Примеры: SetFont('Arial, 10, T, F, F', 1,1) - в ячейке A1 будет установлен шрифт Arial жирным начертанием (не курсив и без подчеркивания). SetFont(', , , T, F', 2,1) - в ячейке B1 будет поменяется только начертание курсив и будет отменено подчеркивание (если оно было). &lt;br /&gt;
&lt;br /&gt;
SaveValuesOnly - убирает формулы на текущей странице и оставляет лишь их результативные статичные значения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Цвета'''''&lt;br /&gt;
&lt;br /&gt;
SetRowFontColor(Row,Color) - Устанавливает цвет шрифта в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetRowColor(Row,Color) - Устанавливает цвет фона в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetColumnFontColor(Col,Color) - Устанавливает цвет шрифта в столбце Col. Color -  целое значение (RGB) &lt;br /&gt;
&lt;br /&gt;
SetColumnColor(Col,Color) - Устанавливает цвет фона в столбце Col. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellFontColor(Row,Col,Color) -  Устанавливает цвет шрифта в ячейке с координатами [Row,Col]. Color -  целое значение, равное номеру цвета в палитре (ColorIndex,не RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellColor(Row,Col,Color) -  Устанавливает цвет фона в ячейке с координатами [Row,Col]. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
GetRowFontColor(Row)- Возвращает RGB значение цвета шрифта строки Row&lt;br /&gt;
&lt;br /&gt;
GetRowColor(Row)- Возвращает RGB значение цвета фона строки Row&lt;br /&gt;
&lt;br /&gt;
GetColumnFontColor(Col)- Возвращает RGB значение цвета шрифта столбца Col&lt;br /&gt;
&lt;br /&gt;
GetColumnColor(Col)- Возвращает RGB значение цвета фона столбца Col &lt;br /&gt;
&lt;br /&gt;
GetCellFontColor(Row,Col) - Возвращает номер цвета шрифта в палитре (ColorIndex) в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
GetCellColor(Row,Col) - Возвращает RGB значение цвета фона в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Копи-паст'''''&lt;br /&gt;
&lt;br /&gt;
Copy(x1, y1, x2, y2) - Копирует в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Cut(x1, y1, x2, y2) - Вырезает в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Paste(x1, y1) - Вставляет из буфера экселя. Команды copy-paste неразрывны, если что нибудь сделать в промежутке между ними, например вставить значение в ячейку, то копирование сброситься. (Последовательность использования: copy - paste, cut - paste)&lt;br /&gt;
&lt;br /&gt;
PasteStyle(x1, x2, y1, y2) - Вставляет только оформление из буфера экселя (Последовательность использования:  Copy - PasteStyle)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Изображения'''''&lt;br /&gt;
&lt;br /&gt;
InsertPicture(TPicture, [x=1, y=1, DispX=0, DispY=0, width=0, height=0]) - Функция вставляет рисунок на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки, width, height (не работает для DirectExcel) - ширина и высота области рисунка в пойнтах-единицах Excel &lt;br /&gt;
&lt;br /&gt;
InsertFirmLogo(FirmCode, [x=1, y=1, DispX=0, DispY=0]) - Функция вставляет логотип фирмы с кодом FirmCode на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Вывод'''''&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки. Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SheetFitPageWidth - устанавливает режим масштабирования печати, чтобы печатная форма помещалась в ширину на один лист.&lt;br /&gt;
&lt;br /&gt;
SetOrientation(value) - Устанавливает ориентацию страницы. True (по-умолчанию) - альбомная (ландшафтная), Ложь - портретная.&lt;br /&gt;
&lt;br /&gt;
PrintOut([copies]) - Печатает текущий лист на принтере по умолчанию. Параметр copies - количество копий, по умолчанию равен 1.&lt;br /&gt;
&lt;br /&gt;
Save(filename) - Сохраняет в файл filename. Если файл существует, в основной системе он будет перезаписан, в других проектах - вызовет ошибку &amp;quot;Файл уже существует&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SetVisible(b) – Устанавливает видимость приложения Excel для пользователя. По-умолчанию – false (не видимо).&lt;br /&gt;
&lt;br /&gt;
DoNotDestroy(b) – При уничтожении объекта TExcel (а он уничтожается, как и все остальные объекты автоматически при завершении выполнения скрипта), приложение Excel уничтожается вместе с ним. DoNotDestroy(true) отключает уничтожение приложения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования'''''&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'myxl');&lt;br /&gt;
 myxl.OpenFile('c:\asdf.xlsx');&lt;br /&gt;
 set($sum, 0);&lt;br /&gt;
 while (myxl.EOF=0, &lt;br /&gt;
      set($sum, $sum+int(myxl.c));&lt;br /&gt;
      myxl.next );&lt;br /&gt;
 $sum&lt;br /&gt;
 &lt;br /&gt;
 ''Возвращает сумму всех числовых данных столбца C файла 'c:\asdf.xlsx'''&lt;br /&gt;
&lt;br /&gt;
== Объект TDirectExcel ==&lt;br /&gt;
Объект позволяет работать с файлами Excel напрямую, без установленного пакета MsOffice. Применяется в сервисах и при отсутствии экселя. Он максимально совместим с объектом TExcel, однако некоторые методы могут быть не реализованы. &lt;br /&gt;
&lt;br /&gt;
== Объект TCSVFile ==&lt;br /&gt;
Предназначен для доступа к данным документов CSV. Разделителем столбцов является символ точка с запятой ;&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
OpenFile(FileName) – Открывает файл FileName.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=false]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO.&lt;br /&gt;
&lt;br /&gt;
LoadFromText(s) - Загружает таблицу из строки s.&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). &lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(Filename) - Сохраняет в файл с именем filename.&lt;br /&gt;
&lt;br /&gt;
== Объект TADO ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к базам данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|Connect(ConnectionString)&lt;br /&gt;
|Подключает к источнику данных. ConnectionString – Строка подключения ADO.&lt;br /&gt;
|-&lt;br /&gt;
|ConnectMySQL(DBServer, DBPort, DBUser, DBPass, DBName)&lt;br /&gt;
|Подключает к базе данных MySQL.&lt;br /&gt;
|-&lt;br /&gt;
|Open(Query)&lt;br /&gt;
|Открывает набор данных выполнив запрос Query.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByNo(i)&lt;br /&gt;
|Возвращает значение поля с номером i. Нумерация полей – с нуля.&lt;br /&gt;
|-&lt;br /&gt;
|FieldName(i)&lt;br /&gt;
|Возвращает имя поля с номером i.&lt;br /&gt;
|-&lt;br /&gt;
|FieldCount&lt;br /&gt;
|Возвращает количество  полей.&lt;br /&gt;
|-&lt;br /&gt;
|RecordCount&lt;br /&gt;
|Возвращает количество записей.&lt;br /&gt;
|-&lt;br /&gt;
|RecNo&lt;br /&gt;
|Возвращает номер текущей записи. ''ВНИМАНИЕ! В зависимости от способа подключения к БД нумерация может начинаться как с 0 так и с 1!''&lt;br /&gt;
|-&lt;br /&gt;
|EOF&lt;br /&gt;
|Возвращает признак достижения конца набора данных. Становится истиной когда выполняется команда Next на последней записи.&lt;br /&gt;
|-&lt;br /&gt;
|Next&lt;br /&gt;
|Переход на следующую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|First&lt;br /&gt;
|Переход на первую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|Last&lt;br /&gt;
|Переход на последнюю запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByName(FieldName)&lt;br /&gt;
|Возвращает значение поля по имени. Также возможно указание имени поля как свойства объекта.&lt;br /&gt;
|-&lt;br /&gt;
|Field(Table, ID, FieldName)&lt;br /&gt;
|Возвращает значение поля FieldName записи с кодом ID таблицы Table. Набор данных, если он открыт, при этом не закрывается. Первичный ключ таблицы должен называться «code». Гарантированно работает только с MYSQL!!!&lt;br /&gt;
|-&lt;br /&gt;
|GetSQLValue(Query)&lt;br /&gt;
|Выполняет SQL-запрос. Текст запроса должен начинаться с первого символа строки (перед запросом не должно быть пробелов, переносов строк, комментариев и т.д.). Если запрос Insert – возвращает ID вставленной записи. Если запрос – Update, Delete, Replace, Set, Start, Commit, Rollback – возвращает количество измененных записей (RowsAffected), иначе – Select – значение первого поля первой строки результата как текст.&lt;br /&gt;
|-&lt;br /&gt;
|FillText(s)&lt;br /&gt;
|Возвращает строку s с замененными названиями полей между знаками процента на соответствующие значения текущей записи. Так же в строке возможно использование интерпретируемого кода, заключенного между тегами &amp;quot;&amp;lt;?&amp;gt;&amp;quot; и &amp;quot;&amp;gt;&amp;quot;. При интерпретации система сначала производит замену полей с процентами на значения, потом интерпретирует код. ''Внимание! Функция не создает отельный контекст интерпретатора, а использует существующий, в нем доступны все объекты и переменные, вызывающего скрипта.'' Дополнительно автоматически создается объект TSelfADO, подключенный к той же БД, что и контекст, вызвавший функцию, с пустым именем, а так же с именем &amp;quot;dataset&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|Query(Query)&lt;br /&gt;
|Синоним GetSQLValue.&lt;br /&gt;
|-&lt;br /&gt;
|Close&lt;br /&gt;
|Закрывает набор данных.&lt;br /&gt;
|-&lt;br /&gt;
|Self&lt;br /&gt;
|Возвращает указатель на подключение к БД для использования в других объектах.&lt;br /&gt;
|-&lt;br /&gt;
|ParseForIn([FieldName='code']) &lt;br /&gt;
|Возвращает через запятую значения всех строк в указанном столбце. По умолчанию, используется столбец с именем code.&lt;br /&gt;
|-&lt;br /&gt;
|GetSQL&lt;br /&gt;
|Для отладки. Возвращает последний SQL запрос переданный в методы Open, Query, GetSQLValue&lt;br /&gt;
|-&lt;br /&gt;
|ExportExcel&lt;br /&gt;
|Для отладки. Выгружает в эксель содержимое датасета. Можно использовать в незнакомом окружении для понимания передаваемых полей в : шаблонах, печатных формах и т.д. Аналог команды %echo% в шаблонах, на случай если она не сработает.&lt;br /&gt;
|-&lt;br /&gt;
|OnGetText&lt;br /&gt;
|Функция подменяет текстовый вывод значения поля при выгрузке в эксель. Первый параметр это имя поля, которое надо подменить. Второй параметр это то что необходимо вывести. Работает только с текстовыми полями. &lt;br /&gt;
'''''Пример использования'''''  &lt;br /&gt;
  DB.OnGetText('Зона', IF((DB.FieldByName('-Lat') ! 0) * (DB.FieldByName('-Lon') ! 0),&lt;br /&gt;
       	GetPolygonByLatLon(DB.FieldByName('-Lat'), DB.FieldByName('-Lon'), 'TYPE = 1 AND IFNULL(zone, 0) &amp;gt; 0 AND PRICE = ' + DB.FieldByName('-price'), 'zone')&lt;br /&gt;
  ,&lt;br /&gt;
        ''&lt;br /&gt;
  ));&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования – см. TSelfADO&lt;br /&gt;
&lt;br /&gt;
== Объект TSelfADO ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наследник объекта TADO. Служит для подключения к «родной» для программы, в которой выполняется скрипт, базе данных. Обладает всеми свойствами и методами объекта TADO, кроме Connect. Иногда автоматически создается системой для обеспечения простого доступа к базе данных, а также иногда создается системой с уже открытым набором данных для передачи обрабатываемого системой набора данных в скрипт. В этом случае для скрипта недоступны функции Open и Close.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&lt;br /&gt;
 rem('Копируем данные из &amp;quot;родной&amp;quot; базы данных в базу MSSQL.');&lt;br /&gt;
 new('TSelfADO', 'MyDB');&lt;br /&gt;
 new('TADO', 'MSSQL');&lt;br /&gt;
 MSSQL.Connect('Provider=SQLOLEDB.1;Password=myPassword;Persist Security Info=True;User ID=myUsername;Initial Catalog=myDataBase;Data Source=myServerAddress');&lt;br /&gt;
 MyDB.Open('select code, name, passport from kurier where code&amp;gt;'+Int(MSSQL.Query('select max(code) from kurier'))+' order by code');&lt;br /&gt;
 While(MyDB.EOF=0,&lt;br /&gt;
      MSSQL.Query('insert kurier (code, name, passport) VALUES ('+MyDB.Code+', '+QuotedStr(MyDB.Name)+', '+QuotedStr(MyDB.Passport)+')');&lt;br /&gt;
      MyDB.Next;&lt;br /&gt;
      );&lt;br /&gt;
&lt;br /&gt;
== Объект TPrinter ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к принтерам.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
BeginDoc – Начинает новый документ.&lt;br /&gt;
&lt;br /&gt;
EndDoc – Закрывает документ&lt;br /&gt;
&lt;br /&gt;
PageHeight – Возвращает высоту страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageWidth – Возвращает ширину страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageNumber – Возвращает номер текущей страницы документа&lt;br /&gt;
&lt;br /&gt;
Orientation – Возвращает текущую ориентацию страницы (0 – портретная, 1 – ландшафтная)&lt;br /&gt;
&lt;br /&gt;
Printing – Возвращает истину если документ открыт&lt;br /&gt;
&lt;br /&gt;
SetOrientation(Orientation) – Устанавливает ориентацию страницы. При необходимости начинает новый документ, новую страницу.&lt;br /&gt;
&lt;br /&gt;
ShowDialog – Показывает пользовательский диалог печати. Возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
NewPage – Начинает новую страницу&lt;br /&gt;
&lt;br /&gt;
Canvas – Предоставляет доступ к объекту TCanvas, связанному с принтером.&lt;br /&gt;
&lt;br /&gt;
PrinterNames – Возвращает список принтеров, установленных в системе, разделенный переносами строк&lt;br /&gt;
&lt;br /&gt;
PrintersCount – Возвращает количество установленных в системе принтеров&lt;br /&gt;
&lt;br /&gt;
SetPrinter(Printer) – Устанавливает текущий принтер. Если передана строка – ищет принтер по названию, иначе – по номеру. Нумерация начинается с 0.&lt;br /&gt;
&lt;br /&gt;
PrintTable(Y, Table) – Выводит на печать таблицу Table типа TTable, начиная с координаты Y. При необходимости таблица печатается на нескольких страницах. Возвращает координату Y конца таблицы.&lt;br /&gt;
&lt;br /&gt;
GetDefaultPrinter - Возвращает имя текущего активного принтера.&lt;br /&gt;
&lt;br /&gt;
SetDefaultPrinter(Printer) – Запоминает предыдущий активный принтер и устанавливает новый текущий принтер. Printer - имя принтера. При необходимости нескольких последовательных вызовов SetDefaultPrinter рекомендуется между вызовами использовать RestoreDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
RestoreDefaultPrinter - Устанавливает активным принтер, который был текущим перед последним вызовом SetDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
== Объект TCanvas ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предоставляет доступ к холсту объекта для прорисовки изображения.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
DPIX – Возвращает разрешение холста по горизонтали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
DPIY – Возвращает разрешение холста по вертикали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
TextOut(x, y, s[, x1, y1, x2, y2]) – Выводит строку s начиная с точки с координатами x и y. Если указаны параметры x1, y1, x2, y2 – то выводимый текст ограничивается заданным прямоугольником.&lt;br /&gt;
&lt;br /&gt;
TextOutEx(x1, y1, x2, y2, Alignment, Font, s, Indent) – Выводит строку s в прямоугольнике с координатами x1, y1, x2, y2. По горизонтали строка выравнивается в соответствии с Alignment (0 – прижато влево, 1 – вправо, 2 – по центру), по вертикали выравнивается по центру. Используя шрифт Font (см описание ниже). Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату X фактического окончания текста (правой стороны – если строка прижата влево, и левой – в остальных случаях)&lt;br /&gt;
&lt;br /&gt;
MLTextOut(x1, y1, x2, y2, Alignment, VAlignment, Font, s, Heigth, Indent) – Выводит многострочный текст s в прямоугольнике с координатами x1, y1, x2, y2 с переносом по словам. По горизонтали строки выравниваются в соответствии с Alignment, по вертикали – в соответствии с VAlignment (0 – прижато вверх, 1 – по центру, 2 – прижато вниз). Используя шрифт Font (см описание ниже). Heigth – высота строки. Если опущено или равно нулю – высота определяется автоматически в соответствии с выбранным шрифтом. Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату Y фактического окончания текста (нижней границы последней строки текста. ''ВНИМАНИЕ! Функция использует координаты прямоугольника для позиционирования текста, однако она не ограничивает его верхней и нижней границами этого прямоугольника!''&lt;br /&gt;
&lt;br /&gt;
DrawPic(x1, y1, x2, y2, Pic, Style, Alignment, Mode) – Прорисовывает изображение Pic (ссылка на изображение TPicture.Self) в прямоугольник заданный координатами x1-y2. Style – стиль масштабирования. 0 – растянуть изображение до границ прямоугольника не сохраняя пропорции, 1 – вписать изображение в прямоугольник сохраняя пропорции – вероятно, останутся поля по вертикали или горизонтали, 2 – вписать сохраняя пропорции, обрезав при необходимости изображение по вертикали или горизонтали. Alignment – выравнивание по горизонтали. Работает только в случае если style=1 и при растягивании изображения получились вертикальные поля. 0 – разместить по центру, 1 – прижать влево, 2 – прижать вправо. Функция возвращает координату X правой стороны изображения кроме случая, когда Style=1 и Alignment=2 – в этом случае возвращается координата левой стороны изображения. Mode - способ наложения изображения. 0 (по-умолчанию) - копирование как есть. 1 - Наложение операцией AND (применяется для получения эффекта прозрачности изображения), 2 - наложение операцией XOR (Применяется для возможности повторной операцией убрать изображение), 3 - Наложение операцией OR.&lt;br /&gt;
&lt;br /&gt;
FillRect(x1, y1, x2, y2) – Рисует прямоугольник '''без границ''' и закрашивает цветом BrashColor&lt;br /&gt;
&lt;br /&gt;
Rect(x1, y1, x2, y2) – Рисует прямоугольник '''c границами''', задаваемыми текущим пером, и закрашивает цветом BrashColor &lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Устанавливает шрифт по-умолчанию.&lt;br /&gt;
&lt;br /&gt;
SetPen(Width, Color) - Устанавливает параметры &amp;quot;ручки&amp;quot; - толщину и цвет. Если любой параметр опустить, соответствующее значение не будет изменено.&lt;br /&gt;
&lt;br /&gt;
SetBrush(Color, Style) - Устанавливает параметры заливки - цвет и стиль. Если любой параметр опустить, соответствующее значение не будет изменено. Стили заливки: 0 - сплошная, 1 - отсутствует (прозрачная), 2-7 - различные виды штриховки (горизонтальные, вертикальные, в клеточку и т.д.).&lt;br /&gt;
&lt;br /&gt;
TextHeight(s) – Возвращает высоту текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
TextWidth(s) – Возвращает ширину текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
Использование шрифта (Font): У объекта TCanvas есть «глобальные» установки шрифта. Однако для некоторых функций возможно указание шрифта, отличающегося от глобального. Параметры шрифта – это текстовая строка, состоящая из 6-ти параметров, разделенных запятыми: Название, размер, жирный, курсив, подчеркнутый, цвет. Например:&lt;br /&gt;
&lt;br /&gt;
 'Times New Roman, 8, Y, N, N, 255'&lt;br /&gt;
&lt;br /&gt;
Любой параметр можно опустить, и тогда вместо него будет использовано значение по-умолчанию: шрифт: arial, размер – 10, не жирный, не курсив, не подчеркнутый, цвет – черный. Например: ', 7' – указывает, что по-умолчанию нужно взять все параметры кроме размера шрифта. Также можно вместо всей строки указать тире ('-') или пустую строку, и шрифт будет использоваться «глобальный».&lt;br /&gt;
&lt;br /&gt;
Объект можно создать отдельно, не создавая объект TPrinter. В таком случае объект создастся как ссылка на текущий холст принтера (принтер должен быть запущен и начат новый документ). Такой подход используется в доп. возможности PrintCustomSticker&lt;br /&gt;
&lt;br /&gt;
== Объект TPicture ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с графическими изображениями форматов BMP, GIF, JPEG и PNG, а также для формирования штрих-кодов. Обратите внимание, прозрачность изображений не поддерживается, однако в методе TCanvas.DrawPic есть параметр Mode, призванный создавать эффект прозрачности.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(FileName) – Загружает изображение из файла FileName. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB, Query) – Загружает изображение из базы данных. DB – ссылка на подключение к базе данных TADO.Self, Query – текст запроса. Запрос должен вернуть в первом поле первой строки BLOB-поле с изображением, все остальные данные возвращаемые запросом игнорируются. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromStr($s) – Загружает изображение из строки $s. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
CreateBar(Width, Height, BarCode, Textless, Type) – Формирует штрих-код шириной Width и высотой Height с типом кодирования Type. BarCode – текст штрих-кода. Булево значение Textless указывает, что в штрих-коде не должно быть человеко-читаемых символов если истинно. Type указывает тип кодирования: 0 (по-умолчанию) CODE128, 1 - EAN-13, 2 - Interleaved 2-5, 3-DataMatrix, 4-QRCode.&lt;br /&gt;
Штрихкод должен быть: Для EAN-13 цифровым 12 или 13 символов (13-й, контрольная сумма рассчитывается автоматически), для CODE128 - должен иметь состоять из допустимого для этого кодирования набора символов. Для Interleaved - должен состоять из четного числа цифр, контрольная сумма автоматически не рассчитывается. Если для Interleaved кода указано значение из 14-ти знаков, подпись цифр выводится в формате Почты России.&lt;br /&gt;
Внимание! Для кодов EAN-13 и Interleaved ширина штрих-кода Width не является точным значением получаемого на выходе изображения. Ширина изображения рассчитывается как максимальное кратное минимально возможной ширине, но не меньше минимально возможной. Конечную ширину можно получить в соответствующем свойстве объекта. Для кода CODE128 штрих-код на выходе может оказаться пустым, если указанной ширины штрих-кода не достаточно для его формирования.&lt;br /&gt;
Для кода DataMatrix можно установить режим для печати скрытых символов с кодами 29(GS) и 232(FCN1), которые требуются для формирования Честного Знака. Для этого необходимо в начале строки указать символ &amp;quot;[&amp;quot; и все разделители 01, 21, 91, 92 так же экранировать этими скобками. Должно получиться [01]02900002317701[21]k3LInNbH_oG0Q[91]EE06[92]YXiyKfiHjE4YE8b+YVMC1O5r8VtpplA3AwcCqrcG9Dk= . При формировании кода, включится режим формирования штрих-кода DataMatrix GS1, в начале будет добавлен символ с кодом 232 (FCN1), а потом будут добавлены разделители с кодом 29 (GS)&lt;br /&gt;
Функция возвращает 1 в случае успеха, или текст ошибки, если такая произошла.&lt;br /&gt;
&lt;br /&gt;
SetSize(Width, Height) - Устанавливает размер изображения.&lt;br /&gt;
&lt;br /&gt;
AsString([ImageFormat]) - Возвращает изображение в виде строки с двоичными данными. ImageFormat принимает значения 1 - Bitmap (по-умолчанию), 2 - jpeg, 3 - png, 4 - gif.&lt;br /&gt;
&lt;br /&gt;
Width – Возвращает ширину изображения.&lt;br /&gt;
&lt;br /&gt;
Height – Возвращает высоту изображения.&lt;br /&gt;
&lt;br /&gt;
Rotate(Angle) – Поворачивает изображение по часовой стрелке на угол Angle. Угол указывается в градусах и может принимать любые значения.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с изображением, используется в качестве параметра для функций, работающих с изображениями из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Canvas - ссылка на объект TCanvas холста изображения.&lt;br /&gt;
&lt;br /&gt;
== Объект TTable ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с таблицами. Удобен для печати таблицы на принтере. Алгоритм таков: Загружаем датасет в таблицу, настраиваем ее (шрифты, штрих-коды и т.д.), потом выводим на принтер функцией TPrinter.PrintTable.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Заголовок – это первая строка таблицы.&lt;br /&gt;
&lt;br /&gt;
Cell(С, R) – Возвращает значение ячейки таблицы с координатами (C, R). Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetCell(С, R, Value) – Устанавливает значение ячейки таблицы с координатами (C, R) в Value. Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
RowCount – Возвращает количество строк в таблице.&lt;br /&gt;
&lt;br /&gt;
ColCount – Возвращает количество столбцов в таблице.&lt;br /&gt;
&lt;br /&gt;
SetTitleFont(Font) – Задает шрифт заголовка таблицы (первой строки).&lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Задает шрифт всей таблицы кроме заголовка.&lt;br /&gt;
&lt;br /&gt;
SetColFont(C, Font) - Устанавливает шрифт столбца C.&lt;br /&gt;
&lt;br /&gt;
SetIndent(Indent) – Задает отступ от границы ячейки до текста в процентах от ширины страницы. По-умолчанию значение 0.3&lt;br /&gt;
&lt;br /&gt;
SetWidth(С, Width) – Задает значение ширины столбца C в процентах от ширины страницы.&lt;br /&gt;
&lt;br /&gt;
SetMinRowHeght (Heght) – Задает значение минимальной высоты строки в пикселях. &lt;br /&gt;
&lt;br /&gt;
SetBarCode(Col, Type) - Указывает, что данные из столбца Col должны печататься в виде штрих-кода. Тип штрих-кода - Type. Значение '''&amp;quot;1&amp;quot; - EAN13'''. Для кода EAN13 первая строка данных в ячейке должна иметь вид &amp;quot;тип штрих-кода, номер&amp;quot;, например &amp;quot;7, 123&amp;quot; (без кавычек, конечно). В этом случае система сформирует штрих-код: &amp;quot;2700000001233&amp;quot;. Первая цифра - всегда 2, далее - указанный тип штрих-кода, нули, чтобы получилось 13 символов, номер, указанный в таблице, и один символ - контрольная сумма. Значение '''&amp;quot;2&amp;quot; - CODE128''' (с версии 734). Данные из первой строки ячейки таблицы печатаются в штрих-коде &amp;quot;как есть&amp;quot;. Для всех видов штрих-кода (с версии 734) последующие строки печатаются под штрих-кодом в виде текста.&lt;br /&gt;
&lt;br /&gt;
SetMultiHeader(Active) - Включает печать заголовка при переносе таблицы на несколько страниц. По умолчанию отключено.&lt;br /&gt;
&lt;br /&gt;
SetCustomHeader(script) - Включает печать пользовательского заголовка. Script - это код интерпретатора, который должен печатать заголовок на канву. Печать таблицы может происходить на нескольких листах, по этому скрипт будет вызван для каждого листа. При использовании этого метода, автоматически инициализируются переменные: $TablePageNo - номер страницы, нумерация начинается с нуля; $TableY - координата по оси Y, от которой рисуется заголовок. Чтобы таблица была под заголовком необходимо значение переменной $TableY увеличить на высоту заголовка.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с таблицей, используется в качестве параметра для функций, работающих с таблицами из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 &amp;lt;?&amp;gt;&lt;br /&gt;
 NEW('TPrinter', 'Prn');&lt;br /&gt;
 If(prn.ShowDialog,&lt;br /&gt;
  NEW('TTable', 'Tbl'); &lt;br /&gt;
  NEW('TSelfADO', 'MyDB'); &lt;br /&gt;
  MyDB.Open('SELECT concat(&amp;quot;7&amp;quot;, &amp;quot;, &amp;quot;,  a.code, &amp;quot;\r\n&amp;quot;, a.client_id, &amp;quot;\r\n&amp;quot;, a.zakaz, &amp;quot;-&amp;quot;, a.number) as &amp;quot;Штрих-код&amp;quot;, a.target AS &amp;quot;Заказик&amp;quot;, address, phone, vlog, poruch FROM address a order by code desc limit 10');&lt;br /&gt;
  Tbl.LoadFromDB(MyDB.Self); &lt;br /&gt;
  Tbl.SetBarcode(1, 1);&lt;br /&gt;
  Tbl.SetCustomHeader(     &lt;br /&gt;
    if($TablePageNo&amp;gt;0,&lt;br /&gt;
      Prn.Canvas.TextOut(Prn.Canvas.DPIX*0.1, $TableY, 'Продолжение таблицы');&lt;br /&gt;
      set($TableY, $TableY + Prn.Canvas.TextHeight('H'));&lt;br /&gt;
    ,0)&lt;br /&gt;
  );&lt;br /&gt;
  Prn.BeginDoc; &lt;br /&gt;
  Prn.PrintTable(0, Tbl.Self);   &lt;br /&gt;
  Prn.EndDoc&lt;br /&gt;
 , );&lt;br /&gt;
&lt;br /&gt;
== Объект TBaseUtils ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции, базирующиеся на БД системы «MEASOFT». По-умолчанию, при создании подключается к основной базе данных модуля, в котором выполняется скрипт, если такая определена контекстом, однако это можно изменить, см SetConnection.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
'''MakeAddress(s[,town])''' – возвращает значение, полученное путем преобразований адреса s для приведения его к внутреннему формату программы. В процессе преобразования до нескольких раз происходит замена буквосочетаний по таблице замены (ее редактирование доступно по нажатию кнопки «Автозамена» в интерфейсе импорта БД из Excel системы (см. Руководство пользователя)), поиск улиц по базе КЛАДР с точностью до одного знака, и некоторые другие операции, нацеленные на исправление ошибок в написании адреса.&lt;br /&gt;
&lt;br /&gt;
С версии программы 2008.0.0.615, при вызове функции в формулах загрузки реестра, в первую очередь происходит проверка строки s на условия:&lt;br /&gt;
* в строке s записано  число; &lt;br /&gt;
* строка s начинается с &amp;quot;ПВЗ &amp;quot;. &lt;br /&gt;
Если одно из этих условий выполняется, то функция пытается установить пункт самовывоза - т.е она сама в загружаемой карточке корреспонденции укажет: адрес ПВЗ, город ПВЗ и установит галку самовывоз. &amp;lt;br/&amp;gt;Правила поиска ПВЗ:&lt;br /&gt;
* Если s число -  считаем его внутренним кодом филиала;&lt;br /&gt;
* Если s начинается с &amp;quot;ПВЗ &amp;quot; - Например в адресе передана строка &amp;quot;ПВЗ На Ленинском проспекте&amp;quot;, то искать будем филиал с названием &amp;quot;На Ленинском проспекте&amp;quot; который подчиненный, активный, с галкой ПВЗ и в городе town. Если город не указан, то ищем филиал во всех городах, и считаем его найденным если найдем только один филиал. &lt;br /&gt;
* Если филиалы найти не удалось, функция makeaddress работает как обычно и выполняет преобразование адреса.&lt;br /&gt;
&lt;br /&gt;
Если адрес не содержит русских букв, только латиница, и курьерская служба находится в одной из стран Россия, Белоруссия, Казахстан или Украина, и город-получатель (второй параметр, town) находится так же в одной из этих стран, функция автоматически делает транслитерацию адреса на русский язык.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''SetConnection(DB) – Подключает объект к базе данных DB, где DB – ссылка на объект TADO.Self.'' '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
''SetTown(Town) – Устанавливает код текущего города (используется в некоторых функциях объекта) в значение Town. По-умолчанию текущий город – 1.''  '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
'''SetIndexLength(Length)''' – Устанавливает длину почтового индекса. По-умолчанию – 6.&lt;br /&gt;
&lt;br /&gt;
'''GetIndex(Address)''' – Возвращает почтовый индекс из адреса.&lt;br /&gt;
&lt;br /&gt;
'''GetStreet(Address)''' - Возвращает улицу до первой запятой.&lt;br /&gt;
&lt;br /&gt;
'''GetHome(Address)''' - Возвращает номер дома до второй запятой, но не более пяти символов.&lt;br /&gt;
&lt;br /&gt;
'''GetKurierByStation(station, Mass, Cash, Date_Putn)'''&lt;br /&gt;
&lt;br /&gt;
'''TownByIndex(Index[, PriorityName][, PriorityCountry])''' – Возвращает код города по индексу. В случае ошибки поиска – код текущего города. Если нашлось несколько населенных пунктов, и указано приоритетное название - выбирается населенный пункт, название которого начинается с PriorityName (если есть).&lt;br /&gt;
&lt;br /&gt;
'''TownByName(Name[,NotNeedCL=False, City=0])''' – Возвращает код города по имени. В случае ошибки поиска – возвратит код текущего города. Если параметр NotNeedCL (параметр не обязательный) установить в TRUE, тогда функция возвратит 0, если город не удалось найти. Параметр City (код региона) позволяет ограничить поиск одной областью (не обязательный, по умолчанию не используется).&lt;br /&gt;
&lt;br /&gt;
'''FillClientInfo(Excel, client, Sheet, Row, Col)''' – Выводит в эксель информацию о клиенте с кодом client на лист sheet начиная со строки row и столбца col.&lt;br /&gt;
&lt;br /&gt;
'''SavePrintFormToFile(FormType, FormNumber)''' - Сохраняет на диске файл печатной формы и возвращает путь к нему&lt;br /&gt;
&lt;br /&gt;
'''CreateTrans(Address[, Store][, Operator][,Correction])''' - Формирует запись для печати кассового чека для корреспонденции с кодом Address, для выбора кассового аппарата используется код склада Store. Если Store не указано - при исполнении в среде клиентского модуля системы использует склад, указанный пользователем в окне [[Настройка параметров рабочего места|&amp;quot;Настройка&amp;quot; - &amp;quot;Параметры&amp;quot;]], в остальных модулях - код текущего склада из [[Настройка глобальных параметров|переменной]] &amp;quot;CL&amp;quot; (&amp;quot;Текущий филиал&amp;quot;). Поле Operator позволяет указать кассира (передается код справочника сотрудников). Если не указан, в основной системе будет использован код авторизованного пользователя, в других модулях - 1.&lt;br /&gt;
Поле Correction позволяет указать данные для корректировочного чека, используется в системе Штрих-М. По умолчанию пустая строка. Возвращает идентификаторы записей чеков. Может вернуть пустую строку, если чек создавать не понадобилось, один или несколько кодов через запятую, если создано несколько чеков. В случае ошибки вызывает ошибку, поэтому рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CreateReturnTrans(Address)''' - формирует запись для печати чека возврата для корреспонденции с кодом Address. Чек возврата печатается на полную сумму и с теми же атрибутами, что и чек продажи. Возвращает идентификатор записи чека возврата. В случае ошибки вызывает ошибку, поэтому, как и с CreateTrans,  рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownDeliveryDays(Source, Mode, TownTo, TownFrom)''' - возвращает количество дней необходимых на доставку отправления, только для межгорода. Source - код клиента, Mode - режим срочности, TownFrom - код города отправителя, TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcDeliveryDate(Source, Mode, TownTo, TownFrom, Date_Beg, Time_beg)''' - Возвращает планируемую дату доставки с учетом сроков доставки. Работает при городской и междугородней доставке. Для межгорода сроки доставки берутся из зон. Для городской доставки, из дополнительных параметров статуса (17 статус, 1 параметр в доп. информации)  Если рассчитать дату планируемой доставки не удалось, возвращает пустую строку. Параметры: Source - код клиента, Mode - режим срочности, TownTo - город получатель, TownFrom - город отправитель, date_beg - дата заказа (может быть передана строкой в формате DD.MM.YYYY или в числовом), time_beg - время заказа. &lt;br /&gt;
&lt;br /&gt;
'''GenSpecialSMA(DirectExcel, Code)''' - функция для генерации отчета о доставке по акту передачи денег. Первый параметр - указатель на TDirectExcel, второй параметр - код акта передачи денег. АПД выводится на текущий лист объекта TDirectExcel.&lt;br /&gt;
&lt;br /&gt;
'''CreateSpecialSMA(ClientCode, DateTo)''' - Функция создает исходящий акт передачи денег (АПД). Требует ClientCode - код клиента, DateTo - дату акта. Функция возвращает коды созданных актов. Если возвращаемых параметров два, значит функция пыталась создать два АПД: первым, идет код АПД с наличной оплатой, а вторым с безналичной. Примеры возвращаемого результата: '0'- акт не был создан, отсутствуют корреспонденции; '124' - код созданного акта; '0,0' - пытались создать два акта, но отсутствуют данные; '4556,0' - создан только наличный АПД; '0,445' - создан только безнал.; '4556,445' - созданы нал. и безнал.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressForActDelivery(ActCode, [DeliveryDateMode=0, Delivery=True])''' - Функция создает корреспонденцию на доставку акта. ActCode - код акта; DeliveryDateMode: 0 - установить план. дату доставки текущим рабочим днем, 1 - установить план. дату доставки следующим рабочим днем, 2 - установить план. дату доставки равной планируемой дате оплаты АПД; Delivery - создать корр. на доставку АПД или создать корреспонденцию на забор АПД (по умолчанию, доставка АПД). Работа функции может быть изменена системной доп. возможностью OnCreateAddressForActDelivery.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressTransferAct(ClientCode, Store, DateTo, [AdditionalParam])''' - Функция создает исходящий акт передачи корреспонденции (АПК). Требует  ClientCode - код клиента, Store - код филиала, для которого будет создан акт, DateTo - дату, до которой в акт попадут возвраты, AdditionalParam - дополнительный строковый параметр для передачи в системную доп. возможность ExceptionsForAPK, позволяющий отобрать в акт, например, только полные возвраты.   Возвращает код созданного акта. ВНИМАНИЕ: при создании АПК используется системная функция ExceptionsForAPK. Если в ней используются интерактивные функции (вывод сообщений, диалоговые окна, выполнение скриптов), то акт сформирован не будет, а функция CREATEADDRESSTRANSFERACT вернет ошибку.     &lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByAddress(Address, TownCode, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попал адрес. Если полигон найти не удалось, функция возвратит пустую строку. Address - адрес корреспонденции текстом; TownCode - код города; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByAddress(addressrecord.address, if((addressrecord.number=0)*(addressrecord.strbarcode=&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;), addressrecord.townfrom, addressrecord.townto), '`schema`=1') - пытаемся найти вхождение адреса в полигоны 1 схемы, при выборе города учитывается корр. на забор, у нее нужно использовать город-отправитель (а для обычной корр. нужен город-получатель).&lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByLatLon(Lat, Lon, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попали GPS координаты. Если полигон найти не удалось, функция возвратит пустую строку. Lat - широта  текстом; Lon - долгота текстом; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByLatLon('55.769064','37.590713','zone is not null and price=0') - пытаемся найти вхождение координат в полигоны, где задана зона, для всех клиентских и курьерских зон.&lt;br /&gt;
&lt;br /&gt;
'''GetLatLonByAddress(AddressText, TownCode)''' - возвращает географические координаты вида lat,lon указанного в AddressText адреса. Поиск производится в городе, имеющем код TownCode в таблице Town.&lt;br /&gt;
&lt;br /&gt;
'''GetRouteCode(AddressText, TownCode, LatLon[, Lon])''' - для адреса AddressText в городе с кодом TownCode (из таблицы Town) по географическим координатам lat, lon возвращает код роута (записи, хранящей координаты адреса в городе). Если роут не найден (для адреса в городе не найдено записи с указанными координатами) - создает новый роут и возвращает его код, если роут найден (был создан ранее) - обновляет у роута координаты. Если параметр Lon задан, то параметр LatLon должен содержать одну координату, иначе LatLon должен содержать строку вида 'lat, lon'.&lt;br /&gt;
В случае ошибки возвращает Null.&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode(address, townto, '55.114034, 36.592397'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Троицк, Полковника милиции Курочкина ул., 11', 1, '37.467446, 55.740537'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Обнинск, Маркса пр., 20', TownByName('Обнинск'), 55.114034, 36.592397));&lt;br /&gt;
&lt;br /&gt;
'''CalcAgentPrice(AddressCode, AgentCode, TownFrom, TownTo, Mode, [, Count=1])''' - функция возвращает стоимость доставки рассчитанную по тарифу агента. AddressCode - код адреса, AgenCode - код филиала (агента), TownFrom - код города отправителя, TownTo - код города получателя, Mode - режим срочности, count - тарифная сетку от указанного количества отправлений (по умолчанию 1)&lt;br /&gt;
&lt;br /&gt;
'''SetAddrKol_vo(address, getkol_vo)''' - функция делает прием корреспонденции в текущем ответственном филиале. address - внутренний код адреса, getkol_vo - количество принимаемых мест, может принимать значения: &amp;quot;kol_vo&amp;quot; - принять все места, &amp;quot;getKol_vo+1&amp;quot; - принять еще одно место, &amp;quot;число&amp;quot; - сделать количество принятых мест равным указанному числу.&lt;br /&gt;
&lt;br /&gt;
'''CalcClientCnt(client_code, date, is_intown [, date_put=CurrDate(), skipajust=false])''' - функция расчета количество доставленных корреспонденций у клиента с кодом client_code за предыдущий месяц от даты date (Или за текущий месяц, подробнее смотри переменную UseCurrentMonthCount) среди внутригородских (is_intown = true) либо междугородних (is_intown = false) корреспонденций, date_put - дата доставки (для альтернативного способа подсчета, включаемого переменной UseDatePutForCalcCnt), skipajust - не учитывать принудительно введенные количества (таблица priceclientadjust типы записей 0 и 1).&lt;br /&gt;
&lt;br /&gt;
'''GetBasePrice''' - возвращает базовую стоимость доставки посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов,зоны,типа,срочности,массы, расстояния. В системах с выключенными доп. услугами также считает проценты от суммы и страховки. &lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset._self&amp;quot;.&lt;br /&gt;
  Описание некоторых полей датасета:&lt;br /&gt;
    pmoney - процент от суммы;&lt;br /&gt;
    pmoneycard - процент от суммы при оплате картой;&lt;br /&gt;
    pricecode - код прайса (таблица Price) ;&lt;br /&gt;
    distarea - район метро получателя (актуально при отключённом едином районировании, как правило район от 200 до 299 является признаком области);&lt;br /&gt;
    region - признак области при включенном едином районировании;&lt;br /&gt;
    distareaFrom и regionFrom  - аналог distarea, region только для отправителя;&lt;br /&gt;
    pcncode - код записи таблицы pricecnt &amp;quot;количество от&amp;quot;;&lt;br /&gt;
    Запрос содержит поля таблицы pricelinesnew - начальная стоимость по тарифной сетки, найденные без учета массы,только по типу срочности и режиму.&lt;br /&gt;
    Запрос содержит поля таблицы price.&lt;br /&gt;
&lt;br /&gt;
*addressrecord - ссылка на объектную модель карточки корреспонденции, следует использовать уже созданную addressrecord._self&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*type - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*wait - количество минут ожидания (не учитывается при доп. услугах, есть системная услуга &amp;quot;ожидание&amp;quot;);&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*rur - сумма передаваемых денег (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от суммы&amp;quot;);&lt;br /&gt;
*inshprice - сумма страховки (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от объявленной стоимости&amp;quot;);&lt;br /&gt;
*distance - расстояние до места доставки, обычно поле заполняется при доставке в область (регион в едино районировании). Дополнительная наценка к стоимости доставки;&lt;br /&gt;
*forward - направление доставки: true - туда; false - обратно;&lt;br /&gt;
*Collection - признак заборной корреспонденции: true - забор, false - доставка (В тарифе есть возможность указать стоимость для забора);&lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
В тарифе есть возможность указать формулу, которая может влиять на базовый расчет. Формула может объявить служебные переменные, которые:&lt;br /&gt;
*$FormulaReplace - если true – возвращаемое значение полностью заменяет базовый расчет;&lt;br /&gt;
*$FormulaKoeff - коэффициент на который будет помножена базовая стоимость.&lt;br /&gt;
Также внутри формулы объявлены следующие объекты dataset, addressrecord и переменные:&lt;br /&gt;
*$ForceIntown - Переменная становится истиной, если междугородний расчет был отменен, т.к. адрес попал в нарисованную зону на карте.&lt;br /&gt;
*а также: $forward, $distance, $Count, $Collection, $Wait, $FormulaKoeff, $PriceCode - описание есть выше.&lt;br /&gt;
&lt;br /&gt;
Для направления &amp;quot;туда&amp;quot;, Функция GetBasePrice вызывается  через доп. услугу &amp;quot;База&amp;quot; (при включенных доп. услугах), для направления &amp;quot;Обратно&amp;quot; всегда вызывается напрямую (т.к. доп. услуги работают только в для направления &amp;quot;туда&amp;quot;).&lt;br /&gt;
На расчет этой функции влияют следующие переменные: &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Расчет стоимости по адресу&amp;quot;, &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Зона клиента по умолчанию&amp;quot;,  &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Подсчет кол-ва отправлений за месяц&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownPrice''' - возвращает базовую стоимость междугородней доставки, посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов, типа, срочности, массы, расстояния.&lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset.self&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*tp - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcAddressPrice(AddressCode, [,ZakazCount])''' - полностью пересчитывает стоимость доставки корреспонденции по тарифу клиента. AddressCode - внутренний код адреса, ZakazCount - не обязательный параметр, кол-во заказов от клиента.&lt;br /&gt;
&lt;br /&gt;
'''GetStationCode(s [,town])''' – возвращает код станции метро, ассоциированный в системе с адресом s. В случае невозможности идентифицировать станцию метро – возвращает 0. &lt;br /&gt;
Когда включено районирование по карте, необходим второй параметр &amp;quot;town&amp;quot; - код города в котором нужно искать адрес.  Возвращает код района если удалось его найти; код станции меж-города - если адрес удалось геокодировать, но район не нашли; код 0 - когда не удалось геокодировать адрес.&lt;br /&gt;
&lt;br /&gt;
'''RecalcSpecialSMA(ActCode)''' - пересчитать акт передачи денег (АПД). Также, у корреспонденций входящих в АПД будет пересчитана стоимость доставки. Для Входящего АПД сумма акта не пересчитывается. Параметр ActCode - внутренний код акта, коды можно перечислять через запятую.&lt;br /&gt;
&lt;br /&gt;
'''UserCode''' - Возвращает код текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserName''' - Возвращает имя текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserPass''' - Возвращает пароль текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''UserBaseCode''' – Возвращает код текущего пользователя из таблицы «Сотрудники» (kurier).&lt;br /&gt;
&lt;br /&gt;
'''UserEmail''' - Возвращает e-mail текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''CurrentTown''' – Возвращает код текущего города (из таблицы town).&lt;br /&gt;
&lt;br /&gt;
'''CurrentCity''' – Возвращает код текущего региона (из таблицы city).&lt;br /&gt;
&lt;br /&gt;
'''CurrentLocation''' – Возвращает код текущего филиала (из таблицы store).&lt;br /&gt;
&lt;br /&gt;
'''FromEmailStr''' - строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
'''FillExcelDoc'''(Excel, Dataset, FormType, FormNumber,Print,[printer]) - Выполняет указанную печатную форму в объекте excel. Excel объект можно не указывать, тогда функция сама создаст объект экселя и разрушит его, полезно когда книгу &lt;br /&gt;
нужно распечатать или отправить по email (на листе данных в ячейке 1,1 укажите ключевое слово email). Dataset объект с данными для скрипта в печатной форме, может быть null. Dataset передавать можно так db.self, тогда переданный dataset внутри печатной формы будет доступен по имени dataset. Print - печатает книгу на принтере, после печати объект excel разрушается, при использовании параметра не указываете объект excel. Printer - имя принтера, на котором печатать (по умолчанию пустая строка, что означает &amp;quot;печатать на принтере по умолчанию&amp;quot;). Например:&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'excel');&lt;br /&gt;
 FillExcelDoc(excel.self, null, 12, 1);&lt;br /&gt;
 excel.DoNotDestroy(true);&lt;br /&gt;
 excel.SetVisible(true);&lt;br /&gt;
 ''Покажет эксель с выполненной печатной формой''&lt;br /&gt;
&lt;br /&gt;
'''ValutaSign''' – Возвращает название валюты для суммы.&lt;br /&gt;
&lt;br /&gt;
'''SendToMeasoft(xml)''' - Отправляет запрос в клиентское API Measoft. Автоматически добавляет начальный &amp;quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''InsertFirmAtt(excel, sheet, firmcode)''' - Вставляем на лист эксель по коду фирмы: печать, подпись, подпись бухгалтера, логотип. Тэги &amp;lt;STAMP&amp;gt;, &amp;lt;DIR&amp;gt;, &amp;lt;BUH&amp;gt;, &amp;lt;LOGO&amp;gt; соответственно. После тега можно указать размеры изображения в символах Microsoft Excel. Формат записи: &amp;lt;STAMP&amp;gt; 16, 16&lt;br /&gt;
&lt;br /&gt;
'''PreCalcSalary(kurier, addressCodes)''' - Рассчитывает предварительную зарплату. Kurier - код курьера, используется для определения тарифа. addressCodes - коды адресов, через запятую для которых необходимо посчитать зарплату. Результаты расчета будут записаны в таблицу kurierpaydetail, так как расчет предварительный то записи не будут прикреплены к конкретному начислению. &lt;br /&gt;
&lt;br /&gt;
  select a.code, kpd.price as &amp;quot;туда&amp;quot;, kpd2.price as &amp;quot;обратно&amp;quot; from address a &lt;br /&gt;
  left join kurierpaydetail kpd on kpd.sourcetable=3 and kpd.sourcecode=a.code and kpd.rectype = 1 &lt;br /&gt;
  left join kurierpaydetail kpd2 on kpd2.sourcetable=3 and kpd2.sourcecode=a.code and kpd2.rectype = 2&lt;br /&gt;
  where a.code in (...)&lt;br /&gt;
&lt;br /&gt;
'''CalcSalary(DateTo, [Filter=0, KurierCode = 0, ManagerCode = 0])''' - Полный расчет зарплаты курьерам. DateTo  - дата до которой создается начисление. Условия отбора курьеров для начисления. Filter - роль сотрудника: 0 - Все, 1 - курьеры, 2 - менеджеры; KurierCode - код курьера, ограничить расчет зарплаты одним курьером;ManagerCode - код курьера, ограничить расчет зарплаты курьерами указанного менеджера. Внимание фильтры Filter, KurierCode и ManagerCode накладываются друг на друга. Результатом функции является SubSQL с информацией по созданным начислениям. &lt;br /&gt;
  поля ответа: код курьера, код менеджера, начислено, бонусы, штрафы, аванс, итого;&lt;br /&gt;
  select kurier, manager, profit, bonus, shtraf, prepay, total  [union select ...]&lt;br /&gt;
&lt;br /&gt;
'''SelDistAddr(s)''' – Возвращает строку для вставки в select запрос, для вывода поля с упрощенным адресом. Принимает один необязательный строковый параметр - алиас таблицы из которой будет упрощаться поле address, по умолчанию &amp;quot;a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''VoiceReadStr(str)''' – Озвучивает фразу str голосовым уведомлением доступными словами из базы. Может содержать тег &amp;quot;{break_off}&amp;quot; для того, чтобы сделать эту фразу не пропускаемой в очереди воспроизведения.&lt;br /&gt;
&lt;br /&gt;
'''CalcStorageCost(ClientCodes, DateFrom, DateTo, NeedReport[, Store])''' – рассчитывает стоимость хранения на складе для выбранных клиентов (ClientCodes - коды клиентов через запятую), в период дат с DateFrom до DateTo, с прикреплением к корреспонденции отчета в зависимости от выставленного параметра NeedReport. Может содержать параметр Store - код филиала, по умолчанию пустой (расчет выполняется для всех филиалов). Возвращает коды созданных корреспонденций через запятую.&lt;br /&gt;
&lt;br /&gt;
'''WriteOut(DocId, ItemId, Date, Cnt[, BC])''' – производит списание товара со склада. DocId - код (docs.code) документа списания, ItemId - код товара (item.code), Date - дата операции, Cnt - количество списываемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер. Если указан BC, то параметр ItemId игнорируется и поиск номенклатуры происходит исключительно по штрих-коду. В случае успеха, функция возвращает строку вида: код номенклатуры, списанное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''IncomePurch(DocId, ItemId, Date, Cnt[, BC, Location = CurrentLocation])''' – производит приход товара на склад. DocId - код (docs.code) приходной накладной, ItemId - код товара (item.code), Date - дата операции, Cnt - количество приходуемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер, Location - код склада (store.code).  В случае успеха, функция возвращает строку вида: код номенклатуры, введенное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''CreateLedgerDoc(Date, Client, UserCode, Type[, ExtNumber, Message])''' - создает складской документ и возвращает код этого документа. Date - дата документа. Client - код клиента. UserCode - код пользователя, создавшего документ. Type - тип документа (statetype = 13). ExtNumber - номер у поставщика для документов прихода и расхода. Message - комментарий к документу. Последние два аргумента не обязательные и могут быть пустыми.&lt;br /&gt;
&lt;br /&gt;
== Объект TINIFile ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции работы с ini-файлами. В некоторых контекстах создается автоматически для предоставления доступа к настроечному файлу модуля, выполняющего скрипт.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
IniParam(s[,section='common']) – Существует только если имя экземпляра объекта пустое. Возвращает значение параметра s ini-файла секции «common», изменить секцию можно не обязательным параметром section. В случае отсутствия параметра в файле возвращает пустую строку. &lt;br /&gt;
&lt;br /&gt;
Param(s) – Синоним IniParam с тем отличием, что существует только если имя объекта непустое.&lt;br /&gt;
&lt;br /&gt;
SetText(s) - Загружает ini файл из строки s. Если в файле нет секции «common», то принудительно объявляет ее в начале.&lt;br /&gt;
&lt;br /&gt;
== Объект TSMS ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для отправки SMS, а также проверки статуса их доставки.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetProxy(Server, Port, User, Pass) - Устанавливает настройки прокси-сервера.&lt;br /&gt;
&lt;br /&gt;
Connect(Provider, Host, User, Pass, SenderName, SMSPrefix) – Подключает объект к провайдеру provider, используя адрес Host, имя пользователя User и пароль Pass. Значение SMSPrefix предназначено для того, чтобы провайдер мог различить сообщения от разных филиалов, если этими филиалами используется одно подключение. Если необходимости разделять сообщения нет - значение SMSPrefix можно не указывать.&lt;br /&gt;
Для провайдера доступны значения 'mirsms', 'sms16', 'websms', 'epochta', 'zanzara', 'SMSManager', 'f1sms', 'BitCall', 'mirsmsGET', 'AMD' и другие, либо можно указать числовые значения номера протокола, от 1 до &amp;lt;rspoiler text=&amp;quot;20&amp;quot;&amp;gt;Набор провайдеров все время дополняется, количество и номера можно смотреть в Справочники - Переменные - Подключения - SMS&amp;lt;/rspoiler&amp;gt; соответственно. Эти значения соответствуют значениям переменной SMSProtocol таблицы &amp;quot;Value&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SendSMS(Phone, Text, [ID]) – Отправляет SMS с текстом Text на телефон Phone. Для некоторых провайдеров необходим уникальный идентификатор сообщения ID (для провайдера iVoice - идентификатор сценария (кампании)). Возвращает ID провайдера для последующей проверки статуса доставки.&lt;br /&gt;
&lt;br /&gt;
CheckSMS(ProviderID) – Проверяет состояние доставки сообщения с идентификатором ProviderID. Возвращает: 0 – доставляется, 1 – успешно доставлено, 2 – не доставлено.&lt;br /&gt;
&lt;br /&gt;
ReceiveSMS(InboxID, DateFrom, DateTo, NewOnly) - Получает входящие SMS, с ящика InboxID (идентификатор выдаётся провайдером). DateFrom, DateTo - задается временной интервал в котором были приняты сообщения(формат 08.04.2013 18:00:00 'DD.MM.YYYY HH:NN:SS'). Чтобы получать только новые сообщение поле NewOnly должно быть True. Возвращает XML с сообщениями.&lt;br /&gt;
&lt;br /&gt;
ExtraResult([ParamName='']) - Вызывается после CheckSMS, возвращает дополнительную информацию по последнему статусу смс. В настоящее время работает только для провайдеров BitCall и iVoice. Для BitCall по умолчанию возвращает кнопки, нажатые абонентом во время работы с голосовым меню. Если в paramname указать 'IdentifyText' то будет возвращен JSON  с ответами абонента на заданные вопросы(используется в случае звонков с индивидуальным сценарием). Для iVoice по умолчанию подразумевается параметр 'response', при этом будет возвращен JSON  с ответами абонента на заданные вопросы (в зависимости от сценария)&lt;br /&gt;
&lt;br /&gt;
Log - Возвращает последний HTTP запрос и ответ от сервера смс.&lt;br /&gt;
&lt;br /&gt;
== Объект TXML ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга XML-данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст XML документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию. Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля.&lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
AttribCount – Возвращает количество атрибутов текущего элемента.&lt;br /&gt;
&lt;br /&gt;
AttribName(i) – Возвращает имя атрибута с номером i.&lt;br /&gt;
&lt;br /&gt;
Attrib(V) – Ищет атрибут и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
== Объект TJSON ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга JSON-данных. &lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст JSON документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля. &lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Можно проверять наличие элементов, если элемента нет, вернется пустая строка.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
isArray - Возвращает true, если текущий элемент является массивом (доступ к дочерним элементам возможен только по индексу, нумерация элементов начинается с нуля)&lt;br /&gt;
&lt;br /&gt;
==Объект TZip==&lt;br /&gt;
Предназначен для работы с Zip архивом. &lt;br /&gt;
&lt;br /&gt;
SetZip(s) - Загружает архив в объект из строки s;&lt;br /&gt;
&lt;br /&gt;
GetZip - Возвращает архив в виде строки;&lt;br /&gt;
&lt;br /&gt;
AddFromFile(SrcPath, ZipPath) - Добавляет файл SrcPath в архив и располагает его по пути ZipPath. ZipPath содержит имя файла в архиве, при необходимости можно указать каталог; &lt;br /&gt;
&lt;br /&gt;
AddFromStr(Data, /*ZipPath*/) - '''параметр ZipPath временно не работает'''. Добавляет файл из строки Data в архив и располагает его по пути ZipPath.  -ZipPath содержит имя файла в архиве, при необходимости можно указать каталог;&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(path) - Загружает архив из файла path;&lt;br /&gt;
&lt;br /&gt;
SaveToFile(path) - Сохраняет архив в файл path;&lt;br /&gt;
&lt;br /&gt;
Count - Возвращает кол-во файлов в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByIndex(index) - Возвращает распакованный файл в виде строки. Index - номер файла в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByName(ZipPath) - Возвращает распакованный файл в виде строки. ZipPath - путь к файлу в архиве, может содержать каталоги;&lt;br /&gt;
&lt;br /&gt;
FileName(index) - По номеру файла, функция возвращает полный путь файла в архиве.&lt;br /&gt;
&lt;br /&gt;
==Объект TBase==&lt;br /&gt;
&lt;br /&gt;
'''Функции общего назначения''':&lt;br /&gt;
&lt;br /&gt;
'''ExecSimpleScript(Caption, Text)''' - Выполняет скрипт &amp;quot;Дополнительных возможностей&amp;quot;. Возвращаемые значения, введенные пользователем устанавливает в переменные $scriptvar1..$scriptvarN, Значения кодов списочных переменных - в переменных $scriptvar1codes..$scriptvarNcodes. Функция возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot; в диалоговом окне.&lt;br /&gt;
&lt;br /&gt;
'''FillAdvPriceReport(Excel, AddressCodes, StartLine, StartCol, [ShowSumPrice,InsertColumns,ShowAll])''' - добавляет отчёт по дополнительным услугам. В AddressCodes - указаны коды адресов через запятую, каждый код это отдельная строка отчета. Адреса будут показаны в порядке перечисления их в AddressCodes. Если в отчет нужно добавить пустую строку, то можно указать код адреса -1000. StartLine, StartCol - верхний левый угол выгружаемой таблицы. ShowSumPrice - добавить столбец итоговый столбец с суммой всех услуг, по умолчанию выключено. InsertColumns - раздвинуть таблицу перед вставкой отчета, позволяет встраивать отчет посередине выгрузки, по умолчанию выключено. ShowAll - показать все дополнительные услуги, по умолчанию false и показывает только услуги с начислениями. Функция возвращает количество использованных столбцов.&lt;br /&gt;
&lt;br /&gt;
'''PrintSticker(Codes, [ToBoxes=False])'''&lt;br /&gt;
&lt;br /&gt;
'''PrintBlanc(Codes, BlancNumber)''' - печатать форму из раздела &amp;quot;Заполнить бланк&amp;quot;. Codes - коды корреспонденций, BlancNumber - номер формы из раздела &amp;quot;Бланки для корреспонденции&amp;quot; (3)&lt;br /&gt;
&lt;br /&gt;
'''GetItemByName(Name)'''&lt;br /&gt;
&lt;br /&gt;
'''GetA4Printer([GetPrinterPort=False])''' - возвращает имя принтера выбранного для печати документов. GetPrinterPort - попытаться по имени принтера найти порт принтера, используйте для печати через команду ghostscript. Определение порта работает только с физическими устройствами LPT, USB, TCPIP. &lt;br /&gt;
&lt;br /&gt;
'''GetStickerPrinter([GetPrinterPort=False])''' - возвращает имя принтера выбранного для печати стикеров. GetPrinterPort - попытаться по имени принтера найти порт принтера, используйте для печати через команду ghostscript. Определение порта работает только с физическими устройствами LPT, USB, TCPIP. &lt;br /&gt;
&lt;br /&gt;
'''GetDuplexPrinter([GetPrinterPort=False])''' - возвращает имя принтера выбранного для двусторонней печати, если принтер не выбран, возвращает пустую строку. GetPrinterPort - попытаться по имени принтера найти порт принтера, используйте для печати через команду ghostscript. Определение порта работает только с физическими устройствами LPT, USB, TCPIP. &lt;br /&gt;
&lt;br /&gt;
'''PrintAttachPDFPage(Code, FileName, Page, Printer)''' - печатает страницу из вложенного файла PDF. Code - код вложения (attachment) или путь к файлу, Page - номер страницы, Printer - 0 = принтер A4, 1 = принтер этикеток. &lt;br /&gt;
&lt;br /&gt;
'''AttachPDFToText(Code, [TextFileName])''' - преобразует файл PDF из вложений в текст. Code - код вложения (attachment) или путь к файлу, TextFileName - имя текстового файла, в который записывается результат (если не указан, используется временный файл). Возвращает текст в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''GhostScript(GScript, Code)''' — функция для выполнения консольных команд утилиты [https://ghostscript.readthedocs.io/en/latest/Use.html ghostscript]. Где, GScript — строка с командами Ghostscript; Code — код вложения или путь к PDF-файлу, предназначенному для обработки. В командах доступен специальный тег %MeasoftInFile%, который автоматически заменяется на путь к предварительно загруженному файлу (Code). Если в команде необходимо указать путь для сохранения результата обработки, используйте тег %MeasoftOutFile%. В этом случае функция на основании параметра Code автоматически сформирует имя временного выходного файла. После успешного выполнения команд функция возвращает путь к сгенерированному выходному файлу -  %MeasoftOutFile%.&lt;br /&gt;
&lt;br /&gt;
'''GetActiveForm([SkipFormName])''' - возвращает код активной формы в программе где происходит сканирование. SkipFormName - не обязательны параметр, имя формы которую нужно пропустить при определении интерфейса.&lt;br /&gt;
 '''Список интерфейсов''': &lt;br /&gt;
 0 - неопределенный; &lt;br /&gt;
 1 - прием корреспонденции на склад; &lt;br /&gt;
 2 - АПД; &lt;br /&gt;
 3 - комплектация адресов (ShelfingForm); &lt;br /&gt;
 4 - доска приема; &lt;br /&gt;
 9 - вкладка «Манифесты»; &lt;br /&gt;
 10 - Инвентаризация корреспонденции; &lt;br /&gt;
 11 - АПК; &lt;br /&gt;
 12 - вкладка «Адреса»; &lt;br /&gt;
 13 - вкладка «Выдача»; &lt;br /&gt;
 14 - вкладка «Склад»; &lt;br /&gt;
 15 - Список номенклатуры; &lt;br /&gt;
 16 - Инвентаризация склада; &lt;br /&gt;
 17 - Приходная накладная; &lt;br /&gt;
 18 - Списание товара; &lt;br /&gt;
 19 - Карточка корреспонденции.&lt;br /&gt;
&lt;br /&gt;
'''AddAddressScanLog(Code[, StrBarCode, IsManual, FromInterface, ExtraInfo])''' - добавляет событие сканирование для корреспонденции с кодом Code. Необязательные параметры: StrBarCode - сканируемый ШК корреспонденции (по умолчанию пустой), IsManual - галка ручного сканирования (по умолчанию false), FromInterface - код интерфейса сканирования (StateType=81, по умолчанию 0 - неопределенный), ExtraInfo - текстовый комментарий события.&lt;br /&gt;
&lt;br /&gt;
'''RuleName(alias)''' - Выдает полный путь в дерева прав по псевдониму права.&lt;br /&gt;
&lt;br /&gt;
'''ShowText(Caption:string, Value:string)''' - показывает пользователю окно с заголовком Caption и с многострочным полем со значением Value. Может быть полезен при отображении логов выполненной операции. &lt;br /&gt;
&lt;br /&gt;
'''ShowScanError(msg [, Speek, Color, Abort])''' - выдает пользователю окно с текстом msg блокируя последующие действия сканирования. Если Speek - истинно, то сообщение проговаривается голосовым движком, по умолчанию выключено. Color - целочисленное число цвета, в который будет окрашен фон сообщения (по умолчанию = -1, стандартный). Abort  - прервать выполнение скрипта, не показывая ошибку.&lt;br /&gt;
&lt;br /&gt;
'''CheckRule(alias)''' - функция проверки разрешения у текущего пользователя системы, alias - псевдоним права. Возвращает 1, если право есть и 0, если права нет. &lt;br /&gt;
 Пример: if(CheckRule('RSE'), ShowMessage('У пользователя есть право изменять счета'), ShowMessage('У пользователя нет права изменять счета'));&lt;br /&gt;
&lt;br /&gt;
'''GetKurierMoney(KurierCode, DateEnd, NonCash)''' - возвращает баланс курьера с кодом KurierCode на дату DateEnd. NonCash - булевый флаг, если истинно, то будет рассчитан безнальный баланс; &lt;br /&gt;
&lt;br /&gt;
'''Функции, работающие только в импорте БД из эксель:'''&lt;br /&gt;
&lt;br /&gt;
ReplaceAddress&lt;br /&gt;
&lt;br /&gt;
GetItemByCode - Поиск товара по артикулу. Внимание: в пределах одного клиента может быть несколько товаров с одинаковыми артикулами. В этом случае функция найдет последний заведенный товар.&lt;br /&gt;
&lt;br /&gt;
GetPrice&lt;br /&gt;
&lt;br /&gt;
GetNewNumber - используется при импорте реестра, возвращает номер конверта в загружаемом заказе&lt;br /&gt;
&lt;br /&gt;
GetNewPos - используется при импорте реестра, возвращает порядковый номер вложения&lt;br /&gt;
&lt;br /&gt;
GetNewPackagePos- используется при импорте реестра, возвращает порядковый номер места&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zakaz - возвращает номер заказа куда происходит импорт реестра&lt;br /&gt;
&lt;br /&gt;
addresscode  -  используется при импорте реестра, код созданного адреса&lt;br /&gt;
&lt;br /&gt;
Source  - код заказчика&lt;br /&gt;
&lt;br /&gt;
ClientTown - Узнаем город клиента, через филиал с которым он работает. Сам клиент берется из заказа указанного в окне &amp;quot;Импорт БД из Excel&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Объект TFieldObject ==&lt;br /&gt;
Создается только автоматически. Объект для доступа к записям, используется в картах и дополнительных услугах (addressrecord) и событиях карточки корреспонденции (fieldlist). Методы объекта:&lt;br /&gt;
&lt;br /&gt;
'''_GetTableInfo''' - возвращает данные о полях и примеры данных объекта.&lt;br /&gt;
&lt;br /&gt;
'''_Self''' - возвращает ссылку на объект.&lt;br /&gt;
&lt;br /&gt;
'''_Set(fieldname, fieldvalue [, DoUpdateForm])''' - Если базовый объект строка. Устаналивает для поля fieldname значение fieldvalue. DoUpdateForm по уолчанию false, если указать true то обновление поля будет не только в объекте но и пользовательском интерфейсе. Обновление работает только в карточке корреспнденции для ограниченного набора полей: vlog, mode, type, date_put, time_put, message, kurier, state1.&lt;br /&gt;
&lt;br /&gt;
'''_Set(keyfield, keyvalue, filed, value)''' - Если базовый объект таблица (addressrecord.boxes). Работает перегруженная версия метода _set, cначала происходит поиск строки по ключу, далее меняется значение указанного столбца. keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца.  Пример, отключение услуги база:&lt;br /&gt;
&lt;br /&gt;
 addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
 priceconf - поле где записан код услуги;&lt;br /&gt;
 1 - услуга База;&lt;br /&gt;
 active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
== Объект TMessage ==&lt;br /&gt;
Создается только автоматически. Объект используется для скриптовой обработки письма в [https://wiki.courierexe.ru/index.php/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8#.D0.98.D0.BC.D0.BF.D0.BE.D1.80.D1.82_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85| заданиях импорта данных]. В себе содержит текст письма в очищенном формате и оригинальном формате HTML, отправитель письма, тему письма, дата получения и список прикрепленных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.Text''' - возвращает очищенный от HTML-тегов текст письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.HTMLText''' - возвращает оригинальный текст письма со всеми HTML-тегами.&lt;br /&gt;
&lt;br /&gt;
'''Message.Sender''' - возвращает email-адрес отправителя письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.AttachmentsCount''' - возвращает количество вложенных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.DateTime''' - возвращает дату и время получения письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.Subject''' - возвращает тему письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentDataString(Number)''' - возвращает вложенный файл под номером Number в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentName(Number)''' - возвращает имя вложенного файла под номером Number.&lt;br /&gt;
&lt;br /&gt;
== Объект TStringList ==&lt;br /&gt;
Может использоваться для построчной обработки многостраничных файлов либо для организации текстовых данных. Номер строк начинается с 0. &lt;br /&gt;
Имеет следующий функционал:&lt;br /&gt;
&lt;br /&gt;
'''Count''' - возвращает количество строк в списке.&lt;br /&gt;
&lt;br /&gt;
'''Add(Value:string)''' - добавляет значение Value в конец списка.&lt;br /&gt;
&lt;br /&gt;
'''SetText(Value:string)''' - устанавливает значение списка в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Insert(Number:integer, Value:string)''' - добавляет строку Value в позицию Number.&lt;br /&gt;
&lt;br /&gt;
'''Delete(Number:integer)''' - удаляет строку из списка в позиции Number.&lt;br /&gt;
&lt;br /&gt;
'''Clear''' - очищает элементы списка.&lt;br /&gt;
&lt;br /&gt;
'''LoadFromFile(Path:string)''' - загружает текстовый файл по пути Path.&lt;br /&gt;
&lt;br /&gt;
'''Strings(Number:integer)''' - возвращает строку с номером Number.&lt;br /&gt;
&lt;br /&gt;
'''SetString(Number:integer, Value:string)''' - устанавливает значение строки с номером Number в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Text''' - возвращает полный список строк в виде текста.&lt;br /&gt;
&lt;br /&gt;
'''CommaText([Quoted:boolean])''' - возвращает список значений через запятую. Если Quoted = true, то квотирует элементы списка. По умолчанию равен false.&lt;br /&gt;
&lt;br /&gt;
'''SetCommaText(Value: string)''' - разбивает значение Value на отдельные строки и кладет в список. Разделитель - запятые.&lt;br /&gt;
&lt;br /&gt;
'''IndexOf(Value:string)''' - ищет значение Value среди элементов списка и если находит, то возвращает номер строки. Возвращает -1 если значение не было найдено.&lt;br /&gt;
&lt;br /&gt;
'''Sorted(Value:boolean)''' - устанавливает флаг отсортированности списка в Value. Если Value = true, то сразу же его сортирует. По умолчанию Value = false.&lt;br /&gt;
&lt;br /&gt;
'''Exchange(Pos1:integer, Pos2:integer)''' - меняет элементы списка с позициями Pos1 и Pos2 местами.&lt;br /&gt;
&lt;br /&gt;
'''Duplicates(Value:integer)''' - изменяет параметр управления дубликатами в списке. Если Value = 0 (значение по умолчанию), то список не реагирует на дубликаты. Если Value = 1, то список при добавлении будет игнорировать дубликаты. Если Value = 2, то список будет выдавать исключение, при добавлении дубликата в список.&lt;br /&gt;
&lt;br /&gt;
'''ParamName(Number:integer[, Delimiter:string])''' - возвращает текст до первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает пустоту.&lt;br /&gt;
&lt;br /&gt;
'''ParamValue(Number:integer[, Delimiter:string])''' - возвращает текст после первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает всю строку.&lt;br /&gt;
&lt;br /&gt;
== Объект TFunc ==&lt;br /&gt;
Объект реализует создание и использование функций в скриптовом языке. Позволяет определять переиспользуемые блоки кода с параметрами.&lt;br /&gt;
Важно учитывать, что внтури функции создается свой инстанс интерпретатора и от туда не доступны никакие переменные\объекты кроме переданных в функцию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные методы:&lt;br /&gt;
&lt;br /&gt;
'''New'''(FuncName, Param1, Param2, ..., Body) — создание новой функции.Функция возвращает результат выполнения последней команды в теле функции. Аргументы:&lt;br /&gt;
* `FuncName` — имя функции (строка)&lt;br /&gt;
* `Param1, Param2, ...` — имена параметров функции (переменные начинаются с `$`, объекты — без префикса)&lt;br /&gt;
* `Body` — тело функции (скрипт, выполняемый при вызове)&lt;br /&gt;
&lt;br /&gt;
'''FuncName'''(Arg1, Arg2, ...) — вызов созданной функции по имени. Если в объявлении была указана тип переменная, то и подставлять в аргумент надо обязательно переменную. Будет передано значение этой переменной (переменные словарине поддерживаются!). Если был объявлен объект, то указатель на объект должен быть получен через метод '''_self'''. C функциями поддерживают работу следующие классы: TExcel, TDirectExcel, TCSVFile, TADO, TSelfADO, TPrinter, TCanvas, TPicture, TTable, TINIFile, TSMS, TXML, TJSON, TZip, TStringList, TBaseUtils, а также объект addressrecord (TFieldObject). Результатом работы функции может быть число или строка.&lt;br /&gt;
&lt;br /&gt;
Пример 1, обработка результатов функции:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'calc');&lt;br /&gt;
calc.new('Sum', '$a', '$b',&lt;br /&gt;
  $a + $b&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
set($x, 10);&lt;br /&gt;
set($y, 20);&lt;br /&gt;
showmessage(calc.Sum($x, $y));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример 2, передача объекта в функцию:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'utils');&lt;br /&gt;
utils.new('ProcessDB', 'dbConn', '$value',&lt;br /&gt;
  showmessage($value);&lt;br /&gt;
  dbConn.open('SELECT * FROM address limit 3 ');&lt;br /&gt;
  if(dbConn.recordcount &amp;gt; 0,&lt;br /&gt;
    showmessage('Найдено записей: ' + dbConn.recordcount);&lt;br /&gt;
    dbConn.first;&lt;br /&gt;
    while(dbConn.eof = 0,&lt;br /&gt;
      showmessage(dbConn.fieldbyname('code'));&lt;br /&gt;
      dbConn.next&lt;br /&gt;
    )&lt;br /&gt;
  ,0)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
utils.ProcessDB(db._self,'test!');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Применение языка формул ==&lt;br /&gt;
'''в различных контекстах системы «MEASOFT» и сопутствующих проектах'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MEASOFT ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительная информация на чеке ====&lt;br /&gt;
&lt;br /&gt;
В карточке клиента на закладке «Касса» имеется поле для ввода текста, который будет отображаться на кассовых чеках, печатаемых для корреспонденции от данного клиента. В поле может быть введен как просто текст, так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TSelfDB с открытым набором данных со строчкой корреспонденции, заказа и клиента, на которую печатается чек&lt;br /&gt;
&lt;br /&gt;
TBaseSupport&lt;br /&gt;
&lt;br /&gt;
TBaseValue&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Так же система записывает в переменную $CashRegisterID вычисленный код фискального регистратора, на котором предполагается печать чека.&lt;br /&gt;
&lt;br /&gt;
Результат работы скрипта печатается на создаваемом чеке, если скрипт не возвращает значение “-1” (число или текст) – в этом случае система чек не создает. Подразумевается, что либо скриптом было принято решение об отсутствии необходимости формирования чека, либо скрипт взял эту функцию на себя.&lt;br /&gt;
&lt;br /&gt;
==== Заполнение шаблонов печатных форм ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительные возможности ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Импорт БД из Excel ====&lt;br /&gt;
В окружении интерпретатора создается объект ZakazRecord, он является списком со значениями таблицы zakaz. Именно в этот заказ будут загружены данные. Из этого объекта также доступно :&amp;lt;br&amp;gt;&lt;br /&gt;
*ZakazRecord.userfields - пользовательские поля заказа;&lt;br /&gt;
*ZakazRecord.Clients - данные таблицы clients;&lt;br /&gt;
*ZakazRecord.Clients.userfields - пользовательские поля заказчика.&lt;br /&gt;
&lt;br /&gt;
==== Прайс лист клиента ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в валюте клиента для каждой поездки (туда или обратно) единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Помимо стандартных объектов, система создает объект AddressRecord, в котором, как свойства, доступны все поля текущей записи. Так же она выставляет значение переменной $Forward в 1 (истина), если необходимо произвести расчет для направления &amp;quot;Туда&amp;quot; и 0 (ложь) - если обратно. ВНИМАНИЕ! Как и во всех остальных местах, после формулы нельзя ставить &amp;quot;;&amp;quot;, иначе скрипт вернет 0!&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 if(int(AddressRecord.Time_Put_Max)&amp;gt;19, 100, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Прибавляет 100 рублей в случае, если максимальный срок доставки 20 часов или более''&lt;br /&gt;
&lt;br /&gt;
 if(pos(AddressRecord.Address, 'Аренда')&amp;gt;0, &lt;br /&gt;
           set($FormulaReplace, 1); &lt;br /&gt;
           1500&lt;br /&gt;
 , 0)&lt;br /&gt;
 &lt;br /&gt;
 ''В случае наличия подстроки &amp;quot;Аренда&amp;quot; в адресе заменяет штатное ценообразование на 1500 рублей''&lt;br /&gt;
&lt;br /&gt;
Объект AddressRecord может предоставить доступ к связанным таблицам :&lt;br /&gt;
* addressrecord.boxes&lt;br /&gt;
* addressrecord.packages&lt;br /&gt;
* addressrecord.clients&lt;br /&gt;
* addressrecord.price&lt;br /&gt;
* addressrecord.advprice&lt;br /&gt;
* addressrecord.userfields&lt;br /&gt;
* addressrecord.addressfld&lt;br /&gt;
* addressrecord.clients.userfields&lt;br /&gt;
* addressrecord.price.userfields&lt;br /&gt;
* addressrecord.zakaz&lt;br /&gt;
* addressrecord.zakaz.userfields&lt;br /&gt;
 &lt;br /&gt;
Чтобы получить доступ к полю VarCode из таблицы userfields необходимо записать AddressRecord.Userfields.VarCode. В присоединённой таблице может быть несколько записей чтобы получить к ним доступ предусмотрены функции _First, _EOF, _Next, _RecordCount, _Set.&lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
 set($value1, 0); set($value2, 0);&lt;br /&gt;
 while(AddressRecord.userfields._EOF=0,&lt;br /&gt;
   if(AddressRecord.userfields.varCode=1, &lt;br /&gt;
     set($value1, if(AddressRecord.userFields.VarValue='Праздничная упаковка', 150, 0)), ''''''');&lt;br /&gt;
   if(AddressRecord.userfields.varCode=2, &lt;br /&gt;
     set($value2, AddressRecord.userFields.VarValue), ''''''');&lt;br /&gt;
   AddressRecord.userFields._Next;&lt;br /&gt;
 );&lt;br /&gt;
 int($value1) + int($value2)&lt;br /&gt;
&lt;br /&gt;
Пример делающий тоже самое что и выше но через поиск Locate:&lt;br /&gt;
 set($value1, if(addressrecord.userfields.VarValue('VarCode', 1)='Праздничная упаковка', 150, 0));&lt;br /&gt;
 set($value2, int(addressrecord.userfields.VarValue('VarCode', 2)));&lt;br /&gt;
 $value1 + $value2&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
В скрипте доступны переменные: &lt;br /&gt;
«$FormulaKoeff» - это коэффициент на который умножится конечная цена (по умолчанию равна 1);&lt;br /&gt;
«$PriceCode»  - код прайса;&lt;br /&gt;
«$CurrentPriceConf»  - код услуги;&lt;br /&gt;
«$BasePrice» - стоимость всех услуг с уровнем (pricelevel) меньше текущего.&lt;br /&gt;
&lt;br /&gt;
Для вызова функции CalcBasePrice (Расчёт базовой цены) в скрипте объявленны переменные: $Count,$Collection,$Distance,$Wait.&lt;br /&gt;
&lt;br /&gt;
Существует поиск по ключевому полю (поиск регистронезависимый), например чтобы найти в таблице advprice введённое значение для текущей услуги, нужно сделать такую запись  addressrecord.advprice.value('priceconf', $CurrentPriceConf) - Первый параметр это ключевое поле, второй искомое значение. Если запись найдётся будет возвращено значение поле value, если нет функция вернёт значение 0.&lt;br /&gt;
 &lt;br /&gt;
Пример &lt;br /&gt;
 if(addressrecord.advprice.active('priceconf', 3)='T', addressrecord.advprice.price, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Смотрим включена ли услуга и если да, возвращаем рассчитанную стоимость&lt;br /&gt;
&lt;br /&gt;
Чтобы изменить значение записанное в объект addressrecord, нужно воспользоваться методом _set(keyfield, keyvalue, filed, value). Параметр keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца. Сначала происходит поиск строки по ключу, далее меняется значение указанного столбца.&lt;br /&gt;
Пример, отключение услуги база:&lt;br /&gt;
  addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
  priceconf - поле где записан код услуги;&lt;br /&gt;
  1 - услуга База;&lt;br /&gt;
  active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
Также существует упрощенный метод _set, с двумя параметрами filed, value - он используется в шаблонах загрузки или в системных доп. возможностях где доступен объект addressrecord.&lt;br /&gt;
&lt;br /&gt;
==== Зарплата курьеров ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в основной валюте для каждой единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Переменные «$FormulaTablKoeff» и «$FormulaMoneyKoeff»  позволяют установить повышающий или понижающий коэффициент на стоимость доставки (по тарифной сетке) и услуги соответственно (процент от суммы, процент от стоимости доставки, ожидание).  Переменная «$UsingZoneName» и «$KurierZone» содержат название и код зоны соответственно, есть возможность поменять название зоны для отчета.&lt;br /&gt;
&lt;br /&gt;
=== Планировщик ===&lt;br /&gt;
&lt;br /&gt;
В поле текста задания может быть введен как текст с командами планировщика (см ниже), так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TIniFile, Указывает на настроечный ini-файл планировщика.&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Для записи в лог планировщика нужно использовать функцию Print&lt;br /&gt;
&lt;br /&gt;
=== Репликатор ===&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
ReplaceAddress(target, address) – Возвращает адрес последней доставки корреспонденции получателю target по адресу address от текущего клиента. При отсутствии такой доставки, возвращает address.&lt;br /&gt;
&lt;br /&gt;
GetPrice –возвращает рассчитанное значение цены, на основе прайс-листа клиента и данных о корреспонденции.&lt;br /&gt;
&lt;br /&gt;
GetKurierByStation(i) – возвращает код курьера, ассоциированного со станцией метро с кодом i.&lt;br /&gt;
&lt;br /&gt;
GetNewNumber – Возвращает не занятый номер единицы корреспонденции в текущем заказе.&lt;br /&gt;
&lt;br /&gt;
==История изменений==&lt;br /&gt;
&lt;br /&gt;
=== Недавние изменения ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|2026.0.0.550 Доработка функций интерпретатора GetA4Printer, GetStickerPrinter, GetDuplexPrinter.&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|2026.0.0.547 Доработка функций ATTACHPDFTOTEXT и PRINTATTACHPDFPAGE, добавлена возможность указать путь к файлу&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.539 Добавлена поддержка отладчика AttachDebugger&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.534 Добавлена поддержка оператора CASE и класса TFunc&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 2021.0.0.57 от 18.06.2019 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TExcel добавлен метод ColumnDelete.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция InsertFirmAtt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
||В объект TExcel добавлен метод Align.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция CheckEan&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект функцию FillAdvPriceReport добавлены параметры ShowSumPrice,InsertColumns&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TSMS добавлен метод Log.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Добавлена функция Money.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция ValutaSign.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция GetPolygonByLatLon.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TTable добавлена функция SetMultiHeader, SetCustomHeader.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DownloadAttachment&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию SetRowHeight объекта TExcel добавлен параметр cnt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция AsString.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция SetSize.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TADO добавлена функция ParseForIn.&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|В объект TBaseUtils из TBase перенесена функция FillExcelDoc.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция CalcAddressPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Все функции класса TBaseSupport перенесены в TBaseUtils. Класс TBaseSupport больше не существует.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функции RowInsert и RowDelete объекта TExcel добавлен параметр count.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция SendToMeaSoft&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция RecalcSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Новая функция Reverse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 849 &amp;amp;nbsp; 22.02.2018 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TBaseUtils.TownByIndex добавлен параметр PriorityName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TBase добавлена функция GetNewPackagePos&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TSMS доработан метод ExtraResult, добавлен параметр ParamName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBase добавлена функция CalcAgentPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateAddressForActDelivery&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функция CalcTownDeliveryDate заменена на CalcDeliveryDate&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция SignatureUrl&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция LoadFromStr.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetPen.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetBrush.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена поддержка чтения в формате PNG.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TCanvas.DrawPic параметр Mode&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Свойство TPicture.Canvas&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DeleteFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 758 &amp;amp;nbsp; 29.03.2017 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция GetPolygonByAddress&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция ParamsCount&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Объект TZip&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функции CreateEAN и Create128 заменены одной функцией CreateBar, полностью совместимой с Create128, но добавлена поддержка EAN-13 и Interleaved 2-5 (для Почты России). В системе функции оставлены для обратной совместимости, но более не являются документированными и рекомендованными к использованию.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Параметр text в функцию Cell объекта TExcel&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция UrlEncode &lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция IncDay теперь может принимать параметр count&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функции FtpGet, FtpPut, TTable.SetCell()&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 452 &amp;amp;nbsp; 26.02.2014 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция Time&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция FixedIntToStr&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция TimePeriod&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена функция приёма смс -  ReceiveSMS&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция STR2UTF&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция SAVETOFILE&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.SetSheetName&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;FILESTR&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Расширены возможности объекта addressrecord в формулах тарифов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 308 &amp;amp;nbsp; 24.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В функции загрузки таблиц из TADO добавлено условие, что поля, названия которых начинаются с &amp;quot;-&amp;quot; не выгружаются. Таким образом можно скрывать служебные поля из результирующего набора.&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowAutoFit &lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowInsert &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 300 &amp;amp;nbsp; 01.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В объекте TCSVFile добавилась возможность запрашивать значения не только текущей записи через параметр сдвига&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;UPDOWN&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлен объект TCSVFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 266 &amp;amp;nbsp; 14.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена поддержка массивов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 265 &amp;amp;nbsp; 11.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция CreateTrans в интерпретатор&lt;br /&gt;
|-&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15768</id>
		<title>Руководство программиста</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15768"/>
				<updated>2026-01-15T15:28:37Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Объект TBase */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Основные положения ==&lt;br /&gt;
&lt;br /&gt;
В систему «MEASOFT» встроен внутренний интерпретируемый язык программирования. Среда состоит из базовой функциональности, и дополнительно создаваемых объектов. Некоторые объекты автоматически создаются средой перед запуском интерпретатора для предоставления доступа к контексту, в котором работает скрипт. Все типы данных приводятся друг к другу автоматически, иногда при необходимости можно использовать функции приведения типов. &lt;br /&gt;
&lt;br /&gt;
Как интерпретатор приводит типы:&lt;br /&gt;
&lt;br /&gt;
1.	При использовании значения как параметр функции интерпретатор автоматически приводит значение к типу, необходимому функции.&lt;br /&gt;
&lt;br /&gt;
2.	При операциях сложения, а также логических операциях, операнды приводятся к строке если хотя бы один из них имеет тип «строка». Например:&lt;br /&gt;
3.3+5		-&amp;gt;  8.3&lt;br /&gt;
‘3.3’+5		-&amp;gt;  ‘3.35’&lt;br /&gt;
подобную проблему можно решить принудительно преобразовав тип:&lt;br /&gt;
float(‘3.3’)+5	-&amp;gt;  8.3&lt;br /&gt;
&lt;br /&gt;
3.	При операциях умножения, деления и вычитания операнды приводятся к числу с плавающей точкой, однако если результат выполнения операции получается целым числом, то он приводится к целочисленному типу.&lt;br /&gt;
&lt;br /&gt;
Как работают функции приведения типов:&lt;br /&gt;
&lt;br /&gt;
1.	При преобразовании строки к числу: функция «читает» строку до первого символа, не позволяющего создать число с плавающей точкой, при этом разделителем целой и дробной частей может быть как точка так и запятая. Если приведение производится к целочисленному типу, то после этого происходит округление. Например:&lt;br /&gt;
float('3.6qwerty735')	-&amp;gt;  3.6&lt;br /&gt;
int('3.6qwerty735')	-&amp;gt;  4&lt;br /&gt;
&lt;br /&gt;
2.	При преобразовании к булевому типу ложью считается пустая строка либо число 0, все остальное - истина&lt;br /&gt;
&lt;br /&gt;
3.	При преобразовании булевого типа к числу истина преобразуется в 1, ложь – в 0. Такое преобразование позволяет использовать сложение и умножение в качестве логических «ИЛИ» и «И» соответственно:&lt;br /&gt;
if((5=5)+(6=7), &amp;lt;a&amp;gt;, [b]) – условие истинно, выполнится код «a».&lt;br /&gt;
&lt;br /&gt;
4.	При преобразовании булевого типа к строке сначала происходит преобразование к числу:&lt;br /&gt;
(5=5)+'qwerty'	-&amp;gt;  ‘1qwerty’&lt;br /&gt;
&lt;br /&gt;
== Описание синтаксиса ==&lt;br /&gt;
&lt;br /&gt;
Команды разделяются точкой с запятой. Параметры функций разделяются запятыми. Каждая команда (даже цикл while) является функцией, возвращающей некоторое значение. Результатом выполнения составной команды (последовательности функций, разделенных точкой с запятой), является результат выполнения последней функции. Имена переменных, функций, объектов, а также их свойств и методов не чувствительны к регистру.&lt;br /&gt;
Константы: константы бывают целочисленными, дробными и строковыми. Значения целочисленных и дробных констант указываются «как есть» (в этом случае разделитель целой и дробной частей – точка), шестнадцатеричные значения начинаются с символа «$» и, если первая цифра – буква, она упреждается цифрой 0, а строковые – в одинарных кавычках. При этом, если внутри строковой константы встречается символ одинарной кавычки он должен быть задвоен, для указания интерпретатору того, что он не является признаком конца константы.&lt;br /&gt;
Операции сравнения: &amp;gt;, &amp;lt;, =, !  - Больше, меньше, равно, не равно соответственно.&lt;br /&gt;
Логические операции: + (ИЛИ), *  (И).&lt;br /&gt;
Арифметические операции: +, -, *, /&lt;br /&gt;
Операция конкатенации строк: +&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Функциональность базового объекта ===&lt;br /&gt;
&lt;br /&gt;
'''SET($a, a)''' – присваивает переменной (1-й параметр) значение второго параметра. При отсутствии переменной – создает ее. Имена переменных должны начинаться с символа «$», а следующий символ не должен быть цифрой. Возвращает новое значение переменной. Функция используется только для задания значений переменных. Не допускается использования для задания значений свойств объектов. Для этого используются соответствующие методы этих объектов.&lt;br /&gt;
&lt;br /&gt;
'''IF(a,b,c)''' или '''IF(a,b)'''  – Условный оператор. В первом случае возвращает b, если a истинно (не равно нулю или пустой строке), иначе – c. Во втором случае – возвращает a, если оно истинно, иначе – b.&lt;br /&gt;
&lt;br /&gt;
'''WHILE(a, b)''' – Оператор цикла. Выполняет b пока a истинно:&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i&amp;gt;0, set($sum, $sum+$i); set($i, $i-1));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''FOR($a, b, c, d)''' – Оператор цикла. Выполняет d пока $a последовательно присваиваются значения от b до с включительно:&lt;br /&gt;
	set($sum, 0);&lt;br /&gt;
for($i, 1, 10, set($sum, $sum+$i));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''NEW(ClassName, InstanceName)''' – Создает экземпляр класса ClassName, назначает ему имя InstanceName. Возвращает порядковый номер созданного объекта. Доступ к свойствам и методам объектов осуществляется по имени объекта и имени свойства/метода, разделенным точкой. Именем объекта может быть и пустая строка, тогда доступ к его свойствам и методам будет осуществляться без указания имени, и, в случае совпадения имен свойств и/или методов со стандартными или свойствами/методами других объектов, использоваться будут соответствующие свойства/методы объекта, созданного ранее, а также такой объект невозможно уничтожить до окончания выполнения скрипта. Все объекты созданные во время выполнения скрипта уничтожаются автоматически после окончания его выполнения.&lt;br /&gt;
&lt;br /&gt;
'''FREE(InstanceName)''' – Уничтожает объект с именем InstanceName. Возвращает 0. В случае отсутствия объекта с заданным именем вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
'''ShowObjects''' – Возвращает список созданных объектов – названия классов и имена.&lt;br /&gt;
&lt;br /&gt;
'''ERROR(message)''' – Вызывает ошибку с текстом message.&lt;br /&gt;
&lt;br /&gt;
'''SHOWMESSAGE(message)''' – Отображает диалоговое окно с текстом message, останавливает выполнение скрипта до закрытия окна пользователем.&lt;br /&gt;
&lt;br /&gt;
'''SimpleAskUser(Message)''' – Выводит диалоговое окно с текстом Message и кнопками «Да» и «Нет». Возвращает 1, если  пользователь нажал кнопку «Да», иначе – 0.&lt;br /&gt;
&lt;br /&gt;
'''TRY(a)''' – Выполняет a в «защищенном от ошибки» режиме. Если в процессе выполнения a возникает ошибка, возвращает текст ошибки, иначе – 0 (ложь).&lt;br /&gt;
&lt;br /&gt;
'''REM(….)''' – Код в скобках игнорируется (комментарий).&lt;br /&gt;
&lt;br /&gt;
'''EXEC(FileName, Params, Wait, WindowState)''' – Запускает внешнее приложение FileName с параметрами Params. Если Wait истинно – ожидает завершение процесса. Для WindowState доступны следующие числовые значения:&lt;br /&gt;
	0 - SW_HIDE&lt;br /&gt;
	1 - SW_SHOWNORMAL (по-умолчанию)&lt;br /&gt;
	3 - SW_MAXIMIZE&lt;br /&gt;
	6 - SW_MINIMIZE&lt;br /&gt;
Функция возвращает истину если приложение запущено успешно. Иначе – Ложь.&lt;br /&gt;
В случае успеха, при параметре Wait – истина кладет в переменную $LastResult код завершения приложения.&lt;br /&gt;
&lt;br /&gt;
'''CASE''' - Оператор множественного выбора. Позволяет выполнить одно из нескольких действий в зависимости от условий. Синтаксис:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
  case(&lt;br /&gt;
    when(условие1, действие1);&lt;br /&gt;
    when(условие2, действие2);&lt;br /&gt;
    ...&lt;br /&gt;
    else(действие_по_умолчанию);&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 50);&lt;br /&gt;
&lt;br /&gt;
showmessage(&lt;br /&gt;
  case(&lt;br /&gt;
    when($a &amp;lt; 5, 50);&lt;br /&gt;
    when($a &amp;lt; 10, 100);&lt;br /&gt;
    when($a &amp;lt; 250, 200);&lt;br /&gt;
    else($a*$b);&lt;br /&gt;
  )  &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''AttachDebugger''' - Команда позволяет подключить открытый [[Отладчик_встроенных_скриптов]] к текущему скрипту. Команда AttachDebugger должна быть '''первой командой''' в скрипте. Добавьте её в самое начало скрипта:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Как работает:'''&lt;br /&gt;
# При выполнении команды AttachDebugger скрипт останавливается.&lt;br /&gt;
# Отладчик автоматически подключается к выполняющемуся скрипту.&lt;br /&gt;
# Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
# Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Если режим отслеживания не включён, команда `AttachDebugger` игнорируется.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Команда AttachDebugger должна быть первой командой в скрипте.&lt;br /&gt;
&lt;br /&gt;
=== Строковые функции ===&lt;br /&gt;
&lt;br /&gt;
'''UpCase(s)''' – возвращает строку s в верхнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''LCase(s)''' – возвращает строку s в нижнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''Len(s)''' – возвращает количество символов в строке s.&lt;br /&gt;
&lt;br /&gt;
'''Pos(s, substr [,start])''' – возвращает номер первого символа первого включения подстроки substr в строку s, возвращает 0, если включения подстроки отсутствуют. Параметр start - это позиция старта поиска, не обязательный параметр, по умолчанию равен 1. Поиск не чувствителен к регистру.&lt;br /&gt;
&lt;br /&gt;
'''Param(s, i)''' – возвращает i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''ParamsCount(s)''' - возвращает количество элементов строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''SetParam(s, p, i)''' – заменяет на значение p i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''Left(s, i [,full] )''' – возвращает i первых символов строки s. Параметр i, может быть строкой, тогда он считается разделителем и функция, возвращает строку слева от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Mid(s, i, j)''' - возвращает подстроку из s начиная с i символа и длиной j символов&lt;br /&gt;
&lt;br /&gt;
'''Right(s, i [,full])''' – возвращает i последних символов строки s. Параметр i, может быть строкой, тогда он считается разделителем, функция ищет разделитель с конца строки, и возвращает строку справа от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Reverse(s)''' - возвращает строку s задом-наперед. Полезно например для поиска с конца функций Pos().&lt;br /&gt;
&lt;br /&gt;
'''Char(i)''' – возвращает символ с кодом i.&lt;br /&gt;
&lt;br /&gt;
'''Ord(s)''' – возвращает код первого символа строки s.&lt;br /&gt;
&lt;br /&gt;
'''Replace(s, strFind1, strReplace1, [ strFind2, strReplace2, ... ], [caseInsensetive])''' - возвращает строку s, в которой все включения строк strFind заменены строкой strReplace. Параметры поиска и замены всегда должны быть в паре и их может быть несколько. caseInsensetive - неучитывать регистр, не обязательный параметр, по умолчанию включен.&lt;br /&gt;
&lt;br /&gt;
'''RemSpace(s)''' – возвращает сроку s без начальных и конечных запятых и пробелов, а также начальных точек.&lt;br /&gt;
&lt;br /&gt;
'''SumStr(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''с добавлением валюты'''. Необязательные параметры captions - позволяет изменить название валюты, формат строки может зависеть от текущего языка(посмотреть формат можно в &amp;quot;Справочники&amp;quot;-&amp;quot;Статусы&amp;quot;-&amp;quot;32 Валюты&amp;quot;, в разделе &amp;quot;Дополнительная информация&amp;quot;). Language - код языка на котором необходимо вывести сумму прописью. По умолчанию если не обязательные параметры опущены, используются региональные настройки в переменных.&lt;br /&gt;
&lt;br /&gt;
'''NumToStrSimple(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''без валюты'''. Параметры идентичны функции SUMSTR.&lt;br /&gt;
&lt;br /&gt;
'''FullNameToShort(Name)''' – Возвращает фамилию и инициалы по полному ФИО Name.&lt;br /&gt;
&lt;br /&gt;
'''MonthName1(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в именительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''MonthName2(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в родительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''StrForXML(s)''' - Подготавливает строку к парсингу как xml: Если находит в строке подстроку &amp;quot;UTF-8&amp;quot; - перекодирует ее из utf-8 в win-1251, убирает начальный знак вопроса, если такой встречается.&lt;br /&gt;
&lt;br /&gt;
'''FixedIntToStr(i, len[, char])''' - Возвращает целое число i дополненное слева символами char (по-умолчанию - &amp;quot;0&amp;quot;) до длины len.&lt;br /&gt;
&lt;br /&gt;
'''Translate(format, [param1, param2, ...])''' - Функция перевода строки format в язык пользователя. Строка format может содержать параметры %s, %d - строка и число соответственно. &lt;br /&gt;
&lt;br /&gt;
'''ExtractFileName(FilePath)''' - возвращает имя файла с расширением из полного пути к файлу FilePath.&lt;br /&gt;
&lt;br /&gt;
====Функции перекодировки====&lt;br /&gt;
'''DecodeStr(s, charset)''' - Производит перекодировку строки s в кодировку CP1251. Кодировка строки s должна быть заранее известна и может быть :&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866, UNICODE. Имя кодировки следует передавать в точности без лишних символов.&lt;br /&gt;
&lt;br /&gt;
'''EncodeStr(s, charset)''' - Производит перекодировку строки s в кодировку charset. Кодировка строки s должна быть CP1251, возможны следующие варианты перекодировки:&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Имя кодировки следует передавать в точности без лишних символов. UNICODE не работает с версии 2021, в ней строки по умолчанию в кодировке unicode.&lt;br /&gt;
&lt;br /&gt;
Функции EncodeBase64(s), DecodeBase64(s), UrlEncode(s), UTF8Encode(s), UTF8Decode(s), Str2UTF(s) - устарели, используйте EncodeStr, DecodeStr.&lt;br /&gt;
&lt;br /&gt;
====Транслитерация====&lt;br /&gt;
&lt;br /&gt;
'''Translit(s)''' - транслитерация строки русского текста s латиницей&lt;br /&gt;
&lt;br /&gt;
'''UnTranslit(s)''' - транслитерация строки s с латиницы на русский.&lt;br /&gt;
&lt;br /&gt;
==== Экранирование ====&lt;br /&gt;
&lt;br /&gt;
'''QUOTEDSTR(s)''' – квотирует строку s символом «\» (обратный слеш). Возвращает строку s, помещенную между символами одинарной кавычки, при этом все вхождения в строку s символов: «\», «&amp;quot;» и «'» экранируются квотирующим символом, а символы  #0, #10 и #13 заменяются на \0, \n и \r соответственно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SQLFloat(f)''' – Приводит число с плавающей точкой к виду, пригодному для SQL-запроса, т.е. к тексту с разделителем дробной части – точка.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextXML(s)''' - квотирует строку s для использования в XML. Производит замены спец. символов для корректности XML-синтаксиса.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextJSON(s)''' - переводит строку в формат JSON, экранирует служебные символы.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextBlob(s)''' - строка s содержит файл, функция перекодирует переданную строку в байты, используется для заполнения полей формата blob.&lt;br /&gt;
&lt;br /&gt;
====Хеширование ====&lt;br /&gt;
&lt;br /&gt;
'''HMACHash256(key, text)''' - создаёт хэш по алгоритму SHA256 для проверки целостности сообщения, key - секретный ключ, text - хэшируемое сообщение&lt;br /&gt;
&lt;br /&gt;
'''MD5Hash(text)''' - создаёт хеш по алгоритму MD5&lt;br /&gt;
&lt;br /&gt;
'''SignatureUrl(url)''' -  Подписывает переданный URL. Функция возвратит переданный URL с добавленным в конце параметром, в котором будет записана подпись.&lt;br /&gt;
&lt;br /&gt;
=== Функции работы с датой и временем ===&lt;br /&gt;
&lt;br /&gt;
'''CurrTime''' – возвращает текущее время&lt;br /&gt;
&lt;br /&gt;
'''CurrDate''' – возвращает текущую дату&lt;br /&gt;
&lt;br /&gt;
'''CurrMillisecond''' - Возвращает количество миллисекунд прошедших с начала текущего года. Используется для точного расчета временных интервалов.&lt;br /&gt;
&lt;br /&gt;
'''Today''' - возвращает текущую дату в числовом формате.&lt;br /&gt;
&lt;br /&gt;
'''Day(dt)''' – возвращает день месяца даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Month(dt)''' – возвращает месяц года даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Year(dt)''' – возвращает год даты dt.&lt;br /&gt;
&lt;br /&gt;
'''FirstDayOfMonth(dt)''' – Возвращает первый день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( FirstDayOfMonth( CurrDate() ) );&lt;br /&gt;
'''Полужирное начертание'''&lt;br /&gt;
'''LastDayOfMonth(dt)''' – Возвращает последний день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( LastDayOfMonth( CurrDate() ) );&lt;br /&gt;
&lt;br /&gt;
'''DaysInMonth(month, year)''' – Возвращает количество дней в указанном месяце.&lt;br /&gt;
&lt;br /&gt;
'''IncDay(dt, [count=1])''' – Возвращает дату, увеличенную на count дней.&lt;br /&gt;
&lt;br /&gt;
'''SQLDate(dt)''' – Пытается конвертировать dt в дату, вернуть в формате «'YYYY-MM-DD'» (с апострофами), если не удается – возвращает «NULL».&lt;br /&gt;
&lt;br /&gt;
'''SQLDateToDate(dt)''' – Переводит дату из SQL-формата в обычный.&lt;br /&gt;
&lt;br /&gt;
'''DAYSBETWEEN(dt1, dt2)''' – Возвращает количество дней между датами dt1 и dt2. В случае ошибки приведения dt1 или dt2 к дате возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''TimeBetween(t1, t2)''' - Возвращает количество минут между временем t1 и t2. Если t1 &amp;gt; t2 то будет показано количество минут между t2 и t1. Параметр t может быть как в формате &amp;quot;HH:MM&amp;quot;, так и в числовом. Если один из параметров не удалось привести к числовому типу возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''WorkDaysBetween(dt1, dt2, [DecreaseFirstDay=0], [DefaultHolidayVarNum=1])''' - Возвращает количество рабочих дней между датами dt1 и dt2. Параметр DecreaseFirstDay уменьшает dt1 на указанное количество дней (по умолчанию 0).  В случае ошибки приведения dt1 или dt2 к дате возвращает -1000. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней(по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''TimePeriod(time1, time2)''' - Оформляет временной период. Возвращаемое значение зависит от наличия значения в параметрах. Возможные варианты: &amp;quot;time1 - time2&amp;quot; , &amp;quot;С time1&amp;quot; , &amp;quot;ДО time2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''StrDateToFloat(s, [time=false])''' - Переводит строку с датой s в числовой тип. Если параметр time включен, то в строке s должно быть указано время. Дата должна быть в формате &amp;quot;DD.MM.YYYY&amp;quot;, а время &amp;quot;HH:NN&amp;quot;. Если строку перевести не удалось возвращает 0&lt;br /&gt;
&lt;br /&gt;
'''IsAWorkDay(dt)''' - Когда день dt является рабочим, возвращает true. Если произошла ошибка приведения даты возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''IncWorkDay(dt, [count=1],[DefaultHolidayVarNum=1])''' - Прибавляет count рабочих дней к дате dt. Возвращает дату в числовом формате, если произошла ошибка приведения даты возвращает -1000. По умолчанию параметр count равен 1 и не является обязательным. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней (по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''Sleep'''(n) - Задержка выполнения на n миллисекунд.&lt;br /&gt;
&lt;br /&gt;
=== Функции приведения типов ===&lt;br /&gt;
&lt;br /&gt;
'''INT(v)''' – возвращает значение типа “целое”, приводя вариантное значение v к числовому типу, а затем округляя его. В том числе используется как функция округления.&lt;br /&gt;
&lt;br /&gt;
'''FLOAT(v)''' – возвращает значение типа “число”, приводя вариантное значение v к числовому типу, переводя в число цепочку символов до первого нецифрового символа (либо точки или запятой).&lt;br /&gt;
&lt;br /&gt;
'''STR(v)''' – возвращает значение типа “строка”, приводя вариантное значение v к строковому типу.&lt;br /&gt;
&lt;br /&gt;
'''Date(v)''' – возвращает дату, либо пустую строку, если не удается конвертировать v в дату&lt;br /&gt;
&lt;br /&gt;
'''Time(v)''' – возвращает время, либо пустую строку, если не удается конвертировать v во время. Понимает числовое представление времени.&lt;br /&gt;
&lt;br /&gt;
=== Математические функции ===&lt;br /&gt;
&lt;br /&gt;
'''ROUNDUP(f)''' – округляет число f до ближайшего большего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''ROUNDDN(f)''' – округляет число f до ближайшего меньшего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''Money(f, CouldBeEmpty, ZeroFill, MakeSpace)''' - Округляет число f, до двух знаков после запятой. CouldBeEmpty - заменить число меньше 0,0001  на пустую строку. ZeroFill  - Следить чтобы после запятой было два знака, если будет один, то добавить ноль. MakeSpace - Разделить разряды пробелом.&lt;br /&gt;
''Подсказка: для простого округления используется функция int()''&lt;br /&gt;
&lt;br /&gt;
'''Abs(f)''' - возвращает модуль числа f.&lt;br /&gt;
&lt;br /&gt;
'''Mod(x, y)''' - возвращает остаток от деления целочисленного числа x на целочисленное число y.&lt;br /&gt;
&lt;br /&gt;
=== Константы ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Null''' – Возвращает пустое значение.&lt;br /&gt;
&lt;br /&gt;
'''Да''', '''True''', '''Нет''', '''False''' – константы, соответствующие булевым значениям.&lt;br /&gt;
&lt;br /&gt;
=== Прочие функции ===&lt;br /&gt;
&lt;br /&gt;
SetPhoneParams(CountryCode, TownCode) – Устанавливает глобальные настройки кода телефонных кодов страны и города соответственно. По-умолчанию код страны – 7, код города – 495.&lt;br /&gt;
&lt;br /&gt;
PhonesCount(s) – Возвращает количество корректных телефонных номеров, найденных в строке s.&lt;br /&gt;
&lt;br /&gt;
GetPhone(s[, n]) – Возвращает n-й корректный телефонный номер, найденный в строке s. Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
GetEmail(s) – Возвращает все корректные адреса email, найденный в строке s, разделенные запятыми (т.е. готовыми к передаче в функцию SendEmail).&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY).&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
GenEan(ID, Code) – Формирует штрих-код EAN 13 Состоящий из идентификатора типа сущности ID и кода сущности Code, Выравнивает до 13-ти символов, первый – «2», последний – контрольная сума.&lt;br /&gt;
&lt;br /&gt;
CheckEan(s) - Проверяет строку s, что она является кодом EAN13.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(FileName,s, encoding [, append])- Создает текстовый файл по пути, указанному в FileName (если по указанному пути существует файл с указанным именем, он удаляется и создается новый) и производит запись строки s в созданный текстовый файл. encoding - название кодировки, по умолчанию сохраняет в кодировке ANSI. Доступные названия кодировок: KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Если append = true, то производится дописывание данных в файл, а не перезаписывание (не обязательный, по умолчанию выключен).&lt;br /&gt;
&lt;br /&gt;
StrFromFile(FileName) - Читает файл FileName, возвращает в виде строки. При ошибке чтения вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
DownloadAttachment(code, [savefilepath, tablename='attachment', fieldBlob='file', fieldLDtime='ldtime', fieldUID='uid']) - Функция выкачивает аттачмент из базы, по внутреннему коду - Code, всегда возвращает содержимое файла в виде строки, а также может сохранить файл по указанному пути в параметре savefilepath. По умолчанию, функция настроена на таблицу attachment. Code - внутренний код вложения, tablename - название таблицы, fieldBlob - название поля с содержимым файла, fieldLDtime - название поля с временем последнего изменения строки (для работы кэша). Функция использует кэш и умеет выкачивать файлы зауженные на внешние серверы (http, ftp,sftp, measoft). Для выкачивания с сервера measoft обязательно необходимо указывать параметр fieldUID.&lt;br /&gt;
&lt;br /&gt;
DeleteFile(FileName) - Удаляет файл FileName с диска, возвращает истину, если операция прошла успешно и ложь - в противном случае.&lt;br /&gt;
&lt;br /&gt;
HTTPPOST(host, PostParams, Proxy, ContentType, HTTPUser, HTTPPass, Method, CustomHeader, Reconnects) - Отправляет HTTP запрос по адресу host с данными PostParams. Proxy - объект Proxy, задающий прокси-сервер (по-умолчанию - пусто - не использовать прокси). ContentType - Заголовок ContentType. По-умолчанию - &amp;quot;application/x-www-form-urlencoded; Charset=UTF-8&amp;quot;. HTTPUser и HTTPPass - данные для http-авторизации на сервере. Method - метод отправки запроса, по-умолчанию - &amp;quot;POST&amp;quot;. CustomHeader - Дополнительные заголовки HTTP запроса, передается в виде списка параметров через запятую и всегда образуют пару: 1 параметр - название заголовка, 2 параметр - значение. Если значение содержит запятую то его нужно экранировать в двойные кавычки. Reconnects - Количество попыток подключения (по-умолчанию - 2), если больше 100 - это таймаут единственной попытки подключения в миллисекундах.&lt;br /&gt;
Функция возвращает ответ сервера. &amp;lt;br&amp;gt;&lt;br /&gt;
''Обратите внимание:'' Для имитации отправки данных html-формы методом POST может понадобиться перед передаваемыми параметрами добавить &amp;quot;Data=&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
FTPPUT(host, User, Pass, FileName[, Active]) - Отправляет файл на FTP/SFTP-сервер. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
FTPGET(host, User, Pass, SourceFileName, DestFileName[, Active]) - Загружает файл SourceFileName с FTP/SFTP-сервера, сохраняет его в файл DestFileName. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
GetTempDir - Возвращает путь к временной папке.&lt;br /&gt;
&lt;br /&gt;
ApplicationDir - Возвращает путь к файлу программы.&lt;br /&gt;
&lt;br /&gt;
Interpretate(script) - Интерпретирует скрипт указанный в script. Выполнение происходит в текущем инстансе.&lt;br /&gt;
&lt;br /&gt;
LastHttpError - Выводит последний запрос выполненный с ошибкой в функции HttpPost. Содержит подробную информацию по запросу и ответу.&lt;br /&gt;
&lt;br /&gt;
LastHttpResponse - Выводит последний запрос и ответ от сервера после выполнения Http-запроса в функции HttpPost.&lt;br /&gt;
&lt;br /&gt;
== Объект TExcel ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к данным документов MS Excel. Требует установленного приложения MS Excel. Для работы без установленного MS Excel предусмотрен объект TDirectExcel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ввод данных'''''&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Если Headered истинно (по-умолчанию), таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Если TranslateHeader истинно, то заголовки таблицы будут автоматически переведены.&lt;br /&gt;
 &lt;br /&gt;
 MyDB.Open('select * from kurier');&lt;br /&gt;
 xl.LoadFromDB(MyDB.Self);&lt;br /&gt;
 xl.DoNotDestroy(true);&lt;br /&gt;
 xl.SetVisible(true);&lt;br /&gt;
&lt;br /&gt;
Post2Sheet(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) -  Почти полный аналог LoadFromDB. В отличии от LoadFromDB если есть открытый файл, выгрузка данных будет выполнена прямо в него.&lt;br /&gt;
&lt;br /&gt;
OpenFile(aFileName) – Выполняет функции SetFileName и Open. &lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
SetFileName(aFileName) – Задает значение свойства FileName.&lt;br /&gt;
&lt;br /&gt;
Open - Открывает файл с именем, заданным свойством FileName. Если имя файла не задано - создает чистую книгу.&lt;br /&gt;
&lt;br /&gt;
Close – Закрывает текущий файл.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ячейки'''''&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
Cell(x, y, text) – Возвращает значение ячейки, заданной координатами x, y. Необязательный булевый параметр text, в случае истинности, указывает на необходимость возврата данных с учетом формата ячейки, т.е. то, что пользователь видит на экране. Обратите внимание, что если в ячейке число, и ширина столбца не достаточна для отображения, Excel выводит &amp;quot;#####&amp;quot;, что и будет возвращено программе, если text=ИСТИНА. Поэтому перед таким использованием рекомендуется выполнить функцию AutoFit.&lt;br /&gt;
&lt;br /&gt;
SetCell(x, y, v[, x2, y2]) – Устанавливает значение ячейки, заданной координатами x и y, в значение v. Если заданы параметры x2, y2 - объединяет (merge) диапазон ячеек заданных координатами, устанавливает значение объединенной ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Строки'''''&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
RowAutoFit([y1, y2]) - Устанавливает автоматическую высоту строк. Аргументы y1 и y2 необязательны и если не указаны, то процедура будет выполнена для всей страницы, в ином случае только для строк от y1 до y2.&lt;br /&gt;
&lt;br /&gt;
SetRowHeight(r, h[, cnt]) – Устанавливает высоту cnt строк (по-умолчанию 1) начиная со строки r в h пикселей.&lt;br /&gt;
&lt;br /&gt;
GetRowHeight(r) – Возвращает высоту строки r в пикселях.&lt;br /&gt;
&lt;br /&gt;
RowInsert(i[, count]) - Вставляет count (по-умолчанию - 1) строк НАД строкой с номером i.&lt;br /&gt;
&lt;br /&gt;
RowDelete(i[, count]) - Удаляет count (по-умолчанию - 1) строк начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Столбцы'''''&lt;br /&gt;
&lt;br /&gt;
ColCount - Возвращает количество столбцов в листе.&lt;br /&gt;
&lt;br /&gt;
AutoFit – Устанавливает автоматическую ширину столбцов.&lt;br /&gt;
&lt;br /&gt;
ColumnDelete(i[, count]) - Удаляет count (по-умолчанию - 1) столбцов начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
SetColWidth (c, w) – Устанавливает ширину столбца c в w пикселей.&lt;br /&gt;
&lt;br /&gt;
GetColWidth (c) – Возвращает ширину столбца c в пикселях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Листы'''''&lt;br /&gt;
&lt;br /&gt;
SetSheet(No) – Устанавливает номер текущего листа. Если лист с таким номером не существует - он будет создан (и все листы до него). Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetSheetName(Name) - Устанавливает название текущего листа.&lt;br /&gt;
&lt;br /&gt;
SheetsCount – Возвращает количество листов в книге.&lt;br /&gt;
&lt;br /&gt;
CopySheetAfter([SheetFrom[, SheetAfter]]) - Копирует лист SheetFrom (по-умолчанию - текущий), создавая новый лист после листа SheetAfter (по-умолчанию - совпадает с копируемым).&lt;br /&gt;
&lt;br /&gt;
SheetDelete(i) - Удаляет лист с номером i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Форматирование'''''&lt;br /&gt;
&lt;br /&gt;
Align(x1, y1, x2, y2 [,HAlign, VAlign]) - Устанавливает выравнивание данных в указанном диапазоне. HAlign - горизонтальное выравнивание (0 – прижато влево , 1 – по центру , 2 – прижато вправо), VAlign - Вертикальное выравнивание (0 – прижато к верху , 1 – по центру , 2 – прижато к низу).&lt;br /&gt;
&lt;br /&gt;
WrapText(x1, y1, x2, y2, value) – Устанавливает перенос текста прямоугольника в значение value. Если координаты опущены, или 0 – устанавливает границы всей используемой области. Для Value значение по-умолчанию - true.&lt;br /&gt;
&lt;br /&gt;
NumberFormat(x1, y1, x2, y2, Format) - Устанавливает формат вывода чисел в указанном диапазоне ячеек. Например, если Format='0.00' - числа будут выводиться c обязательными 2 знаками после десятичного разделителя.&lt;br /&gt;
&lt;br /&gt;
SetBorders(x1, y1, x2, y2) – Устанавливает границы прямоугольника. Если координаты опущены, или 0 – устанавливает границы всей используемой области.&lt;br /&gt;
&lt;br /&gt;
SetFont(Font[, x1, y1[, x2, y2]]) - Устанавливает шрифт Font для ячеек диапазона. Можно указать координаты только одной ячейки, можно - вообще не указать, тогда будет использован последний выделенный диапазон. Шрифт задается как обычно: 'Arial, 16, T, T, T', порядок параметров: Имя шрифта, размер, жирное начертание, курсивное начертание, одиночное подчеркивание. Если параметры не заданы, то у текущего шрифта они меняться не будут. Примеры: SetFont('Arial, 10, T, F, F', 1,1) - в ячейке A1 будет установлен шрифт Arial жирным начертанием (не курсив и без подчеркивания). SetFont(', , , T, F', 2,1) - в ячейке B1 будет поменяется только начертание курсив и будет отменено подчеркивание (если оно было). &lt;br /&gt;
&lt;br /&gt;
SaveValuesOnly - убирает формулы на текущей странице и оставляет лишь их результативные статичные значения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Цвета'''''&lt;br /&gt;
&lt;br /&gt;
SetRowFontColor(Row,Color) - Устанавливает цвет шрифта в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetRowColor(Row,Color) - Устанавливает цвет фона в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetColumnFontColor(Col,Color) - Устанавливает цвет шрифта в столбце Col. Color -  целое значение (RGB) &lt;br /&gt;
&lt;br /&gt;
SetColumnColor(Col,Color) - Устанавливает цвет фона в столбце Col. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellFontColor(Row,Col,Color) -  Устанавливает цвет шрифта в ячейке с координатами [Row,Col]. Color -  целое значение, равное номеру цвета в палитре (ColorIndex,не RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellColor(Row,Col,Color) -  Устанавливает цвет фона в ячейке с координатами [Row,Col]. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
GetRowFontColor(Row)- Возвращает RGB значение цвета шрифта строки Row&lt;br /&gt;
&lt;br /&gt;
GetRowColor(Row)- Возвращает RGB значение цвета фона строки Row&lt;br /&gt;
&lt;br /&gt;
GetColumnFontColor(Col)- Возвращает RGB значение цвета шрифта столбца Col&lt;br /&gt;
&lt;br /&gt;
GetColumnColor(Col)- Возвращает RGB значение цвета фона столбца Col &lt;br /&gt;
&lt;br /&gt;
GetCellFontColor(Row,Col) - Возвращает номер цвета шрифта в палитре (ColorIndex) в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
GetCellColor(Row,Col) - Возвращает RGB значение цвета фона в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Копи-паст'''''&lt;br /&gt;
&lt;br /&gt;
Copy(x1, y1, x2, y2) - Копирует в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Cut(x1, y1, x2, y2) - Вырезает в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Paste(x1, y1) - Вставляет из буфера экселя. Команды copy-paste неразрывны, если что нибудь сделать в промежутке между ними, например вставить значение в ячейку, то копирование сброситься. (Последовательность использования: copy - paste, cut - paste)&lt;br /&gt;
&lt;br /&gt;
PasteStyle(x1, x2, y1, y2) - Вставляет только оформление из буфера экселя (Последовательность использования:  Copy - PasteStyle)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Изображения'''''&lt;br /&gt;
&lt;br /&gt;
InsertPicture(TPicture, [x=1, y=1, DispX=0, DispY=0, width=0, height=0]) - Функция вставляет рисунок на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки, width, height (не работает для DirectExcel) - ширина и высота области рисунка в пойнтах-единицах Excel &lt;br /&gt;
&lt;br /&gt;
InsertFirmLogo(FirmCode, [x=1, y=1, DispX=0, DispY=0]) - Функция вставляет логотип фирмы с кодом FirmCode на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Вывод'''''&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки. Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SheetFitPageWidth - устанавливает режим масштабирования печати, чтобы печатная форма помещалась в ширину на один лист.&lt;br /&gt;
&lt;br /&gt;
SetOrientation(value) - Устанавливает ориентацию страницы. True (по-умолчанию) - альбомная (ландшафтная), Ложь - портретная.&lt;br /&gt;
&lt;br /&gt;
PrintOut([copies]) - Печатает текущий лист на принтере по умолчанию. Параметр copies - количество копий, по умолчанию равен 1.&lt;br /&gt;
&lt;br /&gt;
Save(filename) - Сохраняет в файл filename. Если файл существует, в основной системе он будет перезаписан, в других проектах - вызовет ошибку &amp;quot;Файл уже существует&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SetVisible(b) – Устанавливает видимость приложения Excel для пользователя. По-умолчанию – false (не видимо).&lt;br /&gt;
&lt;br /&gt;
DoNotDestroy(b) – При уничтожении объекта TExcel (а он уничтожается, как и все остальные объекты автоматически при завершении выполнения скрипта), приложение Excel уничтожается вместе с ним. DoNotDestroy(true) отключает уничтожение приложения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования'''''&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'myxl');&lt;br /&gt;
 myxl.OpenFile('c:\asdf.xlsx');&lt;br /&gt;
 set($sum, 0);&lt;br /&gt;
 while (myxl.EOF=0, &lt;br /&gt;
      set($sum, $sum+int(myxl.c));&lt;br /&gt;
      myxl.next );&lt;br /&gt;
 $sum&lt;br /&gt;
 &lt;br /&gt;
 ''Возвращает сумму всех числовых данных столбца C файла 'c:\asdf.xlsx'''&lt;br /&gt;
&lt;br /&gt;
== Объект TDirectExcel ==&lt;br /&gt;
Объект позволяет работать с файлами Excel напрямую, без установленного пакета MsOffice. Применяется в сервисах и при отсутствии экселя. Он максимально совместим с объектом TExcel, однако некоторые методы могут быть не реализованы. &lt;br /&gt;
&lt;br /&gt;
== Объект TCSVFile ==&lt;br /&gt;
Предназначен для доступа к данным документов CSV. Разделителем столбцов является символ точка с запятой ;&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
OpenFile(FileName) – Открывает файл FileName.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=false]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO.&lt;br /&gt;
&lt;br /&gt;
LoadFromText(s) - Загружает таблицу из строки s.&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). &lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(Filename) - Сохраняет в файл с именем filename.&lt;br /&gt;
&lt;br /&gt;
== Объект TADO ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к базам данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|Connect(ConnectionString)&lt;br /&gt;
|Подключает к источнику данных. ConnectionString – Строка подключения ADO.&lt;br /&gt;
|-&lt;br /&gt;
|ConnectMySQL(DBServer, DBPort, DBUser, DBPass, DBName)&lt;br /&gt;
|Подключает к базе данных MySQL.&lt;br /&gt;
|-&lt;br /&gt;
|Open(Query)&lt;br /&gt;
|Открывает набор данных выполнив запрос Query.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByNo(i)&lt;br /&gt;
|Возвращает значение поля с номером i. Нумерация полей – с нуля.&lt;br /&gt;
|-&lt;br /&gt;
|FieldName(i)&lt;br /&gt;
|Возвращает имя поля с номером i.&lt;br /&gt;
|-&lt;br /&gt;
|FieldCount&lt;br /&gt;
|Возвращает количество  полей.&lt;br /&gt;
|-&lt;br /&gt;
|RecordCount&lt;br /&gt;
|Возвращает количество записей.&lt;br /&gt;
|-&lt;br /&gt;
|RecNo&lt;br /&gt;
|Возвращает номер текущей записи. ''ВНИМАНИЕ! В зависимости от способа подключения к БД нумерация может начинаться как с 0 так и с 1!''&lt;br /&gt;
|-&lt;br /&gt;
|EOF&lt;br /&gt;
|Возвращает признак достижения конца набора данных. Становится истиной когда выполняется команда Next на последней записи.&lt;br /&gt;
|-&lt;br /&gt;
|Next&lt;br /&gt;
|Переход на следующую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|First&lt;br /&gt;
|Переход на первую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|Last&lt;br /&gt;
|Переход на последнюю запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByName(FieldName)&lt;br /&gt;
|Возвращает значение поля по имени. Также возможно указание имени поля как свойства объекта.&lt;br /&gt;
|-&lt;br /&gt;
|Field(Table, ID, FieldName)&lt;br /&gt;
|Возвращает значение поля FieldName записи с кодом ID таблицы Table. Набор данных, если он открыт, при этом не закрывается. Первичный ключ таблицы должен называться «code». Гарантированно работает только с MYSQL!!!&lt;br /&gt;
|-&lt;br /&gt;
|GetSQLValue(Query)&lt;br /&gt;
|Выполняет SQL-запрос. Текст запроса должен начинаться с первого символа строки (перед запросом не должно быть пробелов, переносов строк, комментариев и т.д.). Если запрос Insert – возвращает ID вставленной записи. Если запрос – Update, Delete, Replace, Set, Start, Commit, Rollback – возвращает количество измененных записей (RowsAffected), иначе – Select – значение первого поля первой строки результата как текст.&lt;br /&gt;
|-&lt;br /&gt;
|FillText(s)&lt;br /&gt;
|Возвращает строку s с замененными названиями полей между знаками процента на соответствующие значения текущей записи. Так же в строке возможно использование интерпретируемого кода, заключенного между тегами &amp;quot;&amp;lt;?&amp;gt;&amp;quot; и &amp;quot;&amp;gt;&amp;quot;. При интерпретации система сначала производит замену полей с процентами на значения, потом интерпретирует код. ''Внимание! Функция не создает отельный контекст интерпретатора, а использует существующий, в нем доступны все объекты и переменные, вызывающего скрипта.'' Дополнительно автоматически создается объект TSelfADO, подключенный к той же БД, что и контекст, вызвавший функцию, с пустым именем, а так же с именем &amp;quot;dataset&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|Query(Query)&lt;br /&gt;
|Синоним GetSQLValue.&lt;br /&gt;
|-&lt;br /&gt;
|Close&lt;br /&gt;
|Закрывает набор данных.&lt;br /&gt;
|-&lt;br /&gt;
|Self&lt;br /&gt;
|Возвращает указатель на подключение к БД для использования в других объектах.&lt;br /&gt;
|-&lt;br /&gt;
|ParseForIn([FieldName='code']) &lt;br /&gt;
|Возвращает через запятую значения всех строк в указанном столбце. По умолчанию, используется столбец с именем code.&lt;br /&gt;
|-&lt;br /&gt;
|GetSQL&lt;br /&gt;
|Для отладки. Возвращает последний SQL запрос переданный в методы Open, Query, GetSQLValue&lt;br /&gt;
|-&lt;br /&gt;
|ExportExcel&lt;br /&gt;
|Для отладки. Выгружает в эксель содержимое датасета. Можно использовать в незнакомом окружении для понимания передаваемых полей в : шаблонах, печатных формах и т.д. Аналог команды %echo% в шаблонах, на случай если она не сработает.&lt;br /&gt;
|-&lt;br /&gt;
|OnGetText&lt;br /&gt;
|Функция подменяет текстовый вывод значения поля при выгрузке в эксель. Первый параметр это имя поля, которое надо подменить. Второй параметр это то что необходимо вывести. Работает только с текстовыми полями. &lt;br /&gt;
'''''Пример использования'''''  &lt;br /&gt;
  DB.OnGetText('Зона', IF((DB.FieldByName('-Lat') ! 0) * (DB.FieldByName('-Lon') ! 0),&lt;br /&gt;
       	GetPolygonByLatLon(DB.FieldByName('-Lat'), DB.FieldByName('-Lon'), 'TYPE = 1 AND IFNULL(zone, 0) &amp;gt; 0 AND PRICE = ' + DB.FieldByName('-price'), 'zone')&lt;br /&gt;
  ,&lt;br /&gt;
        ''&lt;br /&gt;
  ));&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования – см. TSelfADO&lt;br /&gt;
&lt;br /&gt;
== Объект TSelfADO ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наследник объекта TADO. Служит для подключения к «родной» для программы, в которой выполняется скрипт, базе данных. Обладает всеми свойствами и методами объекта TADO, кроме Connect. Иногда автоматически создается системой для обеспечения простого доступа к базе данных, а также иногда создается системой с уже открытым набором данных для передачи обрабатываемого системой набора данных в скрипт. В этом случае для скрипта недоступны функции Open и Close.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&lt;br /&gt;
 rem('Копируем данные из &amp;quot;родной&amp;quot; базы данных в базу MSSQL.');&lt;br /&gt;
 new('TSelfADO', 'MyDB');&lt;br /&gt;
 new('TADO', 'MSSQL');&lt;br /&gt;
 MSSQL.Connect('Provider=SQLOLEDB.1;Password=myPassword;Persist Security Info=True;User ID=myUsername;Initial Catalog=myDataBase;Data Source=myServerAddress');&lt;br /&gt;
 MyDB.Open('select code, name, passport from kurier where code&amp;gt;'+Int(MSSQL.Query('select max(code) from kurier'))+' order by code');&lt;br /&gt;
 While(MyDB.EOF=0,&lt;br /&gt;
      MSSQL.Query('insert kurier (code, name, passport) VALUES ('+MyDB.Code+', '+QuotedStr(MyDB.Name)+', '+QuotedStr(MyDB.Passport)+')');&lt;br /&gt;
      MyDB.Next;&lt;br /&gt;
      );&lt;br /&gt;
&lt;br /&gt;
== Объект TPrinter ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к принтерам.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
BeginDoc – Начинает новый документ.&lt;br /&gt;
&lt;br /&gt;
EndDoc – Закрывает документ&lt;br /&gt;
&lt;br /&gt;
PageHeight – Возвращает высоту страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageWidth – Возвращает ширину страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageNumber – Возвращает номер текущей страницы документа&lt;br /&gt;
&lt;br /&gt;
Orientation – Возвращает текущую ориентацию страницы (0 – портретная, 1 – ландшафтная)&lt;br /&gt;
&lt;br /&gt;
Printing – Возвращает истину если документ открыт&lt;br /&gt;
&lt;br /&gt;
SetOrientation(Orientation) – Устанавливает ориентацию страницы. При необходимости начинает новый документ, новую страницу.&lt;br /&gt;
&lt;br /&gt;
ShowDialog – Показывает пользовательский диалог печати. Возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
NewPage – Начинает новую страницу&lt;br /&gt;
&lt;br /&gt;
Canvas – Предоставляет доступ к объекту TCanvas, связанному с принтером.&lt;br /&gt;
&lt;br /&gt;
PrinterNames – Возвращает список принтеров, установленных в системе, разделенный переносами строк&lt;br /&gt;
&lt;br /&gt;
PrintersCount – Возвращает количество установленных в системе принтеров&lt;br /&gt;
&lt;br /&gt;
SetPrinter(Printer) – Устанавливает текущий принтер. Если передана строка – ищет принтер по названию, иначе – по номеру. Нумерация начинается с 0.&lt;br /&gt;
&lt;br /&gt;
PrintTable(Y, Table) – Выводит на печать таблицу Table типа TTable, начиная с координаты Y. При необходимости таблица печатается на нескольких страницах. Возвращает координату Y конца таблицы.&lt;br /&gt;
&lt;br /&gt;
GetDefaultPrinter - Возвращает имя текущего активного принтера.&lt;br /&gt;
&lt;br /&gt;
SetDefaultPrinter(Printer) – Запоминает предыдущий активный принтер и устанавливает новый текущий принтер. Printer - имя принтера. При необходимости нескольких последовательных вызовов SetDefaultPrinter рекомендуется между вызовами использовать RestoreDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
RestoreDefaultPrinter - Устанавливает активным принтер, который был текущим перед последним вызовом SetDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
== Объект TCanvas ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предоставляет доступ к холсту объекта для прорисовки изображения.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
DPIX – Возвращает разрешение холста по горизонтали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
DPIY – Возвращает разрешение холста по вертикали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
TextOut(x, y, s[, x1, y1, x2, y2]) – Выводит строку s начиная с точки с координатами x и y. Если указаны параметры x1, y1, x2, y2 – то выводимый текст ограничивается заданным прямоугольником.&lt;br /&gt;
&lt;br /&gt;
TextOutEx(x1, y1, x2, y2, Alignment, Font, s, Indent) – Выводит строку s в прямоугольнике с координатами x1, y1, x2, y2. По горизонтали строка выравнивается в соответствии с Alignment (0 – прижато влево, 1 – вправо, 2 – по центру), по вертикали выравнивается по центру. Используя шрифт Font (см описание ниже). Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату X фактического окончания текста (правой стороны – если строка прижата влево, и левой – в остальных случаях)&lt;br /&gt;
&lt;br /&gt;
MLTextOut(x1, y1, x2, y2, Alignment, VAlignment, Font, s, Heigth, Indent) – Выводит многострочный текст s в прямоугольнике с координатами x1, y1, x2, y2 с переносом по словам. По горизонтали строки выравниваются в соответствии с Alignment, по вертикали – в соответствии с VAlignment (0 – прижато вверх, 1 – по центру, 2 – прижато вниз). Используя шрифт Font (см описание ниже). Heigth – высота строки. Если опущено или равно нулю – высота определяется автоматически в соответствии с выбранным шрифтом. Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату Y фактического окончания текста (нижней границы последней строки текста. ''ВНИМАНИЕ! Функция использует координаты прямоугольника для позиционирования текста, однако она не ограничивает его верхней и нижней границами этого прямоугольника!''&lt;br /&gt;
&lt;br /&gt;
DrawPic(x1, y1, x2, y2, Pic, Style, Alignment, Mode) – Прорисовывает изображение Pic (ссылка на изображение TPicture.Self) в прямоугольник заданный координатами x1-y2. Style – стиль масштабирования. 0 – растянуть изображение до границ прямоугольника не сохраняя пропорции, 1 – вписать изображение в прямоугольник сохраняя пропорции – вероятно, останутся поля по вертикали или горизонтали, 2 – вписать сохраняя пропорции, обрезав при необходимости изображение по вертикали или горизонтали. Alignment – выравнивание по горизонтали. Работает только в случае если style=1 и при растягивании изображения получились вертикальные поля. 0 – разместить по центру, 1 – прижать влево, 2 – прижать вправо. Функция возвращает координату X правой стороны изображения кроме случая, когда Style=1 и Alignment=2 – в этом случае возвращается координата левой стороны изображения. Mode - способ наложения изображения. 0 (по-умолчанию) - копирование как есть. 1 - Наложение операцией AND (применяется для получения эффекта прозрачности изображения), 2 - наложение операцией XOR (Применяется для возможности повторной операцией убрать изображение), 3 - Наложение операцией OR.&lt;br /&gt;
&lt;br /&gt;
FillRect(x1, y1, x2, y2) – Рисует прямоугольник '''без границ''' и закрашивает цветом BrashColor&lt;br /&gt;
&lt;br /&gt;
Rect(x1, y1, x2, y2) – Рисует прямоугольник '''c границами''', задаваемыми текущим пером, и закрашивает цветом BrashColor &lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Устанавливает шрифт по-умолчанию.&lt;br /&gt;
&lt;br /&gt;
SetPen(Width, Color) - Устанавливает параметры &amp;quot;ручки&amp;quot; - толщину и цвет. Если любой параметр опустить, соответствующее значение не будет изменено.&lt;br /&gt;
&lt;br /&gt;
SetBrush(Color, Style) - Устанавливает параметры заливки - цвет и стиль. Если любой параметр опустить, соответствующее значение не будет изменено. Стили заливки: 0 - сплошная, 1 - отсутствует (прозрачная), 2-7 - различные виды штриховки (горизонтальные, вертикальные, в клеточку и т.д.).&lt;br /&gt;
&lt;br /&gt;
TextHeight(s) – Возвращает высоту текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
TextWidth(s) – Возвращает ширину текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
Использование шрифта (Font): У объекта TCanvas есть «глобальные» установки шрифта. Однако для некоторых функций возможно указание шрифта, отличающегося от глобального. Параметры шрифта – это текстовая строка, состоящая из 6-ти параметров, разделенных запятыми: Название, размер, жирный, курсив, подчеркнутый, цвет. Например:&lt;br /&gt;
&lt;br /&gt;
 'Times New Roman, 8, Y, N, N, 255'&lt;br /&gt;
&lt;br /&gt;
Любой параметр можно опустить, и тогда вместо него будет использовано значение по-умолчанию: шрифт: arial, размер – 10, не жирный, не курсив, не подчеркнутый, цвет – черный. Например: ', 7' – указывает, что по-умолчанию нужно взять все параметры кроме размера шрифта. Также можно вместо всей строки указать тире ('-') или пустую строку, и шрифт будет использоваться «глобальный».&lt;br /&gt;
&lt;br /&gt;
Объект можно создать отдельно, не создавая объект TPrinter. В таком случае объект создастся как ссылка на текущий холст принтера (принтер должен быть запущен и начат новый документ). Такой подход используется в доп. возможности PrintCustomSticker&lt;br /&gt;
&lt;br /&gt;
== Объект TPicture ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с графическими изображениями форматов BMP, GIF, JPEG и PNG, а также для формирования штрих-кодов. Обратите внимание, прозрачность изображений не поддерживается, однако в методе TCanvas.DrawPic есть параметр Mode, призванный создавать эффект прозрачности.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(FileName) – Загружает изображение из файла FileName. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB, Query) – Загружает изображение из базы данных. DB – ссылка на подключение к базе данных TADO.Self, Query – текст запроса. Запрос должен вернуть в первом поле первой строки BLOB-поле с изображением, все остальные данные возвращаемые запросом игнорируются. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromStr($s) – Загружает изображение из строки $s. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
CreateBar(Width, Height, BarCode, Textless, Type) – Формирует штрих-код шириной Width и высотой Height с типом кодирования Type. BarCode – текст штрих-кода. Булево значение Textless указывает, что в штрих-коде не должно быть человеко-читаемых символов если истинно. Type указывает тип кодирования: 0 (по-умолчанию) CODE128, 1 - EAN-13, 2 - Interleaved 2-5, 3-DataMatrix, 4-QRCode.&lt;br /&gt;
Штрихкод должен быть: Для EAN-13 цифровым 12 или 13 символов (13-й, контрольная сумма рассчитывается автоматически), для CODE128 - должен иметь состоять из допустимого для этого кодирования набора символов. Для Interleaved - должен состоять из четного числа цифр, контрольная сумма автоматически не рассчитывается. Если для Interleaved кода указано значение из 14-ти знаков, подпись цифр выводится в формате Почты России.&lt;br /&gt;
Внимание! Для кодов EAN-13 и Interleaved ширина штрих-кода Width не является точным значением получаемого на выходе изображения. Ширина изображения рассчитывается как максимальное кратное минимально возможной ширине, но не меньше минимально возможной. Конечную ширину можно получить в соответствующем свойстве объекта. Для кода CODE128 штрих-код на выходе может оказаться пустым, если указанной ширины штрих-кода не достаточно для его формирования.&lt;br /&gt;
Для кода DataMatrix можно установить режим для печати скрытых символов с кодами 29(GS) и 232(FCN1), которые требуются для формирования Честного Знака. Для этого необходимо в начале строки указать символ &amp;quot;[&amp;quot; и все разделители 01, 21, 91, 92 так же экранировать этими скобками. Должно получиться [01]02900002317701[21]k3LInNbH_oG0Q[91]EE06[92]YXiyKfiHjE4YE8b+YVMC1O5r8VtpplA3AwcCqrcG9Dk= . При формировании кода, включится режим формирования штрих-кода DataMatrix GS1, в начале будет добавлен символ с кодом 232 (FCN1), а потом будут добавлены разделители с кодом 29 (GS)&lt;br /&gt;
Функция возвращает 1 в случае успеха, или текст ошибки, если такая произошла.&lt;br /&gt;
&lt;br /&gt;
SetSize(Width, Height) - Устанавливает размер изображения.&lt;br /&gt;
&lt;br /&gt;
AsString([ImageFormat]) - Возвращает изображение в виде строки с двоичными данными. ImageFormat принимает значения 1 - Bitmap (по-умолчанию), 2 - jpeg, 3 - png, 4 - gif.&lt;br /&gt;
&lt;br /&gt;
Width – Возвращает ширину изображения.&lt;br /&gt;
&lt;br /&gt;
Height – Возвращает высоту изображения.&lt;br /&gt;
&lt;br /&gt;
Rotate(Angle) – Поворачивает изображение по часовой стрелке на угол Angle. Угол указывается в градусах и может принимать любые значения.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с изображением, используется в качестве параметра для функций, работающих с изображениями из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Canvas - ссылка на объект TCanvas холста изображения.&lt;br /&gt;
&lt;br /&gt;
== Объект TTable ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с таблицами. Удобен для печати таблицы на принтере. Алгоритм таков: Загружаем датасет в таблицу, настраиваем ее (шрифты, штрих-коды и т.д.), потом выводим на принтер функцией TPrinter.PrintTable.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Заголовок – это первая строка таблицы.&lt;br /&gt;
&lt;br /&gt;
Cell(С, R) – Возвращает значение ячейки таблицы с координатами (C, R). Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetCell(С, R, Value) – Устанавливает значение ячейки таблицы с координатами (C, R) в Value. Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
RowCount – Возвращает количество строк в таблице.&lt;br /&gt;
&lt;br /&gt;
ColCount – Возвращает количество столбцов в таблице.&lt;br /&gt;
&lt;br /&gt;
SetTitleFont(Font) – Задает шрифт заголовка таблицы (первой строки).&lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Задает шрифт всей таблицы кроме заголовка.&lt;br /&gt;
&lt;br /&gt;
SetColFont(C, Font) - Устанавливает шрифт столбца C.&lt;br /&gt;
&lt;br /&gt;
SetIndent(Indent) – Задает отступ от границы ячейки до текста в процентах от ширины страницы. По-умолчанию значение 0.3&lt;br /&gt;
&lt;br /&gt;
SetWidth(С, Width) – Задает значение ширины столбца C в процентах от ширины страницы.&lt;br /&gt;
&lt;br /&gt;
SetMinRowHeght (Heght) – Задает значение минимальной высоты строки в пикселях. &lt;br /&gt;
&lt;br /&gt;
SetBarCode(Col, Type) - Указывает, что данные из столбца Col должны печататься в виде штрих-кода. Тип штрих-кода - Type. Значение '''&amp;quot;1&amp;quot; - EAN13'''. Для кода EAN13 первая строка данных в ячейке должна иметь вид &amp;quot;тип штрих-кода, номер&amp;quot;, например &amp;quot;7, 123&amp;quot; (без кавычек, конечно). В этом случае система сформирует штрих-код: &amp;quot;2700000001233&amp;quot;. Первая цифра - всегда 2, далее - указанный тип штрих-кода, нули, чтобы получилось 13 символов, номер, указанный в таблице, и один символ - контрольная сумма. Значение '''&amp;quot;2&amp;quot; - CODE128''' (с версии 734). Данные из первой строки ячейки таблицы печатаются в штрих-коде &amp;quot;как есть&amp;quot;. Для всех видов штрих-кода (с версии 734) последующие строки печатаются под штрих-кодом в виде текста.&lt;br /&gt;
&lt;br /&gt;
SetMultiHeader(Active) - Включает печать заголовка при переносе таблицы на несколько страниц. По умолчанию отключено.&lt;br /&gt;
&lt;br /&gt;
SetCustomHeader(script) - Включает печать пользовательского заголовка. Script - это код интерпретатора, который должен печатать заголовок на канву. Печать таблицы может происходить на нескольких листах, по этому скрипт будет вызван для каждого листа. При использовании этого метода, автоматически инициализируются переменные: $TablePageNo - номер страницы, нумерация начинается с нуля; $TableY - координата по оси Y, от которой рисуется заголовок. Чтобы таблица была под заголовком необходимо значение переменной $TableY увеличить на высоту заголовка.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с таблицей, используется в качестве параметра для функций, работающих с таблицами из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 &amp;lt;?&amp;gt;&lt;br /&gt;
 NEW('TPrinter', 'Prn');&lt;br /&gt;
 If(prn.ShowDialog,&lt;br /&gt;
  NEW('TTable', 'Tbl'); &lt;br /&gt;
  NEW('TSelfADO', 'MyDB'); &lt;br /&gt;
  MyDB.Open('SELECT concat(&amp;quot;7&amp;quot;, &amp;quot;, &amp;quot;,  a.code, &amp;quot;\r\n&amp;quot;, a.client_id, &amp;quot;\r\n&amp;quot;, a.zakaz, &amp;quot;-&amp;quot;, a.number) as &amp;quot;Штрих-код&amp;quot;, a.target AS &amp;quot;Заказик&amp;quot;, address, phone, vlog, poruch FROM address a order by code desc limit 10');&lt;br /&gt;
  Tbl.LoadFromDB(MyDB.Self); &lt;br /&gt;
  Tbl.SetBarcode(1, 1);&lt;br /&gt;
  Tbl.SetCustomHeader(     &lt;br /&gt;
    if($TablePageNo&amp;gt;0,&lt;br /&gt;
      Prn.Canvas.TextOut(Prn.Canvas.DPIX*0.1, $TableY, 'Продолжение таблицы');&lt;br /&gt;
      set($TableY, $TableY + Prn.Canvas.TextHeight('H'));&lt;br /&gt;
    ,0)&lt;br /&gt;
  );&lt;br /&gt;
  Prn.BeginDoc; &lt;br /&gt;
  Prn.PrintTable(0, Tbl.Self);   &lt;br /&gt;
  Prn.EndDoc&lt;br /&gt;
 , );&lt;br /&gt;
&lt;br /&gt;
== Объект TBaseUtils ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции, базирующиеся на БД системы «MEASOFT». По-умолчанию, при создании подключается к основной базе данных модуля, в котором выполняется скрипт, если такая определена контекстом, однако это можно изменить, см SetConnection.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
'''MakeAddress(s[,town])''' – возвращает значение, полученное путем преобразований адреса s для приведения его к внутреннему формату программы. В процессе преобразования до нескольких раз происходит замена буквосочетаний по таблице замены (ее редактирование доступно по нажатию кнопки «Автозамена» в интерфейсе импорта БД из Excel системы (см. Руководство пользователя)), поиск улиц по базе КЛАДР с точностью до одного знака, и некоторые другие операции, нацеленные на исправление ошибок в написании адреса.&lt;br /&gt;
&lt;br /&gt;
С версии программы 2008.0.0.615, при вызове функции в формулах загрузки реестра, в первую очередь происходит проверка строки s на условия:&lt;br /&gt;
* в строке s записано  число; &lt;br /&gt;
* строка s начинается с &amp;quot;ПВЗ &amp;quot;. &lt;br /&gt;
Если одно из этих условий выполняется, то функция пытается установить пункт самовывоза - т.е она сама в загружаемой карточке корреспонденции укажет: адрес ПВЗ, город ПВЗ и установит галку самовывоз. &amp;lt;br/&amp;gt;Правила поиска ПВЗ:&lt;br /&gt;
* Если s число -  считаем его внутренним кодом филиала;&lt;br /&gt;
* Если s начинается с &amp;quot;ПВЗ &amp;quot; - Например в адресе передана строка &amp;quot;ПВЗ На Ленинском проспекте&amp;quot;, то искать будем филиал с названием &amp;quot;На Ленинском проспекте&amp;quot; который подчиненный, активный, с галкой ПВЗ и в городе town. Если город не указан, то ищем филиал во всех городах, и считаем его найденным если найдем только один филиал. &lt;br /&gt;
* Если филиалы найти не удалось, функция makeaddress работает как обычно и выполняет преобразование адреса.&lt;br /&gt;
&lt;br /&gt;
Если адрес не содержит русских букв, только латиница, и курьерская служба находится в одной из стран Россия, Белоруссия, Казахстан или Украина, и город-получатель (второй параметр, town) находится так же в одной из этих стран, функция автоматически делает транслитерацию адреса на русский язык.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''SetConnection(DB) – Подключает объект к базе данных DB, где DB – ссылка на объект TADO.Self.'' '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
''SetTown(Town) – Устанавливает код текущего города (используется в некоторых функциях объекта) в значение Town. По-умолчанию текущий город – 1.''  '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
'''SetIndexLength(Length)''' – Устанавливает длину почтового индекса. По-умолчанию – 6.&lt;br /&gt;
&lt;br /&gt;
'''GetIndex(Address)''' – Возвращает почтовый индекс из адреса.&lt;br /&gt;
&lt;br /&gt;
'''GetStreet(Address)''' - Возвращает улицу до первой запятой.&lt;br /&gt;
&lt;br /&gt;
'''GetHome(Address)''' - Возвращает номер дома до второй запятой, но не более пяти символов.&lt;br /&gt;
&lt;br /&gt;
'''GetKurierByStation(station, Mass, Cash, Date_Putn)'''&lt;br /&gt;
&lt;br /&gt;
'''TownByIndex(Index[, PriorityName][, PriorityCountry])''' – Возвращает код города по индексу. В случае ошибки поиска – код текущего города. Если нашлось несколько населенных пунктов, и указано приоритетное название - выбирается населенный пункт, название которого начинается с PriorityName (если есть).&lt;br /&gt;
&lt;br /&gt;
'''TownByName(Name[,NotNeedCL=False, City=0])''' – Возвращает код города по имени. В случае ошибки поиска – возвратит код текущего города. Если параметр NotNeedCL (параметр не обязательный) установить в TRUE, тогда функция возвратит 0, если город не удалось найти. Параметр City (код региона) позволяет ограничить поиск одной областью (не обязательный, по умолчанию не используется).&lt;br /&gt;
&lt;br /&gt;
'''FillClientInfo(Excel, client, Sheet, Row, Col)''' – Выводит в эксель информацию о клиенте с кодом client на лист sheet начиная со строки row и столбца col.&lt;br /&gt;
&lt;br /&gt;
'''SavePrintFormToFile(FormType, FormNumber)''' - Сохраняет на диске файл печатной формы и возвращает путь к нему&lt;br /&gt;
&lt;br /&gt;
'''CreateTrans(Address[, Store][, Operator][,Correction])''' - Формирует запись для печати кассового чека для корреспонденции с кодом Address, для выбора кассового аппарата используется код склада Store. Если Store не указано - при исполнении в среде клиентского модуля системы использует склад, указанный пользователем в окне [[Настройка параметров рабочего места|&amp;quot;Настройка&amp;quot; - &amp;quot;Параметры&amp;quot;]], в остальных модулях - код текущего склада из [[Настройка глобальных параметров|переменной]] &amp;quot;CL&amp;quot; (&amp;quot;Текущий филиал&amp;quot;). Поле Operator позволяет указать кассира (передается код справочника сотрудников). Если не указан, в основной системе будет использован код авторизованного пользователя, в других модулях - 1.&lt;br /&gt;
Поле Correction позволяет указать данные для корректировочного чека, используется в системе Штрих-М. По умолчанию пустая строка. Возвращает идентификаторы записей чеков. Может вернуть пустую строку, если чек создавать не понадобилось, один или несколько кодов через запятую, если создано несколько чеков. В случае ошибки вызывает ошибку, поэтому рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CreateReturnTrans(Address)''' - формирует запись для печати чека возврата для корреспонденции с кодом Address. Чек возврата печатается на полную сумму и с теми же атрибутами, что и чек продажи. Возвращает идентификатор записи чека возврата. В случае ошибки вызывает ошибку, поэтому, как и с CreateTrans,  рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownDeliveryDays(Source, Mode, TownTo, TownFrom)''' - возвращает количество дней необходимых на доставку отправления, только для межгорода. Source - код клиента, Mode - режим срочности, TownFrom - код города отправителя, TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcDeliveryDate(Source, Mode, TownTo, TownFrom, Date_Beg, Time_beg)''' - Возвращает планируемую дату доставки с учетом сроков доставки. Работает при городской и междугородней доставке. Для межгорода сроки доставки берутся из зон. Для городской доставки, из дополнительных параметров статуса (17 статус, 1 параметр в доп. информации)  Если рассчитать дату планируемой доставки не удалось, возвращает пустую строку. Параметры: Source - код клиента, Mode - режим срочности, TownTo - город получатель, TownFrom - город отправитель, date_beg - дата заказа (может быть передана строкой в формате DD.MM.YYYY или в числовом), time_beg - время заказа. &lt;br /&gt;
&lt;br /&gt;
'''GenSpecialSMA(DirectExcel, Code)''' - функция для генерации отчета о доставке по акту передачи денег. Первый параметр - указатель на TDirectExcel, второй параметр - код акта передачи денег. АПД выводится на текущий лист объекта TDirectExcel.&lt;br /&gt;
&lt;br /&gt;
'''CreateSpecialSMA(ClientCode, DateTo)''' - Функция создает исходящий акт передачи денег (АПД). Требует ClientCode - код клиента, DateTo - дату акта. Функция возвращает коды созданных актов. Если возвращаемых параметров два, значит функция пыталась создать два АПД: первым, идет код АПД с наличной оплатой, а вторым с безналичной. Примеры возвращаемого результата: '0'- акт не был создан, отсутствуют корреспонденции; '124' - код созданного акта; '0,0' - пытались создать два акта, но отсутствуют данные; '4556,0' - создан только наличный АПД; '0,445' - создан только безнал.; '4556,445' - созданы нал. и безнал.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressForActDelivery(ActCode, [DeliveryDateMode=0, Delivery=True])''' - Функция создает корреспонденцию на доставку акта. ActCode - код акта; DeliveryDateMode: 0 - установить план. дату доставки текущим рабочим днем, 1 - установить план. дату доставки следующим рабочим днем, 2 - установить план. дату доставки равной планируемой дате оплаты АПД; Delivery - создать корр. на доставку АПД или создать корреспонденцию на забор АПД (по умолчанию, доставка АПД). Работа функции может быть изменена системной доп. возможностью OnCreateAddressForActDelivery.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressTransferAct(ClientCode, Store, DateTo, [AdditionalParam])''' - Функция создает исходящий акт передачи корреспонденции (АПК). Требует  ClientCode - код клиента, Store - код филиала, для которого будет создан акт, DateTo - дату, до которой в акт попадут возвраты, AdditionalParam - дополнительный строковый параметр для передачи в системную доп. возможность ExceptionsForAPK, позволяющий отобрать в акт, например, только полные возвраты.   Возвращает код созданного акта. ВНИМАНИЕ: при создании АПК используется системная функция ExceptionsForAPK. Если в ней используются интерактивные функции (вывод сообщений, диалоговые окна, выполнение скриптов), то акт сформирован не будет, а функция CREATEADDRESSTRANSFERACT вернет ошибку.     &lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByAddress(Address, TownCode, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попал адрес. Если полигон найти не удалось, функция возвратит пустую строку. Address - адрес корреспонденции текстом; TownCode - код города; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByAddress(addressrecord.address, if((addressrecord.number=0)*(addressrecord.strbarcode=&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;), addressrecord.townfrom, addressrecord.townto), '`schema`=1') - пытаемся найти вхождение адреса в полигоны 1 схемы, при выборе города учитывается корр. на забор, у нее нужно использовать город-отправитель (а для обычной корр. нужен город-получатель).&lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByLatLon(Lat, Lon, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попали GPS координаты. Если полигон найти не удалось, функция возвратит пустую строку. Lat - широта  текстом; Lon - долгота текстом; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByLatLon('55.769064','37.590713','zone is not null and price=0') - пытаемся найти вхождение координат в полигоны, где задана зона, для всех клиентских и курьерских зон.&lt;br /&gt;
&lt;br /&gt;
'''GetLatLonByAddress(AddressText, TownCode)''' - возвращает географические координаты вида lat,lon указанного в AddressText адреса. Поиск производится в городе, имеющем код TownCode в таблице Town.&lt;br /&gt;
&lt;br /&gt;
'''GetRouteCode(AddressText, TownCode, LatLon[, Lon])''' - для адреса AddressText в городе с кодом TownCode (из таблицы Town) по географическим координатам lat, lon возвращает код роута (записи, хранящей координаты адреса в городе). Если роут не найден (для адреса в городе не найдено записи с указанными координатами) - создает новый роут и возвращает его код, если роут найден (был создан ранее) - обновляет у роута координаты. Если параметр Lon задан, то параметр LatLon должен содержать одну координату, иначе LatLon должен содержать строку вида 'lat, lon'.&lt;br /&gt;
В случае ошибки возвращает Null.&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode(address, townto, '55.114034, 36.592397'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Троицк, Полковника милиции Курочкина ул., 11', 1, '37.467446, 55.740537'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Обнинск, Маркса пр., 20', TownByName('Обнинск'), 55.114034, 36.592397));&lt;br /&gt;
&lt;br /&gt;
'''CalcAgentPrice(AddressCode, AgentCode, TownFrom, TownTo, Mode, [, Count=1])''' - функция возвращает стоимость доставки рассчитанную по тарифу агента. AddressCode - код адреса, AgenCode - код филиала (агента), TownFrom - код города отправителя, TownTo - код города получателя, Mode - режим срочности, count - тарифная сетку от указанного количества отправлений (по умолчанию 1)&lt;br /&gt;
&lt;br /&gt;
'''SetAddrKol_vo(address, getkol_vo)''' - функция делает прием корреспонденции в текущем ответственном филиале. address - внутренний код адреса, getkol_vo - количество принимаемых мест, может принимать значения: &amp;quot;kol_vo&amp;quot; - принять все места, &amp;quot;getKol_vo+1&amp;quot; - принять еще одно место, &amp;quot;число&amp;quot; - сделать количество принятых мест равным указанному числу.&lt;br /&gt;
&lt;br /&gt;
'''CalcClientCnt(client_code, date, is_intown [, date_put=CurrDate(), skipajust=false])''' - функция расчета количество доставленных корреспонденций у клиента с кодом client_code за предыдущий месяц от даты date (Или за текущий месяц, подробнее смотри переменную UseCurrentMonthCount) среди внутригородских (is_intown = true) либо междугородних (is_intown = false) корреспонденций, date_put - дата доставки (для альтернативного способа подсчета, включаемого переменной UseDatePutForCalcCnt), skipajust - не учитывать принудительно введенные количества (таблица priceclientadjust типы записей 0 и 1).&lt;br /&gt;
&lt;br /&gt;
'''GetBasePrice''' - возвращает базовую стоимость доставки посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов,зоны,типа,срочности,массы, расстояния. В системах с выключенными доп. услугами также считает проценты от суммы и страховки. &lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset._self&amp;quot;.&lt;br /&gt;
  Описание некоторых полей датасета:&lt;br /&gt;
    pmoney - процент от суммы;&lt;br /&gt;
    pmoneycard - процент от суммы при оплате картой;&lt;br /&gt;
    pricecode - код прайса (таблица Price) ;&lt;br /&gt;
    distarea - район метро получателя (актуально при отключённом едином районировании, как правило район от 200 до 299 является признаком области);&lt;br /&gt;
    region - признак области при включенном едином районировании;&lt;br /&gt;
    distareaFrom и regionFrom  - аналог distarea, region только для отправителя;&lt;br /&gt;
    pcncode - код записи таблицы pricecnt &amp;quot;количество от&amp;quot;;&lt;br /&gt;
    Запрос содержит поля таблицы pricelinesnew - начальная стоимость по тарифной сетки, найденные без учета массы,только по типу срочности и режиму.&lt;br /&gt;
    Запрос содержит поля таблицы price.&lt;br /&gt;
&lt;br /&gt;
*addressrecord - ссылка на объектную модель карточки корреспонденции, следует использовать уже созданную addressrecord._self&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*type - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*wait - количество минут ожидания (не учитывается при доп. услугах, есть системная услуга &amp;quot;ожидание&amp;quot;);&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*rur - сумма передаваемых денег (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от суммы&amp;quot;);&lt;br /&gt;
*inshprice - сумма страховки (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от объявленной стоимости&amp;quot;);&lt;br /&gt;
*distance - расстояние до места доставки, обычно поле заполняется при доставке в область (регион в едино районировании). Дополнительная наценка к стоимости доставки;&lt;br /&gt;
*forward - направление доставки: true - туда; false - обратно;&lt;br /&gt;
*Collection - признак заборной корреспонденции: true - забор, false - доставка (В тарифе есть возможность указать стоимость для забора);&lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
В тарифе есть возможность указать формулу, которая может влиять на базовый расчет. Формула может объявить служебные переменные, которые:&lt;br /&gt;
*$FormulaReplace - если true – возвращаемое значение полностью заменяет базовый расчет;&lt;br /&gt;
*$FormulaKoeff - коэффициент на который будет помножена базовая стоимость.&lt;br /&gt;
Также внутри формулы объявлены следующие объекты dataset, addressrecord и переменные:&lt;br /&gt;
*$ForceIntown - Переменная становится истиной, если междугородний расчет был отменен, т.к. адрес попал в нарисованную зону на карте.&lt;br /&gt;
*а также: $forward, $distance, $Count, $Collection, $Wait, $FormulaKoeff, $PriceCode - описание есть выше.&lt;br /&gt;
&lt;br /&gt;
Для направления &amp;quot;туда&amp;quot;, Функция GetBasePrice вызывается  через доп. услугу &amp;quot;База&amp;quot; (при включенных доп. услугах), для направления &amp;quot;Обратно&amp;quot; всегда вызывается напрямую (т.к. доп. услуги работают только в для направления &amp;quot;туда&amp;quot;).&lt;br /&gt;
На расчет этой функции влияют следующие переменные: &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Расчет стоимости по адресу&amp;quot;, &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Зона клиента по умолчанию&amp;quot;,  &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Подсчет кол-ва отправлений за месяц&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownPrice''' - возвращает базовую стоимость междугородней доставки, посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов, типа, срочности, массы, расстояния.&lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset.self&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*tp - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcAddressPrice(AddressCode, [,ZakazCount])''' - полностью пересчитывает стоимость доставки корреспонденции по тарифу клиента. AddressCode - внутренний код адреса, ZakazCount - не обязательный параметр, кол-во заказов от клиента.&lt;br /&gt;
&lt;br /&gt;
'''GetStationCode(s [,town])''' – возвращает код станции метро, ассоциированный в системе с адресом s. В случае невозможности идентифицировать станцию метро – возвращает 0. &lt;br /&gt;
Когда включено районирование по карте, необходим второй параметр &amp;quot;town&amp;quot; - код города в котором нужно искать адрес.  Возвращает код района если удалось его найти; код станции меж-города - если адрес удалось геокодировать, но район не нашли; код 0 - когда не удалось геокодировать адрес.&lt;br /&gt;
&lt;br /&gt;
'''RecalcSpecialSMA(ActCode)''' - пересчитать акт передачи денег (АПД). Также, у корреспонденций входящих в АПД будет пересчитана стоимость доставки. Для Входящего АПД сумма акта не пересчитывается. Параметр ActCode - внутренний код акта, коды можно перечислять через запятую.&lt;br /&gt;
&lt;br /&gt;
'''UserCode''' - Возвращает код текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserName''' - Возвращает имя текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserPass''' - Возвращает пароль текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''UserBaseCode''' – Возвращает код текущего пользователя из таблицы «Сотрудники» (kurier).&lt;br /&gt;
&lt;br /&gt;
'''UserEmail''' - Возвращает e-mail текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''CurrentTown''' – Возвращает код текущего города (из таблицы town).&lt;br /&gt;
&lt;br /&gt;
'''CurrentCity''' – Возвращает код текущего региона (из таблицы city).&lt;br /&gt;
&lt;br /&gt;
'''CurrentLocation''' – Возвращает код текущего филиала (из таблицы store).&lt;br /&gt;
&lt;br /&gt;
'''FromEmailStr''' - строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
'''FillExcelDoc'''(Excel, Dataset, FormType, FormNumber,Print,[printer]) - Выполняет указанную печатную форму в объекте excel. Excel объект можно не указывать, тогда функция сама создаст объект экселя и разрушит его, полезно когда книгу &lt;br /&gt;
нужно распечатать или отправить по email (на листе данных в ячейке 1,1 укажите ключевое слово email). Dataset объект с данными для скрипта в печатной форме, может быть null. Dataset передавать можно так db.self, тогда переданный dataset внутри печатной формы будет доступен по имени dataset. Print - печатает книгу на принтере, после печати объект excel разрушается, при использовании параметра не указываете объект excel. Printer - имя принтера, на котором печатать (по умолчанию пустая строка, что означает &amp;quot;печатать на принтере по умолчанию&amp;quot;). Например:&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'excel');&lt;br /&gt;
 FillExcelDoc(excel.self, null, 12, 1);&lt;br /&gt;
 excel.DoNotDestroy(true);&lt;br /&gt;
 excel.SetVisible(true);&lt;br /&gt;
 ''Покажет эксель с выполненной печатной формой''&lt;br /&gt;
&lt;br /&gt;
'''ValutaSign''' – Возвращает название валюты для суммы.&lt;br /&gt;
&lt;br /&gt;
'''SendToMeasoft(xml)''' - Отправляет запрос в клиентское API Measoft. Автоматически добавляет начальный &amp;quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''InsertFirmAtt(excel, sheet, firmcode)''' - Вставляем на лист эксель по коду фирмы: печать, подпись, подпись бухгалтера, логотип. Тэги &amp;lt;STAMP&amp;gt;, &amp;lt;DIR&amp;gt;, &amp;lt;BUH&amp;gt;, &amp;lt;LOGO&amp;gt; соответственно. После тега можно указать размеры изображения в символах Microsoft Excel. Формат записи: &amp;lt;STAMP&amp;gt; 16, 16&lt;br /&gt;
&lt;br /&gt;
'''PreCalcSalary(kurier, addressCodes)''' - Рассчитывает предварительную зарплату. Kurier - код курьера, используется для определения тарифа. addressCodes - коды адресов, через запятую для которых необходимо посчитать зарплату. Результаты расчета будут записаны в таблицу kurierpaydetail, так как расчет предварительный то записи не будут прикреплены к конкретному начислению. &lt;br /&gt;
&lt;br /&gt;
  select a.code, kpd.price as &amp;quot;туда&amp;quot;, kpd2.price as &amp;quot;обратно&amp;quot; from address a &lt;br /&gt;
  left join kurierpaydetail kpd on kpd.sourcetable=3 and kpd.sourcecode=a.code and kpd.rectype = 1 &lt;br /&gt;
  left join kurierpaydetail kpd2 on kpd2.sourcetable=3 and kpd2.sourcecode=a.code and kpd2.rectype = 2&lt;br /&gt;
  where a.code in (...)&lt;br /&gt;
&lt;br /&gt;
'''CalcSalary(DateTo, [Filter=0, KurierCode = 0, ManagerCode = 0])''' - Полный расчет зарплаты курьерам. DateTo  - дата до которой создается начисление. Условия отбора курьеров для начисления. Filter - роль сотрудника: 0 - Все, 1 - курьеры, 2 - менеджеры; KurierCode - код курьера, ограничить расчет зарплаты одним курьером;ManagerCode - код курьера, ограничить расчет зарплаты курьерами указанного менеджера. Внимание фильтры Filter, KurierCode и ManagerCode накладываются друг на друга. Результатом функции является SubSQL с информацией по созданным начислениям. &lt;br /&gt;
  поля ответа: код курьера, код менеджера, начислено, бонусы, штрафы, аванс, итого;&lt;br /&gt;
  select kurier, manager, profit, bonus, shtraf, prepay, total  [union select ...]&lt;br /&gt;
&lt;br /&gt;
'''SelDistAddr(s)''' – Возвращает строку для вставки в select запрос, для вывода поля с упрощенным адресом. Принимает один необязательный строковый параметр - алиас таблицы из которой будет упрощаться поле address, по умолчанию &amp;quot;a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''VoiceReadStr(str)''' – Озвучивает фразу str голосовым уведомлением доступными словами из базы. Может содержать тег &amp;quot;{break_off}&amp;quot; для того, чтобы сделать эту фразу не пропускаемой в очереди воспроизведения.&lt;br /&gt;
&lt;br /&gt;
'''CalcStorageCost(ClientCodes, DateFrom, DateTo, NeedReport[, Store])''' – рассчитывает стоимость хранения на складе для выбранных клиентов (ClientCodes - коды клиентов через запятую), в период дат с DateFrom до DateTo, с прикреплением к корреспонденции отчета в зависимости от выставленного параметра NeedReport. Может содержать параметр Store - код филиала, по умолчанию пустой (расчет выполняется для всех филиалов). Возвращает коды созданных корреспонденций через запятую.&lt;br /&gt;
&lt;br /&gt;
'''WriteOut(DocId, ItemId, Date, Cnt[, BC])''' – производит списание товара со склада. DocId - код (docs.code) документа списания, ItemId - код товара (item.code), Date - дата операции, Cnt - количество списываемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер. Если указан BC, то параметр ItemId игнорируется и поиск номенклатуры происходит исключительно по штрих-коду. В случае успеха, функция возвращает строку вида: код номенклатуры, списанное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''IncomePurch(DocId, ItemId, Date, Cnt[, BC, Location = CurrentLocation])''' – производит приход товара на склад. DocId - код (docs.code) приходной накладной, ItemId - код товара (item.code), Date - дата операции, Cnt - количество приходуемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер, Location - код склада (store.code).  В случае успеха, функция возвращает строку вида: код номенклатуры, введенное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''CreateLedgerDoc(Date, Client, UserCode, Type[, ExtNumber, Message])''' - создает складской документ и возвращает код этого документа. Date - дата документа. Client - код клиента. UserCode - код пользователя, создавшего документ. Type - тип документа (statetype = 13). ExtNumber - номер у поставщика для документов прихода и расхода. Message - комментарий к документу. Последние два аргумента не обязательные и могут быть пустыми.&lt;br /&gt;
&lt;br /&gt;
== Объект TINIFile ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции работы с ini-файлами. В некоторых контекстах создается автоматически для предоставления доступа к настроечному файлу модуля, выполняющего скрипт.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
IniParam(s[,section='common']) – Существует только если имя экземпляра объекта пустое. Возвращает значение параметра s ini-файла секции «common», изменить секцию можно не обязательным параметром section. В случае отсутствия параметра в файле возвращает пустую строку. &lt;br /&gt;
&lt;br /&gt;
Param(s) – Синоним IniParam с тем отличием, что существует только если имя объекта непустое.&lt;br /&gt;
&lt;br /&gt;
SetText(s) - Загружает ini файл из строки s. Если в файле нет секции «common», то принудительно объявляет ее в начале.&lt;br /&gt;
&lt;br /&gt;
== Объект TSMS ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для отправки SMS, а также проверки статуса их доставки.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetProxy(Server, Port, User, Pass) - Устанавливает настройки прокси-сервера.&lt;br /&gt;
&lt;br /&gt;
Connect(Provider, Host, User, Pass, SenderName, SMSPrefix) – Подключает объект к провайдеру provider, используя адрес Host, имя пользователя User и пароль Pass. Значение SMSPrefix предназначено для того, чтобы провайдер мог различить сообщения от разных филиалов, если этими филиалами используется одно подключение. Если необходимости разделять сообщения нет - значение SMSPrefix можно не указывать.&lt;br /&gt;
Для провайдера доступны значения 'mirsms', 'sms16', 'websms', 'epochta', 'zanzara', 'SMSManager', 'f1sms', 'BitCall', 'mirsmsGET', 'AMD' и другие, либо можно указать числовые значения номера протокола, от 1 до &amp;lt;rspoiler text=&amp;quot;20&amp;quot;&amp;gt;Набор провайдеров все время дополняется, количество и номера можно смотреть в Справочники - Переменные - Подключения - SMS&amp;lt;/rspoiler&amp;gt; соответственно. Эти значения соответствуют значениям переменной SMSProtocol таблицы &amp;quot;Value&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SendSMS(Phone, Text, [ID]) – Отправляет SMS с текстом Text на телефон Phone. Для некоторых провайдеров необходим уникальный идентификатор сообщения ID (для провайдера iVoice - идентификатор сценария (кампании)). Возвращает ID провайдера для последующей проверки статуса доставки.&lt;br /&gt;
&lt;br /&gt;
CheckSMS(ProviderID) – Проверяет состояние доставки сообщения с идентификатором ProviderID. Возвращает: 0 – доставляется, 1 – успешно доставлено, 2 – не доставлено.&lt;br /&gt;
&lt;br /&gt;
ReceiveSMS(InboxID, DateFrom, DateTo, NewOnly) - Получает входящие SMS, с ящика InboxID (идентификатор выдаётся провайдером). DateFrom, DateTo - задается временной интервал в котором были приняты сообщения(формат 08.04.2013 18:00:00 'DD.MM.YYYY HH:NN:SS'). Чтобы получать только новые сообщение поле NewOnly должно быть True. Возвращает XML с сообщениями.&lt;br /&gt;
&lt;br /&gt;
ExtraResult([ParamName='']) - Вызывается после CheckSMS, возвращает дополнительную информацию по последнему статусу смс. В настоящее время работает только для провайдеров BitCall и iVoice. Для BitCall по умолчанию возвращает кнопки, нажатые абонентом во время работы с голосовым меню. Если в paramname указать 'IdentifyText' то будет возвращен JSON  с ответами абонента на заданные вопросы(используется в случае звонков с индивидуальным сценарием). Для iVoice по умолчанию подразумевается параметр 'response', при этом будет возвращен JSON  с ответами абонента на заданные вопросы (в зависимости от сценария)&lt;br /&gt;
&lt;br /&gt;
Log - Возвращает последний HTTP запрос и ответ от сервера смс.&lt;br /&gt;
&lt;br /&gt;
== Объект TXML ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга XML-данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст XML документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию. Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля.&lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
AttribCount – Возвращает количество атрибутов текущего элемента.&lt;br /&gt;
&lt;br /&gt;
AttribName(i) – Возвращает имя атрибута с номером i.&lt;br /&gt;
&lt;br /&gt;
Attrib(V) – Ищет атрибут и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
== Объект TJSON ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга JSON-данных. &lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст JSON документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля. &lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Можно проверять наличие элементов, если элемента нет, вернется пустая строка.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
isArray - Возвращает true, если текущий элемент является массивом (доступ к дочерним элементам возможен только по индексу, нумерация элементов начинается с нуля)&lt;br /&gt;
&lt;br /&gt;
==Объект TZip==&lt;br /&gt;
Предназначен для работы с Zip архивом. &lt;br /&gt;
&lt;br /&gt;
SetZip(s) - Загружает архив в объект из строки s;&lt;br /&gt;
&lt;br /&gt;
GetZip - Возвращает архив в виде строки;&lt;br /&gt;
&lt;br /&gt;
AddFromFile(SrcPath, ZipPath) - Добавляет файл SrcPath в архив и располагает его по пути ZipPath. ZipPath содержит имя файла в архиве, при необходимости можно указать каталог; &lt;br /&gt;
&lt;br /&gt;
AddFromStr(Data, /*ZipPath*/) - '''параметр ZipPath временно не работает'''. Добавляет файл из строки Data в архив и располагает его по пути ZipPath.  -ZipPath содержит имя файла в архиве, при необходимости можно указать каталог;&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(path) - Загружает архив из файла path;&lt;br /&gt;
&lt;br /&gt;
SaveToFile(path) - Сохраняет архив в файл path;&lt;br /&gt;
&lt;br /&gt;
Count - Возвращает кол-во файлов в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByIndex(index) - Возвращает распакованный файл в виде строки. Index - номер файла в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByName(ZipPath) - Возвращает распакованный файл в виде строки. ZipPath - путь к файлу в архиве, может содержать каталоги;&lt;br /&gt;
&lt;br /&gt;
FileName(index) - По номеру файла, функция возвращает полный путь файла в архиве.&lt;br /&gt;
&lt;br /&gt;
==Объект TBase==&lt;br /&gt;
&lt;br /&gt;
'''Функции общего назначения''':&lt;br /&gt;
&lt;br /&gt;
'''ExecSimpleScript(Caption, Text)''' - Выполняет скрипт &amp;quot;Дополнительных возможностей&amp;quot;. Возвращаемые значения, введенные пользователем устанавливает в переменные $scriptvar1..$scriptvarN, Значения кодов списочных переменных - в переменных $scriptvar1codes..$scriptvarNcodes. Функция возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot; в диалоговом окне.&lt;br /&gt;
&lt;br /&gt;
'''FillAdvPriceReport(Excel, AddressCodes, StartLine, StartCol, [ShowSumPrice,InsertColumns,ShowAll])''' - добавляет отчёт по дополнительным услугам. В AddressCodes - указаны коды адресов через запятую, каждый код это отдельная строка отчета. Адреса будут показаны в порядке перечисления их в AddressCodes. Если в отчет нужно добавить пустую строку, то можно указать код адреса -1000. StartLine, StartCol - верхний левый угол выгружаемой таблицы. ShowSumPrice - добавить столбец итоговый столбец с суммой всех услуг, по умолчанию выключено. InsertColumns - раздвинуть таблицу перед вставкой отчета, позволяет встраивать отчет посередине выгрузки, по умолчанию выключено. ShowAll - показать все дополнительные услуги, по умолчанию false и показывает только услуги с начислениями. Функция возвращает количество использованных столбцов.&lt;br /&gt;
&lt;br /&gt;
'''PrintSticker(Codes, [ToBoxes=False])'''&lt;br /&gt;
&lt;br /&gt;
'''PrintBlanc(Codes, BlancNumber)''' - печатать форму из раздела &amp;quot;Заполнить бланк&amp;quot;. Codes - коды корреспонденций, BlancNumber - номер формы из раздела &amp;quot;Бланки для корреспонденции&amp;quot; (3)&lt;br /&gt;
&lt;br /&gt;
'''GetItemByName(Name)'''&lt;br /&gt;
&lt;br /&gt;
'''GetA4Printer([GetPrinterPort=False])''' - возвращает имя принтера выбранного для печати документов. GetPrinterPort - попытаться по имени принтера найти порт принтера, используйте для печати через команду ghostscript. Определение порта работает только с физическими устройствами LPT, USB, TCPIP. &lt;br /&gt;
&lt;br /&gt;
'''GetStickerPrinter([GetPrinterPort=False])''' - возвращает имя принтера выбранного для печати стикеров. GetPrinterPort - попытаться по имени принтера найти порт принтера, используйте для печати через команду ghostscript. Определение порта работает только с физическими устройствами LPT, USB, TCPIP. &lt;br /&gt;
&lt;br /&gt;
'''GetDuplexPrinter([GetPrinterPort=False])''' - возвращает имя принтера выбранного для двусторонней печати, если принтер не выбран, возвращает пустую строку. GetPrinterPort - попытаться по имени принтера найти порт принтера, используйте для печати через команду ghostscript. Определение порта работает только с физическими устройствами LPT, USB, TCPIP. &lt;br /&gt;
&lt;br /&gt;
'''PrintAttachPDFPage(Code, FileName, Page, Printer)''' - печатает страницу из вложенного файла PDF. Code - код вложения (attachment) или путь к файлу, Page - номер страницы, Printer - 0 = принтер A4, 1 = принтер этикеток. &lt;br /&gt;
&lt;br /&gt;
'''AttachPDFToText(Code, [TextFileName])''' - преобразует файл PDF из вложений в текст. Code - код вложения (attachment) или путь к файлу, TextFileName - имя текстового файла, в который записывается результат (если не указан, используется временный файл). Возвращает текст в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''GhostScript(GScript, Code)''' — функция для выполнения консольных команд утилиты [https://ghostscript.readthedocs.io/en/latest/Use.html ghostscript]. Где, GScript — строка с командами Ghostscript; Code — код вложения или путь к PDF-файлу, предназначенному для обработки. В командах доступен специальный тег %MeasoftInFile%, который автоматически заменяется на путь к предварительно загруженному файлу (Code). Если в команде необходимо указать путь для сохранения результата обработки, используйте тег %MeasoftOutFile%. В этом случае функция на основании параметра Code автоматически сформирует имя временного выходного файла. После успешного выполнения команд функция возвращает путь к сгенерированному выходному файлу -  %MeasoftOutFile%.&lt;br /&gt;
&lt;br /&gt;
'''GetActiveForm([SkipFormName])''' - возвращает код активной формы в программе где происходит сканирование. SkipFormName - не обязательны параметр, имя формы которую нужно пропустить при определении интерфейса.&lt;br /&gt;
 '''Список интерфейсов''': &lt;br /&gt;
 0 - неопределенный; &lt;br /&gt;
 1 - прием корреспонденции на склад; &lt;br /&gt;
 2 - АПД; &lt;br /&gt;
 3 - комплектация адресов (ShelfingForm); &lt;br /&gt;
 4 - доска приема; &lt;br /&gt;
 9 - вкладка «Манифесты»; &lt;br /&gt;
 10 - Инвентаризация корреспонденции; &lt;br /&gt;
 11 - АПК; &lt;br /&gt;
 12 - вкладка «Адреса»; &lt;br /&gt;
 13 - вкладка «Выдача»; &lt;br /&gt;
 14 - вкладка «Склад»; &lt;br /&gt;
 15 - Список номенклатуры; &lt;br /&gt;
 16 - Инвентаризация склада; &lt;br /&gt;
 17 - Приходная накладная; &lt;br /&gt;
 18 - Списание товара; &lt;br /&gt;
 19 - Карточка корреспонденции.&lt;br /&gt;
&lt;br /&gt;
'''AddAddressScanLog(Code[, StrBarCode, IsManual, FromInterface, ExtraInfo])''' - добавляет событие сканирование для корреспонденции с кодом Code. Необязательные параметры: StrBarCode - сканируемый ШК корреспонденции (по умолчанию пустой), IsManual - галка ручного сканирования (по умолчанию false), FromInterface - код интерфейса сканирования (StateType=81, по умолчанию 0 - неопределенный), ExtraInfo - текстовый комментарий события.&lt;br /&gt;
&lt;br /&gt;
'''RuleName(alias)''' - Выдает полный путь в дерева прав по псевдониму права.&lt;br /&gt;
&lt;br /&gt;
'''ShowText(Caption:string, Value:string)''' - показывает пользователю окно с заголовком Caption и с многострочным полем со значением Value. Может быть полезен при отображении логов выполненной операции. &lt;br /&gt;
&lt;br /&gt;
'''ShowScanError(msg [, Speek, Color, Abort])''' - выдает пользователю окно с текстом msg блокируя последующие действия сканирования. Если Speek - истинно, то сообщение проговаривается голосовым движком, по умолчанию выключено. Color - целочисленное число цвета, в который будет окрашен фон сообщения (по умолчанию = -1, стандартный). Abort  - прервать выполнение скрипта, не показывая ошибку.&lt;br /&gt;
&lt;br /&gt;
'''CheckRule(alias)''' - функция проверки разрешения у текущего пользователя системы, alias - псевдоним права. Возвращает 1, если право есть и 0, если права нет. &lt;br /&gt;
 Пример: if(CheckRule('RSE'), ShowMessage('У пользователя есть право изменять счета'), ShowMessage('У пользователя нет права изменять счета'));&lt;br /&gt;
&lt;br /&gt;
'''GetKurierMoney(KurierCode, DateEnd, NonCash)''' - возвращает баланс курьера с кодом KurierCode на дату DateEnd. NonCash - булевый флаг, если истинно, то будет рассчитан безнальный баланс; &lt;br /&gt;
&lt;br /&gt;
'''Функции, работающие только в импорте БД из эксель:'''&lt;br /&gt;
&lt;br /&gt;
ReplaceAddress&lt;br /&gt;
&lt;br /&gt;
GetItemByCode - Поиск товара по артикулу. Внимание: в пределах одного клиента может быть несколько товаров с одинаковыми артикулами. В этом случае функция найдет последний заведенный товар.&lt;br /&gt;
&lt;br /&gt;
GetPrice&lt;br /&gt;
&lt;br /&gt;
GetNewNumber - используется при импорте реестра, возвращает номер конверта в загружаемом заказе&lt;br /&gt;
&lt;br /&gt;
GetNewPos - используется при импорте реестра, возвращает порядковый номер вложения&lt;br /&gt;
&lt;br /&gt;
GetNewPackagePos- используется при импорте реестра, возвращает порядковый номер места&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zakaz - возвращает номер заказа куда происходит импорт реестра&lt;br /&gt;
&lt;br /&gt;
addresscode  -  используется при импорте реестра, код созданного адреса&lt;br /&gt;
&lt;br /&gt;
Source  - код заказчика&lt;br /&gt;
&lt;br /&gt;
ClientTown - Узнаем город клиента, через филиал с которым он работает. Сам клиент берется из заказа указанного в окне &amp;quot;Импорт БД из Excel&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Объект TFieldObject ==&lt;br /&gt;
Создается только автоматически. Объект для доступа к записям, используется в картах и дополнительных услугах (addressrecord) и событиях карточки корреспонденции (fieldlist). Методы объекта:&lt;br /&gt;
&lt;br /&gt;
'''_GetTableInfo''' - возвращает данные о полях и примеры данных объекта.&lt;br /&gt;
&lt;br /&gt;
'''_Self''' - возвращает ссылку на объект.&lt;br /&gt;
&lt;br /&gt;
'''_Set(fieldname, fieldvalue [, DoUpdateForm])''' - Если базовый объект строка. Устаналивает для поля fieldname значение fieldvalue. DoUpdateForm по уолчанию false, если указать true то обновление поля будет не только в объекте но и пользовательском интерфейсе. Обновление работает только в карточке корреспнденции для ограниченного набора полей: vlog, mode, type, date_put, time_put, message, kurier, state1.&lt;br /&gt;
&lt;br /&gt;
'''_Set(keyfield, keyvalue, filed, value)''' - Если базовый объект таблица (addressrecord.boxes). Работает перегруженная версия метода _set, cначала происходит поиск строки по ключу, далее меняется значение указанного столбца. keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца.  Пример, отключение услуги база:&lt;br /&gt;
&lt;br /&gt;
 addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
 priceconf - поле где записан код услуги;&lt;br /&gt;
 1 - услуга База;&lt;br /&gt;
 active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
== Объект TMessage ==&lt;br /&gt;
Создается только автоматически. Объект используется для скриптовой обработки письма в [https://wiki.courierexe.ru/index.php/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8#.D0.98.D0.BC.D0.BF.D0.BE.D1.80.D1.82_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85| заданиях импорта данных]. В себе содержит текст письма в очищенном формате и оригинальном формате HTML, отправитель письма, тему письма, дата получения и список прикрепленных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.Text''' - возвращает очищенный от HTML-тегов текст письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.HTMLText''' - возвращает оригинальный текст письма со всеми HTML-тегами.&lt;br /&gt;
&lt;br /&gt;
'''Message.Sender''' - возвращает email-адрес отправителя письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.AttachmentsCount''' - возвращает количество вложенных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.DateTime''' - возвращает дату и время получения письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.Subject''' - возвращает тему письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentDataString(Number)''' - возвращает вложенный файл под номером Number в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentName(Number)''' - возвращает имя вложенного файла под номером Number.&lt;br /&gt;
&lt;br /&gt;
== Объект TStringList ==&lt;br /&gt;
Может использоваться для построчной обработки многостраничных файлов либо для организации текстовых данных. Номер строк начинается с 0. &lt;br /&gt;
Имеет следующий функционал:&lt;br /&gt;
&lt;br /&gt;
'''Count''' - возвращает количество строк в списке.&lt;br /&gt;
&lt;br /&gt;
'''Add(Value:string)''' - добавляет значение Value в конец списка.&lt;br /&gt;
&lt;br /&gt;
'''SetText(Value:string)''' - устанавливает значение списка в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Insert(Number:integer, Value:string)''' - добавляет строку Value в позицию Number.&lt;br /&gt;
&lt;br /&gt;
'''Delete(Number:integer)''' - удаляет строку из списка в позиции Number.&lt;br /&gt;
&lt;br /&gt;
'''Clear''' - очищает элементы списка.&lt;br /&gt;
&lt;br /&gt;
'''LoadFromFile(Path:string)''' - загружает текстовый файл по пути Path.&lt;br /&gt;
&lt;br /&gt;
'''Strings(Number:integer)''' - возвращает строку с номером Number.&lt;br /&gt;
&lt;br /&gt;
'''SetString(Number:integer, Value:string)''' - устанавливает значение строки с номером Number в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Text''' - возвращает полный список строк в виде текста.&lt;br /&gt;
&lt;br /&gt;
'''CommaText([Quoted:boolean])''' - возвращает список значений через запятую. Если Quoted = true, то квотирует элементы списка. По умолчанию равен false.&lt;br /&gt;
&lt;br /&gt;
'''SetCommaText(Value: string)''' - разбивает значение Value на отдельные строки и кладет в список. Разделитель - запятые.&lt;br /&gt;
&lt;br /&gt;
'''IndexOf(Value:string)''' - ищет значение Value среди элементов списка и если находит, то возвращает номер строки. Возвращает -1 если значение не было найдено.&lt;br /&gt;
&lt;br /&gt;
'''Sorted(Value:boolean)''' - устанавливает флаг отсортированности списка в Value. Если Value = true, то сразу же его сортирует. По умолчанию Value = false.&lt;br /&gt;
&lt;br /&gt;
'''Exchange(Pos1:integer, Pos2:integer)''' - меняет элементы списка с позициями Pos1 и Pos2 местами.&lt;br /&gt;
&lt;br /&gt;
'''Duplicates(Value:integer)''' - изменяет параметр управления дубликатами в списке. Если Value = 0 (значение по умолчанию), то список не реагирует на дубликаты. Если Value = 1, то список при добавлении будет игнорировать дубликаты. Если Value = 2, то список будет выдавать исключение, при добавлении дубликата в список.&lt;br /&gt;
&lt;br /&gt;
'''ParamName(Number:integer[, Delimiter:string])''' - возвращает текст до первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает пустоту.&lt;br /&gt;
&lt;br /&gt;
'''ParamValue(Number:integer[, Delimiter:string])''' - возвращает текст после первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает всю строку.&lt;br /&gt;
&lt;br /&gt;
== Объект TFunc ==&lt;br /&gt;
Объект реализует создание и использование функций в скриптовом языке. Позволяет определять переиспользуемые блоки кода с параметрами.&lt;br /&gt;
Важно учитывать, что внтури функции создается свой инстанс интерпретатора и от туда не доступны никакие переменные\объекты кроме переданных в функцию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные методы:&lt;br /&gt;
&lt;br /&gt;
'''New'''(FuncName, Param1, Param2, ..., Body) — создание новой функции.Функция возвращает результат выполнения последней команды в теле функции. Аргументы:&lt;br /&gt;
* `FuncName` — имя функции (строка)&lt;br /&gt;
* `Param1, Param2, ...` — имена параметров функции (переменные начинаются с `$`, объекты — без префикса)&lt;br /&gt;
* `Body` — тело функции (скрипт, выполняемый при вызове)&lt;br /&gt;
&lt;br /&gt;
'''FuncName'''(Arg1, Arg2, ...) — вызов созданной функции по имени. Если в объявлении была указана тип переменная, то и подставлять в аргумент надо обязательно переменную. Будет передано значение этой переменной (переменные словарине поддерживаются!). Если был объявлен объект, то указатель на объект должен быть получен через метод '''_self'''. C функциями поддерживают работу следующие классы: TExcel, TDirectExcel, TCSVFile, TADO, TSelfADO, TPrinter, TCanvas, TPicture, TTable, TINIFile, TSMS, TXML, TJSON, TZip, TStringList, TBaseUtils, а также объект addressrecord (TFieldObject). Результатом работы функции может быть число или строка.&lt;br /&gt;
&lt;br /&gt;
Пример 1, обработка результатов функции:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'calc');&lt;br /&gt;
calc.new('Sum', '$a', '$b',&lt;br /&gt;
  $a + $b&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
set($x, 10);&lt;br /&gt;
set($y, 20);&lt;br /&gt;
showmessage(calc.Sum($x, $y));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример 2, передача объекта в функцию:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'utils');&lt;br /&gt;
utils.new('ProcessDB', 'dbConn', '$value',&lt;br /&gt;
  showmessage($value);&lt;br /&gt;
  dbConn.open('SELECT * FROM address limit 3 ');&lt;br /&gt;
  if(dbConn.recordcount &amp;gt; 0,&lt;br /&gt;
    showmessage('Найдено записей: ' + dbConn.recordcount);&lt;br /&gt;
    dbConn.first;&lt;br /&gt;
    while(dbConn.eof = 0,&lt;br /&gt;
      showmessage(dbConn.fieldbyname('code'));&lt;br /&gt;
      dbConn.next&lt;br /&gt;
    )&lt;br /&gt;
  ,0)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
utils.ProcessDB(db._self,'test!');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Применение языка формул ==&lt;br /&gt;
'''в различных контекстах системы «MEASOFT» и сопутствующих проектах'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MEASOFT ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительная информация на чеке ====&lt;br /&gt;
&lt;br /&gt;
В карточке клиента на закладке «Касса» имеется поле для ввода текста, который будет отображаться на кассовых чеках, печатаемых для корреспонденции от данного клиента. В поле может быть введен как просто текст, так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TSelfDB с открытым набором данных со строчкой корреспонденции, заказа и клиента, на которую печатается чек&lt;br /&gt;
&lt;br /&gt;
TBaseSupport&lt;br /&gt;
&lt;br /&gt;
TBaseValue&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Так же система записывает в переменную $CashRegisterID вычисленный код фискального регистратора, на котором предполагается печать чека.&lt;br /&gt;
&lt;br /&gt;
Результат работы скрипта печатается на создаваемом чеке, если скрипт не возвращает значение “-1” (число или текст) – в этом случае система чек не создает. Подразумевается, что либо скриптом было принято решение об отсутствии необходимости формирования чека, либо скрипт взял эту функцию на себя.&lt;br /&gt;
&lt;br /&gt;
==== Заполнение шаблонов печатных форм ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительные возможности ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Импорт БД из Excel ====&lt;br /&gt;
В окружении интерпретатора создается объект ZakazRecord, он является списком со значениями таблицы zakaz. Именно в этот заказ будут загружены данные. Из этого объекта также доступно :&amp;lt;br&amp;gt;&lt;br /&gt;
*ZakazRecord.userfields - пользовательские поля заказа;&lt;br /&gt;
*ZakazRecord.Clients - данные таблицы clients;&lt;br /&gt;
*ZakazRecord.Clients.userfields - пользовательские поля заказчика.&lt;br /&gt;
&lt;br /&gt;
==== Прайс лист клиента ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в валюте клиента для каждой поездки (туда или обратно) единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Помимо стандартных объектов, система создает объект AddressRecord, в котором, как свойства, доступны все поля текущей записи. Так же она выставляет значение переменной $Forward в 1 (истина), если необходимо произвести расчет для направления &amp;quot;Туда&amp;quot; и 0 (ложь) - если обратно. ВНИМАНИЕ! Как и во всех остальных местах, после формулы нельзя ставить &amp;quot;;&amp;quot;, иначе скрипт вернет 0!&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 if(int(AddressRecord.Time_Put_Max)&amp;gt;19, 100, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Прибавляет 100 рублей в случае, если максимальный срок доставки 20 часов или более''&lt;br /&gt;
&lt;br /&gt;
 if(pos(AddressRecord.Address, 'Аренда')&amp;gt;0, &lt;br /&gt;
           set($FormulaReplace, 1); &lt;br /&gt;
           1500&lt;br /&gt;
 , 0)&lt;br /&gt;
 &lt;br /&gt;
 ''В случае наличия подстроки &amp;quot;Аренда&amp;quot; в адресе заменяет штатное ценообразование на 1500 рублей''&lt;br /&gt;
&lt;br /&gt;
Объект AddressRecord может предоставить доступ к связанным таблицам :&lt;br /&gt;
* addressrecord.boxes&lt;br /&gt;
* addressrecord.packages&lt;br /&gt;
* addressrecord.clients&lt;br /&gt;
* addressrecord.price&lt;br /&gt;
* addressrecord.advprice&lt;br /&gt;
* addressrecord.userfields&lt;br /&gt;
* addressrecord.addressfld&lt;br /&gt;
* addressrecord.clients.userfields&lt;br /&gt;
* addressrecord.price.userfields&lt;br /&gt;
* addressrecord.zakaz&lt;br /&gt;
* addressrecord.zakaz.userfields&lt;br /&gt;
 &lt;br /&gt;
Чтобы получить доступ к полю VarCode из таблицы userfields необходимо записать AddressRecord.Userfields.VarCode. В присоединённой таблице может быть несколько записей чтобы получить к ним доступ предусмотрены функции _First, _EOF, _Next, _RecordCount, _Set.&lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
 set($value1, 0); set($value2, 0);&lt;br /&gt;
 while(AddressRecord.userfields._EOF=0,&lt;br /&gt;
   if(AddressRecord.userfields.varCode=1, &lt;br /&gt;
     set($value1, if(AddressRecord.userFields.VarValue='Праздничная упаковка', 150, 0)), ''''''');&lt;br /&gt;
   if(AddressRecord.userfields.varCode=2, &lt;br /&gt;
     set($value2, AddressRecord.userFields.VarValue), ''''''');&lt;br /&gt;
   AddressRecord.userFields._Next;&lt;br /&gt;
 );&lt;br /&gt;
 int($value1) + int($value2)&lt;br /&gt;
&lt;br /&gt;
Пример делающий тоже самое что и выше но через поиск Locate:&lt;br /&gt;
 set($value1, if(addressrecord.userfields.VarValue('VarCode', 1)='Праздничная упаковка', 150, 0));&lt;br /&gt;
 set($value2, int(addressrecord.userfields.VarValue('VarCode', 2)));&lt;br /&gt;
 $value1 + $value2&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
В скрипте доступны переменные: &lt;br /&gt;
«$FormulaKoeff» - это коэффициент на который умножится конечная цена (по умолчанию равна 1);&lt;br /&gt;
«$PriceCode»  - код прайса;&lt;br /&gt;
«$CurrentPriceConf»  - код услуги;&lt;br /&gt;
«$BasePrice» - стоимость всех услуг с уровнем (pricelevel) меньше текущего.&lt;br /&gt;
&lt;br /&gt;
Для вызова функции CalcBasePrice (Расчёт базовой цены) в скрипте объявленны переменные: $Count,$Collection,$Distance,$Wait.&lt;br /&gt;
&lt;br /&gt;
Существует поиск по ключевому полю (поиск регистронезависимый), например чтобы найти в таблице advprice введённое значение для текущей услуги, нужно сделать такую запись  addressrecord.advprice.value('priceconf', $CurrentPriceConf) - Первый параметр это ключевое поле, второй искомое значение. Если запись найдётся будет возвращено значение поле value, если нет функция вернёт значение 0.&lt;br /&gt;
 &lt;br /&gt;
Пример &lt;br /&gt;
 if(addressrecord.advprice.active('priceconf', 3)='T', addressrecord.advprice.price, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Смотрим включена ли услуга и если да, возвращаем рассчитанную стоимость&lt;br /&gt;
&lt;br /&gt;
Чтобы изменить значение записанное в объект addressrecord, нужно воспользоваться методом _set(keyfield, keyvalue, filed, value). Параметр keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца. Сначала происходит поиск строки по ключу, далее меняется значение указанного столбца.&lt;br /&gt;
Пример, отключение услуги база:&lt;br /&gt;
  addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
  priceconf - поле где записан код услуги;&lt;br /&gt;
  1 - услуга База;&lt;br /&gt;
  active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
Также существует упрощенный метод _set, с двумя параметрами filed, value - он используется в шаблонах загрузки или в системных доп. возможностях где доступен объект addressrecord.&lt;br /&gt;
&lt;br /&gt;
==== Зарплата курьеров ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в основной валюте для каждой единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Переменные «$FormulaTablKoeff» и «$FormulaMoneyKoeff»  позволяют установить повышающий или понижающий коэффициент на стоимость доставки (по тарифной сетке) и услуги соответственно (процент от суммы, процент от стоимости доставки, ожидание).  Переменная «$UsingZoneName» и «$KurierZone» содержат название и код зоны соответственно, есть возможность поменять название зоны для отчета.&lt;br /&gt;
&lt;br /&gt;
=== Планировщик ===&lt;br /&gt;
&lt;br /&gt;
В поле текста задания может быть введен как текст с командами планировщика (см ниже), так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TIniFile, Указывает на настроечный ini-файл планировщика.&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Для записи в лог планировщика нужно использовать функцию Print&lt;br /&gt;
&lt;br /&gt;
=== Репликатор ===&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
ReplaceAddress(target, address) – Возвращает адрес последней доставки корреспонденции получателю target по адресу address от текущего клиента. При отсутствии такой доставки, возвращает address.&lt;br /&gt;
&lt;br /&gt;
GetPrice –возвращает рассчитанное значение цены, на основе прайс-листа клиента и данных о корреспонденции.&lt;br /&gt;
&lt;br /&gt;
GetKurierByStation(i) – возвращает код курьера, ассоциированного со станцией метро с кодом i.&lt;br /&gt;
&lt;br /&gt;
GetNewNumber – Возвращает не занятый номер единицы корреспонденции в текущем заказе.&lt;br /&gt;
&lt;br /&gt;
==История изменений==&lt;br /&gt;
&lt;br /&gt;
=== Недавние изменения ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|2026.0.0.547 Доработка функций ATTACHPDFTOTEXT и PRINTATTACHPDFPAGE, добавлена возможность указать путь к файлу&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.539 Добавлена поддержка отладчика AttachDebugger&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.534 Добавлена поддержка оператора CASE и класса TFunc&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 2021.0.0.57 от 18.06.2019 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TExcel добавлен метод ColumnDelete.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция InsertFirmAtt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
||В объект TExcel добавлен метод Align.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция CheckEan&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект функцию FillAdvPriceReport добавлены параметры ShowSumPrice,InsertColumns&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TSMS добавлен метод Log.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Добавлена функция Money.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция ValutaSign.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция GetPolygonByLatLon.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TTable добавлена функция SetMultiHeader, SetCustomHeader.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DownloadAttachment&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию SetRowHeight объекта TExcel добавлен параметр cnt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция AsString.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция SetSize.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TADO добавлена функция ParseForIn.&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|В объект TBaseUtils из TBase перенесена функция FillExcelDoc.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция CalcAddressPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Все функции класса TBaseSupport перенесены в TBaseUtils. Класс TBaseSupport больше не существует.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функции RowInsert и RowDelete объекта TExcel добавлен параметр count.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция SendToMeaSoft&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция RecalcSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Новая функция Reverse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 849 &amp;amp;nbsp; 22.02.2018 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TBaseUtils.TownByIndex добавлен параметр PriorityName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TBase добавлена функция GetNewPackagePos&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TSMS доработан метод ExtraResult, добавлен параметр ParamName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBase добавлена функция CalcAgentPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateAddressForActDelivery&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функция CalcTownDeliveryDate заменена на CalcDeliveryDate&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция SignatureUrl&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция LoadFromStr.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetPen.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetBrush.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена поддержка чтения в формате PNG.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TCanvas.DrawPic параметр Mode&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Свойство TPicture.Canvas&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DeleteFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 758 &amp;amp;nbsp; 29.03.2017 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция GetPolygonByAddress&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция ParamsCount&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Объект TZip&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функции CreateEAN и Create128 заменены одной функцией CreateBar, полностью совместимой с Create128, но добавлена поддержка EAN-13 и Interleaved 2-5 (для Почты России). В системе функции оставлены для обратной совместимости, но более не являются документированными и рекомендованными к использованию.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Параметр text в функцию Cell объекта TExcel&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция UrlEncode &lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция IncDay теперь может принимать параметр count&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функции FtpGet, FtpPut, TTable.SetCell()&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 452 &amp;amp;nbsp; 26.02.2014 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция Time&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция FixedIntToStr&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция TimePeriod&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена функция приёма смс -  ReceiveSMS&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция STR2UTF&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция SAVETOFILE&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.SetSheetName&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;FILESTR&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Расширены возможности объекта addressrecord в формулах тарифов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 308 &amp;amp;nbsp; 24.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В функции загрузки таблиц из TADO добавлено условие, что поля, названия которых начинаются с &amp;quot;-&amp;quot; не выгружаются. Таким образом можно скрывать служебные поля из результирующего набора.&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowAutoFit &lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowInsert &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 300 &amp;amp;nbsp; 01.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В объекте TCSVFile добавилась возможность запрашивать значения не только текущей записи через параметр сдвига&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;UPDOWN&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлен объект TCSVFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 266 &amp;amp;nbsp; 14.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена поддержка массивов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 265 &amp;amp;nbsp; 11.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция CreateTrans в интерпретатор&lt;br /&gt;
|-&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15735</id>
		<title>Руководство программиста</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15735"/>
				<updated>2026-01-13T17:17:06Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Недавние изменения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Основные положения ==&lt;br /&gt;
&lt;br /&gt;
В систему «MEASOFT» встроен внутренний интерпретируемый язык программирования. Среда состоит из базовой функциональности, и дополнительно создаваемых объектов. Некоторые объекты автоматически создаются средой перед запуском интерпретатора для предоставления доступа к контексту, в котором работает скрипт. Все типы данных приводятся друг к другу автоматически, иногда при необходимости можно использовать функции приведения типов. &lt;br /&gt;
&lt;br /&gt;
Как интерпретатор приводит типы:&lt;br /&gt;
&lt;br /&gt;
1.	При использовании значения как параметр функции интерпретатор автоматически приводит значение к типу, необходимому функции.&lt;br /&gt;
&lt;br /&gt;
2.	При операциях сложения, а также логических операциях, операнды приводятся к строке если хотя бы один из них имеет тип «строка». Например:&lt;br /&gt;
3.3+5		-&amp;gt;  8.3&lt;br /&gt;
‘3.3’+5		-&amp;gt;  ‘3.35’&lt;br /&gt;
подобную проблему можно решить принудительно преобразовав тип:&lt;br /&gt;
float(‘3.3’)+5	-&amp;gt;  8.3&lt;br /&gt;
&lt;br /&gt;
3.	При операциях умножения, деления и вычитания операнды приводятся к числу с плавающей точкой, однако если результат выполнения операции получается целым числом, то он приводится к целочисленному типу.&lt;br /&gt;
&lt;br /&gt;
Как работают функции приведения типов:&lt;br /&gt;
&lt;br /&gt;
1.	При преобразовании строки к числу: функция «читает» строку до первого символа, не позволяющего создать число с плавающей точкой, при этом разделителем целой и дробной частей может быть как точка так и запятая. Если приведение производится к целочисленному типу, то после этого происходит округление. Например:&lt;br /&gt;
float('3.6qwerty735')	-&amp;gt;  3.6&lt;br /&gt;
int('3.6qwerty735')	-&amp;gt;  4&lt;br /&gt;
&lt;br /&gt;
2.	При преобразовании к булевому типу ложью считается пустая строка либо число 0, все остальное - истина&lt;br /&gt;
&lt;br /&gt;
3.	При преобразовании булевого типа к числу истина преобразуется в 1, ложь – в 0. Такое преобразование позволяет использовать сложение и умножение в качестве логических «ИЛИ» и «И» соответственно:&lt;br /&gt;
if((5=5)+(6=7), &amp;lt;a&amp;gt;, [b]) – условие истинно, выполнится код «a».&lt;br /&gt;
&lt;br /&gt;
4.	При преобразовании булевого типа к строке сначала происходит преобразование к числу:&lt;br /&gt;
(5=5)+'qwerty'	-&amp;gt;  ‘1qwerty’&lt;br /&gt;
&lt;br /&gt;
== Описание синтаксиса ==&lt;br /&gt;
&lt;br /&gt;
Команды разделяются точкой с запятой. Параметры функций разделяются запятыми. Каждая команда (даже цикл while) является функцией, возвращающей некоторое значение. Результатом выполнения составной команды (последовательности функций, разделенных точкой с запятой), является результат выполнения последней функции. Имена переменных, функций, объектов, а также их свойств и методов не чувствительны к регистру.&lt;br /&gt;
Константы: константы бывают целочисленными, дробными и строковыми. Значения целочисленных и дробных констант указываются «как есть» (в этом случае разделитель целой и дробной частей – точка), шестнадцатеричные значения начинаются с символа «$» и, если первая цифра – буква, она упреждается цифрой 0, а строковые – в одинарных кавычках. При этом, если внутри строковой константы встречается символ одинарной кавычки он должен быть задвоен, для указания интерпретатору того, что он не является признаком конца константы.&lt;br /&gt;
Операции сравнения: &amp;gt;, &amp;lt;, =, !  - Больше, меньше, равно, не равно соответственно.&lt;br /&gt;
Логические операции: + (ИЛИ), *  (И).&lt;br /&gt;
Арифметические операции: +, -, *, /&lt;br /&gt;
Операция конкатенации строк: +&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Функциональность базового объекта ===&lt;br /&gt;
&lt;br /&gt;
'''SET($a, a)''' – присваивает переменной (1-й параметр) значение второго параметра. При отсутствии переменной – создает ее. Имена переменных должны начинаться с символа «$», а следующий символ не должен быть цифрой. Возвращает новое значение переменной. Функция используется только для задания значений переменных. Не допускается использования для задания значений свойств объектов. Для этого используются соответствующие методы этих объектов.&lt;br /&gt;
&lt;br /&gt;
'''IF(a,b,c)''' или '''IF(a,b)'''  – Условный оператор. В первом случае возвращает b, если a истинно (не равно нулю или пустой строке), иначе – c. Во втором случае – возвращает a, если оно истинно, иначе – b.&lt;br /&gt;
&lt;br /&gt;
'''WHILE(a, b)''' – Оператор цикла. Выполняет b пока a истинно:&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i&amp;gt;0, set($sum, $sum+$i); set($i, $i-1));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''FOR($a, b, c, d)''' – Оператор цикла. Выполняет d пока $a последовательно присваиваются значения от b до с включительно:&lt;br /&gt;
	set($sum, 0);&lt;br /&gt;
for($i, 1, 10, set($sum, $sum+$i));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''NEW(ClassName, InstanceName)''' – Создает экземпляр класса ClassName, назначает ему имя InstanceName. Возвращает порядковый номер созданного объекта. Доступ к свойствам и методам объектов осуществляется по имени объекта и имени свойства/метода, разделенным точкой. Именем объекта может быть и пустая строка, тогда доступ к его свойствам и методам будет осуществляться без указания имени, и, в случае совпадения имен свойств и/или методов со стандартными или свойствами/методами других объектов, использоваться будут соответствующие свойства/методы объекта, созданного ранее, а также такой объект невозможно уничтожить до окончания выполнения скрипта. Все объекты созданные во время выполнения скрипта уничтожаются автоматически после окончания его выполнения.&lt;br /&gt;
&lt;br /&gt;
'''FREE(InstanceName)''' – Уничтожает объект с именем InstanceName. Возвращает 0. В случае отсутствия объекта с заданным именем вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
'''ShowObjects''' – Возвращает список созданных объектов – названия классов и имена.&lt;br /&gt;
&lt;br /&gt;
'''ERROR(message)''' – Вызывает ошибку с текстом message.&lt;br /&gt;
&lt;br /&gt;
'''SHOWMESSAGE(message)''' – Отображает диалоговое окно с текстом message, останавливает выполнение скрипта до закрытия окна пользователем.&lt;br /&gt;
&lt;br /&gt;
'''SimpleAskUser(Message)''' – Выводит диалоговое окно с текстом Message и кнопками «Да» и «Нет». Возвращает 1, если  пользователь нажал кнопку «Да», иначе – 0.&lt;br /&gt;
&lt;br /&gt;
'''TRY(a)''' – Выполняет a в «защищенном от ошибки» режиме. Если в процессе выполнения a возникает ошибка, возвращает текст ошибки, иначе – 0 (ложь).&lt;br /&gt;
&lt;br /&gt;
'''REM(….)''' – Код в скобках игнорируется (комментарий).&lt;br /&gt;
&lt;br /&gt;
'''EXEC(FileName, Params, Wait, WindowState)''' – Запускает внешнее приложение FileName с параметрами Params. Если Wait истинно – ожидает завершение процесса. Для WindowState доступны следующие числовые значения:&lt;br /&gt;
	0 - SW_HIDE&lt;br /&gt;
	1 - SW_SHOWNORMAL (по-умолчанию)&lt;br /&gt;
	3 - SW_MAXIMIZE&lt;br /&gt;
	6 - SW_MINIMIZE&lt;br /&gt;
Функция возвращает истину если приложение запущено успешно. Иначе – Ложь.&lt;br /&gt;
В случае успеха, при параметре Wait – истина кладет в переменную $LastResult код завершения приложения.&lt;br /&gt;
&lt;br /&gt;
'''CASE''' - Оператор множественного выбора. Позволяет выполнить одно из нескольких действий в зависимости от условий. Синтаксис:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
  case(&lt;br /&gt;
    when(условие1, действие1);&lt;br /&gt;
    when(условие2, действие2);&lt;br /&gt;
    ...&lt;br /&gt;
    else(действие_по_умолчанию);&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 50);&lt;br /&gt;
&lt;br /&gt;
showmessage(&lt;br /&gt;
  case(&lt;br /&gt;
    when($a &amp;lt; 5, 50);&lt;br /&gt;
    when($a &amp;lt; 10, 100);&lt;br /&gt;
    when($a &amp;lt; 250, 200);&lt;br /&gt;
    else($a*$b);&lt;br /&gt;
  )  &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''AttachDebugger''' - Команда позволяет подключить открытый [[Отладчик_встроенных_скриптов]] к текущему скрипту. Команда AttachDebugger должна быть '''первой командой''' в скрипте. Добавьте её в самое начало скрипта:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Как работает:'''&lt;br /&gt;
# При выполнении команды AttachDebugger скрипт останавливается.&lt;br /&gt;
# Отладчик автоматически подключается к выполняющемуся скрипту.&lt;br /&gt;
# Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
# Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Если режим отслеживания не включён, команда `AttachDebugger` игнорируется.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Команда AttachDebugger должна быть первой командой в скрипте.&lt;br /&gt;
&lt;br /&gt;
=== Строковые функции ===&lt;br /&gt;
&lt;br /&gt;
'''UpCase(s)''' – возвращает строку s в верхнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''LCase(s)''' – возвращает строку s в нижнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''Len(s)''' – возвращает количество символов в строке s.&lt;br /&gt;
&lt;br /&gt;
'''Pos(s, substr [,start])''' – возвращает номер первого символа первого включения подстроки substr в строку s, возвращает 0, если включения подстроки отсутствуют. Параметр start - это позиция старта поиска, не обязательный параметр, по умолчанию равен 1. Поиск не чувствителен к регистру.&lt;br /&gt;
&lt;br /&gt;
'''Param(s, i)''' – возвращает i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''ParamsCount(s)''' - возвращает количество элементов строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''SetParam(s, p, i)''' – заменяет на значение p i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''Left(s, i [,full] )''' – возвращает i первых символов строки s. Параметр i, может быть строкой, тогда он считается разделителем и функция, возвращает строку слева от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Mid(s, i, j)''' - возвращает подстроку из s начиная с i символа и длиной j символов&lt;br /&gt;
&lt;br /&gt;
'''Right(s, i [,full])''' – возвращает i последних символов строки s. Параметр i, может быть строкой, тогда он считается разделителем, функция ищет разделитель с конца строки, и возвращает строку справа от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Reverse(s)''' - возвращает строку s задом-наперед. Полезно например для поиска с конца функций Pos().&lt;br /&gt;
&lt;br /&gt;
'''Char(i)''' – возвращает символ с кодом i.&lt;br /&gt;
&lt;br /&gt;
'''Ord(s)''' – возвращает код первого символа строки s.&lt;br /&gt;
&lt;br /&gt;
'''Replace(s, strFind1, strReplace1, [ strFind2, strReplace2, ... ], [caseInsensetive])''' - возвращает строку s, в которой все включения строк strFind заменены строкой strReplace. Параметры поиска и замены всегда должны быть в паре и их может быть несколько. caseInsensetive - неучитывать регистр, не обязательный параметр, по умолчанию включен.&lt;br /&gt;
&lt;br /&gt;
'''RemSpace(s)''' – возвращает сроку s без начальных и конечных запятых и пробелов, а также начальных точек.&lt;br /&gt;
&lt;br /&gt;
'''SumStr(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''с добавлением валюты'''. Необязательные параметры captions - позволяет изменить название валюты, формат строки может зависеть от текущего языка(посмотреть формат можно в &amp;quot;Справочники&amp;quot;-&amp;quot;Статусы&amp;quot;-&amp;quot;32 Валюты&amp;quot;, в разделе &amp;quot;Дополнительная информация&amp;quot;). Language - код языка на котором необходимо вывести сумму прописью. По умолчанию если не обязательные параметры опущены, используются региональные настройки в переменных.&lt;br /&gt;
&lt;br /&gt;
'''NumToStrSimple(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''без валюты'''. Параметры идентичны функции SUMSTR.&lt;br /&gt;
&lt;br /&gt;
'''FullNameToShort(Name)''' – Возвращает фамилию и инициалы по полному ФИО Name.&lt;br /&gt;
&lt;br /&gt;
'''MonthName1(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в именительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''MonthName2(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в родительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''StrForXML(s)''' - Подготавливает строку к парсингу как xml: Если находит в строке подстроку &amp;quot;UTF-8&amp;quot; - перекодирует ее из utf-8 в win-1251, убирает начальный знак вопроса, если такой встречается.&lt;br /&gt;
&lt;br /&gt;
'''FixedIntToStr(i, len[, char])''' - Возвращает целое число i дополненное слева символами char (по-умолчанию - &amp;quot;0&amp;quot;) до длины len.&lt;br /&gt;
&lt;br /&gt;
'''Translate(format, [param1, param2, ...])''' - Функция перевода строки format в язык пользователя. Строка format может содержать параметры %s, %d - строка и число соответственно. &lt;br /&gt;
&lt;br /&gt;
'''ExtractFileName(FilePath)''' - возвращает имя файла с расширением из полного пути к файлу FilePath.&lt;br /&gt;
&lt;br /&gt;
====Функции перекодировки====&lt;br /&gt;
'''DecodeStr(s, charset)''' - Производит перекодировку строки s в кодировку CP1251. Кодировка строки s должна быть заранее известна и может быть :&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866, UNICODE. Имя кодировки следует передавать в точности без лишних символов.&lt;br /&gt;
&lt;br /&gt;
'''EncodeStr(s, charset)''' - Производит перекодировку строки s в кодировку charset. Кодировка строки s должна быть CP1251, возможны следующие варианты перекодировки:&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Имя кодировки следует передавать в точности без лишних символов. UNICODE не работает с версии 2021, в ней строки по умолчанию в кодировке unicode.&lt;br /&gt;
&lt;br /&gt;
Функции EncodeBase64(s), DecodeBase64(s), UrlEncode(s), UTF8Encode(s), UTF8Decode(s), Str2UTF(s) - устарели, используйте EncodeStr, DecodeStr.&lt;br /&gt;
&lt;br /&gt;
====Транслитерация====&lt;br /&gt;
&lt;br /&gt;
'''Translit(s)''' - транслитерация строки русского текста s латиницей&lt;br /&gt;
&lt;br /&gt;
'''UnTranslit(s)''' - транслитерация строки s с латиницы на русский.&lt;br /&gt;
&lt;br /&gt;
==== Экранирование ====&lt;br /&gt;
&lt;br /&gt;
'''QUOTEDSTR(s)''' – квотирует строку s символом «\» (обратный слеш). Возвращает строку s, помещенную между символами одинарной кавычки, при этом все вхождения в строку s символов: «\», «&amp;quot;» и «'» экранируются квотирующим символом, а символы  #0, #10 и #13 заменяются на \0, \n и \r соответственно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SQLFloat(f)''' – Приводит число с плавающей точкой к виду, пригодному для SQL-запроса, т.е. к тексту с разделителем дробной части – точка.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextXML(s)''' - квотирует строку s для использования в XML. Производит замены спец. символов для корректности XML-синтаксиса.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextJSON(s)''' - переводит строку в формат JSON, экранирует служебные символы.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextBlob(s)''' - строка s содержит файл, функция перекодирует переданную строку в байты, используется для заполнения полей формата blob.&lt;br /&gt;
&lt;br /&gt;
====Хеширование ====&lt;br /&gt;
&lt;br /&gt;
'''HMACHash256(key, text)''' - создаёт хэш по алгоритму SHA256 для проверки целостности сообщения, key - секретный ключ, text - хэшируемое сообщение&lt;br /&gt;
&lt;br /&gt;
'''MD5Hash(text)''' - создаёт хеш по алгоритму MD5&lt;br /&gt;
&lt;br /&gt;
'''SignatureUrl(url)''' -  Подписывает переданный URL. Функция возвратит переданный URL с добавленным в конце параметром, в котором будет записана подпись.&lt;br /&gt;
&lt;br /&gt;
=== Функции работы с датой и временем ===&lt;br /&gt;
&lt;br /&gt;
'''CurrTime''' – возвращает текущее время&lt;br /&gt;
&lt;br /&gt;
'''CurrDate''' – возвращает текущую дату&lt;br /&gt;
&lt;br /&gt;
'''CurrMillisecond''' - Возвращает количество миллисекунд прошедших с начала текущего года. Используется для точного расчета временных интервалов.&lt;br /&gt;
&lt;br /&gt;
'''Today''' - возвращает текущую дату в числовом формате.&lt;br /&gt;
&lt;br /&gt;
'''Day(dt)''' – возвращает день месяца даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Month(dt)''' – возвращает месяц года даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Year(dt)''' – возвращает год даты dt.&lt;br /&gt;
&lt;br /&gt;
'''FirstDayOfMonth(dt)''' – Возвращает первый день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( FirstDayOfMonth( CurrDate() ) );&lt;br /&gt;
'''Полужирное начертание'''&lt;br /&gt;
'''LastDayOfMonth(dt)''' – Возвращает последний день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( LastDayOfMonth( CurrDate() ) );&lt;br /&gt;
&lt;br /&gt;
'''DaysInMonth(month, year)''' – Возвращает количество дней в указанном месяце.&lt;br /&gt;
&lt;br /&gt;
'''IncDay(dt, [count=1])''' – Возвращает дату, увеличенную на count дней.&lt;br /&gt;
&lt;br /&gt;
'''SQLDate(dt)''' – Пытается конвертировать dt в дату, вернуть в формате «'YYYY-MM-DD'» (с апострофами), если не удается – возвращает «NULL».&lt;br /&gt;
&lt;br /&gt;
'''SQLDateToDate(dt)''' – Переводит дату из SQL-формата в обычный.&lt;br /&gt;
&lt;br /&gt;
'''DAYSBETWEEN(dt1, dt2)''' – Возвращает количество дней между датами dt1 и dt2. В случае ошибки приведения dt1 или dt2 к дате возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''TimeBetween(t1, t2)''' - Возвращает количество минут между временем t1 и t2. Если t1 &amp;gt; t2 то будет показано количество минут между t2 и t1. Параметр t может быть как в формате &amp;quot;HH:MM&amp;quot;, так и в числовом. Если один из параметров не удалось привести к числовому типу возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''WorkDaysBetween(dt1, dt2, [DecreaseFirstDay=0], [DefaultHolidayVarNum=1])''' - Возвращает количество рабочих дней между датами dt1 и dt2. Параметр DecreaseFirstDay уменьшает dt1 на указанное количество дней (по умолчанию 0).  В случае ошибки приведения dt1 или dt2 к дате возвращает -1000. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней(по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''TimePeriod(time1, time2)''' - Оформляет временной период. Возвращаемое значение зависит от наличия значения в параметрах. Возможные варианты: &amp;quot;time1 - time2&amp;quot; , &amp;quot;С time1&amp;quot; , &amp;quot;ДО time2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''StrDateToFloat(s, [time=false])''' - Переводит строку с датой s в числовой тип. Если параметр time включен, то в строке s должно быть указано время. Дата должна быть в формате &amp;quot;DD.MM.YYYY&amp;quot;, а время &amp;quot;HH:NN&amp;quot;. Если строку перевести не удалось возвращает 0&lt;br /&gt;
&lt;br /&gt;
'''IsAWorkDay(dt)''' - Когда день dt является рабочим, возвращает true. Если произошла ошибка приведения даты возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''IncWorkDay(dt, [count=1],[DefaultHolidayVarNum=1])''' - Прибавляет count рабочих дней к дате dt. Возвращает дату в числовом формате, если произошла ошибка приведения даты возвращает -1000. По умолчанию параметр count равен 1 и не является обязательным. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней (по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''Sleep'''(n) - Задержка выполнения на n миллисекунд.&lt;br /&gt;
&lt;br /&gt;
=== Функции приведения типов ===&lt;br /&gt;
&lt;br /&gt;
'''INT(v)''' – возвращает значение типа “целое”, приводя вариантное значение v к числовому типу, а затем округляя его. В том числе используется как функция округления.&lt;br /&gt;
&lt;br /&gt;
'''FLOAT(v)''' – возвращает значение типа “число”, приводя вариантное значение v к числовому типу, переводя в число цепочку символов до первого нецифрового символа (либо точки или запятой).&lt;br /&gt;
&lt;br /&gt;
'''STR(v)''' – возвращает значение типа “строка”, приводя вариантное значение v к строковому типу.&lt;br /&gt;
&lt;br /&gt;
'''Date(v)''' – возвращает дату, либо пустую строку, если не удается конвертировать v в дату&lt;br /&gt;
&lt;br /&gt;
'''Time(v)''' – возвращает время, либо пустую строку, если не удается конвертировать v во время. Понимает числовое представление времени.&lt;br /&gt;
&lt;br /&gt;
=== Математические функции ===&lt;br /&gt;
&lt;br /&gt;
'''ROUNDUP(f)''' – округляет число f до ближайшего большего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''ROUNDDN(f)''' – округляет число f до ближайшего меньшего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''Money(f, CouldBeEmpty, ZeroFill, MakeSpace)''' - Округляет число f, до двух знаков после запятой. CouldBeEmpty - заменить число меньше 0,0001  на пустую строку. ZeroFill  - Следить чтобы после запятой было два знака, если будет один, то добавить ноль. MakeSpace - Разделить разряды пробелом.&lt;br /&gt;
''Подсказка: для простого округления используется функция int()''&lt;br /&gt;
&lt;br /&gt;
'''Abs(f)''' - возвращает модуль числа f.&lt;br /&gt;
&lt;br /&gt;
'''Mod(x, y)''' - возвращает остаток от деления целочисленного числа x на целочисленное число y.&lt;br /&gt;
&lt;br /&gt;
=== Константы ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Null''' – Возвращает пустое значение.&lt;br /&gt;
&lt;br /&gt;
'''Да''', '''True''', '''Нет''', '''False''' – константы, соответствующие булевым значениям.&lt;br /&gt;
&lt;br /&gt;
=== Прочие функции ===&lt;br /&gt;
&lt;br /&gt;
SetPhoneParams(CountryCode, TownCode) – Устанавливает глобальные настройки кода телефонных кодов страны и города соответственно. По-умолчанию код страны – 7, код города – 495.&lt;br /&gt;
&lt;br /&gt;
PhonesCount(s) – Возвращает количество корректных телефонных номеров, найденных в строке s.&lt;br /&gt;
&lt;br /&gt;
GetPhone(s[, n]) – Возвращает n-й корректный телефонный номер, найденный в строке s. Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
GetEmail(s) – Возвращает все корректные адреса email, найденный в строке s, разделенные запятыми (т.е. готовыми к передаче в функцию SendEmail).&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY).&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
GenEan(ID, Code) – Формирует штрих-код EAN 13 Состоящий из идентификатора типа сущности ID и кода сущности Code, Выравнивает до 13-ти символов, первый – «2», последний – контрольная сума.&lt;br /&gt;
&lt;br /&gt;
CheckEan(s) - Проверяет строку s, что она является кодом EAN13.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(FileName,s, encoding [, append])- Создает текстовый файл по пути, указанному в FileName (если по указанному пути существует файл с указанным именем, он удаляется и создается новый) и производит запись строки s в созданный текстовый файл. encoding - название кодировки, по умолчанию сохраняет в кодировке ANSI. Доступные названия кодировок: KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Если append = true, то производится дописывание данных в файл, а не перезаписывание (не обязательный, по умолчанию выключен).&lt;br /&gt;
&lt;br /&gt;
StrFromFile(FileName) - Читает файл FileName, возвращает в виде строки. При ошибке чтения вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
DownloadAttachment(code, [savefilepath, tablename='attachment', fieldBlob='file', fieldLDtime='ldtime', fieldUID='uid']) - Функция выкачивает аттачмент из базы, по внутреннему коду - Code, всегда возвращает содержимое файла в виде строки, а также может сохранить файл по указанному пути в параметре savefilepath. По умолчанию, функция настроена на таблицу attachment. Code - внутренний код вложения, tablename - название таблицы, fieldBlob - название поля с содержимым файла, fieldLDtime - название поля с временем последнего изменения строки (для работы кэша). Функция использует кэш и умеет выкачивать файлы зауженные на внешние серверы (http, ftp,sftp, measoft). Для выкачивания с сервера measoft обязательно необходимо указывать параметр fieldUID.&lt;br /&gt;
&lt;br /&gt;
DeleteFile(FileName) - Удаляет файл FileName с диска, возвращает истину, если операция прошла успешно и ложь - в противном случае.&lt;br /&gt;
&lt;br /&gt;
HTTPPOST(host, PostParams, Proxy, ContentType, HTTPUser, HTTPPass, Method, CustomHeader, Reconnects) - Отправляет HTTP запрос по адресу host с данными PostParams. Proxy - объект Proxy, задающий прокси-сервер (по-умолчанию - пусто - не использовать прокси). ContentType - Заголовок ContentType. По-умолчанию - &amp;quot;application/x-www-form-urlencoded; Charset=UTF-8&amp;quot;. HTTPUser и HTTPPass - данные для http-авторизации на сервере. Method - метод отправки запроса, по-умолчанию - &amp;quot;POST&amp;quot;. CustomHeader - Дополнительные заголовки HTTP запроса, передается в виде списка параметров через запятую и всегда образуют пару: 1 параметр - название заголовка, 2 параметр - значение. Если значение содержит запятую то его нужно экранировать в двойные кавычки. Reconnects - Количество попыток подключения (по-умолчанию - 2), если больше 100 - это таймаут единственной попытки подключения в миллисекундах.&lt;br /&gt;
Функция возвращает ответ сервера. &amp;lt;br&amp;gt;&lt;br /&gt;
''Обратите внимание:'' Для имитации отправки данных html-формы методом POST может понадобиться перед передаваемыми параметрами добавить &amp;quot;Data=&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
FTPPUT(host, User, Pass, FileName[, Active]) - Отправляет файл на FTP/SFTP-сервер. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
FTPGET(host, User, Pass, SourceFileName, DestFileName[, Active]) - Загружает файл SourceFileName с FTP/SFTP-сервера, сохраняет его в файл DestFileName. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
GetTempDir - Возвращает путь к временной папке.&lt;br /&gt;
&lt;br /&gt;
ApplicationDir - Возвращает путь к файлу программы.&lt;br /&gt;
&lt;br /&gt;
Interpretate(script) - Интерпретирует скрипт указанный в script. Выполнение происходит в текущем инстансе.&lt;br /&gt;
&lt;br /&gt;
LastHttpError - Выводит последний запрос выполненный с ошибкой в функции HttpPost. Содержит подробную информацию по запросу и ответу.&lt;br /&gt;
&lt;br /&gt;
LastHttpResponse - Выводит последний запрос и ответ от сервера после выполнения Http-запроса в функции HttpPost.&lt;br /&gt;
&lt;br /&gt;
== Объект TExcel ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к данным документов MS Excel. Требует установленного приложения MS Excel. Для работы без установленного MS Excel предусмотрен объект TDirectExcel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ввод данных'''''&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Если Headered истинно (по-умолчанию), таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Если TranslateHeader истинно, то заголовки таблицы будут автоматически переведены.&lt;br /&gt;
 &lt;br /&gt;
 MyDB.Open('select * from kurier');&lt;br /&gt;
 xl.LoadFromDB(MyDB.Self);&lt;br /&gt;
 xl.DoNotDestroy(true);&lt;br /&gt;
 xl.SetVisible(true);&lt;br /&gt;
&lt;br /&gt;
Post2Sheet(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) -  Почти полный аналог LoadFromDB. В отличии от LoadFromDB если есть открытый файл, выгрузка данных будет выполнена прямо в него.&lt;br /&gt;
&lt;br /&gt;
OpenFile(aFileName) – Выполняет функции SetFileName и Open. &lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
SetFileName(aFileName) – Задает значение свойства FileName.&lt;br /&gt;
&lt;br /&gt;
Open - Открывает файл с именем, заданным свойством FileName. Если имя файла не задано - создает чистую книгу.&lt;br /&gt;
&lt;br /&gt;
Close – Закрывает текущий файл.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ячейки'''''&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
Cell(x, y, text) – Возвращает значение ячейки, заданной координатами x, y. Необязательный булевый параметр text, в случае истинности, указывает на необходимость возврата данных с учетом формата ячейки, т.е. то, что пользователь видит на экране. Обратите внимание, что если в ячейке число, и ширина столбца не достаточна для отображения, Excel выводит &amp;quot;#####&amp;quot;, что и будет возвращено программе, если text=ИСТИНА. Поэтому перед таким использованием рекомендуется выполнить функцию AutoFit.&lt;br /&gt;
&lt;br /&gt;
SetCell(x, y, v[, x2, y2]) – Устанавливает значение ячейки, заданной координатами x и y, в значение v. Если заданы параметры x2, y2 - объединяет (merge) диапазон ячеек заданных координатами, устанавливает значение объединенной ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Строки'''''&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
RowAutoFit([y1, y2]) - Устанавливает автоматическую высоту строк. Аргументы y1 и y2 необязательны и если не указаны, то процедура будет выполнена для всей страницы, в ином случае только для строк от y1 до y2.&lt;br /&gt;
&lt;br /&gt;
SetRowHeight(r, h[, cnt]) – Устанавливает высоту cnt строк (по-умолчанию 1) начиная со строки r в h пикселей.&lt;br /&gt;
&lt;br /&gt;
GetRowHeight(r) – Возвращает высоту строки r в пикселях.&lt;br /&gt;
&lt;br /&gt;
RowInsert(i[, count]) - Вставляет count (по-умолчанию - 1) строк НАД строкой с номером i.&lt;br /&gt;
&lt;br /&gt;
RowDelete(i[, count]) - Удаляет count (по-умолчанию - 1) строк начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Столбцы'''''&lt;br /&gt;
&lt;br /&gt;
ColCount - Возвращает количество столбцов в листе.&lt;br /&gt;
&lt;br /&gt;
AutoFit – Устанавливает автоматическую ширину столбцов.&lt;br /&gt;
&lt;br /&gt;
ColumnDelete(i[, count]) - Удаляет count (по-умолчанию - 1) столбцов начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
SetColWidth (c, w) – Устанавливает ширину столбца c в w пикселей.&lt;br /&gt;
&lt;br /&gt;
GetColWidth (c) – Возвращает ширину столбца c в пикселях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Листы'''''&lt;br /&gt;
&lt;br /&gt;
SetSheet(No) – Устанавливает номер текущего листа. Если лист с таким номером не существует - он будет создан (и все листы до него). Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetSheetName(Name) - Устанавливает название текущего листа.&lt;br /&gt;
&lt;br /&gt;
SheetsCount – Возвращает количество листов в книге.&lt;br /&gt;
&lt;br /&gt;
CopySheetAfter([SheetFrom[, SheetAfter]]) - Копирует лист SheetFrom (по-умолчанию - текущий), создавая новый лист после листа SheetAfter (по-умолчанию - совпадает с копируемым).&lt;br /&gt;
&lt;br /&gt;
SheetDelete(i) - Удаляет лист с номером i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Форматирование'''''&lt;br /&gt;
&lt;br /&gt;
Align(x1, y1, x2, y2 [,HAlign, VAlign]) - Устанавливает выравнивание данных в указанном диапазоне. HAlign - горизонтальное выравнивание (0 – прижато влево , 1 – по центру , 2 – прижато вправо), VAlign - Вертикальное выравнивание (0 – прижато к верху , 1 – по центру , 2 – прижато к низу).&lt;br /&gt;
&lt;br /&gt;
WrapText(x1, y1, x2, y2, value) – Устанавливает перенос текста прямоугольника в значение value. Если координаты опущены, или 0 – устанавливает границы всей используемой области. Для Value значение по-умолчанию - true.&lt;br /&gt;
&lt;br /&gt;
NumberFormat(x1, y1, x2, y2, Format) - Устанавливает формат вывода чисел в указанном диапазоне ячеек. Например, если Format='0.00' - числа будут выводиться c обязательными 2 знаками после десятичного разделителя.&lt;br /&gt;
&lt;br /&gt;
SetBorders(x1, y1, x2, y2) – Устанавливает границы прямоугольника. Если координаты опущены, или 0 – устанавливает границы всей используемой области.&lt;br /&gt;
&lt;br /&gt;
SetFont(Font[, x1, y1[, x2, y2]]) - Устанавливает шрифт Font для ячеек диапазона. Можно указать координаты только одной ячейки, можно - вообще не указать, тогда будет использован последний выделенный диапазон. Шрифт задается как обычно: 'Arial, 16, T, T, T', порядок параметров: Имя шрифта, размер, жирное начертание, курсивное начертание, одиночное подчеркивание. Если параметры не заданы, то у текущего шрифта они меняться не будут. Примеры: SetFont('Arial, 10, T, F, F', 1,1) - в ячейке A1 будет установлен шрифт Arial жирным начертанием (не курсив и без подчеркивания). SetFont(', , , T, F', 2,1) - в ячейке B1 будет поменяется только начертание курсив и будет отменено подчеркивание (если оно было). &lt;br /&gt;
&lt;br /&gt;
SaveValuesOnly - убирает формулы на текущей странице и оставляет лишь их результативные статичные значения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Цвета'''''&lt;br /&gt;
&lt;br /&gt;
SetRowFontColor(Row,Color) - Устанавливает цвет шрифта в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetRowColor(Row,Color) - Устанавливает цвет фона в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetColumnFontColor(Col,Color) - Устанавливает цвет шрифта в столбце Col. Color -  целое значение (RGB) &lt;br /&gt;
&lt;br /&gt;
SetColumnColor(Col,Color) - Устанавливает цвет фона в столбце Col. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellFontColor(Row,Col,Color) -  Устанавливает цвет шрифта в ячейке с координатами [Row,Col]. Color -  целое значение, равное номеру цвета в палитре (ColorIndex,не RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellColor(Row,Col,Color) -  Устанавливает цвет фона в ячейке с координатами [Row,Col]. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
GetRowFontColor(Row)- Возвращает RGB значение цвета шрифта строки Row&lt;br /&gt;
&lt;br /&gt;
GetRowColor(Row)- Возвращает RGB значение цвета фона строки Row&lt;br /&gt;
&lt;br /&gt;
GetColumnFontColor(Col)- Возвращает RGB значение цвета шрифта столбца Col&lt;br /&gt;
&lt;br /&gt;
GetColumnColor(Col)- Возвращает RGB значение цвета фона столбца Col &lt;br /&gt;
&lt;br /&gt;
GetCellFontColor(Row,Col) - Возвращает номер цвета шрифта в палитре (ColorIndex) в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
GetCellColor(Row,Col) - Возвращает RGB значение цвета фона в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Копи-паст'''''&lt;br /&gt;
&lt;br /&gt;
Copy(x1, y1, x2, y2) - Копирует в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Cut(x1, y1, x2, y2) - Вырезает в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Paste(x1, y1) - Вставляет из буфера экселя. Команды copy-paste неразрывны, если что нибудь сделать в промежутке между ними, например вставить значение в ячейку, то копирование сброситься. (Последовательность использования: copy - paste, cut - paste)&lt;br /&gt;
&lt;br /&gt;
PasteStyle(x1, x2, y1, y2) - Вставляет только оформление из буфера экселя (Последовательность использования:  Copy - PasteStyle)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Изображения'''''&lt;br /&gt;
&lt;br /&gt;
InsertPicture(TPicture, [x=1, y=1, DispX=0, DispY=0, width=0, height=0]) - Функция вставляет рисунок на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки, width, height (не работает для DirectExcel) - ширина и высота области рисунка в пойнтах-единицах Excel &lt;br /&gt;
&lt;br /&gt;
InsertFirmLogo(FirmCode, [x=1, y=1, DispX=0, DispY=0]) - Функция вставляет логотип фирмы с кодом FirmCode на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Вывод'''''&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки. Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SheetFitPageWidth - устанавливает режим масштабирования печати, чтобы печатная форма помещалась в ширину на один лист.&lt;br /&gt;
&lt;br /&gt;
SetOrientation(value) - Устанавливает ориентацию страницы. True (по-умолчанию) - альбомная (ландшафтная), Ложь - портретная.&lt;br /&gt;
&lt;br /&gt;
PrintOut([copies]) - Печатает текущий лист на принтере по умолчанию. Параметр copies - количество копий, по умолчанию равен 1.&lt;br /&gt;
&lt;br /&gt;
Save(filename) - Сохраняет в файл filename. Если файл существует, в основной системе он будет перезаписан, в других проектах - вызовет ошибку &amp;quot;Файл уже существует&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SetVisible(b) – Устанавливает видимость приложения Excel для пользователя. По-умолчанию – false (не видимо).&lt;br /&gt;
&lt;br /&gt;
DoNotDestroy(b) – При уничтожении объекта TExcel (а он уничтожается, как и все остальные объекты автоматически при завершении выполнения скрипта), приложение Excel уничтожается вместе с ним. DoNotDestroy(true) отключает уничтожение приложения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования'''''&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'myxl');&lt;br /&gt;
 myxl.OpenFile('c:\asdf.xlsx');&lt;br /&gt;
 set($sum, 0);&lt;br /&gt;
 while (myxl.EOF=0, &lt;br /&gt;
      set($sum, $sum+int(myxl.c));&lt;br /&gt;
      myxl.next );&lt;br /&gt;
 $sum&lt;br /&gt;
 &lt;br /&gt;
 ''Возвращает сумму всех числовых данных столбца C файла 'c:\asdf.xlsx'''&lt;br /&gt;
&lt;br /&gt;
== Объект TDirectExcel ==&lt;br /&gt;
Объект позволяет работать с файлами Excel напрямую, без установленного пакета MsOffice. Применяется в сервисах и при отсутствии экселя. Он максимально совместим с объектом TExcel, однако некоторые методы могут быть не реализованы. &lt;br /&gt;
&lt;br /&gt;
== Объект TCSVFile ==&lt;br /&gt;
Предназначен для доступа к данным документов CSV. Разделителем столбцов является символ точка с запятой ;&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
OpenFile(FileName) – Открывает файл FileName.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=false]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO.&lt;br /&gt;
&lt;br /&gt;
LoadFromText(s) - Загружает таблицу из строки s.&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). &lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(Filename) - Сохраняет в файл с именем filename.&lt;br /&gt;
&lt;br /&gt;
== Объект TADO ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к базам данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|Connect(ConnectionString)&lt;br /&gt;
|Подключает к источнику данных. ConnectionString – Строка подключения ADO.&lt;br /&gt;
|-&lt;br /&gt;
|ConnectMySQL(DBServer, DBPort, DBUser, DBPass, DBName)&lt;br /&gt;
|Подключает к базе данных MySQL.&lt;br /&gt;
|-&lt;br /&gt;
|Open(Query)&lt;br /&gt;
|Открывает набор данных выполнив запрос Query.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByNo(i)&lt;br /&gt;
|Возвращает значение поля с номером i. Нумерация полей – с нуля.&lt;br /&gt;
|-&lt;br /&gt;
|FieldName(i)&lt;br /&gt;
|Возвращает имя поля с номером i.&lt;br /&gt;
|-&lt;br /&gt;
|FieldCount&lt;br /&gt;
|Возвращает количество  полей.&lt;br /&gt;
|-&lt;br /&gt;
|RecordCount&lt;br /&gt;
|Возвращает количество записей.&lt;br /&gt;
|-&lt;br /&gt;
|RecNo&lt;br /&gt;
|Возвращает номер текущей записи. ''ВНИМАНИЕ! В зависимости от способа подключения к БД нумерация может начинаться как с 0 так и с 1!''&lt;br /&gt;
|-&lt;br /&gt;
|EOF&lt;br /&gt;
|Возвращает признак достижения конца набора данных. Становится истиной когда выполняется команда Next на последней записи.&lt;br /&gt;
|-&lt;br /&gt;
|Next&lt;br /&gt;
|Переход на следующую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|First&lt;br /&gt;
|Переход на первую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|Last&lt;br /&gt;
|Переход на последнюю запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByName(FieldName)&lt;br /&gt;
|Возвращает значение поля по имени. Также возможно указание имени поля как свойства объекта.&lt;br /&gt;
|-&lt;br /&gt;
|Field(Table, ID, FieldName)&lt;br /&gt;
|Возвращает значение поля FieldName записи с кодом ID таблицы Table. Набор данных, если он открыт, при этом не закрывается. Первичный ключ таблицы должен называться «code». Гарантированно работает только с MYSQL!!!&lt;br /&gt;
|-&lt;br /&gt;
|GetSQLValue(Query)&lt;br /&gt;
|Выполняет SQL-запрос. Текст запроса должен начинаться с первого символа строки (перед запросом не должно быть пробелов, переносов строк, комментариев и т.д.). Если запрос Insert – возвращает ID вставленной записи. Если запрос – Update, Delete, Replace, Set, Start, Commit, Rollback – возвращает количество измененных записей (RowsAffected), иначе – Select – значение первого поля первой строки результата как текст.&lt;br /&gt;
|-&lt;br /&gt;
|FillText(s)&lt;br /&gt;
|Возвращает строку s с замененными названиями полей между знаками процента на соответствующие значения текущей записи. Так же в строке возможно использование интерпретируемого кода, заключенного между тегами &amp;quot;&amp;lt;?&amp;gt;&amp;quot; и &amp;quot;&amp;gt;&amp;quot;. При интерпретации система сначала производит замену полей с процентами на значения, потом интерпретирует код. ''Внимание! Функция не создает отельный контекст интерпретатора, а использует существующий, в нем доступны все объекты и переменные, вызывающего скрипта.'' Дополнительно автоматически создается объект TSelfADO, подключенный к той же БД, что и контекст, вызвавший функцию, с пустым именем, а так же с именем &amp;quot;dataset&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|Query(Query)&lt;br /&gt;
|Синоним GetSQLValue.&lt;br /&gt;
|-&lt;br /&gt;
|Close&lt;br /&gt;
|Закрывает набор данных.&lt;br /&gt;
|-&lt;br /&gt;
|Self&lt;br /&gt;
|Возвращает указатель на подключение к БД для использования в других объектах.&lt;br /&gt;
|-&lt;br /&gt;
|ParseForIn([FieldName='code']) &lt;br /&gt;
|Возвращает через запятую значения всех строк в указанном столбце. По умолчанию, используется столбец с именем code.&lt;br /&gt;
|-&lt;br /&gt;
|GetSQL&lt;br /&gt;
|Для отладки. Возвращает последний SQL запрос переданный в методы Open, Query, GetSQLValue&lt;br /&gt;
|-&lt;br /&gt;
|ExportExcel&lt;br /&gt;
|Для отладки. Выгружает в эксель содержимое датасета. Можно использовать в незнакомом окружении для понимания передаваемых полей в : шаблонах, печатных формах и т.д. Аналог команды %echo% в шаблонах, на случай если она не сработает.&lt;br /&gt;
|-&lt;br /&gt;
|OnGetText&lt;br /&gt;
|Функция подменяет текстовый вывод значения поля при выгрузке в эксель. Первый параметр это имя поля, которое надо подменить. Второй параметр это то что необходимо вывести. Работает только с текстовыми полями. &lt;br /&gt;
'''''Пример использования'''''  &lt;br /&gt;
  DB.OnGetText('Зона', IF((DB.FieldByName('-Lat') ! 0) * (DB.FieldByName('-Lon') ! 0),&lt;br /&gt;
       	GetPolygonByLatLon(DB.FieldByName('-Lat'), DB.FieldByName('-Lon'), 'TYPE = 1 AND IFNULL(zone, 0) &amp;gt; 0 AND PRICE = ' + DB.FieldByName('-price'), 'zone')&lt;br /&gt;
  ,&lt;br /&gt;
        ''&lt;br /&gt;
  ));&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования – см. TSelfADO&lt;br /&gt;
&lt;br /&gt;
== Объект TSelfADO ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наследник объекта TADO. Служит для подключения к «родной» для программы, в которой выполняется скрипт, базе данных. Обладает всеми свойствами и методами объекта TADO, кроме Connect. Иногда автоматически создается системой для обеспечения простого доступа к базе данных, а также иногда создается системой с уже открытым набором данных для передачи обрабатываемого системой набора данных в скрипт. В этом случае для скрипта недоступны функции Open и Close.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&lt;br /&gt;
 rem('Копируем данные из &amp;quot;родной&amp;quot; базы данных в базу MSSQL.');&lt;br /&gt;
 new('TSelfADO', 'MyDB');&lt;br /&gt;
 new('TADO', 'MSSQL');&lt;br /&gt;
 MSSQL.Connect('Provider=SQLOLEDB.1;Password=myPassword;Persist Security Info=True;User ID=myUsername;Initial Catalog=myDataBase;Data Source=myServerAddress');&lt;br /&gt;
 MyDB.Open('select code, name, passport from kurier where code&amp;gt;'+Int(MSSQL.Query('select max(code) from kurier'))+' order by code');&lt;br /&gt;
 While(MyDB.EOF=0,&lt;br /&gt;
      MSSQL.Query('insert kurier (code, name, passport) VALUES ('+MyDB.Code+', '+QuotedStr(MyDB.Name)+', '+QuotedStr(MyDB.Passport)+')');&lt;br /&gt;
      MyDB.Next;&lt;br /&gt;
      );&lt;br /&gt;
&lt;br /&gt;
== Объект TPrinter ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к принтерам.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
BeginDoc – Начинает новый документ.&lt;br /&gt;
&lt;br /&gt;
EndDoc – Закрывает документ&lt;br /&gt;
&lt;br /&gt;
PageHeight – Возвращает высоту страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageWidth – Возвращает ширину страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageNumber – Возвращает номер текущей страницы документа&lt;br /&gt;
&lt;br /&gt;
Orientation – Возвращает текущую ориентацию страницы (0 – портретная, 1 – ландшафтная)&lt;br /&gt;
&lt;br /&gt;
Printing – Возвращает истину если документ открыт&lt;br /&gt;
&lt;br /&gt;
SetOrientation(Orientation) – Устанавливает ориентацию страницы. При необходимости начинает новый документ, новую страницу.&lt;br /&gt;
&lt;br /&gt;
ShowDialog – Показывает пользовательский диалог печати. Возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
NewPage – Начинает новую страницу&lt;br /&gt;
&lt;br /&gt;
Canvas – Предоставляет доступ к объекту TCanvas, связанному с принтером.&lt;br /&gt;
&lt;br /&gt;
PrinterNames – Возвращает список принтеров, установленных в системе, разделенный переносами строк&lt;br /&gt;
&lt;br /&gt;
PrintersCount – Возвращает количество установленных в системе принтеров&lt;br /&gt;
&lt;br /&gt;
SetPrinter(Printer) – Устанавливает текущий принтер. Если передана строка – ищет принтер по названию, иначе – по номеру. Нумерация начинается с 0.&lt;br /&gt;
&lt;br /&gt;
PrintTable(Y, Table) – Выводит на печать таблицу Table типа TTable, начиная с координаты Y. При необходимости таблица печатается на нескольких страницах. Возвращает координату Y конца таблицы.&lt;br /&gt;
&lt;br /&gt;
GetDefaultPrinter - Возвращает имя текущего активного принтера.&lt;br /&gt;
&lt;br /&gt;
SetDefaultPrinter(Printer) – Запоминает предыдущий активный принтер и устанавливает новый текущий принтер. Printer - имя принтера. При необходимости нескольких последовательных вызовов SetDefaultPrinter рекомендуется между вызовами использовать RestoreDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
RestoreDefaultPrinter - Устанавливает активным принтер, который был текущим перед последним вызовом SetDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
== Объект TCanvas ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предоставляет доступ к холсту объекта для прорисовки изображения.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
DPIX – Возвращает разрешение холста по горизонтали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
DPIY – Возвращает разрешение холста по вертикали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
TextOut(x, y, s[, x1, y1, x2, y2]) – Выводит строку s начиная с точки с координатами x и y. Если указаны параметры x1, y1, x2, y2 – то выводимый текст ограничивается заданным прямоугольником.&lt;br /&gt;
&lt;br /&gt;
TextOutEx(x1, y1, x2, y2, Alignment, Font, s, Indent) – Выводит строку s в прямоугольнике с координатами x1, y1, x2, y2. По горизонтали строка выравнивается в соответствии с Alignment (0 – прижато влево, 1 – вправо, 2 – по центру), по вертикали выравнивается по центру. Используя шрифт Font (см описание ниже). Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату X фактического окончания текста (правой стороны – если строка прижата влево, и левой – в остальных случаях)&lt;br /&gt;
&lt;br /&gt;
MLTextOut(x1, y1, x2, y2, Alignment, VAlignment, Font, s, Heigth, Indent) – Выводит многострочный текст s в прямоугольнике с координатами x1, y1, x2, y2 с переносом по словам. По горизонтали строки выравниваются в соответствии с Alignment, по вертикали – в соответствии с VAlignment (0 – прижато вверх, 1 – по центру, 2 – прижато вниз). Используя шрифт Font (см описание ниже). Heigth – высота строки. Если опущено или равно нулю – высота определяется автоматически в соответствии с выбранным шрифтом. Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату Y фактического окончания текста (нижней границы последней строки текста. ''ВНИМАНИЕ! Функция использует координаты прямоугольника для позиционирования текста, однако она не ограничивает его верхней и нижней границами этого прямоугольника!''&lt;br /&gt;
&lt;br /&gt;
DrawPic(x1, y1, x2, y2, Pic, Style, Alignment, Mode) – Прорисовывает изображение Pic (ссылка на изображение TPicture.Self) в прямоугольник заданный координатами x1-y2. Style – стиль масштабирования. 0 – растянуть изображение до границ прямоугольника не сохраняя пропорции, 1 – вписать изображение в прямоугольник сохраняя пропорции – вероятно, останутся поля по вертикали или горизонтали, 2 – вписать сохраняя пропорции, обрезав при необходимости изображение по вертикали или горизонтали. Alignment – выравнивание по горизонтали. Работает только в случае если style=1 и при растягивании изображения получились вертикальные поля. 0 – разместить по центру, 1 – прижать влево, 2 – прижать вправо. Функция возвращает координату X правой стороны изображения кроме случая, когда Style=1 и Alignment=2 – в этом случае возвращается координата левой стороны изображения. Mode - способ наложения изображения. 0 (по-умолчанию) - копирование как есть. 1 - Наложение операцией AND (применяется для получения эффекта прозрачности изображения), 2 - наложение операцией XOR (Применяется для возможности повторной операцией убрать изображение), 3 - Наложение операцией OR.&lt;br /&gt;
&lt;br /&gt;
FillRect(x1, y1, x2, y2) – Рисует прямоугольник '''без границ''' и закрашивает цветом BrashColor&lt;br /&gt;
&lt;br /&gt;
Rect(x1, y1, x2, y2) – Рисует прямоугольник '''c границами''', задаваемыми текущим пером, и закрашивает цветом BrashColor &lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Устанавливает шрифт по-умолчанию.&lt;br /&gt;
&lt;br /&gt;
SetPen(Width, Color) - Устанавливает параметры &amp;quot;ручки&amp;quot; - толщину и цвет. Если любой параметр опустить, соответствующее значение не будет изменено.&lt;br /&gt;
&lt;br /&gt;
SetBrush(Color, Style) - Устанавливает параметры заливки - цвет и стиль. Если любой параметр опустить, соответствующее значение не будет изменено. Стили заливки: 0 - сплошная, 1 - отсутствует (прозрачная), 2-7 - различные виды штриховки (горизонтальные, вертикальные, в клеточку и т.д.).&lt;br /&gt;
&lt;br /&gt;
TextHeight(s) – Возвращает высоту текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
TextWidth(s) – Возвращает ширину текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
Использование шрифта (Font): У объекта TCanvas есть «глобальные» установки шрифта. Однако для некоторых функций возможно указание шрифта, отличающегося от глобального. Параметры шрифта – это текстовая строка, состоящая из 6-ти параметров, разделенных запятыми: Название, размер, жирный, курсив, подчеркнутый, цвет. Например:&lt;br /&gt;
&lt;br /&gt;
 'Times New Roman, 8, Y, N, N, 255'&lt;br /&gt;
&lt;br /&gt;
Любой параметр можно опустить, и тогда вместо него будет использовано значение по-умолчанию: шрифт: arial, размер – 10, не жирный, не курсив, не подчеркнутый, цвет – черный. Например: ', 7' – указывает, что по-умолчанию нужно взять все параметры кроме размера шрифта. Также можно вместо всей строки указать тире ('-') или пустую строку, и шрифт будет использоваться «глобальный».&lt;br /&gt;
&lt;br /&gt;
Объект можно создать отдельно, не создавая объект TPrinter. В таком случае объект создастся как ссылка на текущий холст принтера (принтер должен быть запущен и начат новый документ). Такой подход используется в доп. возможности PrintCustomSticker&lt;br /&gt;
&lt;br /&gt;
== Объект TPicture ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с графическими изображениями форматов BMP, GIF, JPEG и PNG, а также для формирования штрих-кодов. Обратите внимание, прозрачность изображений не поддерживается, однако в методе TCanvas.DrawPic есть параметр Mode, призванный создавать эффект прозрачности.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(FileName) – Загружает изображение из файла FileName. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB, Query) – Загружает изображение из базы данных. DB – ссылка на подключение к базе данных TADO.Self, Query – текст запроса. Запрос должен вернуть в первом поле первой строки BLOB-поле с изображением, все остальные данные возвращаемые запросом игнорируются. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromStr($s) – Загружает изображение из строки $s. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
CreateBar(Width, Height, BarCode, Textless, Type) – Формирует штрих-код шириной Width и высотой Height с типом кодирования Type. BarCode – текст штрих-кода. Булево значение Textless указывает, что в штрих-коде не должно быть человеко-читаемых символов если истинно. Type указывает тип кодирования: 0 (по-умолчанию) CODE128, 1 - EAN-13, 2 - Interleaved 2-5, 3-DataMatrix, 4-QRCode.&lt;br /&gt;
Штрихкод должен быть: Для EAN-13 цифровым 12 или 13 символов (13-й, контрольная сумма рассчитывается автоматически), для CODE128 - должен иметь состоять из допустимого для этого кодирования набора символов. Для Interleaved - должен состоять из четного числа цифр, контрольная сумма автоматически не рассчитывается. Если для Interleaved кода указано значение из 14-ти знаков, подпись цифр выводится в формате Почты России.&lt;br /&gt;
Внимание! Для кодов EAN-13 и Interleaved ширина штрих-кода Width не является точным значением получаемого на выходе изображения. Ширина изображения рассчитывается как максимальное кратное минимально возможной ширине, но не меньше минимально возможной. Конечную ширину можно получить в соответствующем свойстве объекта. Для кода CODE128 штрих-код на выходе может оказаться пустым, если указанной ширины штрих-кода не достаточно для его формирования.&lt;br /&gt;
Для кода DataMatrix можно установить режим для печати скрытых символов с кодами 29(GS) и 232(FCN1), которые требуются для формирования Честного Знака. Для этого необходимо в начале строки указать символ &amp;quot;[&amp;quot; и все разделители 01, 21, 91, 92 так же экранировать этими скобками. Должно получиться [01]02900002317701[21]k3LInNbH_oG0Q[91]EE06[92]YXiyKfiHjE4YE8b+YVMC1O5r8VtpplA3AwcCqrcG9Dk= . При формировании кода, включится режим формирования штрих-кода DataMatrix GS1, в начале будет добавлен символ с кодом 232 (FCN1), а потом будут добавлены разделители с кодом 29 (GS)&lt;br /&gt;
Функция возвращает 1 в случае успеха, или текст ошибки, если такая произошла.&lt;br /&gt;
&lt;br /&gt;
SetSize(Width, Height) - Устанавливает размер изображения.&lt;br /&gt;
&lt;br /&gt;
AsString([ImageFormat]) - Возвращает изображение в виде строки с двоичными данными. ImageFormat принимает значения 1 - Bitmap (по-умолчанию), 2 - jpeg, 3 - png, 4 - gif.&lt;br /&gt;
&lt;br /&gt;
Width – Возвращает ширину изображения.&lt;br /&gt;
&lt;br /&gt;
Height – Возвращает высоту изображения.&lt;br /&gt;
&lt;br /&gt;
Rotate(Angle) – Поворачивает изображение по часовой стрелке на угол Angle. Угол указывается в градусах и может принимать любые значения.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с изображением, используется в качестве параметра для функций, работающих с изображениями из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Canvas - ссылка на объект TCanvas холста изображения.&lt;br /&gt;
&lt;br /&gt;
== Объект TTable ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с таблицами. Удобен для печати таблицы на принтере. Алгоритм таков: Загружаем датасет в таблицу, настраиваем ее (шрифты, штрих-коды и т.д.), потом выводим на принтер функцией TPrinter.PrintTable.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Заголовок – это первая строка таблицы.&lt;br /&gt;
&lt;br /&gt;
Cell(С, R) – Возвращает значение ячейки таблицы с координатами (C, R). Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetCell(С, R, Value) – Устанавливает значение ячейки таблицы с координатами (C, R) в Value. Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
RowCount – Возвращает количество строк в таблице.&lt;br /&gt;
&lt;br /&gt;
ColCount – Возвращает количество столбцов в таблице.&lt;br /&gt;
&lt;br /&gt;
SetTitleFont(Font) – Задает шрифт заголовка таблицы (первой строки).&lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Задает шрифт всей таблицы кроме заголовка.&lt;br /&gt;
&lt;br /&gt;
SetColFont(C, Font) - Устанавливает шрифт столбца C.&lt;br /&gt;
&lt;br /&gt;
SetIndent(Indent) – Задает отступ от границы ячейки до текста в процентах от ширины страницы. По-умолчанию значение 0.3&lt;br /&gt;
&lt;br /&gt;
SetWidth(С, Width) – Задает значение ширины столбца C в процентах от ширины страницы.&lt;br /&gt;
&lt;br /&gt;
SetMinRowHeght (Heght) – Задает значение минимальной высоты строки в пикселях. &lt;br /&gt;
&lt;br /&gt;
SetBarCode(Col, Type) - Указывает, что данные из столбца Col должны печататься в виде штрих-кода. Тип штрих-кода - Type. Значение '''&amp;quot;1&amp;quot; - EAN13'''. Для кода EAN13 первая строка данных в ячейке должна иметь вид &amp;quot;тип штрих-кода, номер&amp;quot;, например &amp;quot;7, 123&amp;quot; (без кавычек, конечно). В этом случае система сформирует штрих-код: &amp;quot;2700000001233&amp;quot;. Первая цифра - всегда 2, далее - указанный тип штрих-кода, нули, чтобы получилось 13 символов, номер, указанный в таблице, и один символ - контрольная сумма. Значение '''&amp;quot;2&amp;quot; - CODE128''' (с версии 734). Данные из первой строки ячейки таблицы печатаются в штрих-коде &amp;quot;как есть&amp;quot;. Для всех видов штрих-кода (с версии 734) последующие строки печатаются под штрих-кодом в виде текста.&lt;br /&gt;
&lt;br /&gt;
SetMultiHeader(Active) - Включает печать заголовка при переносе таблицы на несколько страниц. По умолчанию отключено.&lt;br /&gt;
&lt;br /&gt;
SetCustomHeader(script) - Включает печать пользовательского заголовка. Script - это код интерпретатора, который должен печатать заголовок на канву. Печать таблицы может происходить на нескольких листах, по этому скрипт будет вызван для каждого листа. При использовании этого метода, автоматически инициализируются переменные: $TablePageNo - номер страницы, нумерация начинается с нуля; $TableY - координата по оси Y, от которой рисуется заголовок. Чтобы таблица была под заголовком необходимо значение переменной $TableY увеличить на высоту заголовка.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с таблицей, используется в качестве параметра для функций, работающих с таблицами из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 &amp;lt;?&amp;gt;&lt;br /&gt;
 NEW('TPrinter', 'Prn');&lt;br /&gt;
 If(prn.ShowDialog,&lt;br /&gt;
  NEW('TTable', 'Tbl'); &lt;br /&gt;
  NEW('TSelfADO', 'MyDB'); &lt;br /&gt;
  MyDB.Open('SELECT concat(&amp;quot;7&amp;quot;, &amp;quot;, &amp;quot;,  a.code, &amp;quot;\r\n&amp;quot;, a.client_id, &amp;quot;\r\n&amp;quot;, a.zakaz, &amp;quot;-&amp;quot;, a.number) as &amp;quot;Штрих-код&amp;quot;, a.target AS &amp;quot;Заказик&amp;quot;, address, phone, vlog, poruch FROM address a order by code desc limit 10');&lt;br /&gt;
  Tbl.LoadFromDB(MyDB.Self); &lt;br /&gt;
  Tbl.SetBarcode(1, 1);&lt;br /&gt;
  Tbl.SetCustomHeader(     &lt;br /&gt;
    if($TablePageNo&amp;gt;0,&lt;br /&gt;
      Prn.Canvas.TextOut(Prn.Canvas.DPIX*0.1, $TableY, 'Продолжение таблицы');&lt;br /&gt;
      set($TableY, $TableY + Prn.Canvas.TextHeight('H'));&lt;br /&gt;
    ,0)&lt;br /&gt;
  );&lt;br /&gt;
  Prn.BeginDoc; &lt;br /&gt;
  Prn.PrintTable(0, Tbl.Self);   &lt;br /&gt;
  Prn.EndDoc&lt;br /&gt;
 , );&lt;br /&gt;
&lt;br /&gt;
== Объект TBaseUtils ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции, базирующиеся на БД системы «MEASOFT». По-умолчанию, при создании подключается к основной базе данных модуля, в котором выполняется скрипт, если такая определена контекстом, однако это можно изменить, см SetConnection.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
'''MakeAddress(s[,town])''' – возвращает значение, полученное путем преобразований адреса s для приведения его к внутреннему формату программы. В процессе преобразования до нескольких раз происходит замена буквосочетаний по таблице замены (ее редактирование доступно по нажатию кнопки «Автозамена» в интерфейсе импорта БД из Excel системы (см. Руководство пользователя)), поиск улиц по базе КЛАДР с точностью до одного знака, и некоторые другие операции, нацеленные на исправление ошибок в написании адреса.&lt;br /&gt;
&lt;br /&gt;
С версии программы 2008.0.0.615, при вызове функции в формулах загрузки реестра, в первую очередь происходит проверка строки s на условия:&lt;br /&gt;
* в строке s записано  число; &lt;br /&gt;
* строка s начинается с &amp;quot;ПВЗ &amp;quot;. &lt;br /&gt;
Если одно из этих условий выполняется, то функция пытается установить пункт самовывоза - т.е она сама в загружаемой карточке корреспонденции укажет: адрес ПВЗ, город ПВЗ и установит галку самовывоз. &amp;lt;br/&amp;gt;Правила поиска ПВЗ:&lt;br /&gt;
* Если s число -  считаем его внутренним кодом филиала;&lt;br /&gt;
* Если s начинается с &amp;quot;ПВЗ &amp;quot; - Например в адресе передана строка &amp;quot;ПВЗ На Ленинском проспекте&amp;quot;, то искать будем филиал с названием &amp;quot;На Ленинском проспекте&amp;quot; который подчиненный, активный, с галкой ПВЗ и в городе town. Если город не указан, то ищем филиал во всех городах, и считаем его найденным если найдем только один филиал. &lt;br /&gt;
* Если филиалы найти не удалось, функция makeaddress работает как обычно и выполняет преобразование адреса.&lt;br /&gt;
&lt;br /&gt;
Если адрес не содержит русских букв, только латиница, и курьерская служба находится в одной из стран Россия, Белоруссия, Казахстан или Украина, и город-получатель (второй параметр, town) находится так же в одной из этих стран, функция автоматически делает транслитерацию адреса на русский язык.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''SetConnection(DB) – Подключает объект к базе данных DB, где DB – ссылка на объект TADO.Self.'' '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
''SetTown(Town) – Устанавливает код текущего города (используется в некоторых функциях объекта) в значение Town. По-умолчанию текущий город – 1.''  '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
'''SetIndexLength(Length)''' – Устанавливает длину почтового индекса. По-умолчанию – 6.&lt;br /&gt;
&lt;br /&gt;
'''GetIndex(Address)''' – Возвращает почтовый индекс из адреса.&lt;br /&gt;
&lt;br /&gt;
'''GetStreet(Address)''' - Возвращает улицу до первой запятой.&lt;br /&gt;
&lt;br /&gt;
'''GetHome(Address)''' - Возвращает номер дома до второй запятой, но не более пяти символов.&lt;br /&gt;
&lt;br /&gt;
'''GetKurierByStation(station, Mass, Cash, Date_Putn)'''&lt;br /&gt;
&lt;br /&gt;
'''TownByIndex(Index[, PriorityName][, PriorityCountry])''' – Возвращает код города по индексу. В случае ошибки поиска – код текущего города. Если нашлось несколько населенных пунктов, и указано приоритетное название - выбирается населенный пункт, название которого начинается с PriorityName (если есть).&lt;br /&gt;
&lt;br /&gt;
'''TownByName(Name[,NotNeedCL=False, City=0])''' – Возвращает код города по имени. В случае ошибки поиска – возвратит код текущего города. Если параметр NotNeedCL (параметр не обязательный) установить в TRUE, тогда функция возвратит 0, если город не удалось найти. Параметр City (код региона) позволяет ограничить поиск одной областью (не обязательный, по умолчанию не используется).&lt;br /&gt;
&lt;br /&gt;
'''FillClientInfo(Excel, client, Sheet, Row, Col)''' – Выводит в эксель информацию о клиенте с кодом client на лист sheet начиная со строки row и столбца col.&lt;br /&gt;
&lt;br /&gt;
'''SavePrintFormToFile(FormType, FormNumber)''' - Сохраняет на диске файл печатной формы и возвращает путь к нему&lt;br /&gt;
&lt;br /&gt;
'''CreateTrans(Address[, Store][, Operator][,Correction])''' - Формирует запись для печати кассового чека для корреспонденции с кодом Address, для выбора кассового аппарата используется код склада Store. Если Store не указано - при исполнении в среде клиентского модуля системы использует склад, указанный пользователем в окне [[Настройка параметров рабочего места|&amp;quot;Настройка&amp;quot; - &amp;quot;Параметры&amp;quot;]], в остальных модулях - код текущего склада из [[Настройка глобальных параметров|переменной]] &amp;quot;CL&amp;quot; (&amp;quot;Текущий филиал&amp;quot;). Поле Operator позволяет указать кассира (передается код справочника сотрудников). Если не указан, в основной системе будет использован код авторизованного пользователя, в других модулях - 1.&lt;br /&gt;
Поле Correction позволяет указать данные для корректировочного чека, используется в системе Штрих-М. По умолчанию пустая строка. Возвращает идентификаторы записей чеков. Может вернуть пустую строку, если чек создавать не понадобилось, один или несколько кодов через запятую, если создано несколько чеков. В случае ошибки вызывает ошибку, поэтому рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CreateReturnTrans(Address)''' - формирует запись для печати чека возврата для корреспонденции с кодом Address. Чек возврата печатается на полную сумму и с теми же атрибутами, что и чек продажи. Возвращает идентификатор записи чека возврата. В случае ошибки вызывает ошибку, поэтому, как и с CreateTrans,  рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownDeliveryDays(Source, Mode, TownTo, TownFrom)''' - возвращает количество дней необходимых на доставку отправления, только для межгорода. Source - код клиента, Mode - режим срочности, TownFrom - код города отправителя, TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcDeliveryDate(Source, Mode, TownTo, TownFrom, Date_Beg, Time_beg)''' - Возвращает планируемую дату доставки с учетом сроков доставки. Работает при городской и междугородней доставке. Для межгорода сроки доставки берутся из зон. Для городской доставки, из дополнительных параметров статуса (17 статус, 1 параметр в доп. информации)  Если рассчитать дату планируемой доставки не удалось, возвращает пустую строку. Параметры: Source - код клиента, Mode - режим срочности, TownTo - город получатель, TownFrom - город отправитель, date_beg - дата заказа (может быть передана строкой в формате DD.MM.YYYY или в числовом), time_beg - время заказа. &lt;br /&gt;
&lt;br /&gt;
'''GenSpecialSMA(DirectExcel, Code)''' - функция для генерации отчета о доставке по акту передачи денег. Первый параметр - указатель на TDirectExcel, второй параметр - код акта передачи денег. АПД выводится на текущий лист объекта TDirectExcel.&lt;br /&gt;
&lt;br /&gt;
'''CreateSpecialSMA(ClientCode, DateTo)''' - Функция создает исходящий акт передачи денег (АПД). Требует ClientCode - код клиента, DateTo - дату акта. Функция возвращает коды созданных актов. Если возвращаемых параметров два, значит функция пыталась создать два АПД: первым, идет код АПД с наличной оплатой, а вторым с безналичной. Примеры возвращаемого результата: '0'- акт не был создан, отсутствуют корреспонденции; '124' - код созданного акта; '0,0' - пытались создать два акта, но отсутствуют данные; '4556,0' - создан только наличный АПД; '0,445' - создан только безнал.; '4556,445' - созданы нал. и безнал.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressForActDelivery(ActCode, [DeliveryDateMode=0, Delivery=True])''' - Функция создает корреспонденцию на доставку акта. ActCode - код акта; DeliveryDateMode: 0 - установить план. дату доставки текущим рабочим днем, 1 - установить план. дату доставки следующим рабочим днем, 2 - установить план. дату доставки равной планируемой дате оплаты АПД; Delivery - создать корр. на доставку АПД или создать корреспонденцию на забор АПД (по умолчанию, доставка АПД). Работа функции может быть изменена системной доп. возможностью OnCreateAddressForActDelivery.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressTransferAct(ClientCode, Store, DateTo, [AdditionalParam])''' - Функция создает исходящий акт передачи корреспонденции (АПК). Требует  ClientCode - код клиента, Store - код филиала, для которого будет создан акт, DateTo - дату, до которой в акт попадут возвраты, AdditionalParam - дополнительный строковый параметр для передачи в системную доп. возможность ExceptionsForAPK, позволяющий отобрать в акт, например, только полные возвраты.   Возвращает код созданного акта. ВНИМАНИЕ: при создании АПК используется системная функция ExceptionsForAPK. Если в ней используются интерактивные функции (вывод сообщений, диалоговые окна, выполнение скриптов), то акт сформирован не будет, а функция CREATEADDRESSTRANSFERACT вернет ошибку.     &lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByAddress(Address, TownCode, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попал адрес. Если полигон найти не удалось, функция возвратит пустую строку. Address - адрес корреспонденции текстом; TownCode - код города; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByAddress(addressrecord.address, if((addressrecord.number=0)*(addressrecord.strbarcode=&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;), addressrecord.townfrom, addressrecord.townto), '`schema`=1') - пытаемся найти вхождение адреса в полигоны 1 схемы, при выборе города учитывается корр. на забор, у нее нужно использовать город-отправитель (а для обычной корр. нужен город-получатель).&lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByLatLon(Lat, Lon, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попали GPS координаты. Если полигон найти не удалось, функция возвратит пустую строку. Lat - широта  текстом; Lon - долгота текстом; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByLatLon('55.769064','37.590713','zone is not null and price=0') - пытаемся найти вхождение координат в полигоны, где задана зона, для всех клиентских и курьерских зон.&lt;br /&gt;
&lt;br /&gt;
'''GetLatLonByAddress(AddressText, TownCode)''' - возвращает географические координаты вида lat,lon указанного в AddressText адреса. Поиск производится в городе, имеющем код TownCode в таблице Town.&lt;br /&gt;
&lt;br /&gt;
'''GetRouteCode(AddressText, TownCode, LatLon[, Lon])''' - для адреса AddressText в городе с кодом TownCode (из таблицы Town) по географическим координатам lat, lon возвращает код роута (записи, хранящей координаты адреса в городе). Если роут не найден (для адреса в городе не найдено записи с указанными координатами) - создает новый роут и возвращает его код, если роут найден (был создан ранее) - обновляет у роута координаты. Если параметр Lon задан, то параметр LatLon должен содержать одну координату, иначе LatLon должен содержать строку вида 'lat, lon'.&lt;br /&gt;
В случае ошибки возвращает Null.&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode(address, townto, '55.114034, 36.592397'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Троицк, Полковника милиции Курочкина ул., 11', 1, '37.467446, 55.740537'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Обнинск, Маркса пр., 20', TownByName('Обнинск'), 55.114034, 36.592397));&lt;br /&gt;
&lt;br /&gt;
'''CalcAgentPrice(AddressCode, AgentCode, TownFrom, TownTo, Mode, [, Count=1])''' - функция возвращает стоимость доставки рассчитанную по тарифу агента. AddressCode - код адреса, AgenCode - код филиала (агента), TownFrom - код города отправителя, TownTo - код города получателя, Mode - режим срочности, count - тарифная сетку от указанного количества отправлений (по умолчанию 1)&lt;br /&gt;
&lt;br /&gt;
'''SetAddrKol_vo(address, getkol_vo)''' - функция делает прием корреспонденции в текущем ответственном филиале. address - внутренний код адреса, getkol_vo - количество принимаемых мест, может принимать значения: &amp;quot;kol_vo&amp;quot; - принять все места, &amp;quot;getKol_vo+1&amp;quot; - принять еще одно место, &amp;quot;число&amp;quot; - сделать количество принятых мест равным указанному числу.&lt;br /&gt;
&lt;br /&gt;
'''CalcClientCnt(client_code, date, is_intown [, date_put=CurrDate(), skipajust=false])''' - функция расчета количество доставленных корреспонденций у клиента с кодом client_code за предыдущий месяц от даты date (Или за текущий месяц, подробнее смотри переменную UseCurrentMonthCount) среди внутригородских (is_intown = true) либо междугородних (is_intown = false) корреспонденций, date_put - дата доставки (для альтернативного способа подсчета, включаемого переменной UseDatePutForCalcCnt), skipajust - не учитывать принудительно введенные количества (таблица priceclientadjust типы записей 0 и 1).&lt;br /&gt;
&lt;br /&gt;
'''GetBasePrice''' - возвращает базовую стоимость доставки посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов,зоны,типа,срочности,массы, расстояния. В системах с выключенными доп. услугами также считает проценты от суммы и страховки. &lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset._self&amp;quot;.&lt;br /&gt;
  Описание некоторых полей датасета:&lt;br /&gt;
    pmoney - процент от суммы;&lt;br /&gt;
    pmoneycard - процент от суммы при оплате картой;&lt;br /&gt;
    pricecode - код прайса (таблица Price) ;&lt;br /&gt;
    distarea - район метро получателя (актуально при отключённом едином районировании, как правило район от 200 до 299 является признаком области);&lt;br /&gt;
    region - признак области при включенном едином районировании;&lt;br /&gt;
    distareaFrom и regionFrom  - аналог distarea, region только для отправителя;&lt;br /&gt;
    pcncode - код записи таблицы pricecnt &amp;quot;количество от&amp;quot;;&lt;br /&gt;
    Запрос содержит поля таблицы pricelinesnew - начальная стоимость по тарифной сетки, найденные без учета массы,только по типу срочности и режиму.&lt;br /&gt;
    Запрос содержит поля таблицы price.&lt;br /&gt;
&lt;br /&gt;
*addressrecord - ссылка на объектную модель карточки корреспонденции, следует использовать уже созданную addressrecord._self&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*type - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*wait - количество минут ожидания (не учитывается при доп. услугах, есть системная услуга &amp;quot;ожидание&amp;quot;);&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*rur - сумма передаваемых денег (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от суммы&amp;quot;);&lt;br /&gt;
*inshprice - сумма страховки (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от объявленной стоимости&amp;quot;);&lt;br /&gt;
*distance - расстояние до места доставки, обычно поле заполняется при доставке в область (регион в едино районировании). Дополнительная наценка к стоимости доставки;&lt;br /&gt;
*forward - направление доставки: true - туда; false - обратно;&lt;br /&gt;
*Collection - признак заборной корреспонденции: true - забор, false - доставка (В тарифе есть возможность указать стоимость для забора);&lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
В тарифе есть возможность указать формулу, которая может влиять на базовый расчет. Формула может объявить служебные переменные, которые:&lt;br /&gt;
*$FormulaReplace - если true – возвращаемое значение полностью заменяет базовый расчет;&lt;br /&gt;
*$FormulaKoeff - коэффициент на который будет помножена базовая стоимость.&lt;br /&gt;
Также внутри формулы объявлены следующие объекты dataset, addressrecord и переменные:&lt;br /&gt;
*$ForceIntown - Переменная становится истиной, если междугородний расчет был отменен, т.к. адрес попал в нарисованную зону на карте.&lt;br /&gt;
*а также: $forward, $distance, $Count, $Collection, $Wait, $FormulaKoeff, $PriceCode - описание есть выше.&lt;br /&gt;
&lt;br /&gt;
Для направления &amp;quot;туда&amp;quot;, Функция GetBasePrice вызывается  через доп. услугу &amp;quot;База&amp;quot; (при включенных доп. услугах), для направления &amp;quot;Обратно&amp;quot; всегда вызывается напрямую (т.к. доп. услуги работают только в для направления &amp;quot;туда&amp;quot;).&lt;br /&gt;
На расчет этой функции влияют следующие переменные: &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Расчет стоимости по адресу&amp;quot;, &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Зона клиента по умолчанию&amp;quot;,  &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Подсчет кол-ва отправлений за месяц&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownPrice''' - возвращает базовую стоимость междугородней доставки, посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов, типа, срочности, массы, расстояния.&lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset.self&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*tp - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcAddressPrice(AddressCode, [,ZakazCount])''' - полностью пересчитывает стоимость доставки корреспонденции по тарифу клиента. AddressCode - внутренний код адреса, ZakazCount - не обязательный параметр, кол-во заказов от клиента.&lt;br /&gt;
&lt;br /&gt;
'''GetStationCode(s [,town])''' – возвращает код станции метро, ассоциированный в системе с адресом s. В случае невозможности идентифицировать станцию метро – возвращает 0. &lt;br /&gt;
Когда включено районирование по карте, необходим второй параметр &amp;quot;town&amp;quot; - код города в котором нужно искать адрес.  Возвращает код района если удалось его найти; код станции меж-города - если адрес удалось геокодировать, но район не нашли; код 0 - когда не удалось геокодировать адрес.&lt;br /&gt;
&lt;br /&gt;
'''RecalcSpecialSMA(ActCode)''' - пересчитать акт передачи денег (АПД). Также, у корреспонденций входящих в АПД будет пересчитана стоимость доставки. Для Входящего АПД сумма акта не пересчитывается. Параметр ActCode - внутренний код акта, коды можно перечислять через запятую.&lt;br /&gt;
&lt;br /&gt;
'''UserCode''' - Возвращает код текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserName''' - Возвращает имя текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserPass''' - Возвращает пароль текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''UserBaseCode''' – Возвращает код текущего пользователя из таблицы «Сотрудники» (kurier).&lt;br /&gt;
&lt;br /&gt;
'''UserEmail''' - Возвращает e-mail текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''CurrentTown''' – Возвращает код текущего города (из таблицы town).&lt;br /&gt;
&lt;br /&gt;
'''CurrentCity''' – Возвращает код текущего региона (из таблицы city).&lt;br /&gt;
&lt;br /&gt;
'''CurrentLocation''' – Возвращает код текущего филиала (из таблицы store).&lt;br /&gt;
&lt;br /&gt;
'''FromEmailStr''' - строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
'''FillExcelDoc'''(Excel, Dataset, FormType, FormNumber,Print,[printer]) - Выполняет указанную печатную форму в объекте excel. Excel объект можно не указывать, тогда функция сама создаст объект экселя и разрушит его, полезно когда книгу &lt;br /&gt;
нужно распечатать или отправить по email (на листе данных в ячейке 1,1 укажите ключевое слово email). Dataset объект с данными для скрипта в печатной форме, может быть null. Dataset передавать можно так db.self, тогда переданный dataset внутри печатной формы будет доступен по имени dataset. Print - печатает книгу на принтере, после печати объект excel разрушается, при использовании параметра не указываете объект excel. Printer - имя принтера, на котором печатать (по умолчанию пустая строка, что означает &amp;quot;печатать на принтере по умолчанию&amp;quot;). Например:&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'excel');&lt;br /&gt;
 FillExcelDoc(excel.self, null, 12, 1);&lt;br /&gt;
 excel.DoNotDestroy(true);&lt;br /&gt;
 excel.SetVisible(true);&lt;br /&gt;
 ''Покажет эксель с выполненной печатной формой''&lt;br /&gt;
&lt;br /&gt;
'''ValutaSign''' – Возвращает название валюты для суммы.&lt;br /&gt;
&lt;br /&gt;
'''SendToMeasoft(xml)''' - Отправляет запрос в клиентское API Measoft. Автоматически добавляет начальный &amp;quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''InsertFirmAtt(excel, sheet, firmcode)''' - Вставляем на лист эксель по коду фирмы: печать, подпись, подпись бухгалтера, логотип. Тэги &amp;lt;STAMP&amp;gt;, &amp;lt;DIR&amp;gt;, &amp;lt;BUH&amp;gt;, &amp;lt;LOGO&amp;gt; соответственно. После тега можно указать размеры изображения в символах Microsoft Excel. Формат записи: &amp;lt;STAMP&amp;gt; 16, 16&lt;br /&gt;
&lt;br /&gt;
'''PreCalcSalary(kurier, addressCodes)''' - Рассчитывает предварительную зарплату. Kurier - код курьера, используется для определения тарифа. addressCodes - коды адресов, через запятую для которых необходимо посчитать зарплату. Результаты расчета будут записаны в таблицу kurierpaydetail, так как расчет предварительный то записи не будут прикреплены к конкретному начислению. &lt;br /&gt;
&lt;br /&gt;
  select a.code, kpd.price as &amp;quot;туда&amp;quot;, kpd2.price as &amp;quot;обратно&amp;quot; from address a &lt;br /&gt;
  left join kurierpaydetail kpd on kpd.sourcetable=3 and kpd.sourcecode=a.code and kpd.rectype = 1 &lt;br /&gt;
  left join kurierpaydetail kpd2 on kpd2.sourcetable=3 and kpd2.sourcecode=a.code and kpd2.rectype = 2&lt;br /&gt;
  where a.code in (...)&lt;br /&gt;
&lt;br /&gt;
'''CalcSalary(DateTo, [Filter=0, KurierCode = 0, ManagerCode = 0])''' - Полный расчет зарплаты курьерам. DateTo  - дата до которой создается начисление. Условия отбора курьеров для начисления. Filter - роль сотрудника: 0 - Все, 1 - курьеры, 2 - менеджеры; KurierCode - код курьера, ограничить расчет зарплаты одним курьером;ManagerCode - код курьера, ограничить расчет зарплаты курьерами указанного менеджера. Внимание фильтры Filter, KurierCode и ManagerCode накладываются друг на друга. Результатом функции является SubSQL с информацией по созданным начислениям. &lt;br /&gt;
  поля ответа: код курьера, код менеджера, начислено, бонусы, штрафы, аванс, итого;&lt;br /&gt;
  select kurier, manager, profit, bonus, shtraf, prepay, total  [union select ...]&lt;br /&gt;
&lt;br /&gt;
'''SelDistAddr(s)''' – Возвращает строку для вставки в select запрос, для вывода поля с упрощенным адресом. Принимает один необязательный строковый параметр - алиас таблицы из которой будет упрощаться поле address, по умолчанию &amp;quot;a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''VoiceReadStr(str)''' – Озвучивает фразу str голосовым уведомлением доступными словами из базы. Может содержать тег &amp;quot;{break_off}&amp;quot; для того, чтобы сделать эту фразу не пропускаемой в очереди воспроизведения.&lt;br /&gt;
&lt;br /&gt;
'''CalcStorageCost(ClientCodes, DateFrom, DateTo, NeedReport[, Store])''' – рассчитывает стоимость хранения на складе для выбранных клиентов (ClientCodes - коды клиентов через запятую), в период дат с DateFrom до DateTo, с прикреплением к корреспонденции отчета в зависимости от выставленного параметра NeedReport. Может содержать параметр Store - код филиала, по умолчанию пустой (расчет выполняется для всех филиалов). Возвращает коды созданных корреспонденций через запятую.&lt;br /&gt;
&lt;br /&gt;
'''WriteOut(DocId, ItemId, Date, Cnt[, BC])''' – производит списание товара со склада. DocId - код (docs.code) документа списания, ItemId - код товара (item.code), Date - дата операции, Cnt - количество списываемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер. Если указан BC, то параметр ItemId игнорируется и поиск номенклатуры происходит исключительно по штрих-коду. В случае успеха, функция возвращает строку вида: код номенклатуры, списанное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''IncomePurch(DocId, ItemId, Date, Cnt[, BC, Location = CurrentLocation])''' – производит приход товара на склад. DocId - код (docs.code) приходной накладной, ItemId - код товара (item.code), Date - дата операции, Cnt - количество приходуемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер, Location - код склада (store.code).  В случае успеха, функция возвращает строку вида: код номенклатуры, введенное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''CreateLedgerDoc(Date, Client, UserCode, Type[, ExtNumber, Message])''' - создает складской документ и возвращает код этого документа. Date - дата документа. Client - код клиента. UserCode - код пользователя, создавшего документ. Type - тип документа (statetype = 13). ExtNumber - номер у поставщика для документов прихода и расхода. Message - комментарий к документу. Последние два аргумента не обязательные и могут быть пустыми.&lt;br /&gt;
&lt;br /&gt;
== Объект TINIFile ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции работы с ini-файлами. В некоторых контекстах создается автоматически для предоставления доступа к настроечному файлу модуля, выполняющего скрипт.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
IniParam(s[,section='common']) – Существует только если имя экземпляра объекта пустое. Возвращает значение параметра s ini-файла секции «common», изменить секцию можно не обязательным параметром section. В случае отсутствия параметра в файле возвращает пустую строку. &lt;br /&gt;
&lt;br /&gt;
Param(s) – Синоним IniParam с тем отличием, что существует только если имя объекта непустое.&lt;br /&gt;
&lt;br /&gt;
SetText(s) - Загружает ini файл из строки s. Если в файле нет секции «common», то принудительно объявляет ее в начале.&lt;br /&gt;
&lt;br /&gt;
== Объект TSMS ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для отправки SMS, а также проверки статуса их доставки.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetProxy(Server, Port, User, Pass) - Устанавливает настройки прокси-сервера.&lt;br /&gt;
&lt;br /&gt;
Connect(Provider, Host, User, Pass, SenderName, SMSPrefix) – Подключает объект к провайдеру provider, используя адрес Host, имя пользователя User и пароль Pass. Значение SMSPrefix предназначено для того, чтобы провайдер мог различить сообщения от разных филиалов, если этими филиалами используется одно подключение. Если необходимости разделять сообщения нет - значение SMSPrefix можно не указывать.&lt;br /&gt;
Для провайдера доступны значения 'mirsms', 'sms16', 'websms', 'epochta', 'zanzara', 'SMSManager', 'f1sms', 'BitCall', 'mirsmsGET', 'AMD' и другие, либо можно указать числовые значения номера протокола, от 1 до &amp;lt;rspoiler text=&amp;quot;20&amp;quot;&amp;gt;Набор провайдеров все время дополняется, количество и номера можно смотреть в Справочники - Переменные - Подключения - SMS&amp;lt;/rspoiler&amp;gt; соответственно. Эти значения соответствуют значениям переменной SMSProtocol таблицы &amp;quot;Value&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SendSMS(Phone, Text, [ID]) – Отправляет SMS с текстом Text на телефон Phone. Для некоторых провайдеров необходим уникальный идентификатор сообщения ID (для провайдера iVoice - идентификатор сценария (кампании)). Возвращает ID провайдера для последующей проверки статуса доставки.&lt;br /&gt;
&lt;br /&gt;
CheckSMS(ProviderID) – Проверяет состояние доставки сообщения с идентификатором ProviderID. Возвращает: 0 – доставляется, 1 – успешно доставлено, 2 – не доставлено.&lt;br /&gt;
&lt;br /&gt;
ReceiveSMS(InboxID, DateFrom, DateTo, NewOnly) - Получает входящие SMS, с ящика InboxID (идентификатор выдаётся провайдером). DateFrom, DateTo - задается временной интервал в котором были приняты сообщения(формат 08.04.2013 18:00:00 'DD.MM.YYYY HH:NN:SS'). Чтобы получать только новые сообщение поле NewOnly должно быть True. Возвращает XML с сообщениями.&lt;br /&gt;
&lt;br /&gt;
ExtraResult([ParamName='']) - Вызывается после CheckSMS, возвращает дополнительную информацию по последнему статусу смс. В настоящее время работает только для провайдеров BitCall и iVoice. Для BitCall по умолчанию возвращает кнопки, нажатые абонентом во время работы с голосовым меню. Если в paramname указать 'IdentifyText' то будет возвращен JSON  с ответами абонента на заданные вопросы(используется в случае звонков с индивидуальным сценарием). Для iVoice по умолчанию подразумевается параметр 'response', при этом будет возвращен JSON  с ответами абонента на заданные вопросы (в зависимости от сценария)&lt;br /&gt;
&lt;br /&gt;
Log - Возвращает последний HTTP запрос и ответ от сервера смс.&lt;br /&gt;
&lt;br /&gt;
== Объект TXML ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга XML-данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст XML документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию. Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля.&lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
AttribCount – Возвращает количество атрибутов текущего элемента.&lt;br /&gt;
&lt;br /&gt;
AttribName(i) – Возвращает имя атрибута с номером i.&lt;br /&gt;
&lt;br /&gt;
Attrib(V) – Ищет атрибут и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
== Объект TJSON ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга JSON-данных. &lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст JSON документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля. &lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Можно проверять наличие элементов, если элемента нет, вернется пустая строка.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
isArray - Возвращает true, если текущий элемент является массивом (доступ к дочерним элементам возможен только по индексу, нумерация элементов начинается с нуля)&lt;br /&gt;
&lt;br /&gt;
==Объект TZip==&lt;br /&gt;
Предназначен для работы с Zip архивом. &lt;br /&gt;
&lt;br /&gt;
SetZip(s) - Загружает архив в объект из строки s;&lt;br /&gt;
&lt;br /&gt;
GetZip - Возвращает архив в виде строки;&lt;br /&gt;
&lt;br /&gt;
AddFromFile(SrcPath, ZipPath) - Добавляет файл SrcPath в архив и располагает его по пути ZipPath. ZipPath содержит имя файла в архиве, при необходимости можно указать каталог; &lt;br /&gt;
&lt;br /&gt;
AddFromStr(Data, /*ZipPath*/) - '''параметр ZipPath временно не работает'''. Добавляет файл из строки Data в архив и располагает его по пути ZipPath.  -ZipPath содержит имя файла в архиве, при необходимости можно указать каталог;&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(path) - Загружает архив из файла path;&lt;br /&gt;
&lt;br /&gt;
SaveToFile(path) - Сохраняет архив в файл path;&lt;br /&gt;
&lt;br /&gt;
Count - Возвращает кол-во файлов в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByIndex(index) - Возвращает распакованный файл в виде строки. Index - номер файла в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByName(ZipPath) - Возвращает распакованный файл в виде строки. ZipPath - путь к файлу в архиве, может содержать каталоги;&lt;br /&gt;
&lt;br /&gt;
FileName(index) - По номеру файла, функция возвращает полный путь файла в архиве.&lt;br /&gt;
&lt;br /&gt;
==Объект TBase==&lt;br /&gt;
&lt;br /&gt;
'''Функции общего назначения''':&lt;br /&gt;
&lt;br /&gt;
'''ExecSimpleScript(Caption, Text)''' - Выполняет скрипт &amp;quot;Дополнительных возможностей&amp;quot;. Возвращаемые значения, введенные пользователем устанавливает в переменные $scriptvar1..$scriptvarN, Значения кодов списочных переменных - в переменных $scriptvar1codes..$scriptvarNcodes. Функция возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot; в диалоговом окне.&lt;br /&gt;
&lt;br /&gt;
'''FillAdvPriceReport(Excel, AddressCodes, StartLine, StartCol, [ShowSumPrice,InsertColumns,ShowAll])''' - добавляет отчёт по дополнительным услугам. В AddressCodes - указаны коды адресов через запятую, каждый код это отдельная строка отчета. Адреса будут показаны в порядке перечисления их в AddressCodes. Если в отчет нужно добавить пустую строку, то можно указать код адреса -1000. StartLine, StartCol - верхний левый угол выгружаемой таблицы. ShowSumPrice - добавить столбец итоговый столбец с суммой всех услуг, по умолчанию выключено. InsertColumns - раздвинуть таблицу перед вставкой отчета, позволяет встраивать отчет посередине выгрузки, по умолчанию выключено. ShowAll - показать все дополнительные услуги, по умолчанию false и показывает только услуги с начислениями. Функция возвращает количество использованных столбцов.&lt;br /&gt;
&lt;br /&gt;
'''PrintSticker(Codes, [ToBoxes=False])'''&lt;br /&gt;
&lt;br /&gt;
'''PrintBlanc(Codes, BlancNumber)''' - печатать форму из раздела &amp;quot;Заполнить бланк&amp;quot;. Codes - коды корреспонденций, BlancNumber - номер формы из раздела &amp;quot;Бланки для корреспонденции&amp;quot; (3)&lt;br /&gt;
&lt;br /&gt;
'''GetItemByName(Name)'''&lt;br /&gt;
&lt;br /&gt;
'''GetA4Printer''' - возвращает имя принтера выбранного для печати документов&lt;br /&gt;
&lt;br /&gt;
'''GetStickerPrinter''' - возвращает имя принтера выбранного для печати стикеров&lt;br /&gt;
&lt;br /&gt;
'''GetDuplexPrinter''' - возвращает имя принтера выбранного для двусторонней печати, если принтер не выбран, возвращает пустую строку&lt;br /&gt;
&lt;br /&gt;
'''PrintAttachPDFPage(Code, FileName, Page, Printer)''' - печатает страницу из вложенного файла PDF. Code - код вложения (attachment) или путь к файлу, Page - номер страницы, Printer - 0 = принтер A4, 1 = принтер этикеток. &lt;br /&gt;
&lt;br /&gt;
'''AttachPDFToText(Code, [TextFileName])''' - преобразует файл PDF из вложений в текст. Code - код вложения (attachment) или путь к файлу, TextFileName - имя текстового файла, в который записывается результат (если не указан, используется временный файл). Возвращает текст в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''GhostScript(GScript, Code)''' — функция для выполнения консольных команд утилиты [https://ghostscript.readthedocs.io/en/latest/Use.html ghostscript]. Где, GScript — строка с командами Ghostscript; Code — код вложения или путь к PDF-файлу, предназначенному для обработки. В командах доступен специальный тег %MeasoftInFile%, который автоматически заменяется на путь к предварительно загруженному файлу (Code). Если в команде необходимо указать путь для сохранения результата обработки, используйте тег %MeasoftOutFile%. В этом случае функция на основании параметра Code автоматически сформирует имя временного выходного файла. После успешного выполнения команд функция возвращает путь к сгенерированному выходному файлу -  %MeasoftOutFile%.&lt;br /&gt;
&lt;br /&gt;
'''GetActiveForm([SkipFormName])''' - возвращает код активной формы в программе где происходит сканирование. SkipFormName - не обязательны параметр, имя формы которую нужно пропустить при определении интерфейса.&lt;br /&gt;
 '''Список интерфейсов''': &lt;br /&gt;
 0 - неопределенный; &lt;br /&gt;
 1 - прием корреспонденции на склад; &lt;br /&gt;
 2 - АПД; &lt;br /&gt;
 3 - комплектация адресов (ShelfingForm); &lt;br /&gt;
 4 - доска приема; &lt;br /&gt;
 9 - вкладка «Манифесты»; &lt;br /&gt;
 10 - Инвентаризация корреспонденции; &lt;br /&gt;
 11 - АПК; &lt;br /&gt;
 12 - вкладка «Адреса»; &lt;br /&gt;
 13 - вкладка «Выдача»; &lt;br /&gt;
 14 - вкладка «Склад»; &lt;br /&gt;
 15 - Список номенклатуры; &lt;br /&gt;
 16 - Инвентаризация склада; &lt;br /&gt;
 17 - Приходная накладная; &lt;br /&gt;
 18 - Списание товара; &lt;br /&gt;
 19 - Карточка корреспонденции.&lt;br /&gt;
&lt;br /&gt;
'''AddAddressScanLog(Code[, StrBarCode, IsManual, FromInterface, ExtraInfo])''' - добавляет событие сканирование для корреспонденции с кодом Code. Необязательные параметры: StrBarCode - сканируемый ШК корреспонденции (по умолчанию пустой), IsManual - галка ручного сканирования (по умолчанию false), FromInterface - код интерфейса сканирования (StateType=81, по умолчанию 0 - неопределенный), ExtraInfo - текстовый комментарий события.&lt;br /&gt;
&lt;br /&gt;
'''RuleName(alias)''' - Выдает полный путь в дерева прав по псевдониму права.&lt;br /&gt;
&lt;br /&gt;
'''ShowText(Caption:string, Value:string)''' - показывает пользователю окно с заголовком Caption и с многострочным полем со значением Value. Может быть полезен при отображении логов выполненной операции. &lt;br /&gt;
&lt;br /&gt;
'''ShowScanError(msg [, Speek, Color, Abort])''' - выдает пользователю окно с текстом msg блокируя последующие действия сканирования. Если Speek - истинно, то сообщение проговаривается голосовым движком, по умолчанию выключено. Color - целочисленное число цвета, в который будет окрашен фон сообщения (по умолчанию = -1, стандартный). Abort  - прервать выполнение скрипта, не показывая ошибку.&lt;br /&gt;
&lt;br /&gt;
'''CheckRule(alias)''' - функция проверки разрешения у текущего пользователя системы, alias - псевдоним права. Возвращает 1, если право есть и 0, если права нет. &lt;br /&gt;
 Пример: if(CheckRule('RSE'), ShowMessage('У пользователя есть право изменять счета'), ShowMessage('У пользователя нет права изменять счета'));&lt;br /&gt;
&lt;br /&gt;
'''GetKurierMoney(KurierCode, DateEnd, NonCash)''' - возвращает баланс курьера с кодом KurierCode на дату DateEnd. NonCash - булевый флаг, если истинно, то будет рассчитан безнальный баланс; &lt;br /&gt;
&lt;br /&gt;
'''Функции, работающие только в импорте БД из эксель:'''&lt;br /&gt;
&lt;br /&gt;
ReplaceAddress&lt;br /&gt;
&lt;br /&gt;
GetItemByCode - Поиск товара по артикулу. Внимание: в пределах одного клиента может быть несколько товаров с одинаковыми артикулами. В этом случае функция найдет последний заведенный товар.&lt;br /&gt;
&lt;br /&gt;
GetPrice&lt;br /&gt;
&lt;br /&gt;
GetNewNumber - используется при импорте реестра, возвращает номер конверта в загружаемом заказе&lt;br /&gt;
&lt;br /&gt;
GetNewPos - используется при импорте реестра, возвращает порядковый номер вложения&lt;br /&gt;
&lt;br /&gt;
GetNewPackagePos- используется при импорте реестра, возвращает порядковый номер места&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zakaz - возвращает номер заказа куда происходит импорт реестра&lt;br /&gt;
&lt;br /&gt;
addresscode  -  используется при импорте реестра, код созданного адреса&lt;br /&gt;
&lt;br /&gt;
Source  - код заказчика&lt;br /&gt;
&lt;br /&gt;
ClientTown - Узнаем город клиента, через филиал с которым он работает. Сам клиент берется из заказа указанного в окне &amp;quot;Импорт БД из Excel&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Объект TFieldObject ==&lt;br /&gt;
Создается только автоматически. Объект для доступа к записям, используется в картах и дополнительных услугах (addressrecord) и событиях карточки корреспонденции (fieldlist). Методы объекта:&lt;br /&gt;
&lt;br /&gt;
'''_GetTableInfo''' - возвращает данные о полях и примеры данных объекта.&lt;br /&gt;
&lt;br /&gt;
'''_Self''' - возвращает ссылку на объект.&lt;br /&gt;
&lt;br /&gt;
'''_Set(fieldname, fieldvalue [, DoUpdateForm])''' - Если базовый объект строка. Устаналивает для поля fieldname значение fieldvalue. DoUpdateForm по уолчанию false, если указать true то обновление поля будет не только в объекте но и пользовательском интерфейсе. Обновление работает только в карточке корреспнденции для ограниченного набора полей: vlog, mode, type, date_put, time_put, message, kurier, state1.&lt;br /&gt;
&lt;br /&gt;
'''_Set(keyfield, keyvalue, filed, value)''' - Если базовый объект таблица (addressrecord.boxes). Работает перегруженная версия метода _set, cначала происходит поиск строки по ключу, далее меняется значение указанного столбца. keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца.  Пример, отключение услуги база:&lt;br /&gt;
&lt;br /&gt;
 addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
 priceconf - поле где записан код услуги;&lt;br /&gt;
 1 - услуга База;&lt;br /&gt;
 active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
== Объект TMessage ==&lt;br /&gt;
Создается только автоматически. Объект используется для скриптовой обработки письма в [https://wiki.courierexe.ru/index.php/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8#.D0.98.D0.BC.D0.BF.D0.BE.D1.80.D1.82_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85| заданиях импорта данных]. В себе содержит текст письма в очищенном формате и оригинальном формате HTML, отправитель письма, тему письма, дата получения и список прикрепленных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.Text''' - возвращает очищенный от HTML-тегов текст письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.HTMLText''' - возвращает оригинальный текст письма со всеми HTML-тегами.&lt;br /&gt;
&lt;br /&gt;
'''Message.Sender''' - возвращает email-адрес отправителя письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.AttachmentsCount''' - возвращает количество вложенных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.DateTime''' - возвращает дату и время получения письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.Subject''' - возвращает тему письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentDataString(Number)''' - возвращает вложенный файл под номером Number в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentName(Number)''' - возвращает имя вложенного файла под номером Number.&lt;br /&gt;
&lt;br /&gt;
== Объект TStringList ==&lt;br /&gt;
Может использоваться для построчной обработки многостраничных файлов либо для организации текстовых данных. Номер строк начинается с 0. &lt;br /&gt;
Имеет следующий функционал:&lt;br /&gt;
&lt;br /&gt;
'''Count''' - возвращает количество строк в списке.&lt;br /&gt;
&lt;br /&gt;
'''Add(Value:string)''' - добавляет значение Value в конец списка.&lt;br /&gt;
&lt;br /&gt;
'''SetText(Value:string)''' - устанавливает значение списка в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Insert(Number:integer, Value:string)''' - добавляет строку Value в позицию Number.&lt;br /&gt;
&lt;br /&gt;
'''Delete(Number:integer)''' - удаляет строку из списка в позиции Number.&lt;br /&gt;
&lt;br /&gt;
'''Clear''' - очищает элементы списка.&lt;br /&gt;
&lt;br /&gt;
'''LoadFromFile(Path:string)''' - загружает текстовый файл по пути Path.&lt;br /&gt;
&lt;br /&gt;
'''Strings(Number:integer)''' - возвращает строку с номером Number.&lt;br /&gt;
&lt;br /&gt;
'''SetString(Number:integer, Value:string)''' - устанавливает значение строки с номером Number в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Text''' - возвращает полный список строк в виде текста.&lt;br /&gt;
&lt;br /&gt;
'''CommaText([Quoted:boolean])''' - возвращает список значений через запятую. Если Quoted = true, то квотирует элементы списка. По умолчанию равен false.&lt;br /&gt;
&lt;br /&gt;
'''SetCommaText(Value: string)''' - разбивает значение Value на отдельные строки и кладет в список. Разделитель - запятые.&lt;br /&gt;
&lt;br /&gt;
'''IndexOf(Value:string)''' - ищет значение Value среди элементов списка и если находит, то возвращает номер строки. Возвращает -1 если значение не было найдено.&lt;br /&gt;
&lt;br /&gt;
'''Sorted(Value:boolean)''' - устанавливает флаг отсортированности списка в Value. Если Value = true, то сразу же его сортирует. По умолчанию Value = false.&lt;br /&gt;
&lt;br /&gt;
'''Exchange(Pos1:integer, Pos2:integer)''' - меняет элементы списка с позициями Pos1 и Pos2 местами.&lt;br /&gt;
&lt;br /&gt;
'''Duplicates(Value:integer)''' - изменяет параметр управления дубликатами в списке. Если Value = 0 (значение по умолчанию), то список не реагирует на дубликаты. Если Value = 1, то список при добавлении будет игнорировать дубликаты. Если Value = 2, то список будет выдавать исключение, при добавлении дубликата в список.&lt;br /&gt;
&lt;br /&gt;
'''ParamName(Number:integer[, Delimiter:string])''' - возвращает текст до первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает пустоту.&lt;br /&gt;
&lt;br /&gt;
'''ParamValue(Number:integer[, Delimiter:string])''' - возвращает текст после первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает всю строку.&lt;br /&gt;
&lt;br /&gt;
== Объект TFunc ==&lt;br /&gt;
Объект реализует создание и использование функций в скриптовом языке. Позволяет определять переиспользуемые блоки кода с параметрами.&lt;br /&gt;
Важно учитывать, что внтури функции создается свой инстанс интерпретатора и от туда не доступны никакие переменные\объекты кроме переданных в функцию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные методы:&lt;br /&gt;
&lt;br /&gt;
'''New'''(FuncName, Param1, Param2, ..., Body) — создание новой функции.Функция возвращает результат выполнения последней команды в теле функции. Аргументы:&lt;br /&gt;
* `FuncName` — имя функции (строка)&lt;br /&gt;
* `Param1, Param2, ...` — имена параметров функции (переменные начинаются с `$`, объекты — без префикса)&lt;br /&gt;
* `Body` — тело функции (скрипт, выполняемый при вызове)&lt;br /&gt;
&lt;br /&gt;
'''FuncName'''(Arg1, Arg2, ...) — вызов созданной функции по имени. Если в объявлении была указана тип переменная, то и подставлять в аргумент надо обязательно переменную. Будет передано значение этой переменной (переменные словарине поддерживаются!). Если был объявлен объект, то указатель на объект должен быть получен через метод '''_self'''. C функциями поддерживают работу следующие классы: TExcel, TDirectExcel, TCSVFile, TADO, TSelfADO, TPrinter, TCanvas, TPicture, TTable, TINIFile, TSMS, TXML, TJSON, TZip, TStringList, TBaseUtils, а также объект addressrecord (TFieldObject). Результатом работы функции может быть число или строка.&lt;br /&gt;
&lt;br /&gt;
Пример 1, обработка результатов функции:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'calc');&lt;br /&gt;
calc.new('Sum', '$a', '$b',&lt;br /&gt;
  $a + $b&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
set($x, 10);&lt;br /&gt;
set($y, 20);&lt;br /&gt;
showmessage(calc.Sum($x, $y));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример 2, передача объекта в функцию:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'utils');&lt;br /&gt;
utils.new('ProcessDB', 'dbConn', '$value',&lt;br /&gt;
  showmessage($value);&lt;br /&gt;
  dbConn.open('SELECT * FROM address limit 3 ');&lt;br /&gt;
  if(dbConn.recordcount &amp;gt; 0,&lt;br /&gt;
    showmessage('Найдено записей: ' + dbConn.recordcount);&lt;br /&gt;
    dbConn.first;&lt;br /&gt;
    while(dbConn.eof = 0,&lt;br /&gt;
      showmessage(dbConn.fieldbyname('code'));&lt;br /&gt;
      dbConn.next&lt;br /&gt;
    )&lt;br /&gt;
  ,0)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
utils.ProcessDB(db._self,'test!');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Применение языка формул ==&lt;br /&gt;
'''в различных контекстах системы «MEASOFT» и сопутствующих проектах'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MEASOFT ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительная информация на чеке ====&lt;br /&gt;
&lt;br /&gt;
В карточке клиента на закладке «Касса» имеется поле для ввода текста, который будет отображаться на кассовых чеках, печатаемых для корреспонденции от данного клиента. В поле может быть введен как просто текст, так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TSelfDB с открытым набором данных со строчкой корреспонденции, заказа и клиента, на которую печатается чек&lt;br /&gt;
&lt;br /&gt;
TBaseSupport&lt;br /&gt;
&lt;br /&gt;
TBaseValue&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Так же система записывает в переменную $CashRegisterID вычисленный код фискального регистратора, на котором предполагается печать чека.&lt;br /&gt;
&lt;br /&gt;
Результат работы скрипта печатается на создаваемом чеке, если скрипт не возвращает значение “-1” (число или текст) – в этом случае система чек не создает. Подразумевается, что либо скриптом было принято решение об отсутствии необходимости формирования чека, либо скрипт взял эту функцию на себя.&lt;br /&gt;
&lt;br /&gt;
==== Заполнение шаблонов печатных форм ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительные возможности ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Импорт БД из Excel ====&lt;br /&gt;
В окружении интерпретатора создается объект ZakazRecord, он является списком со значениями таблицы zakaz. Именно в этот заказ будут загружены данные. Из этого объекта также доступно :&amp;lt;br&amp;gt;&lt;br /&gt;
*ZakazRecord.userfields - пользовательские поля заказа;&lt;br /&gt;
*ZakazRecord.Clients - данные таблицы clients;&lt;br /&gt;
*ZakazRecord.Clients.userfields - пользовательские поля заказчика.&lt;br /&gt;
&lt;br /&gt;
==== Прайс лист клиента ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в валюте клиента для каждой поездки (туда или обратно) единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Помимо стандартных объектов, система создает объект AddressRecord, в котором, как свойства, доступны все поля текущей записи. Так же она выставляет значение переменной $Forward в 1 (истина), если необходимо произвести расчет для направления &amp;quot;Туда&amp;quot; и 0 (ложь) - если обратно. ВНИМАНИЕ! Как и во всех остальных местах, после формулы нельзя ставить &amp;quot;;&amp;quot;, иначе скрипт вернет 0!&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 if(int(AddressRecord.Time_Put_Max)&amp;gt;19, 100, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Прибавляет 100 рублей в случае, если максимальный срок доставки 20 часов или более''&lt;br /&gt;
&lt;br /&gt;
 if(pos(AddressRecord.Address, 'Аренда')&amp;gt;0, &lt;br /&gt;
           set($FormulaReplace, 1); &lt;br /&gt;
           1500&lt;br /&gt;
 , 0)&lt;br /&gt;
 &lt;br /&gt;
 ''В случае наличия подстроки &amp;quot;Аренда&amp;quot; в адресе заменяет штатное ценообразование на 1500 рублей''&lt;br /&gt;
&lt;br /&gt;
Объект AddressRecord может предоставить доступ к связанным таблицам :&lt;br /&gt;
* addressrecord.boxes&lt;br /&gt;
* addressrecord.packages&lt;br /&gt;
* addressrecord.clients&lt;br /&gt;
* addressrecord.price&lt;br /&gt;
* addressrecord.advprice&lt;br /&gt;
* addressrecord.userfields&lt;br /&gt;
* addressrecord.addressfld&lt;br /&gt;
* addressrecord.clients.userfields&lt;br /&gt;
* addressrecord.price.userfields&lt;br /&gt;
* addressrecord.zakaz&lt;br /&gt;
* addressrecord.zakaz.userfields&lt;br /&gt;
 &lt;br /&gt;
Чтобы получить доступ к полю VarCode из таблицы userfields необходимо записать AddressRecord.Userfields.VarCode. В присоединённой таблице может быть несколько записей чтобы получить к ним доступ предусмотрены функции _First, _EOF, _Next, _RecordCount, _Set.&lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
 set($value1, 0); set($value2, 0);&lt;br /&gt;
 while(AddressRecord.userfields._EOF=0,&lt;br /&gt;
   if(AddressRecord.userfields.varCode=1, &lt;br /&gt;
     set($value1, if(AddressRecord.userFields.VarValue='Праздничная упаковка', 150, 0)), ''''''');&lt;br /&gt;
   if(AddressRecord.userfields.varCode=2, &lt;br /&gt;
     set($value2, AddressRecord.userFields.VarValue), ''''''');&lt;br /&gt;
   AddressRecord.userFields._Next;&lt;br /&gt;
 );&lt;br /&gt;
 int($value1) + int($value2)&lt;br /&gt;
&lt;br /&gt;
Пример делающий тоже самое что и выше но через поиск Locate:&lt;br /&gt;
 set($value1, if(addressrecord.userfields.VarValue('VarCode', 1)='Праздничная упаковка', 150, 0));&lt;br /&gt;
 set($value2, int(addressrecord.userfields.VarValue('VarCode', 2)));&lt;br /&gt;
 $value1 + $value2&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
В скрипте доступны переменные: &lt;br /&gt;
«$FormulaKoeff» - это коэффициент на который умножится конечная цена (по умолчанию равна 1);&lt;br /&gt;
«$PriceCode»  - код прайса;&lt;br /&gt;
«$CurrentPriceConf»  - код услуги;&lt;br /&gt;
«$BasePrice» - стоимость всех услуг с уровнем (pricelevel) меньше текущего.&lt;br /&gt;
&lt;br /&gt;
Для вызова функции CalcBasePrice (Расчёт базовой цены) в скрипте объявленны переменные: $Count,$Collection,$Distance,$Wait.&lt;br /&gt;
&lt;br /&gt;
Существует поиск по ключевому полю (поиск регистронезависимый), например чтобы найти в таблице advprice введённое значение для текущей услуги, нужно сделать такую запись  addressrecord.advprice.value('priceconf', $CurrentPriceConf) - Первый параметр это ключевое поле, второй искомое значение. Если запись найдётся будет возвращено значение поле value, если нет функция вернёт значение 0.&lt;br /&gt;
 &lt;br /&gt;
Пример &lt;br /&gt;
 if(addressrecord.advprice.active('priceconf', 3)='T', addressrecord.advprice.price, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Смотрим включена ли услуга и если да, возвращаем рассчитанную стоимость&lt;br /&gt;
&lt;br /&gt;
Чтобы изменить значение записанное в объект addressrecord, нужно воспользоваться методом _set(keyfield, keyvalue, filed, value). Параметр keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца. Сначала происходит поиск строки по ключу, далее меняется значение указанного столбца.&lt;br /&gt;
Пример, отключение услуги база:&lt;br /&gt;
  addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
  priceconf - поле где записан код услуги;&lt;br /&gt;
  1 - услуга База;&lt;br /&gt;
  active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
Также существует упрощенный метод _set, с двумя параметрами filed, value - он используется в шаблонах загрузки или в системных доп. возможностях где доступен объект addressrecord.&lt;br /&gt;
&lt;br /&gt;
==== Зарплата курьеров ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в основной валюте для каждой единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Переменные «$FormulaTablKoeff» и «$FormulaMoneyKoeff»  позволяют установить повышающий или понижающий коэффициент на стоимость доставки (по тарифной сетке) и услуги соответственно (процент от суммы, процент от стоимости доставки, ожидание).  Переменная «$UsingZoneName» и «$KurierZone» содержат название и код зоны соответственно, есть возможность поменять название зоны для отчета.&lt;br /&gt;
&lt;br /&gt;
=== Планировщик ===&lt;br /&gt;
&lt;br /&gt;
В поле текста задания может быть введен как текст с командами планировщика (см ниже), так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TIniFile, Указывает на настроечный ini-файл планировщика.&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Для записи в лог планировщика нужно использовать функцию Print&lt;br /&gt;
&lt;br /&gt;
=== Репликатор ===&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
ReplaceAddress(target, address) – Возвращает адрес последней доставки корреспонденции получателю target по адресу address от текущего клиента. При отсутствии такой доставки, возвращает address.&lt;br /&gt;
&lt;br /&gt;
GetPrice –возвращает рассчитанное значение цены, на основе прайс-листа клиента и данных о корреспонденции.&lt;br /&gt;
&lt;br /&gt;
GetKurierByStation(i) – возвращает код курьера, ассоциированного со станцией метро с кодом i.&lt;br /&gt;
&lt;br /&gt;
GetNewNumber – Возвращает не занятый номер единицы корреспонденции в текущем заказе.&lt;br /&gt;
&lt;br /&gt;
==История изменений==&lt;br /&gt;
&lt;br /&gt;
=== Недавние изменения ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|2026.0.0.547 Доработка функций ATTACHPDFTOTEXT и PRINTATTACHPDFPAGE, добавлена возможность указать путь к файлу&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.539 Добавлена поддержка отладчика AttachDebugger&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.534 Добавлена поддержка оператора CASE и класса TFunc&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 2021.0.0.57 от 18.06.2019 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TExcel добавлен метод ColumnDelete.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция InsertFirmAtt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
||В объект TExcel добавлен метод Align.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция CheckEan&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект функцию FillAdvPriceReport добавлены параметры ShowSumPrice,InsertColumns&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TSMS добавлен метод Log.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Добавлена функция Money.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция ValutaSign.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция GetPolygonByLatLon.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TTable добавлена функция SetMultiHeader, SetCustomHeader.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DownloadAttachment&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию SetRowHeight объекта TExcel добавлен параметр cnt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция AsString.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция SetSize.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TADO добавлена функция ParseForIn.&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|В объект TBaseUtils из TBase перенесена функция FillExcelDoc.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция CalcAddressPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Все функции класса TBaseSupport перенесены в TBaseUtils. Класс TBaseSupport больше не существует.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функции RowInsert и RowDelete объекта TExcel добавлен параметр count.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция SendToMeaSoft&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция RecalcSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Новая функция Reverse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 849 &amp;amp;nbsp; 22.02.2018 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TBaseUtils.TownByIndex добавлен параметр PriorityName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TBase добавлена функция GetNewPackagePos&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TSMS доработан метод ExtraResult, добавлен параметр ParamName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBase добавлена функция CalcAgentPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateAddressForActDelivery&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функция CalcTownDeliveryDate заменена на CalcDeliveryDate&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция SignatureUrl&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция LoadFromStr.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetPen.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetBrush.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена поддержка чтения в формате PNG.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TCanvas.DrawPic параметр Mode&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Свойство TPicture.Canvas&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DeleteFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 758 &amp;amp;nbsp; 29.03.2017 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция GetPolygonByAddress&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция ParamsCount&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Объект TZip&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функции CreateEAN и Create128 заменены одной функцией CreateBar, полностью совместимой с Create128, но добавлена поддержка EAN-13 и Interleaved 2-5 (для Почты России). В системе функции оставлены для обратной совместимости, но более не являются документированными и рекомендованными к использованию.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Параметр text в функцию Cell объекта TExcel&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция UrlEncode &lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция IncDay теперь может принимать параметр count&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функции FtpGet, FtpPut, TTable.SetCell()&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 452 &amp;amp;nbsp; 26.02.2014 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция Time&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция FixedIntToStr&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция TimePeriod&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена функция приёма смс -  ReceiveSMS&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция STR2UTF&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция SAVETOFILE&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.SetSheetName&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;FILESTR&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Расширены возможности объекта addressrecord в формулах тарифов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 308 &amp;amp;nbsp; 24.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В функции загрузки таблиц из TADO добавлено условие, что поля, названия которых начинаются с &amp;quot;-&amp;quot; не выгружаются. Таким образом можно скрывать служебные поля из результирующего набора.&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowAutoFit &lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowInsert &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 300 &amp;amp;nbsp; 01.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В объекте TCSVFile добавилась возможность запрашивать значения не только текущей записи через параметр сдвига&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;UPDOWN&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлен объект TCSVFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 266 &amp;amp;nbsp; 14.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена поддержка массивов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 265 &amp;amp;nbsp; 11.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция CreateTrans в интерпретатор&lt;br /&gt;
|-&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15734</id>
		<title>Руководство программиста</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15734"/>
				<updated>2026-01-13T17:16:51Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* История изменений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Основные положения ==&lt;br /&gt;
&lt;br /&gt;
В систему «MEASOFT» встроен внутренний интерпретируемый язык программирования. Среда состоит из базовой функциональности, и дополнительно создаваемых объектов. Некоторые объекты автоматически создаются средой перед запуском интерпретатора для предоставления доступа к контексту, в котором работает скрипт. Все типы данных приводятся друг к другу автоматически, иногда при необходимости можно использовать функции приведения типов. &lt;br /&gt;
&lt;br /&gt;
Как интерпретатор приводит типы:&lt;br /&gt;
&lt;br /&gt;
1.	При использовании значения как параметр функции интерпретатор автоматически приводит значение к типу, необходимому функции.&lt;br /&gt;
&lt;br /&gt;
2.	При операциях сложения, а также логических операциях, операнды приводятся к строке если хотя бы один из них имеет тип «строка». Например:&lt;br /&gt;
3.3+5		-&amp;gt;  8.3&lt;br /&gt;
‘3.3’+5		-&amp;gt;  ‘3.35’&lt;br /&gt;
подобную проблему можно решить принудительно преобразовав тип:&lt;br /&gt;
float(‘3.3’)+5	-&amp;gt;  8.3&lt;br /&gt;
&lt;br /&gt;
3.	При операциях умножения, деления и вычитания операнды приводятся к числу с плавающей точкой, однако если результат выполнения операции получается целым числом, то он приводится к целочисленному типу.&lt;br /&gt;
&lt;br /&gt;
Как работают функции приведения типов:&lt;br /&gt;
&lt;br /&gt;
1.	При преобразовании строки к числу: функция «читает» строку до первого символа, не позволяющего создать число с плавающей точкой, при этом разделителем целой и дробной частей может быть как точка так и запятая. Если приведение производится к целочисленному типу, то после этого происходит округление. Например:&lt;br /&gt;
float('3.6qwerty735')	-&amp;gt;  3.6&lt;br /&gt;
int('3.6qwerty735')	-&amp;gt;  4&lt;br /&gt;
&lt;br /&gt;
2.	При преобразовании к булевому типу ложью считается пустая строка либо число 0, все остальное - истина&lt;br /&gt;
&lt;br /&gt;
3.	При преобразовании булевого типа к числу истина преобразуется в 1, ложь – в 0. Такое преобразование позволяет использовать сложение и умножение в качестве логических «ИЛИ» и «И» соответственно:&lt;br /&gt;
if((5=5)+(6=7), &amp;lt;a&amp;gt;, [b]) – условие истинно, выполнится код «a».&lt;br /&gt;
&lt;br /&gt;
4.	При преобразовании булевого типа к строке сначала происходит преобразование к числу:&lt;br /&gt;
(5=5)+'qwerty'	-&amp;gt;  ‘1qwerty’&lt;br /&gt;
&lt;br /&gt;
== Описание синтаксиса ==&lt;br /&gt;
&lt;br /&gt;
Команды разделяются точкой с запятой. Параметры функций разделяются запятыми. Каждая команда (даже цикл while) является функцией, возвращающей некоторое значение. Результатом выполнения составной команды (последовательности функций, разделенных точкой с запятой), является результат выполнения последней функции. Имена переменных, функций, объектов, а также их свойств и методов не чувствительны к регистру.&lt;br /&gt;
Константы: константы бывают целочисленными, дробными и строковыми. Значения целочисленных и дробных констант указываются «как есть» (в этом случае разделитель целой и дробной частей – точка), шестнадцатеричные значения начинаются с символа «$» и, если первая цифра – буква, она упреждается цифрой 0, а строковые – в одинарных кавычках. При этом, если внутри строковой константы встречается символ одинарной кавычки он должен быть задвоен, для указания интерпретатору того, что он не является признаком конца константы.&lt;br /&gt;
Операции сравнения: &amp;gt;, &amp;lt;, =, !  - Больше, меньше, равно, не равно соответственно.&lt;br /&gt;
Логические операции: + (ИЛИ), *  (И).&lt;br /&gt;
Арифметические операции: +, -, *, /&lt;br /&gt;
Операция конкатенации строк: +&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Функциональность базового объекта ===&lt;br /&gt;
&lt;br /&gt;
'''SET($a, a)''' – присваивает переменной (1-й параметр) значение второго параметра. При отсутствии переменной – создает ее. Имена переменных должны начинаться с символа «$», а следующий символ не должен быть цифрой. Возвращает новое значение переменной. Функция используется только для задания значений переменных. Не допускается использования для задания значений свойств объектов. Для этого используются соответствующие методы этих объектов.&lt;br /&gt;
&lt;br /&gt;
'''IF(a,b,c)''' или '''IF(a,b)'''  – Условный оператор. В первом случае возвращает b, если a истинно (не равно нулю или пустой строке), иначе – c. Во втором случае – возвращает a, если оно истинно, иначе – b.&lt;br /&gt;
&lt;br /&gt;
'''WHILE(a, b)''' – Оператор цикла. Выполняет b пока a истинно:&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i&amp;gt;0, set($sum, $sum+$i); set($i, $i-1));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''FOR($a, b, c, d)''' – Оператор цикла. Выполняет d пока $a последовательно присваиваются значения от b до с включительно:&lt;br /&gt;
	set($sum, 0);&lt;br /&gt;
for($i, 1, 10, set($sum, $sum+$i));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''NEW(ClassName, InstanceName)''' – Создает экземпляр класса ClassName, назначает ему имя InstanceName. Возвращает порядковый номер созданного объекта. Доступ к свойствам и методам объектов осуществляется по имени объекта и имени свойства/метода, разделенным точкой. Именем объекта может быть и пустая строка, тогда доступ к его свойствам и методам будет осуществляться без указания имени, и, в случае совпадения имен свойств и/или методов со стандартными или свойствами/методами других объектов, использоваться будут соответствующие свойства/методы объекта, созданного ранее, а также такой объект невозможно уничтожить до окончания выполнения скрипта. Все объекты созданные во время выполнения скрипта уничтожаются автоматически после окончания его выполнения.&lt;br /&gt;
&lt;br /&gt;
'''FREE(InstanceName)''' – Уничтожает объект с именем InstanceName. Возвращает 0. В случае отсутствия объекта с заданным именем вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
'''ShowObjects''' – Возвращает список созданных объектов – названия классов и имена.&lt;br /&gt;
&lt;br /&gt;
'''ERROR(message)''' – Вызывает ошибку с текстом message.&lt;br /&gt;
&lt;br /&gt;
'''SHOWMESSAGE(message)''' – Отображает диалоговое окно с текстом message, останавливает выполнение скрипта до закрытия окна пользователем.&lt;br /&gt;
&lt;br /&gt;
'''SimpleAskUser(Message)''' – Выводит диалоговое окно с текстом Message и кнопками «Да» и «Нет». Возвращает 1, если  пользователь нажал кнопку «Да», иначе – 0.&lt;br /&gt;
&lt;br /&gt;
'''TRY(a)''' – Выполняет a в «защищенном от ошибки» режиме. Если в процессе выполнения a возникает ошибка, возвращает текст ошибки, иначе – 0 (ложь).&lt;br /&gt;
&lt;br /&gt;
'''REM(….)''' – Код в скобках игнорируется (комментарий).&lt;br /&gt;
&lt;br /&gt;
'''EXEC(FileName, Params, Wait, WindowState)''' – Запускает внешнее приложение FileName с параметрами Params. Если Wait истинно – ожидает завершение процесса. Для WindowState доступны следующие числовые значения:&lt;br /&gt;
	0 - SW_HIDE&lt;br /&gt;
	1 - SW_SHOWNORMAL (по-умолчанию)&lt;br /&gt;
	3 - SW_MAXIMIZE&lt;br /&gt;
	6 - SW_MINIMIZE&lt;br /&gt;
Функция возвращает истину если приложение запущено успешно. Иначе – Ложь.&lt;br /&gt;
В случае успеха, при параметре Wait – истина кладет в переменную $LastResult код завершения приложения.&lt;br /&gt;
&lt;br /&gt;
'''CASE''' - Оператор множественного выбора. Позволяет выполнить одно из нескольких действий в зависимости от условий. Синтаксис:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
  case(&lt;br /&gt;
    when(условие1, действие1);&lt;br /&gt;
    when(условие2, действие2);&lt;br /&gt;
    ...&lt;br /&gt;
    else(действие_по_умолчанию);&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 50);&lt;br /&gt;
&lt;br /&gt;
showmessage(&lt;br /&gt;
  case(&lt;br /&gt;
    when($a &amp;lt; 5, 50);&lt;br /&gt;
    when($a &amp;lt; 10, 100);&lt;br /&gt;
    when($a &amp;lt; 250, 200);&lt;br /&gt;
    else($a*$b);&lt;br /&gt;
  )  &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''AttachDebugger''' - Команда позволяет подключить открытый [[Отладчик_встроенных_скриптов]] к текущему скрипту. Команда AttachDebugger должна быть '''первой командой''' в скрипте. Добавьте её в самое начало скрипта:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Как работает:'''&lt;br /&gt;
# При выполнении команды AttachDebugger скрипт останавливается.&lt;br /&gt;
# Отладчик автоматически подключается к выполняющемуся скрипту.&lt;br /&gt;
# Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
# Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Если режим отслеживания не включён, команда `AttachDebugger` игнорируется.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Команда AttachDebugger должна быть первой командой в скрипте.&lt;br /&gt;
&lt;br /&gt;
=== Строковые функции ===&lt;br /&gt;
&lt;br /&gt;
'''UpCase(s)''' – возвращает строку s в верхнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''LCase(s)''' – возвращает строку s в нижнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''Len(s)''' – возвращает количество символов в строке s.&lt;br /&gt;
&lt;br /&gt;
'''Pos(s, substr [,start])''' – возвращает номер первого символа первого включения подстроки substr в строку s, возвращает 0, если включения подстроки отсутствуют. Параметр start - это позиция старта поиска, не обязательный параметр, по умолчанию равен 1. Поиск не чувствителен к регистру.&lt;br /&gt;
&lt;br /&gt;
'''Param(s, i)''' – возвращает i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''ParamsCount(s)''' - возвращает количество элементов строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''SetParam(s, p, i)''' – заменяет на значение p i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''Left(s, i [,full] )''' – возвращает i первых символов строки s. Параметр i, может быть строкой, тогда он считается разделителем и функция, возвращает строку слева от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Mid(s, i, j)''' - возвращает подстроку из s начиная с i символа и длиной j символов&lt;br /&gt;
&lt;br /&gt;
'''Right(s, i [,full])''' – возвращает i последних символов строки s. Параметр i, может быть строкой, тогда он считается разделителем, функция ищет разделитель с конца строки, и возвращает строку справа от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Reverse(s)''' - возвращает строку s задом-наперед. Полезно например для поиска с конца функций Pos().&lt;br /&gt;
&lt;br /&gt;
'''Char(i)''' – возвращает символ с кодом i.&lt;br /&gt;
&lt;br /&gt;
'''Ord(s)''' – возвращает код первого символа строки s.&lt;br /&gt;
&lt;br /&gt;
'''Replace(s, strFind1, strReplace1, [ strFind2, strReplace2, ... ], [caseInsensetive])''' - возвращает строку s, в которой все включения строк strFind заменены строкой strReplace. Параметры поиска и замены всегда должны быть в паре и их может быть несколько. caseInsensetive - неучитывать регистр, не обязательный параметр, по умолчанию включен.&lt;br /&gt;
&lt;br /&gt;
'''RemSpace(s)''' – возвращает сроку s без начальных и конечных запятых и пробелов, а также начальных точек.&lt;br /&gt;
&lt;br /&gt;
'''SumStr(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''с добавлением валюты'''. Необязательные параметры captions - позволяет изменить название валюты, формат строки может зависеть от текущего языка(посмотреть формат можно в &amp;quot;Справочники&amp;quot;-&amp;quot;Статусы&amp;quot;-&amp;quot;32 Валюты&amp;quot;, в разделе &amp;quot;Дополнительная информация&amp;quot;). Language - код языка на котором необходимо вывести сумму прописью. По умолчанию если не обязательные параметры опущены, используются региональные настройки в переменных.&lt;br /&gt;
&lt;br /&gt;
'''NumToStrSimple(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''без валюты'''. Параметры идентичны функции SUMSTR.&lt;br /&gt;
&lt;br /&gt;
'''FullNameToShort(Name)''' – Возвращает фамилию и инициалы по полному ФИО Name.&lt;br /&gt;
&lt;br /&gt;
'''MonthName1(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в именительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''MonthName2(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в родительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''StrForXML(s)''' - Подготавливает строку к парсингу как xml: Если находит в строке подстроку &amp;quot;UTF-8&amp;quot; - перекодирует ее из utf-8 в win-1251, убирает начальный знак вопроса, если такой встречается.&lt;br /&gt;
&lt;br /&gt;
'''FixedIntToStr(i, len[, char])''' - Возвращает целое число i дополненное слева символами char (по-умолчанию - &amp;quot;0&amp;quot;) до длины len.&lt;br /&gt;
&lt;br /&gt;
'''Translate(format, [param1, param2, ...])''' - Функция перевода строки format в язык пользователя. Строка format может содержать параметры %s, %d - строка и число соответственно. &lt;br /&gt;
&lt;br /&gt;
'''ExtractFileName(FilePath)''' - возвращает имя файла с расширением из полного пути к файлу FilePath.&lt;br /&gt;
&lt;br /&gt;
====Функции перекодировки====&lt;br /&gt;
'''DecodeStr(s, charset)''' - Производит перекодировку строки s в кодировку CP1251. Кодировка строки s должна быть заранее известна и может быть :&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866, UNICODE. Имя кодировки следует передавать в точности без лишних символов.&lt;br /&gt;
&lt;br /&gt;
'''EncodeStr(s, charset)''' - Производит перекодировку строки s в кодировку charset. Кодировка строки s должна быть CP1251, возможны следующие варианты перекодировки:&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Имя кодировки следует передавать в точности без лишних символов. UNICODE не работает с версии 2021, в ней строки по умолчанию в кодировке unicode.&lt;br /&gt;
&lt;br /&gt;
Функции EncodeBase64(s), DecodeBase64(s), UrlEncode(s), UTF8Encode(s), UTF8Decode(s), Str2UTF(s) - устарели, используйте EncodeStr, DecodeStr.&lt;br /&gt;
&lt;br /&gt;
====Транслитерация====&lt;br /&gt;
&lt;br /&gt;
'''Translit(s)''' - транслитерация строки русского текста s латиницей&lt;br /&gt;
&lt;br /&gt;
'''UnTranslit(s)''' - транслитерация строки s с латиницы на русский.&lt;br /&gt;
&lt;br /&gt;
==== Экранирование ====&lt;br /&gt;
&lt;br /&gt;
'''QUOTEDSTR(s)''' – квотирует строку s символом «\» (обратный слеш). Возвращает строку s, помещенную между символами одинарной кавычки, при этом все вхождения в строку s символов: «\», «&amp;quot;» и «'» экранируются квотирующим символом, а символы  #0, #10 и #13 заменяются на \0, \n и \r соответственно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SQLFloat(f)''' – Приводит число с плавающей точкой к виду, пригодному для SQL-запроса, т.е. к тексту с разделителем дробной части – точка.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextXML(s)''' - квотирует строку s для использования в XML. Производит замены спец. символов для корректности XML-синтаксиса.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextJSON(s)''' - переводит строку в формат JSON, экранирует служебные символы.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextBlob(s)''' - строка s содержит файл, функция перекодирует переданную строку в байты, используется для заполнения полей формата blob.&lt;br /&gt;
&lt;br /&gt;
====Хеширование ====&lt;br /&gt;
&lt;br /&gt;
'''HMACHash256(key, text)''' - создаёт хэш по алгоритму SHA256 для проверки целостности сообщения, key - секретный ключ, text - хэшируемое сообщение&lt;br /&gt;
&lt;br /&gt;
'''MD5Hash(text)''' - создаёт хеш по алгоритму MD5&lt;br /&gt;
&lt;br /&gt;
'''SignatureUrl(url)''' -  Подписывает переданный URL. Функция возвратит переданный URL с добавленным в конце параметром, в котором будет записана подпись.&lt;br /&gt;
&lt;br /&gt;
=== Функции работы с датой и временем ===&lt;br /&gt;
&lt;br /&gt;
'''CurrTime''' – возвращает текущее время&lt;br /&gt;
&lt;br /&gt;
'''CurrDate''' – возвращает текущую дату&lt;br /&gt;
&lt;br /&gt;
'''CurrMillisecond''' - Возвращает количество миллисекунд прошедших с начала текущего года. Используется для точного расчета временных интервалов.&lt;br /&gt;
&lt;br /&gt;
'''Today''' - возвращает текущую дату в числовом формате.&lt;br /&gt;
&lt;br /&gt;
'''Day(dt)''' – возвращает день месяца даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Month(dt)''' – возвращает месяц года даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Year(dt)''' – возвращает год даты dt.&lt;br /&gt;
&lt;br /&gt;
'''FirstDayOfMonth(dt)''' – Возвращает первый день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( FirstDayOfMonth( CurrDate() ) );&lt;br /&gt;
'''Полужирное начертание'''&lt;br /&gt;
'''LastDayOfMonth(dt)''' – Возвращает последний день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( LastDayOfMonth( CurrDate() ) );&lt;br /&gt;
&lt;br /&gt;
'''DaysInMonth(month, year)''' – Возвращает количество дней в указанном месяце.&lt;br /&gt;
&lt;br /&gt;
'''IncDay(dt, [count=1])''' – Возвращает дату, увеличенную на count дней.&lt;br /&gt;
&lt;br /&gt;
'''SQLDate(dt)''' – Пытается конвертировать dt в дату, вернуть в формате «'YYYY-MM-DD'» (с апострофами), если не удается – возвращает «NULL».&lt;br /&gt;
&lt;br /&gt;
'''SQLDateToDate(dt)''' – Переводит дату из SQL-формата в обычный.&lt;br /&gt;
&lt;br /&gt;
'''DAYSBETWEEN(dt1, dt2)''' – Возвращает количество дней между датами dt1 и dt2. В случае ошибки приведения dt1 или dt2 к дате возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''TimeBetween(t1, t2)''' - Возвращает количество минут между временем t1 и t2. Если t1 &amp;gt; t2 то будет показано количество минут между t2 и t1. Параметр t может быть как в формате &amp;quot;HH:MM&amp;quot;, так и в числовом. Если один из параметров не удалось привести к числовому типу возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''WorkDaysBetween(dt1, dt2, [DecreaseFirstDay=0], [DefaultHolidayVarNum=1])''' - Возвращает количество рабочих дней между датами dt1 и dt2. Параметр DecreaseFirstDay уменьшает dt1 на указанное количество дней (по умолчанию 0).  В случае ошибки приведения dt1 или dt2 к дате возвращает -1000. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней(по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''TimePeriod(time1, time2)''' - Оформляет временной период. Возвращаемое значение зависит от наличия значения в параметрах. Возможные варианты: &amp;quot;time1 - time2&amp;quot; , &amp;quot;С time1&amp;quot; , &amp;quot;ДО time2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''StrDateToFloat(s, [time=false])''' - Переводит строку с датой s в числовой тип. Если параметр time включен, то в строке s должно быть указано время. Дата должна быть в формате &amp;quot;DD.MM.YYYY&amp;quot;, а время &amp;quot;HH:NN&amp;quot;. Если строку перевести не удалось возвращает 0&lt;br /&gt;
&lt;br /&gt;
'''IsAWorkDay(dt)''' - Когда день dt является рабочим, возвращает true. Если произошла ошибка приведения даты возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''IncWorkDay(dt, [count=1],[DefaultHolidayVarNum=1])''' - Прибавляет count рабочих дней к дате dt. Возвращает дату в числовом формате, если произошла ошибка приведения даты возвращает -1000. По умолчанию параметр count равен 1 и не является обязательным. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней (по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''Sleep'''(n) - Задержка выполнения на n миллисекунд.&lt;br /&gt;
&lt;br /&gt;
=== Функции приведения типов ===&lt;br /&gt;
&lt;br /&gt;
'''INT(v)''' – возвращает значение типа “целое”, приводя вариантное значение v к числовому типу, а затем округляя его. В том числе используется как функция округления.&lt;br /&gt;
&lt;br /&gt;
'''FLOAT(v)''' – возвращает значение типа “число”, приводя вариантное значение v к числовому типу, переводя в число цепочку символов до первого нецифрового символа (либо точки или запятой).&lt;br /&gt;
&lt;br /&gt;
'''STR(v)''' – возвращает значение типа “строка”, приводя вариантное значение v к строковому типу.&lt;br /&gt;
&lt;br /&gt;
'''Date(v)''' – возвращает дату, либо пустую строку, если не удается конвертировать v в дату&lt;br /&gt;
&lt;br /&gt;
'''Time(v)''' – возвращает время, либо пустую строку, если не удается конвертировать v во время. Понимает числовое представление времени.&lt;br /&gt;
&lt;br /&gt;
=== Математические функции ===&lt;br /&gt;
&lt;br /&gt;
'''ROUNDUP(f)''' – округляет число f до ближайшего большего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''ROUNDDN(f)''' – округляет число f до ближайшего меньшего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''Money(f, CouldBeEmpty, ZeroFill, MakeSpace)''' - Округляет число f, до двух знаков после запятой. CouldBeEmpty - заменить число меньше 0,0001  на пустую строку. ZeroFill  - Следить чтобы после запятой было два знака, если будет один, то добавить ноль. MakeSpace - Разделить разряды пробелом.&lt;br /&gt;
''Подсказка: для простого округления используется функция int()''&lt;br /&gt;
&lt;br /&gt;
'''Abs(f)''' - возвращает модуль числа f.&lt;br /&gt;
&lt;br /&gt;
'''Mod(x, y)''' - возвращает остаток от деления целочисленного числа x на целочисленное число y.&lt;br /&gt;
&lt;br /&gt;
=== Константы ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Null''' – Возвращает пустое значение.&lt;br /&gt;
&lt;br /&gt;
'''Да''', '''True''', '''Нет''', '''False''' – константы, соответствующие булевым значениям.&lt;br /&gt;
&lt;br /&gt;
=== Прочие функции ===&lt;br /&gt;
&lt;br /&gt;
SetPhoneParams(CountryCode, TownCode) – Устанавливает глобальные настройки кода телефонных кодов страны и города соответственно. По-умолчанию код страны – 7, код города – 495.&lt;br /&gt;
&lt;br /&gt;
PhonesCount(s) – Возвращает количество корректных телефонных номеров, найденных в строке s.&lt;br /&gt;
&lt;br /&gt;
GetPhone(s[, n]) – Возвращает n-й корректный телефонный номер, найденный в строке s. Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
GetEmail(s) – Возвращает все корректные адреса email, найденный в строке s, разделенные запятыми (т.е. готовыми к передаче в функцию SendEmail).&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY).&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
GenEan(ID, Code) – Формирует штрих-код EAN 13 Состоящий из идентификатора типа сущности ID и кода сущности Code, Выравнивает до 13-ти символов, первый – «2», последний – контрольная сума.&lt;br /&gt;
&lt;br /&gt;
CheckEan(s) - Проверяет строку s, что она является кодом EAN13.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(FileName,s, encoding [, append])- Создает текстовый файл по пути, указанному в FileName (если по указанному пути существует файл с указанным именем, он удаляется и создается новый) и производит запись строки s в созданный текстовый файл. encoding - название кодировки, по умолчанию сохраняет в кодировке ANSI. Доступные названия кодировок: KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Если append = true, то производится дописывание данных в файл, а не перезаписывание (не обязательный, по умолчанию выключен).&lt;br /&gt;
&lt;br /&gt;
StrFromFile(FileName) - Читает файл FileName, возвращает в виде строки. При ошибке чтения вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
DownloadAttachment(code, [savefilepath, tablename='attachment', fieldBlob='file', fieldLDtime='ldtime', fieldUID='uid']) - Функция выкачивает аттачмент из базы, по внутреннему коду - Code, всегда возвращает содержимое файла в виде строки, а также может сохранить файл по указанному пути в параметре savefilepath. По умолчанию, функция настроена на таблицу attachment. Code - внутренний код вложения, tablename - название таблицы, fieldBlob - название поля с содержимым файла, fieldLDtime - название поля с временем последнего изменения строки (для работы кэша). Функция использует кэш и умеет выкачивать файлы зауженные на внешние серверы (http, ftp,sftp, measoft). Для выкачивания с сервера measoft обязательно необходимо указывать параметр fieldUID.&lt;br /&gt;
&lt;br /&gt;
DeleteFile(FileName) - Удаляет файл FileName с диска, возвращает истину, если операция прошла успешно и ложь - в противном случае.&lt;br /&gt;
&lt;br /&gt;
HTTPPOST(host, PostParams, Proxy, ContentType, HTTPUser, HTTPPass, Method, CustomHeader, Reconnects) - Отправляет HTTP запрос по адресу host с данными PostParams. Proxy - объект Proxy, задающий прокси-сервер (по-умолчанию - пусто - не использовать прокси). ContentType - Заголовок ContentType. По-умолчанию - &amp;quot;application/x-www-form-urlencoded; Charset=UTF-8&amp;quot;. HTTPUser и HTTPPass - данные для http-авторизации на сервере. Method - метод отправки запроса, по-умолчанию - &amp;quot;POST&amp;quot;. CustomHeader - Дополнительные заголовки HTTP запроса, передается в виде списка параметров через запятую и всегда образуют пару: 1 параметр - название заголовка, 2 параметр - значение. Если значение содержит запятую то его нужно экранировать в двойные кавычки. Reconnects - Количество попыток подключения (по-умолчанию - 2), если больше 100 - это таймаут единственной попытки подключения в миллисекундах.&lt;br /&gt;
Функция возвращает ответ сервера. &amp;lt;br&amp;gt;&lt;br /&gt;
''Обратите внимание:'' Для имитации отправки данных html-формы методом POST может понадобиться перед передаваемыми параметрами добавить &amp;quot;Data=&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
FTPPUT(host, User, Pass, FileName[, Active]) - Отправляет файл на FTP/SFTP-сервер. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
FTPGET(host, User, Pass, SourceFileName, DestFileName[, Active]) - Загружает файл SourceFileName с FTP/SFTP-сервера, сохраняет его в файл DestFileName. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
GetTempDir - Возвращает путь к временной папке.&lt;br /&gt;
&lt;br /&gt;
ApplicationDir - Возвращает путь к файлу программы.&lt;br /&gt;
&lt;br /&gt;
Interpretate(script) - Интерпретирует скрипт указанный в script. Выполнение происходит в текущем инстансе.&lt;br /&gt;
&lt;br /&gt;
LastHttpError - Выводит последний запрос выполненный с ошибкой в функции HttpPost. Содержит подробную информацию по запросу и ответу.&lt;br /&gt;
&lt;br /&gt;
LastHttpResponse - Выводит последний запрос и ответ от сервера после выполнения Http-запроса в функции HttpPost.&lt;br /&gt;
&lt;br /&gt;
== Объект TExcel ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к данным документов MS Excel. Требует установленного приложения MS Excel. Для работы без установленного MS Excel предусмотрен объект TDirectExcel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ввод данных'''''&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Если Headered истинно (по-умолчанию), таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Если TranslateHeader истинно, то заголовки таблицы будут автоматически переведены.&lt;br /&gt;
 &lt;br /&gt;
 MyDB.Open('select * from kurier');&lt;br /&gt;
 xl.LoadFromDB(MyDB.Self);&lt;br /&gt;
 xl.DoNotDestroy(true);&lt;br /&gt;
 xl.SetVisible(true);&lt;br /&gt;
&lt;br /&gt;
Post2Sheet(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) -  Почти полный аналог LoadFromDB. В отличии от LoadFromDB если есть открытый файл, выгрузка данных будет выполнена прямо в него.&lt;br /&gt;
&lt;br /&gt;
OpenFile(aFileName) – Выполняет функции SetFileName и Open. &lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
SetFileName(aFileName) – Задает значение свойства FileName.&lt;br /&gt;
&lt;br /&gt;
Open - Открывает файл с именем, заданным свойством FileName. Если имя файла не задано - создает чистую книгу.&lt;br /&gt;
&lt;br /&gt;
Close – Закрывает текущий файл.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ячейки'''''&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
Cell(x, y, text) – Возвращает значение ячейки, заданной координатами x, y. Необязательный булевый параметр text, в случае истинности, указывает на необходимость возврата данных с учетом формата ячейки, т.е. то, что пользователь видит на экране. Обратите внимание, что если в ячейке число, и ширина столбца не достаточна для отображения, Excel выводит &amp;quot;#####&amp;quot;, что и будет возвращено программе, если text=ИСТИНА. Поэтому перед таким использованием рекомендуется выполнить функцию AutoFit.&lt;br /&gt;
&lt;br /&gt;
SetCell(x, y, v[, x2, y2]) – Устанавливает значение ячейки, заданной координатами x и y, в значение v. Если заданы параметры x2, y2 - объединяет (merge) диапазон ячеек заданных координатами, устанавливает значение объединенной ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Строки'''''&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
RowAutoFit([y1, y2]) - Устанавливает автоматическую высоту строк. Аргументы y1 и y2 необязательны и если не указаны, то процедура будет выполнена для всей страницы, в ином случае только для строк от y1 до y2.&lt;br /&gt;
&lt;br /&gt;
SetRowHeight(r, h[, cnt]) – Устанавливает высоту cnt строк (по-умолчанию 1) начиная со строки r в h пикселей.&lt;br /&gt;
&lt;br /&gt;
GetRowHeight(r) – Возвращает высоту строки r в пикселях.&lt;br /&gt;
&lt;br /&gt;
RowInsert(i[, count]) - Вставляет count (по-умолчанию - 1) строк НАД строкой с номером i.&lt;br /&gt;
&lt;br /&gt;
RowDelete(i[, count]) - Удаляет count (по-умолчанию - 1) строк начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Столбцы'''''&lt;br /&gt;
&lt;br /&gt;
ColCount - Возвращает количество столбцов в листе.&lt;br /&gt;
&lt;br /&gt;
AutoFit – Устанавливает автоматическую ширину столбцов.&lt;br /&gt;
&lt;br /&gt;
ColumnDelete(i[, count]) - Удаляет count (по-умолчанию - 1) столбцов начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
SetColWidth (c, w) – Устанавливает ширину столбца c в w пикселей.&lt;br /&gt;
&lt;br /&gt;
GetColWidth (c) – Возвращает ширину столбца c в пикселях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Листы'''''&lt;br /&gt;
&lt;br /&gt;
SetSheet(No) – Устанавливает номер текущего листа. Если лист с таким номером не существует - он будет создан (и все листы до него). Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetSheetName(Name) - Устанавливает название текущего листа.&lt;br /&gt;
&lt;br /&gt;
SheetsCount – Возвращает количество листов в книге.&lt;br /&gt;
&lt;br /&gt;
CopySheetAfter([SheetFrom[, SheetAfter]]) - Копирует лист SheetFrom (по-умолчанию - текущий), создавая новый лист после листа SheetAfter (по-умолчанию - совпадает с копируемым).&lt;br /&gt;
&lt;br /&gt;
SheetDelete(i) - Удаляет лист с номером i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Форматирование'''''&lt;br /&gt;
&lt;br /&gt;
Align(x1, y1, x2, y2 [,HAlign, VAlign]) - Устанавливает выравнивание данных в указанном диапазоне. HAlign - горизонтальное выравнивание (0 – прижато влево , 1 – по центру , 2 – прижато вправо), VAlign - Вертикальное выравнивание (0 – прижато к верху , 1 – по центру , 2 – прижато к низу).&lt;br /&gt;
&lt;br /&gt;
WrapText(x1, y1, x2, y2, value) – Устанавливает перенос текста прямоугольника в значение value. Если координаты опущены, или 0 – устанавливает границы всей используемой области. Для Value значение по-умолчанию - true.&lt;br /&gt;
&lt;br /&gt;
NumberFormat(x1, y1, x2, y2, Format) - Устанавливает формат вывода чисел в указанном диапазоне ячеек. Например, если Format='0.00' - числа будут выводиться c обязательными 2 знаками после десятичного разделителя.&lt;br /&gt;
&lt;br /&gt;
SetBorders(x1, y1, x2, y2) – Устанавливает границы прямоугольника. Если координаты опущены, или 0 – устанавливает границы всей используемой области.&lt;br /&gt;
&lt;br /&gt;
SetFont(Font[, x1, y1[, x2, y2]]) - Устанавливает шрифт Font для ячеек диапазона. Можно указать координаты только одной ячейки, можно - вообще не указать, тогда будет использован последний выделенный диапазон. Шрифт задается как обычно: 'Arial, 16, T, T, T', порядок параметров: Имя шрифта, размер, жирное начертание, курсивное начертание, одиночное подчеркивание. Если параметры не заданы, то у текущего шрифта они меняться не будут. Примеры: SetFont('Arial, 10, T, F, F', 1,1) - в ячейке A1 будет установлен шрифт Arial жирным начертанием (не курсив и без подчеркивания). SetFont(', , , T, F', 2,1) - в ячейке B1 будет поменяется только начертание курсив и будет отменено подчеркивание (если оно было). &lt;br /&gt;
&lt;br /&gt;
SaveValuesOnly - убирает формулы на текущей странице и оставляет лишь их результативные статичные значения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Цвета'''''&lt;br /&gt;
&lt;br /&gt;
SetRowFontColor(Row,Color) - Устанавливает цвет шрифта в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetRowColor(Row,Color) - Устанавливает цвет фона в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetColumnFontColor(Col,Color) - Устанавливает цвет шрифта в столбце Col. Color -  целое значение (RGB) &lt;br /&gt;
&lt;br /&gt;
SetColumnColor(Col,Color) - Устанавливает цвет фона в столбце Col. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellFontColor(Row,Col,Color) -  Устанавливает цвет шрифта в ячейке с координатами [Row,Col]. Color -  целое значение, равное номеру цвета в палитре (ColorIndex,не RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellColor(Row,Col,Color) -  Устанавливает цвет фона в ячейке с координатами [Row,Col]. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
GetRowFontColor(Row)- Возвращает RGB значение цвета шрифта строки Row&lt;br /&gt;
&lt;br /&gt;
GetRowColor(Row)- Возвращает RGB значение цвета фона строки Row&lt;br /&gt;
&lt;br /&gt;
GetColumnFontColor(Col)- Возвращает RGB значение цвета шрифта столбца Col&lt;br /&gt;
&lt;br /&gt;
GetColumnColor(Col)- Возвращает RGB значение цвета фона столбца Col &lt;br /&gt;
&lt;br /&gt;
GetCellFontColor(Row,Col) - Возвращает номер цвета шрифта в палитре (ColorIndex) в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
GetCellColor(Row,Col) - Возвращает RGB значение цвета фона в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Копи-паст'''''&lt;br /&gt;
&lt;br /&gt;
Copy(x1, y1, x2, y2) - Копирует в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Cut(x1, y1, x2, y2) - Вырезает в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Paste(x1, y1) - Вставляет из буфера экселя. Команды copy-paste неразрывны, если что нибудь сделать в промежутке между ними, например вставить значение в ячейку, то копирование сброситься. (Последовательность использования: copy - paste, cut - paste)&lt;br /&gt;
&lt;br /&gt;
PasteStyle(x1, x2, y1, y2) - Вставляет только оформление из буфера экселя (Последовательность использования:  Copy - PasteStyle)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Изображения'''''&lt;br /&gt;
&lt;br /&gt;
InsertPicture(TPicture, [x=1, y=1, DispX=0, DispY=0, width=0, height=0]) - Функция вставляет рисунок на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки, width, height (не работает для DirectExcel) - ширина и высота области рисунка в пойнтах-единицах Excel &lt;br /&gt;
&lt;br /&gt;
InsertFirmLogo(FirmCode, [x=1, y=1, DispX=0, DispY=0]) - Функция вставляет логотип фирмы с кодом FirmCode на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Вывод'''''&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки. Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SheetFitPageWidth - устанавливает режим масштабирования печати, чтобы печатная форма помещалась в ширину на один лист.&lt;br /&gt;
&lt;br /&gt;
SetOrientation(value) - Устанавливает ориентацию страницы. True (по-умолчанию) - альбомная (ландшафтная), Ложь - портретная.&lt;br /&gt;
&lt;br /&gt;
PrintOut([copies]) - Печатает текущий лист на принтере по умолчанию. Параметр copies - количество копий, по умолчанию равен 1.&lt;br /&gt;
&lt;br /&gt;
Save(filename) - Сохраняет в файл filename. Если файл существует, в основной системе он будет перезаписан, в других проектах - вызовет ошибку &amp;quot;Файл уже существует&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SetVisible(b) – Устанавливает видимость приложения Excel для пользователя. По-умолчанию – false (не видимо).&lt;br /&gt;
&lt;br /&gt;
DoNotDestroy(b) – При уничтожении объекта TExcel (а он уничтожается, как и все остальные объекты автоматически при завершении выполнения скрипта), приложение Excel уничтожается вместе с ним. DoNotDestroy(true) отключает уничтожение приложения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования'''''&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'myxl');&lt;br /&gt;
 myxl.OpenFile('c:\asdf.xlsx');&lt;br /&gt;
 set($sum, 0);&lt;br /&gt;
 while (myxl.EOF=0, &lt;br /&gt;
      set($sum, $sum+int(myxl.c));&lt;br /&gt;
      myxl.next );&lt;br /&gt;
 $sum&lt;br /&gt;
 &lt;br /&gt;
 ''Возвращает сумму всех числовых данных столбца C файла 'c:\asdf.xlsx'''&lt;br /&gt;
&lt;br /&gt;
== Объект TDirectExcel ==&lt;br /&gt;
Объект позволяет работать с файлами Excel напрямую, без установленного пакета MsOffice. Применяется в сервисах и при отсутствии экселя. Он максимально совместим с объектом TExcel, однако некоторые методы могут быть не реализованы. &lt;br /&gt;
&lt;br /&gt;
== Объект TCSVFile ==&lt;br /&gt;
Предназначен для доступа к данным документов CSV. Разделителем столбцов является символ точка с запятой ;&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
OpenFile(FileName) – Открывает файл FileName.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=false]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO.&lt;br /&gt;
&lt;br /&gt;
LoadFromText(s) - Загружает таблицу из строки s.&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). &lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(Filename) - Сохраняет в файл с именем filename.&lt;br /&gt;
&lt;br /&gt;
== Объект TADO ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к базам данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|Connect(ConnectionString)&lt;br /&gt;
|Подключает к источнику данных. ConnectionString – Строка подключения ADO.&lt;br /&gt;
|-&lt;br /&gt;
|ConnectMySQL(DBServer, DBPort, DBUser, DBPass, DBName)&lt;br /&gt;
|Подключает к базе данных MySQL.&lt;br /&gt;
|-&lt;br /&gt;
|Open(Query)&lt;br /&gt;
|Открывает набор данных выполнив запрос Query.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByNo(i)&lt;br /&gt;
|Возвращает значение поля с номером i. Нумерация полей – с нуля.&lt;br /&gt;
|-&lt;br /&gt;
|FieldName(i)&lt;br /&gt;
|Возвращает имя поля с номером i.&lt;br /&gt;
|-&lt;br /&gt;
|FieldCount&lt;br /&gt;
|Возвращает количество  полей.&lt;br /&gt;
|-&lt;br /&gt;
|RecordCount&lt;br /&gt;
|Возвращает количество записей.&lt;br /&gt;
|-&lt;br /&gt;
|RecNo&lt;br /&gt;
|Возвращает номер текущей записи. ''ВНИМАНИЕ! В зависимости от способа подключения к БД нумерация может начинаться как с 0 так и с 1!''&lt;br /&gt;
|-&lt;br /&gt;
|EOF&lt;br /&gt;
|Возвращает признак достижения конца набора данных. Становится истиной когда выполняется команда Next на последней записи.&lt;br /&gt;
|-&lt;br /&gt;
|Next&lt;br /&gt;
|Переход на следующую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|First&lt;br /&gt;
|Переход на первую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|Last&lt;br /&gt;
|Переход на последнюю запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByName(FieldName)&lt;br /&gt;
|Возвращает значение поля по имени. Также возможно указание имени поля как свойства объекта.&lt;br /&gt;
|-&lt;br /&gt;
|Field(Table, ID, FieldName)&lt;br /&gt;
|Возвращает значение поля FieldName записи с кодом ID таблицы Table. Набор данных, если он открыт, при этом не закрывается. Первичный ключ таблицы должен называться «code». Гарантированно работает только с MYSQL!!!&lt;br /&gt;
|-&lt;br /&gt;
|GetSQLValue(Query)&lt;br /&gt;
|Выполняет SQL-запрос. Текст запроса должен начинаться с первого символа строки (перед запросом не должно быть пробелов, переносов строк, комментариев и т.д.). Если запрос Insert – возвращает ID вставленной записи. Если запрос – Update, Delete, Replace, Set, Start, Commit, Rollback – возвращает количество измененных записей (RowsAffected), иначе – Select – значение первого поля первой строки результата как текст.&lt;br /&gt;
|-&lt;br /&gt;
|FillText(s)&lt;br /&gt;
|Возвращает строку s с замененными названиями полей между знаками процента на соответствующие значения текущей записи. Так же в строке возможно использование интерпретируемого кода, заключенного между тегами &amp;quot;&amp;lt;?&amp;gt;&amp;quot; и &amp;quot;&amp;gt;&amp;quot;. При интерпретации система сначала производит замену полей с процентами на значения, потом интерпретирует код. ''Внимание! Функция не создает отельный контекст интерпретатора, а использует существующий, в нем доступны все объекты и переменные, вызывающего скрипта.'' Дополнительно автоматически создается объект TSelfADO, подключенный к той же БД, что и контекст, вызвавший функцию, с пустым именем, а так же с именем &amp;quot;dataset&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|Query(Query)&lt;br /&gt;
|Синоним GetSQLValue.&lt;br /&gt;
|-&lt;br /&gt;
|Close&lt;br /&gt;
|Закрывает набор данных.&lt;br /&gt;
|-&lt;br /&gt;
|Self&lt;br /&gt;
|Возвращает указатель на подключение к БД для использования в других объектах.&lt;br /&gt;
|-&lt;br /&gt;
|ParseForIn([FieldName='code']) &lt;br /&gt;
|Возвращает через запятую значения всех строк в указанном столбце. По умолчанию, используется столбец с именем code.&lt;br /&gt;
|-&lt;br /&gt;
|GetSQL&lt;br /&gt;
|Для отладки. Возвращает последний SQL запрос переданный в методы Open, Query, GetSQLValue&lt;br /&gt;
|-&lt;br /&gt;
|ExportExcel&lt;br /&gt;
|Для отладки. Выгружает в эксель содержимое датасета. Можно использовать в незнакомом окружении для понимания передаваемых полей в : шаблонах, печатных формах и т.д. Аналог команды %echo% в шаблонах, на случай если она не сработает.&lt;br /&gt;
|-&lt;br /&gt;
|OnGetText&lt;br /&gt;
|Функция подменяет текстовый вывод значения поля при выгрузке в эксель. Первый параметр это имя поля, которое надо подменить. Второй параметр это то что необходимо вывести. Работает только с текстовыми полями. &lt;br /&gt;
'''''Пример использования'''''  &lt;br /&gt;
  DB.OnGetText('Зона', IF((DB.FieldByName('-Lat') ! 0) * (DB.FieldByName('-Lon') ! 0),&lt;br /&gt;
       	GetPolygonByLatLon(DB.FieldByName('-Lat'), DB.FieldByName('-Lon'), 'TYPE = 1 AND IFNULL(zone, 0) &amp;gt; 0 AND PRICE = ' + DB.FieldByName('-price'), 'zone')&lt;br /&gt;
  ,&lt;br /&gt;
        ''&lt;br /&gt;
  ));&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования – см. TSelfADO&lt;br /&gt;
&lt;br /&gt;
== Объект TSelfADO ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наследник объекта TADO. Служит для подключения к «родной» для программы, в которой выполняется скрипт, базе данных. Обладает всеми свойствами и методами объекта TADO, кроме Connect. Иногда автоматически создается системой для обеспечения простого доступа к базе данных, а также иногда создается системой с уже открытым набором данных для передачи обрабатываемого системой набора данных в скрипт. В этом случае для скрипта недоступны функции Open и Close.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&lt;br /&gt;
 rem('Копируем данные из &amp;quot;родной&amp;quot; базы данных в базу MSSQL.');&lt;br /&gt;
 new('TSelfADO', 'MyDB');&lt;br /&gt;
 new('TADO', 'MSSQL');&lt;br /&gt;
 MSSQL.Connect('Provider=SQLOLEDB.1;Password=myPassword;Persist Security Info=True;User ID=myUsername;Initial Catalog=myDataBase;Data Source=myServerAddress');&lt;br /&gt;
 MyDB.Open('select code, name, passport from kurier where code&amp;gt;'+Int(MSSQL.Query('select max(code) from kurier'))+' order by code');&lt;br /&gt;
 While(MyDB.EOF=0,&lt;br /&gt;
      MSSQL.Query('insert kurier (code, name, passport) VALUES ('+MyDB.Code+', '+QuotedStr(MyDB.Name)+', '+QuotedStr(MyDB.Passport)+')');&lt;br /&gt;
      MyDB.Next;&lt;br /&gt;
      );&lt;br /&gt;
&lt;br /&gt;
== Объект TPrinter ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к принтерам.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
BeginDoc – Начинает новый документ.&lt;br /&gt;
&lt;br /&gt;
EndDoc – Закрывает документ&lt;br /&gt;
&lt;br /&gt;
PageHeight – Возвращает высоту страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageWidth – Возвращает ширину страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageNumber – Возвращает номер текущей страницы документа&lt;br /&gt;
&lt;br /&gt;
Orientation – Возвращает текущую ориентацию страницы (0 – портретная, 1 – ландшафтная)&lt;br /&gt;
&lt;br /&gt;
Printing – Возвращает истину если документ открыт&lt;br /&gt;
&lt;br /&gt;
SetOrientation(Orientation) – Устанавливает ориентацию страницы. При необходимости начинает новый документ, новую страницу.&lt;br /&gt;
&lt;br /&gt;
ShowDialog – Показывает пользовательский диалог печати. Возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
NewPage – Начинает новую страницу&lt;br /&gt;
&lt;br /&gt;
Canvas – Предоставляет доступ к объекту TCanvas, связанному с принтером.&lt;br /&gt;
&lt;br /&gt;
PrinterNames – Возвращает список принтеров, установленных в системе, разделенный переносами строк&lt;br /&gt;
&lt;br /&gt;
PrintersCount – Возвращает количество установленных в системе принтеров&lt;br /&gt;
&lt;br /&gt;
SetPrinter(Printer) – Устанавливает текущий принтер. Если передана строка – ищет принтер по названию, иначе – по номеру. Нумерация начинается с 0.&lt;br /&gt;
&lt;br /&gt;
PrintTable(Y, Table) – Выводит на печать таблицу Table типа TTable, начиная с координаты Y. При необходимости таблица печатается на нескольких страницах. Возвращает координату Y конца таблицы.&lt;br /&gt;
&lt;br /&gt;
GetDefaultPrinter - Возвращает имя текущего активного принтера.&lt;br /&gt;
&lt;br /&gt;
SetDefaultPrinter(Printer) – Запоминает предыдущий активный принтер и устанавливает новый текущий принтер. Printer - имя принтера. При необходимости нескольких последовательных вызовов SetDefaultPrinter рекомендуется между вызовами использовать RestoreDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
RestoreDefaultPrinter - Устанавливает активным принтер, который был текущим перед последним вызовом SetDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
== Объект TCanvas ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предоставляет доступ к холсту объекта для прорисовки изображения.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
DPIX – Возвращает разрешение холста по горизонтали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
DPIY – Возвращает разрешение холста по вертикали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
TextOut(x, y, s[, x1, y1, x2, y2]) – Выводит строку s начиная с точки с координатами x и y. Если указаны параметры x1, y1, x2, y2 – то выводимый текст ограничивается заданным прямоугольником.&lt;br /&gt;
&lt;br /&gt;
TextOutEx(x1, y1, x2, y2, Alignment, Font, s, Indent) – Выводит строку s в прямоугольнике с координатами x1, y1, x2, y2. По горизонтали строка выравнивается в соответствии с Alignment (0 – прижато влево, 1 – вправо, 2 – по центру), по вертикали выравнивается по центру. Используя шрифт Font (см описание ниже). Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату X фактического окончания текста (правой стороны – если строка прижата влево, и левой – в остальных случаях)&lt;br /&gt;
&lt;br /&gt;
MLTextOut(x1, y1, x2, y2, Alignment, VAlignment, Font, s, Heigth, Indent) – Выводит многострочный текст s в прямоугольнике с координатами x1, y1, x2, y2 с переносом по словам. По горизонтали строки выравниваются в соответствии с Alignment, по вертикали – в соответствии с VAlignment (0 – прижато вверх, 1 – по центру, 2 – прижато вниз). Используя шрифт Font (см описание ниже). Heigth – высота строки. Если опущено или равно нулю – высота определяется автоматически в соответствии с выбранным шрифтом. Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату Y фактического окончания текста (нижней границы последней строки текста. ''ВНИМАНИЕ! Функция использует координаты прямоугольника для позиционирования текста, однако она не ограничивает его верхней и нижней границами этого прямоугольника!''&lt;br /&gt;
&lt;br /&gt;
DrawPic(x1, y1, x2, y2, Pic, Style, Alignment, Mode) – Прорисовывает изображение Pic (ссылка на изображение TPicture.Self) в прямоугольник заданный координатами x1-y2. Style – стиль масштабирования. 0 – растянуть изображение до границ прямоугольника не сохраняя пропорции, 1 – вписать изображение в прямоугольник сохраняя пропорции – вероятно, останутся поля по вертикали или горизонтали, 2 – вписать сохраняя пропорции, обрезав при необходимости изображение по вертикали или горизонтали. Alignment – выравнивание по горизонтали. Работает только в случае если style=1 и при растягивании изображения получились вертикальные поля. 0 – разместить по центру, 1 – прижать влево, 2 – прижать вправо. Функция возвращает координату X правой стороны изображения кроме случая, когда Style=1 и Alignment=2 – в этом случае возвращается координата левой стороны изображения. Mode - способ наложения изображения. 0 (по-умолчанию) - копирование как есть. 1 - Наложение операцией AND (применяется для получения эффекта прозрачности изображения), 2 - наложение операцией XOR (Применяется для возможности повторной операцией убрать изображение), 3 - Наложение операцией OR.&lt;br /&gt;
&lt;br /&gt;
FillRect(x1, y1, x2, y2) – Рисует прямоугольник '''без границ''' и закрашивает цветом BrashColor&lt;br /&gt;
&lt;br /&gt;
Rect(x1, y1, x2, y2) – Рисует прямоугольник '''c границами''', задаваемыми текущим пером, и закрашивает цветом BrashColor &lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Устанавливает шрифт по-умолчанию.&lt;br /&gt;
&lt;br /&gt;
SetPen(Width, Color) - Устанавливает параметры &amp;quot;ручки&amp;quot; - толщину и цвет. Если любой параметр опустить, соответствующее значение не будет изменено.&lt;br /&gt;
&lt;br /&gt;
SetBrush(Color, Style) - Устанавливает параметры заливки - цвет и стиль. Если любой параметр опустить, соответствующее значение не будет изменено. Стили заливки: 0 - сплошная, 1 - отсутствует (прозрачная), 2-7 - различные виды штриховки (горизонтальные, вертикальные, в клеточку и т.д.).&lt;br /&gt;
&lt;br /&gt;
TextHeight(s) – Возвращает высоту текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
TextWidth(s) – Возвращает ширину текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
Использование шрифта (Font): У объекта TCanvas есть «глобальные» установки шрифта. Однако для некоторых функций возможно указание шрифта, отличающегося от глобального. Параметры шрифта – это текстовая строка, состоящая из 6-ти параметров, разделенных запятыми: Название, размер, жирный, курсив, подчеркнутый, цвет. Например:&lt;br /&gt;
&lt;br /&gt;
 'Times New Roman, 8, Y, N, N, 255'&lt;br /&gt;
&lt;br /&gt;
Любой параметр можно опустить, и тогда вместо него будет использовано значение по-умолчанию: шрифт: arial, размер – 10, не жирный, не курсив, не подчеркнутый, цвет – черный. Например: ', 7' – указывает, что по-умолчанию нужно взять все параметры кроме размера шрифта. Также можно вместо всей строки указать тире ('-') или пустую строку, и шрифт будет использоваться «глобальный».&lt;br /&gt;
&lt;br /&gt;
Объект можно создать отдельно, не создавая объект TPrinter. В таком случае объект создастся как ссылка на текущий холст принтера (принтер должен быть запущен и начат новый документ). Такой подход используется в доп. возможности PrintCustomSticker&lt;br /&gt;
&lt;br /&gt;
== Объект TPicture ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с графическими изображениями форматов BMP, GIF, JPEG и PNG, а также для формирования штрих-кодов. Обратите внимание, прозрачность изображений не поддерживается, однако в методе TCanvas.DrawPic есть параметр Mode, призванный создавать эффект прозрачности.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(FileName) – Загружает изображение из файла FileName. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB, Query) – Загружает изображение из базы данных. DB – ссылка на подключение к базе данных TADO.Self, Query – текст запроса. Запрос должен вернуть в первом поле первой строки BLOB-поле с изображением, все остальные данные возвращаемые запросом игнорируются. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromStr($s) – Загружает изображение из строки $s. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
CreateBar(Width, Height, BarCode, Textless, Type) – Формирует штрих-код шириной Width и высотой Height с типом кодирования Type. BarCode – текст штрих-кода. Булево значение Textless указывает, что в штрих-коде не должно быть человеко-читаемых символов если истинно. Type указывает тип кодирования: 0 (по-умолчанию) CODE128, 1 - EAN-13, 2 - Interleaved 2-5, 3-DataMatrix, 4-QRCode.&lt;br /&gt;
Штрихкод должен быть: Для EAN-13 цифровым 12 или 13 символов (13-й, контрольная сумма рассчитывается автоматически), для CODE128 - должен иметь состоять из допустимого для этого кодирования набора символов. Для Interleaved - должен состоять из четного числа цифр, контрольная сумма автоматически не рассчитывается. Если для Interleaved кода указано значение из 14-ти знаков, подпись цифр выводится в формате Почты России.&lt;br /&gt;
Внимание! Для кодов EAN-13 и Interleaved ширина штрих-кода Width не является точным значением получаемого на выходе изображения. Ширина изображения рассчитывается как максимальное кратное минимально возможной ширине, но не меньше минимально возможной. Конечную ширину можно получить в соответствующем свойстве объекта. Для кода CODE128 штрих-код на выходе может оказаться пустым, если указанной ширины штрих-кода не достаточно для его формирования.&lt;br /&gt;
Для кода DataMatrix можно установить режим для печати скрытых символов с кодами 29(GS) и 232(FCN1), которые требуются для формирования Честного Знака. Для этого необходимо в начале строки указать символ &amp;quot;[&amp;quot; и все разделители 01, 21, 91, 92 так же экранировать этими скобками. Должно получиться [01]02900002317701[21]k3LInNbH_oG0Q[91]EE06[92]YXiyKfiHjE4YE8b+YVMC1O5r8VtpplA3AwcCqrcG9Dk= . При формировании кода, включится режим формирования штрих-кода DataMatrix GS1, в начале будет добавлен символ с кодом 232 (FCN1), а потом будут добавлены разделители с кодом 29 (GS)&lt;br /&gt;
Функция возвращает 1 в случае успеха, или текст ошибки, если такая произошла.&lt;br /&gt;
&lt;br /&gt;
SetSize(Width, Height) - Устанавливает размер изображения.&lt;br /&gt;
&lt;br /&gt;
AsString([ImageFormat]) - Возвращает изображение в виде строки с двоичными данными. ImageFormat принимает значения 1 - Bitmap (по-умолчанию), 2 - jpeg, 3 - png, 4 - gif.&lt;br /&gt;
&lt;br /&gt;
Width – Возвращает ширину изображения.&lt;br /&gt;
&lt;br /&gt;
Height – Возвращает высоту изображения.&lt;br /&gt;
&lt;br /&gt;
Rotate(Angle) – Поворачивает изображение по часовой стрелке на угол Angle. Угол указывается в градусах и может принимать любые значения.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с изображением, используется в качестве параметра для функций, работающих с изображениями из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Canvas - ссылка на объект TCanvas холста изображения.&lt;br /&gt;
&lt;br /&gt;
== Объект TTable ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с таблицами. Удобен для печати таблицы на принтере. Алгоритм таков: Загружаем датасет в таблицу, настраиваем ее (шрифты, штрих-коды и т.д.), потом выводим на принтер функцией TPrinter.PrintTable.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Заголовок – это первая строка таблицы.&lt;br /&gt;
&lt;br /&gt;
Cell(С, R) – Возвращает значение ячейки таблицы с координатами (C, R). Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetCell(С, R, Value) – Устанавливает значение ячейки таблицы с координатами (C, R) в Value. Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
RowCount – Возвращает количество строк в таблице.&lt;br /&gt;
&lt;br /&gt;
ColCount – Возвращает количество столбцов в таблице.&lt;br /&gt;
&lt;br /&gt;
SetTitleFont(Font) – Задает шрифт заголовка таблицы (первой строки).&lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Задает шрифт всей таблицы кроме заголовка.&lt;br /&gt;
&lt;br /&gt;
SetColFont(C, Font) - Устанавливает шрифт столбца C.&lt;br /&gt;
&lt;br /&gt;
SetIndent(Indent) – Задает отступ от границы ячейки до текста в процентах от ширины страницы. По-умолчанию значение 0.3&lt;br /&gt;
&lt;br /&gt;
SetWidth(С, Width) – Задает значение ширины столбца C в процентах от ширины страницы.&lt;br /&gt;
&lt;br /&gt;
SetMinRowHeght (Heght) – Задает значение минимальной высоты строки в пикселях. &lt;br /&gt;
&lt;br /&gt;
SetBarCode(Col, Type) - Указывает, что данные из столбца Col должны печататься в виде штрих-кода. Тип штрих-кода - Type. Значение '''&amp;quot;1&amp;quot; - EAN13'''. Для кода EAN13 первая строка данных в ячейке должна иметь вид &amp;quot;тип штрих-кода, номер&amp;quot;, например &amp;quot;7, 123&amp;quot; (без кавычек, конечно). В этом случае система сформирует штрих-код: &amp;quot;2700000001233&amp;quot;. Первая цифра - всегда 2, далее - указанный тип штрих-кода, нули, чтобы получилось 13 символов, номер, указанный в таблице, и один символ - контрольная сумма. Значение '''&amp;quot;2&amp;quot; - CODE128''' (с версии 734). Данные из первой строки ячейки таблицы печатаются в штрих-коде &amp;quot;как есть&amp;quot;. Для всех видов штрих-кода (с версии 734) последующие строки печатаются под штрих-кодом в виде текста.&lt;br /&gt;
&lt;br /&gt;
SetMultiHeader(Active) - Включает печать заголовка при переносе таблицы на несколько страниц. По умолчанию отключено.&lt;br /&gt;
&lt;br /&gt;
SetCustomHeader(script) - Включает печать пользовательского заголовка. Script - это код интерпретатора, который должен печатать заголовок на канву. Печать таблицы может происходить на нескольких листах, по этому скрипт будет вызван для каждого листа. При использовании этого метода, автоматически инициализируются переменные: $TablePageNo - номер страницы, нумерация начинается с нуля; $TableY - координата по оси Y, от которой рисуется заголовок. Чтобы таблица была под заголовком необходимо значение переменной $TableY увеличить на высоту заголовка.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с таблицей, используется в качестве параметра для функций, работающих с таблицами из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 &amp;lt;?&amp;gt;&lt;br /&gt;
 NEW('TPrinter', 'Prn');&lt;br /&gt;
 If(prn.ShowDialog,&lt;br /&gt;
  NEW('TTable', 'Tbl'); &lt;br /&gt;
  NEW('TSelfADO', 'MyDB'); &lt;br /&gt;
  MyDB.Open('SELECT concat(&amp;quot;7&amp;quot;, &amp;quot;, &amp;quot;,  a.code, &amp;quot;\r\n&amp;quot;, a.client_id, &amp;quot;\r\n&amp;quot;, a.zakaz, &amp;quot;-&amp;quot;, a.number) as &amp;quot;Штрих-код&amp;quot;, a.target AS &amp;quot;Заказик&amp;quot;, address, phone, vlog, poruch FROM address a order by code desc limit 10');&lt;br /&gt;
  Tbl.LoadFromDB(MyDB.Self); &lt;br /&gt;
  Tbl.SetBarcode(1, 1);&lt;br /&gt;
  Tbl.SetCustomHeader(     &lt;br /&gt;
    if($TablePageNo&amp;gt;0,&lt;br /&gt;
      Prn.Canvas.TextOut(Prn.Canvas.DPIX*0.1, $TableY, 'Продолжение таблицы');&lt;br /&gt;
      set($TableY, $TableY + Prn.Canvas.TextHeight('H'));&lt;br /&gt;
    ,0)&lt;br /&gt;
  );&lt;br /&gt;
  Prn.BeginDoc; &lt;br /&gt;
  Prn.PrintTable(0, Tbl.Self);   &lt;br /&gt;
  Prn.EndDoc&lt;br /&gt;
 , );&lt;br /&gt;
&lt;br /&gt;
== Объект TBaseUtils ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции, базирующиеся на БД системы «MEASOFT». По-умолчанию, при создании подключается к основной базе данных модуля, в котором выполняется скрипт, если такая определена контекстом, однако это можно изменить, см SetConnection.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
'''MakeAddress(s[,town])''' – возвращает значение, полученное путем преобразований адреса s для приведения его к внутреннему формату программы. В процессе преобразования до нескольких раз происходит замена буквосочетаний по таблице замены (ее редактирование доступно по нажатию кнопки «Автозамена» в интерфейсе импорта БД из Excel системы (см. Руководство пользователя)), поиск улиц по базе КЛАДР с точностью до одного знака, и некоторые другие операции, нацеленные на исправление ошибок в написании адреса.&lt;br /&gt;
&lt;br /&gt;
С версии программы 2008.0.0.615, при вызове функции в формулах загрузки реестра, в первую очередь происходит проверка строки s на условия:&lt;br /&gt;
* в строке s записано  число; &lt;br /&gt;
* строка s начинается с &amp;quot;ПВЗ &amp;quot;. &lt;br /&gt;
Если одно из этих условий выполняется, то функция пытается установить пункт самовывоза - т.е она сама в загружаемой карточке корреспонденции укажет: адрес ПВЗ, город ПВЗ и установит галку самовывоз. &amp;lt;br/&amp;gt;Правила поиска ПВЗ:&lt;br /&gt;
* Если s число -  считаем его внутренним кодом филиала;&lt;br /&gt;
* Если s начинается с &amp;quot;ПВЗ &amp;quot; - Например в адресе передана строка &amp;quot;ПВЗ На Ленинском проспекте&amp;quot;, то искать будем филиал с названием &amp;quot;На Ленинском проспекте&amp;quot; который подчиненный, активный, с галкой ПВЗ и в городе town. Если город не указан, то ищем филиал во всех городах, и считаем его найденным если найдем только один филиал. &lt;br /&gt;
* Если филиалы найти не удалось, функция makeaddress работает как обычно и выполняет преобразование адреса.&lt;br /&gt;
&lt;br /&gt;
Если адрес не содержит русских букв, только латиница, и курьерская служба находится в одной из стран Россия, Белоруссия, Казахстан или Украина, и город-получатель (второй параметр, town) находится так же в одной из этих стран, функция автоматически делает транслитерацию адреса на русский язык.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''SetConnection(DB) – Подключает объект к базе данных DB, где DB – ссылка на объект TADO.Self.'' '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
''SetTown(Town) – Устанавливает код текущего города (используется в некоторых функциях объекта) в значение Town. По-умолчанию текущий город – 1.''  '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
'''SetIndexLength(Length)''' – Устанавливает длину почтового индекса. По-умолчанию – 6.&lt;br /&gt;
&lt;br /&gt;
'''GetIndex(Address)''' – Возвращает почтовый индекс из адреса.&lt;br /&gt;
&lt;br /&gt;
'''GetStreet(Address)''' - Возвращает улицу до первой запятой.&lt;br /&gt;
&lt;br /&gt;
'''GetHome(Address)''' - Возвращает номер дома до второй запятой, но не более пяти символов.&lt;br /&gt;
&lt;br /&gt;
'''GetKurierByStation(station, Mass, Cash, Date_Putn)'''&lt;br /&gt;
&lt;br /&gt;
'''TownByIndex(Index[, PriorityName][, PriorityCountry])''' – Возвращает код города по индексу. В случае ошибки поиска – код текущего города. Если нашлось несколько населенных пунктов, и указано приоритетное название - выбирается населенный пункт, название которого начинается с PriorityName (если есть).&lt;br /&gt;
&lt;br /&gt;
'''TownByName(Name[,NotNeedCL=False, City=0])''' – Возвращает код города по имени. В случае ошибки поиска – возвратит код текущего города. Если параметр NotNeedCL (параметр не обязательный) установить в TRUE, тогда функция возвратит 0, если город не удалось найти. Параметр City (код региона) позволяет ограничить поиск одной областью (не обязательный, по умолчанию не используется).&lt;br /&gt;
&lt;br /&gt;
'''FillClientInfo(Excel, client, Sheet, Row, Col)''' – Выводит в эксель информацию о клиенте с кодом client на лист sheet начиная со строки row и столбца col.&lt;br /&gt;
&lt;br /&gt;
'''SavePrintFormToFile(FormType, FormNumber)''' - Сохраняет на диске файл печатной формы и возвращает путь к нему&lt;br /&gt;
&lt;br /&gt;
'''CreateTrans(Address[, Store][, Operator][,Correction])''' - Формирует запись для печати кассового чека для корреспонденции с кодом Address, для выбора кассового аппарата используется код склада Store. Если Store не указано - при исполнении в среде клиентского модуля системы использует склад, указанный пользователем в окне [[Настройка параметров рабочего места|&amp;quot;Настройка&amp;quot; - &amp;quot;Параметры&amp;quot;]], в остальных модулях - код текущего склада из [[Настройка глобальных параметров|переменной]] &amp;quot;CL&amp;quot; (&amp;quot;Текущий филиал&amp;quot;). Поле Operator позволяет указать кассира (передается код справочника сотрудников). Если не указан, в основной системе будет использован код авторизованного пользователя, в других модулях - 1.&lt;br /&gt;
Поле Correction позволяет указать данные для корректировочного чека, используется в системе Штрих-М. По умолчанию пустая строка. Возвращает идентификаторы записей чеков. Может вернуть пустую строку, если чек создавать не понадобилось, один или несколько кодов через запятую, если создано несколько чеков. В случае ошибки вызывает ошибку, поэтому рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CreateReturnTrans(Address)''' - формирует запись для печати чека возврата для корреспонденции с кодом Address. Чек возврата печатается на полную сумму и с теми же атрибутами, что и чек продажи. Возвращает идентификатор записи чека возврата. В случае ошибки вызывает ошибку, поэтому, как и с CreateTrans,  рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownDeliveryDays(Source, Mode, TownTo, TownFrom)''' - возвращает количество дней необходимых на доставку отправления, только для межгорода. Source - код клиента, Mode - режим срочности, TownFrom - код города отправителя, TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcDeliveryDate(Source, Mode, TownTo, TownFrom, Date_Beg, Time_beg)''' - Возвращает планируемую дату доставки с учетом сроков доставки. Работает при городской и междугородней доставке. Для межгорода сроки доставки берутся из зон. Для городской доставки, из дополнительных параметров статуса (17 статус, 1 параметр в доп. информации)  Если рассчитать дату планируемой доставки не удалось, возвращает пустую строку. Параметры: Source - код клиента, Mode - режим срочности, TownTo - город получатель, TownFrom - город отправитель, date_beg - дата заказа (может быть передана строкой в формате DD.MM.YYYY или в числовом), time_beg - время заказа. &lt;br /&gt;
&lt;br /&gt;
'''GenSpecialSMA(DirectExcel, Code)''' - функция для генерации отчета о доставке по акту передачи денег. Первый параметр - указатель на TDirectExcel, второй параметр - код акта передачи денег. АПД выводится на текущий лист объекта TDirectExcel.&lt;br /&gt;
&lt;br /&gt;
'''CreateSpecialSMA(ClientCode, DateTo)''' - Функция создает исходящий акт передачи денег (АПД). Требует ClientCode - код клиента, DateTo - дату акта. Функция возвращает коды созданных актов. Если возвращаемых параметров два, значит функция пыталась создать два АПД: первым, идет код АПД с наличной оплатой, а вторым с безналичной. Примеры возвращаемого результата: '0'- акт не был создан, отсутствуют корреспонденции; '124' - код созданного акта; '0,0' - пытались создать два акта, но отсутствуют данные; '4556,0' - создан только наличный АПД; '0,445' - создан только безнал.; '4556,445' - созданы нал. и безнал.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressForActDelivery(ActCode, [DeliveryDateMode=0, Delivery=True])''' - Функция создает корреспонденцию на доставку акта. ActCode - код акта; DeliveryDateMode: 0 - установить план. дату доставки текущим рабочим днем, 1 - установить план. дату доставки следующим рабочим днем, 2 - установить план. дату доставки равной планируемой дате оплаты АПД; Delivery - создать корр. на доставку АПД или создать корреспонденцию на забор АПД (по умолчанию, доставка АПД). Работа функции может быть изменена системной доп. возможностью OnCreateAddressForActDelivery.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressTransferAct(ClientCode, Store, DateTo, [AdditionalParam])''' - Функция создает исходящий акт передачи корреспонденции (АПК). Требует  ClientCode - код клиента, Store - код филиала, для которого будет создан акт, DateTo - дату, до которой в акт попадут возвраты, AdditionalParam - дополнительный строковый параметр для передачи в системную доп. возможность ExceptionsForAPK, позволяющий отобрать в акт, например, только полные возвраты.   Возвращает код созданного акта. ВНИМАНИЕ: при создании АПК используется системная функция ExceptionsForAPK. Если в ней используются интерактивные функции (вывод сообщений, диалоговые окна, выполнение скриптов), то акт сформирован не будет, а функция CREATEADDRESSTRANSFERACT вернет ошибку.     &lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByAddress(Address, TownCode, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попал адрес. Если полигон найти не удалось, функция возвратит пустую строку. Address - адрес корреспонденции текстом; TownCode - код города; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByAddress(addressrecord.address, if((addressrecord.number=0)*(addressrecord.strbarcode=&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;), addressrecord.townfrom, addressrecord.townto), '`schema`=1') - пытаемся найти вхождение адреса в полигоны 1 схемы, при выборе города учитывается корр. на забор, у нее нужно использовать город-отправитель (а для обычной корр. нужен город-получатель).&lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByLatLon(Lat, Lon, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попали GPS координаты. Если полигон найти не удалось, функция возвратит пустую строку. Lat - широта  текстом; Lon - долгота текстом; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByLatLon('55.769064','37.590713','zone is not null and price=0') - пытаемся найти вхождение координат в полигоны, где задана зона, для всех клиентских и курьерских зон.&lt;br /&gt;
&lt;br /&gt;
'''GetLatLonByAddress(AddressText, TownCode)''' - возвращает географические координаты вида lat,lon указанного в AddressText адреса. Поиск производится в городе, имеющем код TownCode в таблице Town.&lt;br /&gt;
&lt;br /&gt;
'''GetRouteCode(AddressText, TownCode, LatLon[, Lon])''' - для адреса AddressText в городе с кодом TownCode (из таблицы Town) по географическим координатам lat, lon возвращает код роута (записи, хранящей координаты адреса в городе). Если роут не найден (для адреса в городе не найдено записи с указанными координатами) - создает новый роут и возвращает его код, если роут найден (был создан ранее) - обновляет у роута координаты. Если параметр Lon задан, то параметр LatLon должен содержать одну координату, иначе LatLon должен содержать строку вида 'lat, lon'.&lt;br /&gt;
В случае ошибки возвращает Null.&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode(address, townto, '55.114034, 36.592397'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Троицк, Полковника милиции Курочкина ул., 11', 1, '37.467446, 55.740537'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Обнинск, Маркса пр., 20', TownByName('Обнинск'), 55.114034, 36.592397));&lt;br /&gt;
&lt;br /&gt;
'''CalcAgentPrice(AddressCode, AgentCode, TownFrom, TownTo, Mode, [, Count=1])''' - функция возвращает стоимость доставки рассчитанную по тарифу агента. AddressCode - код адреса, AgenCode - код филиала (агента), TownFrom - код города отправителя, TownTo - код города получателя, Mode - режим срочности, count - тарифная сетку от указанного количества отправлений (по умолчанию 1)&lt;br /&gt;
&lt;br /&gt;
'''SetAddrKol_vo(address, getkol_vo)''' - функция делает прием корреспонденции в текущем ответственном филиале. address - внутренний код адреса, getkol_vo - количество принимаемых мест, может принимать значения: &amp;quot;kol_vo&amp;quot; - принять все места, &amp;quot;getKol_vo+1&amp;quot; - принять еще одно место, &amp;quot;число&amp;quot; - сделать количество принятых мест равным указанному числу.&lt;br /&gt;
&lt;br /&gt;
'''CalcClientCnt(client_code, date, is_intown [, date_put=CurrDate(), skipajust=false])''' - функция расчета количество доставленных корреспонденций у клиента с кодом client_code за предыдущий месяц от даты date (Или за текущий месяц, подробнее смотри переменную UseCurrentMonthCount) среди внутригородских (is_intown = true) либо междугородних (is_intown = false) корреспонденций, date_put - дата доставки (для альтернативного способа подсчета, включаемого переменной UseDatePutForCalcCnt), skipajust - не учитывать принудительно введенные количества (таблица priceclientadjust типы записей 0 и 1).&lt;br /&gt;
&lt;br /&gt;
'''GetBasePrice''' - возвращает базовую стоимость доставки посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов,зоны,типа,срочности,массы, расстояния. В системах с выключенными доп. услугами также считает проценты от суммы и страховки. &lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset._self&amp;quot;.&lt;br /&gt;
  Описание некоторых полей датасета:&lt;br /&gt;
    pmoney - процент от суммы;&lt;br /&gt;
    pmoneycard - процент от суммы при оплате картой;&lt;br /&gt;
    pricecode - код прайса (таблица Price) ;&lt;br /&gt;
    distarea - район метро получателя (актуально при отключённом едином районировании, как правило район от 200 до 299 является признаком области);&lt;br /&gt;
    region - признак области при включенном едином районировании;&lt;br /&gt;
    distareaFrom и regionFrom  - аналог distarea, region только для отправителя;&lt;br /&gt;
    pcncode - код записи таблицы pricecnt &amp;quot;количество от&amp;quot;;&lt;br /&gt;
    Запрос содержит поля таблицы pricelinesnew - начальная стоимость по тарифной сетки, найденные без учета массы,только по типу срочности и режиму.&lt;br /&gt;
    Запрос содержит поля таблицы price.&lt;br /&gt;
&lt;br /&gt;
*addressrecord - ссылка на объектную модель карточки корреспонденции, следует использовать уже созданную addressrecord._self&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*type - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*wait - количество минут ожидания (не учитывается при доп. услугах, есть системная услуга &amp;quot;ожидание&amp;quot;);&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*rur - сумма передаваемых денег (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от суммы&amp;quot;);&lt;br /&gt;
*inshprice - сумма страховки (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от объявленной стоимости&amp;quot;);&lt;br /&gt;
*distance - расстояние до места доставки, обычно поле заполняется при доставке в область (регион в едино районировании). Дополнительная наценка к стоимости доставки;&lt;br /&gt;
*forward - направление доставки: true - туда; false - обратно;&lt;br /&gt;
*Collection - признак заборной корреспонденции: true - забор, false - доставка (В тарифе есть возможность указать стоимость для забора);&lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
В тарифе есть возможность указать формулу, которая может влиять на базовый расчет. Формула может объявить служебные переменные, которые:&lt;br /&gt;
*$FormulaReplace - если true – возвращаемое значение полностью заменяет базовый расчет;&lt;br /&gt;
*$FormulaKoeff - коэффициент на который будет помножена базовая стоимость.&lt;br /&gt;
Также внутри формулы объявлены следующие объекты dataset, addressrecord и переменные:&lt;br /&gt;
*$ForceIntown - Переменная становится истиной, если междугородний расчет был отменен, т.к. адрес попал в нарисованную зону на карте.&lt;br /&gt;
*а также: $forward, $distance, $Count, $Collection, $Wait, $FormulaKoeff, $PriceCode - описание есть выше.&lt;br /&gt;
&lt;br /&gt;
Для направления &amp;quot;туда&amp;quot;, Функция GetBasePrice вызывается  через доп. услугу &amp;quot;База&amp;quot; (при включенных доп. услугах), для направления &amp;quot;Обратно&amp;quot; всегда вызывается напрямую (т.к. доп. услуги работают только в для направления &amp;quot;туда&amp;quot;).&lt;br /&gt;
На расчет этой функции влияют следующие переменные: &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Расчет стоимости по адресу&amp;quot;, &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Зона клиента по умолчанию&amp;quot;,  &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Подсчет кол-ва отправлений за месяц&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownPrice''' - возвращает базовую стоимость междугородней доставки, посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов, типа, срочности, массы, расстояния.&lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset.self&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*tp - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcAddressPrice(AddressCode, [,ZakazCount])''' - полностью пересчитывает стоимость доставки корреспонденции по тарифу клиента. AddressCode - внутренний код адреса, ZakazCount - не обязательный параметр, кол-во заказов от клиента.&lt;br /&gt;
&lt;br /&gt;
'''GetStationCode(s [,town])''' – возвращает код станции метро, ассоциированный в системе с адресом s. В случае невозможности идентифицировать станцию метро – возвращает 0. &lt;br /&gt;
Когда включено районирование по карте, необходим второй параметр &amp;quot;town&amp;quot; - код города в котором нужно искать адрес.  Возвращает код района если удалось его найти; код станции меж-города - если адрес удалось геокодировать, но район не нашли; код 0 - когда не удалось геокодировать адрес.&lt;br /&gt;
&lt;br /&gt;
'''RecalcSpecialSMA(ActCode)''' - пересчитать акт передачи денег (АПД). Также, у корреспонденций входящих в АПД будет пересчитана стоимость доставки. Для Входящего АПД сумма акта не пересчитывается. Параметр ActCode - внутренний код акта, коды можно перечислять через запятую.&lt;br /&gt;
&lt;br /&gt;
'''UserCode''' - Возвращает код текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserName''' - Возвращает имя текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserPass''' - Возвращает пароль текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''UserBaseCode''' – Возвращает код текущего пользователя из таблицы «Сотрудники» (kurier).&lt;br /&gt;
&lt;br /&gt;
'''UserEmail''' - Возвращает e-mail текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''CurrentTown''' – Возвращает код текущего города (из таблицы town).&lt;br /&gt;
&lt;br /&gt;
'''CurrentCity''' – Возвращает код текущего региона (из таблицы city).&lt;br /&gt;
&lt;br /&gt;
'''CurrentLocation''' – Возвращает код текущего филиала (из таблицы store).&lt;br /&gt;
&lt;br /&gt;
'''FromEmailStr''' - строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
'''FillExcelDoc'''(Excel, Dataset, FormType, FormNumber,Print,[printer]) - Выполняет указанную печатную форму в объекте excel. Excel объект можно не указывать, тогда функция сама создаст объект экселя и разрушит его, полезно когда книгу &lt;br /&gt;
нужно распечатать или отправить по email (на листе данных в ячейке 1,1 укажите ключевое слово email). Dataset объект с данными для скрипта в печатной форме, может быть null. Dataset передавать можно так db.self, тогда переданный dataset внутри печатной формы будет доступен по имени dataset. Print - печатает книгу на принтере, после печати объект excel разрушается, при использовании параметра не указываете объект excel. Printer - имя принтера, на котором печатать (по умолчанию пустая строка, что означает &amp;quot;печатать на принтере по умолчанию&amp;quot;). Например:&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'excel');&lt;br /&gt;
 FillExcelDoc(excel.self, null, 12, 1);&lt;br /&gt;
 excel.DoNotDestroy(true);&lt;br /&gt;
 excel.SetVisible(true);&lt;br /&gt;
 ''Покажет эксель с выполненной печатной формой''&lt;br /&gt;
&lt;br /&gt;
'''ValutaSign''' – Возвращает название валюты для суммы.&lt;br /&gt;
&lt;br /&gt;
'''SendToMeasoft(xml)''' - Отправляет запрос в клиентское API Measoft. Автоматически добавляет начальный &amp;quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''InsertFirmAtt(excel, sheet, firmcode)''' - Вставляем на лист эксель по коду фирмы: печать, подпись, подпись бухгалтера, логотип. Тэги &amp;lt;STAMP&amp;gt;, &amp;lt;DIR&amp;gt;, &amp;lt;BUH&amp;gt;, &amp;lt;LOGO&amp;gt; соответственно. После тега можно указать размеры изображения в символах Microsoft Excel. Формат записи: &amp;lt;STAMP&amp;gt; 16, 16&lt;br /&gt;
&lt;br /&gt;
'''PreCalcSalary(kurier, addressCodes)''' - Рассчитывает предварительную зарплату. Kurier - код курьера, используется для определения тарифа. addressCodes - коды адресов, через запятую для которых необходимо посчитать зарплату. Результаты расчета будут записаны в таблицу kurierpaydetail, так как расчет предварительный то записи не будут прикреплены к конкретному начислению. &lt;br /&gt;
&lt;br /&gt;
  select a.code, kpd.price as &amp;quot;туда&amp;quot;, kpd2.price as &amp;quot;обратно&amp;quot; from address a &lt;br /&gt;
  left join kurierpaydetail kpd on kpd.sourcetable=3 and kpd.sourcecode=a.code and kpd.rectype = 1 &lt;br /&gt;
  left join kurierpaydetail kpd2 on kpd2.sourcetable=3 and kpd2.sourcecode=a.code and kpd2.rectype = 2&lt;br /&gt;
  where a.code in (...)&lt;br /&gt;
&lt;br /&gt;
'''CalcSalary(DateTo, [Filter=0, KurierCode = 0, ManagerCode = 0])''' - Полный расчет зарплаты курьерам. DateTo  - дата до которой создается начисление. Условия отбора курьеров для начисления. Filter - роль сотрудника: 0 - Все, 1 - курьеры, 2 - менеджеры; KurierCode - код курьера, ограничить расчет зарплаты одним курьером;ManagerCode - код курьера, ограничить расчет зарплаты курьерами указанного менеджера. Внимание фильтры Filter, KurierCode и ManagerCode накладываются друг на друга. Результатом функции является SubSQL с информацией по созданным начислениям. &lt;br /&gt;
  поля ответа: код курьера, код менеджера, начислено, бонусы, штрафы, аванс, итого;&lt;br /&gt;
  select kurier, manager, profit, bonus, shtraf, prepay, total  [union select ...]&lt;br /&gt;
&lt;br /&gt;
'''SelDistAddr(s)''' – Возвращает строку для вставки в select запрос, для вывода поля с упрощенным адресом. Принимает один необязательный строковый параметр - алиас таблицы из которой будет упрощаться поле address, по умолчанию &amp;quot;a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''VoiceReadStr(str)''' – Озвучивает фразу str голосовым уведомлением доступными словами из базы. Может содержать тег &amp;quot;{break_off}&amp;quot; для того, чтобы сделать эту фразу не пропускаемой в очереди воспроизведения.&lt;br /&gt;
&lt;br /&gt;
'''CalcStorageCost(ClientCodes, DateFrom, DateTo, NeedReport[, Store])''' – рассчитывает стоимость хранения на складе для выбранных клиентов (ClientCodes - коды клиентов через запятую), в период дат с DateFrom до DateTo, с прикреплением к корреспонденции отчета в зависимости от выставленного параметра NeedReport. Может содержать параметр Store - код филиала, по умолчанию пустой (расчет выполняется для всех филиалов). Возвращает коды созданных корреспонденций через запятую.&lt;br /&gt;
&lt;br /&gt;
'''WriteOut(DocId, ItemId, Date, Cnt[, BC])''' – производит списание товара со склада. DocId - код (docs.code) документа списания, ItemId - код товара (item.code), Date - дата операции, Cnt - количество списываемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер. Если указан BC, то параметр ItemId игнорируется и поиск номенклатуры происходит исключительно по штрих-коду. В случае успеха, функция возвращает строку вида: код номенклатуры, списанное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''IncomePurch(DocId, ItemId, Date, Cnt[, BC, Location = CurrentLocation])''' – производит приход товара на склад. DocId - код (docs.code) приходной накладной, ItemId - код товара (item.code), Date - дата операции, Cnt - количество приходуемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер, Location - код склада (store.code).  В случае успеха, функция возвращает строку вида: код номенклатуры, введенное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''CreateLedgerDoc(Date, Client, UserCode, Type[, ExtNumber, Message])''' - создает складской документ и возвращает код этого документа. Date - дата документа. Client - код клиента. UserCode - код пользователя, создавшего документ. Type - тип документа (statetype = 13). ExtNumber - номер у поставщика для документов прихода и расхода. Message - комментарий к документу. Последние два аргумента не обязательные и могут быть пустыми.&lt;br /&gt;
&lt;br /&gt;
== Объект TINIFile ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции работы с ini-файлами. В некоторых контекстах создается автоматически для предоставления доступа к настроечному файлу модуля, выполняющего скрипт.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
IniParam(s[,section='common']) – Существует только если имя экземпляра объекта пустое. Возвращает значение параметра s ini-файла секции «common», изменить секцию можно не обязательным параметром section. В случае отсутствия параметра в файле возвращает пустую строку. &lt;br /&gt;
&lt;br /&gt;
Param(s) – Синоним IniParam с тем отличием, что существует только если имя объекта непустое.&lt;br /&gt;
&lt;br /&gt;
SetText(s) - Загружает ini файл из строки s. Если в файле нет секции «common», то принудительно объявляет ее в начале.&lt;br /&gt;
&lt;br /&gt;
== Объект TSMS ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для отправки SMS, а также проверки статуса их доставки.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetProxy(Server, Port, User, Pass) - Устанавливает настройки прокси-сервера.&lt;br /&gt;
&lt;br /&gt;
Connect(Provider, Host, User, Pass, SenderName, SMSPrefix) – Подключает объект к провайдеру provider, используя адрес Host, имя пользователя User и пароль Pass. Значение SMSPrefix предназначено для того, чтобы провайдер мог различить сообщения от разных филиалов, если этими филиалами используется одно подключение. Если необходимости разделять сообщения нет - значение SMSPrefix можно не указывать.&lt;br /&gt;
Для провайдера доступны значения 'mirsms', 'sms16', 'websms', 'epochta', 'zanzara', 'SMSManager', 'f1sms', 'BitCall', 'mirsmsGET', 'AMD' и другие, либо можно указать числовые значения номера протокола, от 1 до &amp;lt;rspoiler text=&amp;quot;20&amp;quot;&amp;gt;Набор провайдеров все время дополняется, количество и номера можно смотреть в Справочники - Переменные - Подключения - SMS&amp;lt;/rspoiler&amp;gt; соответственно. Эти значения соответствуют значениям переменной SMSProtocol таблицы &amp;quot;Value&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SendSMS(Phone, Text, [ID]) – Отправляет SMS с текстом Text на телефон Phone. Для некоторых провайдеров необходим уникальный идентификатор сообщения ID (для провайдера iVoice - идентификатор сценария (кампании)). Возвращает ID провайдера для последующей проверки статуса доставки.&lt;br /&gt;
&lt;br /&gt;
CheckSMS(ProviderID) – Проверяет состояние доставки сообщения с идентификатором ProviderID. Возвращает: 0 – доставляется, 1 – успешно доставлено, 2 – не доставлено.&lt;br /&gt;
&lt;br /&gt;
ReceiveSMS(InboxID, DateFrom, DateTo, NewOnly) - Получает входящие SMS, с ящика InboxID (идентификатор выдаётся провайдером). DateFrom, DateTo - задается временной интервал в котором были приняты сообщения(формат 08.04.2013 18:00:00 'DD.MM.YYYY HH:NN:SS'). Чтобы получать только новые сообщение поле NewOnly должно быть True. Возвращает XML с сообщениями.&lt;br /&gt;
&lt;br /&gt;
ExtraResult([ParamName='']) - Вызывается после CheckSMS, возвращает дополнительную информацию по последнему статусу смс. В настоящее время работает только для провайдеров BitCall и iVoice. Для BitCall по умолчанию возвращает кнопки, нажатые абонентом во время работы с голосовым меню. Если в paramname указать 'IdentifyText' то будет возвращен JSON  с ответами абонента на заданные вопросы(используется в случае звонков с индивидуальным сценарием). Для iVoice по умолчанию подразумевается параметр 'response', при этом будет возвращен JSON  с ответами абонента на заданные вопросы (в зависимости от сценария)&lt;br /&gt;
&lt;br /&gt;
Log - Возвращает последний HTTP запрос и ответ от сервера смс.&lt;br /&gt;
&lt;br /&gt;
== Объект TXML ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга XML-данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст XML документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию. Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля.&lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
AttribCount – Возвращает количество атрибутов текущего элемента.&lt;br /&gt;
&lt;br /&gt;
AttribName(i) – Возвращает имя атрибута с номером i.&lt;br /&gt;
&lt;br /&gt;
Attrib(V) – Ищет атрибут и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
== Объект TJSON ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга JSON-данных. &lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст JSON документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля. &lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Можно проверять наличие элементов, если элемента нет, вернется пустая строка.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
isArray - Возвращает true, если текущий элемент является массивом (доступ к дочерним элементам возможен только по индексу, нумерация элементов начинается с нуля)&lt;br /&gt;
&lt;br /&gt;
==Объект TZip==&lt;br /&gt;
Предназначен для работы с Zip архивом. &lt;br /&gt;
&lt;br /&gt;
SetZip(s) - Загружает архив в объект из строки s;&lt;br /&gt;
&lt;br /&gt;
GetZip - Возвращает архив в виде строки;&lt;br /&gt;
&lt;br /&gt;
AddFromFile(SrcPath, ZipPath) - Добавляет файл SrcPath в архив и располагает его по пути ZipPath. ZipPath содержит имя файла в архиве, при необходимости можно указать каталог; &lt;br /&gt;
&lt;br /&gt;
AddFromStr(Data, /*ZipPath*/) - '''параметр ZipPath временно не работает'''. Добавляет файл из строки Data в архив и располагает его по пути ZipPath.  -ZipPath содержит имя файла в архиве, при необходимости можно указать каталог;&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(path) - Загружает архив из файла path;&lt;br /&gt;
&lt;br /&gt;
SaveToFile(path) - Сохраняет архив в файл path;&lt;br /&gt;
&lt;br /&gt;
Count - Возвращает кол-во файлов в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByIndex(index) - Возвращает распакованный файл в виде строки. Index - номер файла в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByName(ZipPath) - Возвращает распакованный файл в виде строки. ZipPath - путь к файлу в архиве, может содержать каталоги;&lt;br /&gt;
&lt;br /&gt;
FileName(index) - По номеру файла, функция возвращает полный путь файла в архиве.&lt;br /&gt;
&lt;br /&gt;
==Объект TBase==&lt;br /&gt;
&lt;br /&gt;
'''Функции общего назначения''':&lt;br /&gt;
&lt;br /&gt;
'''ExecSimpleScript(Caption, Text)''' - Выполняет скрипт &amp;quot;Дополнительных возможностей&amp;quot;. Возвращаемые значения, введенные пользователем устанавливает в переменные $scriptvar1..$scriptvarN, Значения кодов списочных переменных - в переменных $scriptvar1codes..$scriptvarNcodes. Функция возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot; в диалоговом окне.&lt;br /&gt;
&lt;br /&gt;
'''FillAdvPriceReport(Excel, AddressCodes, StartLine, StartCol, [ShowSumPrice,InsertColumns,ShowAll])''' - добавляет отчёт по дополнительным услугам. В AddressCodes - указаны коды адресов через запятую, каждый код это отдельная строка отчета. Адреса будут показаны в порядке перечисления их в AddressCodes. Если в отчет нужно добавить пустую строку, то можно указать код адреса -1000. StartLine, StartCol - верхний левый угол выгружаемой таблицы. ShowSumPrice - добавить столбец итоговый столбец с суммой всех услуг, по умолчанию выключено. InsertColumns - раздвинуть таблицу перед вставкой отчета, позволяет встраивать отчет посередине выгрузки, по умолчанию выключено. ShowAll - показать все дополнительные услуги, по умолчанию false и показывает только услуги с начислениями. Функция возвращает количество использованных столбцов.&lt;br /&gt;
&lt;br /&gt;
'''PrintSticker(Codes, [ToBoxes=False])'''&lt;br /&gt;
&lt;br /&gt;
'''PrintBlanc(Codes, BlancNumber)''' - печатать форму из раздела &amp;quot;Заполнить бланк&amp;quot;. Codes - коды корреспонденций, BlancNumber - номер формы из раздела &amp;quot;Бланки для корреспонденции&amp;quot; (3)&lt;br /&gt;
&lt;br /&gt;
'''GetItemByName(Name)'''&lt;br /&gt;
&lt;br /&gt;
'''GetA4Printer''' - возвращает имя принтера выбранного для печати документов&lt;br /&gt;
&lt;br /&gt;
'''GetStickerPrinter''' - возвращает имя принтера выбранного для печати стикеров&lt;br /&gt;
&lt;br /&gt;
'''GetDuplexPrinter''' - возвращает имя принтера выбранного для двусторонней печати, если принтер не выбран, возвращает пустую строку&lt;br /&gt;
&lt;br /&gt;
'''PrintAttachPDFPage(Code, FileName, Page, Printer)''' - печатает страницу из вложенного файла PDF. Code - код вложения (attachment) или путь к файлу, Page - номер страницы, Printer - 0 = принтер A4, 1 = принтер этикеток. &lt;br /&gt;
&lt;br /&gt;
'''AttachPDFToText(Code, [TextFileName])''' - преобразует файл PDF из вложений в текст. Code - код вложения (attachment) или путь к файлу, TextFileName - имя текстового файла, в который записывается результат (если не указан, используется временный файл). Возвращает текст в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''GhostScript(GScript, Code)''' — функция для выполнения консольных команд утилиты [https://ghostscript.readthedocs.io/en/latest/Use.html ghostscript]. Где, GScript — строка с командами Ghostscript; Code — код вложения или путь к PDF-файлу, предназначенному для обработки. В командах доступен специальный тег %MeasoftInFile%, который автоматически заменяется на путь к предварительно загруженному файлу (Code). Если в команде необходимо указать путь для сохранения результата обработки, используйте тег %MeasoftOutFile%. В этом случае функция на основании параметра Code автоматически сформирует имя временного выходного файла. После успешного выполнения команд функция возвращает путь к сгенерированному выходному файлу -  %MeasoftOutFile%.&lt;br /&gt;
&lt;br /&gt;
'''GetActiveForm([SkipFormName])''' - возвращает код активной формы в программе где происходит сканирование. SkipFormName - не обязательны параметр, имя формы которую нужно пропустить при определении интерфейса.&lt;br /&gt;
 '''Список интерфейсов''': &lt;br /&gt;
 0 - неопределенный; &lt;br /&gt;
 1 - прием корреспонденции на склад; &lt;br /&gt;
 2 - АПД; &lt;br /&gt;
 3 - комплектация адресов (ShelfingForm); &lt;br /&gt;
 4 - доска приема; &lt;br /&gt;
 9 - вкладка «Манифесты»; &lt;br /&gt;
 10 - Инвентаризация корреспонденции; &lt;br /&gt;
 11 - АПК; &lt;br /&gt;
 12 - вкладка «Адреса»; &lt;br /&gt;
 13 - вкладка «Выдача»; &lt;br /&gt;
 14 - вкладка «Склад»; &lt;br /&gt;
 15 - Список номенклатуры; &lt;br /&gt;
 16 - Инвентаризация склада; &lt;br /&gt;
 17 - Приходная накладная; &lt;br /&gt;
 18 - Списание товара; &lt;br /&gt;
 19 - Карточка корреспонденции.&lt;br /&gt;
&lt;br /&gt;
'''AddAddressScanLog(Code[, StrBarCode, IsManual, FromInterface, ExtraInfo])''' - добавляет событие сканирование для корреспонденции с кодом Code. Необязательные параметры: StrBarCode - сканируемый ШК корреспонденции (по умолчанию пустой), IsManual - галка ручного сканирования (по умолчанию false), FromInterface - код интерфейса сканирования (StateType=81, по умолчанию 0 - неопределенный), ExtraInfo - текстовый комментарий события.&lt;br /&gt;
&lt;br /&gt;
'''RuleName(alias)''' - Выдает полный путь в дерева прав по псевдониму права.&lt;br /&gt;
&lt;br /&gt;
'''ShowText(Caption:string, Value:string)''' - показывает пользователю окно с заголовком Caption и с многострочным полем со значением Value. Может быть полезен при отображении логов выполненной операции. &lt;br /&gt;
&lt;br /&gt;
'''ShowScanError(msg [, Speek, Color, Abort])''' - выдает пользователю окно с текстом msg блокируя последующие действия сканирования. Если Speek - истинно, то сообщение проговаривается голосовым движком, по умолчанию выключено. Color - целочисленное число цвета, в который будет окрашен фон сообщения (по умолчанию = -1, стандартный). Abort  - прервать выполнение скрипта, не показывая ошибку.&lt;br /&gt;
&lt;br /&gt;
'''CheckRule(alias)''' - функция проверки разрешения у текущего пользователя системы, alias - псевдоним права. Возвращает 1, если право есть и 0, если права нет. &lt;br /&gt;
 Пример: if(CheckRule('RSE'), ShowMessage('У пользователя есть право изменять счета'), ShowMessage('У пользователя нет права изменять счета'));&lt;br /&gt;
&lt;br /&gt;
'''GetKurierMoney(KurierCode, DateEnd, NonCash)''' - возвращает баланс курьера с кодом KurierCode на дату DateEnd. NonCash - булевый флаг, если истинно, то будет рассчитан безнальный баланс; &lt;br /&gt;
&lt;br /&gt;
'''Функции, работающие только в импорте БД из эксель:'''&lt;br /&gt;
&lt;br /&gt;
ReplaceAddress&lt;br /&gt;
&lt;br /&gt;
GetItemByCode - Поиск товара по артикулу. Внимание: в пределах одного клиента может быть несколько товаров с одинаковыми артикулами. В этом случае функция найдет последний заведенный товар.&lt;br /&gt;
&lt;br /&gt;
GetPrice&lt;br /&gt;
&lt;br /&gt;
GetNewNumber - используется при импорте реестра, возвращает номер конверта в загружаемом заказе&lt;br /&gt;
&lt;br /&gt;
GetNewPos - используется при импорте реестра, возвращает порядковый номер вложения&lt;br /&gt;
&lt;br /&gt;
GetNewPackagePos- используется при импорте реестра, возвращает порядковый номер места&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zakaz - возвращает номер заказа куда происходит импорт реестра&lt;br /&gt;
&lt;br /&gt;
addresscode  -  используется при импорте реестра, код созданного адреса&lt;br /&gt;
&lt;br /&gt;
Source  - код заказчика&lt;br /&gt;
&lt;br /&gt;
ClientTown - Узнаем город клиента, через филиал с которым он работает. Сам клиент берется из заказа указанного в окне &amp;quot;Импорт БД из Excel&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Объект TFieldObject ==&lt;br /&gt;
Создается только автоматически. Объект для доступа к записям, используется в картах и дополнительных услугах (addressrecord) и событиях карточки корреспонденции (fieldlist). Методы объекта:&lt;br /&gt;
&lt;br /&gt;
'''_GetTableInfo''' - возвращает данные о полях и примеры данных объекта.&lt;br /&gt;
&lt;br /&gt;
'''_Self''' - возвращает ссылку на объект.&lt;br /&gt;
&lt;br /&gt;
'''_Set(fieldname, fieldvalue [, DoUpdateForm])''' - Если базовый объект строка. Устаналивает для поля fieldname значение fieldvalue. DoUpdateForm по уолчанию false, если указать true то обновление поля будет не только в объекте но и пользовательском интерфейсе. Обновление работает только в карточке корреспнденции для ограниченного набора полей: vlog, mode, type, date_put, time_put, message, kurier, state1.&lt;br /&gt;
&lt;br /&gt;
'''_Set(keyfield, keyvalue, filed, value)''' - Если базовый объект таблица (addressrecord.boxes). Работает перегруженная версия метода _set, cначала происходит поиск строки по ключу, далее меняется значение указанного столбца. keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца.  Пример, отключение услуги база:&lt;br /&gt;
&lt;br /&gt;
 addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
 priceconf - поле где записан код услуги;&lt;br /&gt;
 1 - услуга База;&lt;br /&gt;
 active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
== Объект TMessage ==&lt;br /&gt;
Создается только автоматически. Объект используется для скриптовой обработки письма в [https://wiki.courierexe.ru/index.php/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8#.D0.98.D0.BC.D0.BF.D0.BE.D1.80.D1.82_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85| заданиях импорта данных]. В себе содержит текст письма в очищенном формате и оригинальном формате HTML, отправитель письма, тему письма, дата получения и список прикрепленных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.Text''' - возвращает очищенный от HTML-тегов текст письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.HTMLText''' - возвращает оригинальный текст письма со всеми HTML-тегами.&lt;br /&gt;
&lt;br /&gt;
'''Message.Sender''' - возвращает email-адрес отправителя письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.AttachmentsCount''' - возвращает количество вложенных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.DateTime''' - возвращает дату и время получения письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.Subject''' - возвращает тему письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentDataString(Number)''' - возвращает вложенный файл под номером Number в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentName(Number)''' - возвращает имя вложенного файла под номером Number.&lt;br /&gt;
&lt;br /&gt;
== Объект TStringList ==&lt;br /&gt;
Может использоваться для построчной обработки многостраничных файлов либо для организации текстовых данных. Номер строк начинается с 0. &lt;br /&gt;
Имеет следующий функционал:&lt;br /&gt;
&lt;br /&gt;
'''Count''' - возвращает количество строк в списке.&lt;br /&gt;
&lt;br /&gt;
'''Add(Value:string)''' - добавляет значение Value в конец списка.&lt;br /&gt;
&lt;br /&gt;
'''SetText(Value:string)''' - устанавливает значение списка в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Insert(Number:integer, Value:string)''' - добавляет строку Value в позицию Number.&lt;br /&gt;
&lt;br /&gt;
'''Delete(Number:integer)''' - удаляет строку из списка в позиции Number.&lt;br /&gt;
&lt;br /&gt;
'''Clear''' - очищает элементы списка.&lt;br /&gt;
&lt;br /&gt;
'''LoadFromFile(Path:string)''' - загружает текстовый файл по пути Path.&lt;br /&gt;
&lt;br /&gt;
'''Strings(Number:integer)''' - возвращает строку с номером Number.&lt;br /&gt;
&lt;br /&gt;
'''SetString(Number:integer, Value:string)''' - устанавливает значение строки с номером Number в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Text''' - возвращает полный список строк в виде текста.&lt;br /&gt;
&lt;br /&gt;
'''CommaText([Quoted:boolean])''' - возвращает список значений через запятую. Если Quoted = true, то квотирует элементы списка. По умолчанию равен false.&lt;br /&gt;
&lt;br /&gt;
'''SetCommaText(Value: string)''' - разбивает значение Value на отдельные строки и кладет в список. Разделитель - запятые.&lt;br /&gt;
&lt;br /&gt;
'''IndexOf(Value:string)''' - ищет значение Value среди элементов списка и если находит, то возвращает номер строки. Возвращает -1 если значение не было найдено.&lt;br /&gt;
&lt;br /&gt;
'''Sorted(Value:boolean)''' - устанавливает флаг отсортированности списка в Value. Если Value = true, то сразу же его сортирует. По умолчанию Value = false.&lt;br /&gt;
&lt;br /&gt;
'''Exchange(Pos1:integer, Pos2:integer)''' - меняет элементы списка с позициями Pos1 и Pos2 местами.&lt;br /&gt;
&lt;br /&gt;
'''Duplicates(Value:integer)''' - изменяет параметр управления дубликатами в списке. Если Value = 0 (значение по умолчанию), то список не реагирует на дубликаты. Если Value = 1, то список при добавлении будет игнорировать дубликаты. Если Value = 2, то список будет выдавать исключение, при добавлении дубликата в список.&lt;br /&gt;
&lt;br /&gt;
'''ParamName(Number:integer[, Delimiter:string])''' - возвращает текст до первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает пустоту.&lt;br /&gt;
&lt;br /&gt;
'''ParamValue(Number:integer[, Delimiter:string])''' - возвращает текст после первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает всю строку.&lt;br /&gt;
&lt;br /&gt;
== Объект TFunc ==&lt;br /&gt;
Объект реализует создание и использование функций в скриптовом языке. Позволяет определять переиспользуемые блоки кода с параметрами.&lt;br /&gt;
Важно учитывать, что внтури функции создается свой инстанс интерпретатора и от туда не доступны никакие переменные\объекты кроме переданных в функцию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные методы:&lt;br /&gt;
&lt;br /&gt;
'''New'''(FuncName, Param1, Param2, ..., Body) — создание новой функции.Функция возвращает результат выполнения последней команды в теле функции. Аргументы:&lt;br /&gt;
* `FuncName` — имя функции (строка)&lt;br /&gt;
* `Param1, Param2, ...` — имена параметров функции (переменные начинаются с `$`, объекты — без префикса)&lt;br /&gt;
* `Body` — тело функции (скрипт, выполняемый при вызове)&lt;br /&gt;
&lt;br /&gt;
'''FuncName'''(Arg1, Arg2, ...) — вызов созданной функции по имени. Если в объявлении была указана тип переменная, то и подставлять в аргумент надо обязательно переменную. Будет передано значение этой переменной (переменные словарине поддерживаются!). Если был объявлен объект, то указатель на объект должен быть получен через метод '''_self'''. C функциями поддерживают работу следующие классы: TExcel, TDirectExcel, TCSVFile, TADO, TSelfADO, TPrinter, TCanvas, TPicture, TTable, TINIFile, TSMS, TXML, TJSON, TZip, TStringList, TBaseUtils, а также объект addressrecord (TFieldObject). Результатом работы функции может быть число или строка.&lt;br /&gt;
&lt;br /&gt;
Пример 1, обработка результатов функции:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'calc');&lt;br /&gt;
calc.new('Sum', '$a', '$b',&lt;br /&gt;
  $a + $b&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
set($x, 10);&lt;br /&gt;
set($y, 20);&lt;br /&gt;
showmessage(calc.Sum($x, $y));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример 2, передача объекта в функцию:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'utils');&lt;br /&gt;
utils.new('ProcessDB', 'dbConn', '$value',&lt;br /&gt;
  showmessage($value);&lt;br /&gt;
  dbConn.open('SELECT * FROM address limit 3 ');&lt;br /&gt;
  if(dbConn.recordcount &amp;gt; 0,&lt;br /&gt;
    showmessage('Найдено записей: ' + dbConn.recordcount);&lt;br /&gt;
    dbConn.first;&lt;br /&gt;
    while(dbConn.eof = 0,&lt;br /&gt;
      showmessage(dbConn.fieldbyname('code'));&lt;br /&gt;
      dbConn.next&lt;br /&gt;
    )&lt;br /&gt;
  ,0)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
utils.ProcessDB(db._self,'test!');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Применение языка формул ==&lt;br /&gt;
'''в различных контекстах системы «MEASOFT» и сопутствующих проектах'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MEASOFT ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительная информация на чеке ====&lt;br /&gt;
&lt;br /&gt;
В карточке клиента на закладке «Касса» имеется поле для ввода текста, который будет отображаться на кассовых чеках, печатаемых для корреспонденции от данного клиента. В поле может быть введен как просто текст, так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TSelfDB с открытым набором данных со строчкой корреспонденции, заказа и клиента, на которую печатается чек&lt;br /&gt;
&lt;br /&gt;
TBaseSupport&lt;br /&gt;
&lt;br /&gt;
TBaseValue&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Так же система записывает в переменную $CashRegisterID вычисленный код фискального регистратора, на котором предполагается печать чека.&lt;br /&gt;
&lt;br /&gt;
Результат работы скрипта печатается на создаваемом чеке, если скрипт не возвращает значение “-1” (число или текст) – в этом случае система чек не создает. Подразумевается, что либо скриптом было принято решение об отсутствии необходимости формирования чека, либо скрипт взял эту функцию на себя.&lt;br /&gt;
&lt;br /&gt;
==== Заполнение шаблонов печатных форм ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительные возможности ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Импорт БД из Excel ====&lt;br /&gt;
В окружении интерпретатора создается объект ZakazRecord, он является списком со значениями таблицы zakaz. Именно в этот заказ будут загружены данные. Из этого объекта также доступно :&amp;lt;br&amp;gt;&lt;br /&gt;
*ZakazRecord.userfields - пользовательские поля заказа;&lt;br /&gt;
*ZakazRecord.Clients - данные таблицы clients;&lt;br /&gt;
*ZakazRecord.Clients.userfields - пользовательские поля заказчика.&lt;br /&gt;
&lt;br /&gt;
==== Прайс лист клиента ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в валюте клиента для каждой поездки (туда или обратно) единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Помимо стандартных объектов, система создает объект AddressRecord, в котором, как свойства, доступны все поля текущей записи. Так же она выставляет значение переменной $Forward в 1 (истина), если необходимо произвести расчет для направления &amp;quot;Туда&amp;quot; и 0 (ложь) - если обратно. ВНИМАНИЕ! Как и во всех остальных местах, после формулы нельзя ставить &amp;quot;;&amp;quot;, иначе скрипт вернет 0!&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 if(int(AddressRecord.Time_Put_Max)&amp;gt;19, 100, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Прибавляет 100 рублей в случае, если максимальный срок доставки 20 часов или более''&lt;br /&gt;
&lt;br /&gt;
 if(pos(AddressRecord.Address, 'Аренда')&amp;gt;0, &lt;br /&gt;
           set($FormulaReplace, 1); &lt;br /&gt;
           1500&lt;br /&gt;
 , 0)&lt;br /&gt;
 &lt;br /&gt;
 ''В случае наличия подстроки &amp;quot;Аренда&amp;quot; в адресе заменяет штатное ценообразование на 1500 рублей''&lt;br /&gt;
&lt;br /&gt;
Объект AddressRecord может предоставить доступ к связанным таблицам :&lt;br /&gt;
* addressrecord.boxes&lt;br /&gt;
* addressrecord.packages&lt;br /&gt;
* addressrecord.clients&lt;br /&gt;
* addressrecord.price&lt;br /&gt;
* addressrecord.advprice&lt;br /&gt;
* addressrecord.userfields&lt;br /&gt;
* addressrecord.addressfld&lt;br /&gt;
* addressrecord.clients.userfields&lt;br /&gt;
* addressrecord.price.userfields&lt;br /&gt;
* addressrecord.zakaz&lt;br /&gt;
* addressrecord.zakaz.userfields&lt;br /&gt;
 &lt;br /&gt;
Чтобы получить доступ к полю VarCode из таблицы userfields необходимо записать AddressRecord.Userfields.VarCode. В присоединённой таблице может быть несколько записей чтобы получить к ним доступ предусмотрены функции _First, _EOF, _Next, _RecordCount, _Set.&lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
 set($value1, 0); set($value2, 0);&lt;br /&gt;
 while(AddressRecord.userfields._EOF=0,&lt;br /&gt;
   if(AddressRecord.userfields.varCode=1, &lt;br /&gt;
     set($value1, if(AddressRecord.userFields.VarValue='Праздничная упаковка', 150, 0)), ''''''');&lt;br /&gt;
   if(AddressRecord.userfields.varCode=2, &lt;br /&gt;
     set($value2, AddressRecord.userFields.VarValue), ''''''');&lt;br /&gt;
   AddressRecord.userFields._Next;&lt;br /&gt;
 );&lt;br /&gt;
 int($value1) + int($value2)&lt;br /&gt;
&lt;br /&gt;
Пример делающий тоже самое что и выше но через поиск Locate:&lt;br /&gt;
 set($value1, if(addressrecord.userfields.VarValue('VarCode', 1)='Праздничная упаковка', 150, 0));&lt;br /&gt;
 set($value2, int(addressrecord.userfields.VarValue('VarCode', 2)));&lt;br /&gt;
 $value1 + $value2&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
В скрипте доступны переменные: &lt;br /&gt;
«$FormulaKoeff» - это коэффициент на который умножится конечная цена (по умолчанию равна 1);&lt;br /&gt;
«$PriceCode»  - код прайса;&lt;br /&gt;
«$CurrentPriceConf»  - код услуги;&lt;br /&gt;
«$BasePrice» - стоимость всех услуг с уровнем (pricelevel) меньше текущего.&lt;br /&gt;
&lt;br /&gt;
Для вызова функции CalcBasePrice (Расчёт базовой цены) в скрипте объявленны переменные: $Count,$Collection,$Distance,$Wait.&lt;br /&gt;
&lt;br /&gt;
Существует поиск по ключевому полю (поиск регистронезависимый), например чтобы найти в таблице advprice введённое значение для текущей услуги, нужно сделать такую запись  addressrecord.advprice.value('priceconf', $CurrentPriceConf) - Первый параметр это ключевое поле, второй искомое значение. Если запись найдётся будет возвращено значение поле value, если нет функция вернёт значение 0.&lt;br /&gt;
 &lt;br /&gt;
Пример &lt;br /&gt;
 if(addressrecord.advprice.active('priceconf', 3)='T', addressrecord.advprice.price, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Смотрим включена ли услуга и если да, возвращаем рассчитанную стоимость&lt;br /&gt;
&lt;br /&gt;
Чтобы изменить значение записанное в объект addressrecord, нужно воспользоваться методом _set(keyfield, keyvalue, filed, value). Параметр keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца. Сначала происходит поиск строки по ключу, далее меняется значение указанного столбца.&lt;br /&gt;
Пример, отключение услуги база:&lt;br /&gt;
  addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
  priceconf - поле где записан код услуги;&lt;br /&gt;
  1 - услуга База;&lt;br /&gt;
  active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
Также существует упрощенный метод _set, с двумя параметрами filed, value - он используется в шаблонах загрузки или в системных доп. возможностях где доступен объект addressrecord.&lt;br /&gt;
&lt;br /&gt;
==== Зарплата курьеров ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в основной валюте для каждой единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Переменные «$FormulaTablKoeff» и «$FormulaMoneyKoeff»  позволяют установить повышающий или понижающий коэффициент на стоимость доставки (по тарифной сетке) и услуги соответственно (процент от суммы, процент от стоимости доставки, ожидание).  Переменная «$UsingZoneName» и «$KurierZone» содержат название и код зоны соответственно, есть возможность поменять название зоны для отчета.&lt;br /&gt;
&lt;br /&gt;
=== Планировщик ===&lt;br /&gt;
&lt;br /&gt;
В поле текста задания может быть введен как текст с командами планировщика (см ниже), так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TIniFile, Указывает на настроечный ini-файл планировщика.&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Для записи в лог планировщика нужно использовать функцию Print&lt;br /&gt;
&lt;br /&gt;
=== Репликатор ===&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
ReplaceAddress(target, address) – Возвращает адрес последней доставки корреспонденции получателю target по адресу address от текущего клиента. При отсутствии такой доставки, возвращает address.&lt;br /&gt;
&lt;br /&gt;
GetPrice –возвращает рассчитанное значение цены, на основе прайс-листа клиента и данных о корреспонденции.&lt;br /&gt;
&lt;br /&gt;
GetKurierByStation(i) – возвращает код курьера, ассоциированного со станцией метро с кодом i.&lt;br /&gt;
&lt;br /&gt;
GetNewNumber – Возвращает не занятый номер единицы корреспонденции в текущем заказе.&lt;br /&gt;
&lt;br /&gt;
==История изменений==&lt;br /&gt;
&lt;br /&gt;
=== Недавние изменения ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2026.0.0.547 Доработка функций ATTACHPDFTOTEXT и PRINTATTACHPDFPAGE, добавлена возможность указать путь к файлу&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.539 Добавлена поддержка отладчика AttachDebugger&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.534 Добавлена поддержка оператора CASE и класса TFunc&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 2021.0.0.57 от 18.06.2019 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TExcel добавлен метод ColumnDelete.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция InsertFirmAtt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
||В объект TExcel добавлен метод Align.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция CheckEan&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект функцию FillAdvPriceReport добавлены параметры ShowSumPrice,InsertColumns&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TSMS добавлен метод Log.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Добавлена функция Money.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция ValutaSign.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция GetPolygonByLatLon.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TTable добавлена функция SetMultiHeader, SetCustomHeader.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DownloadAttachment&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию SetRowHeight объекта TExcel добавлен параметр cnt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция AsString.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция SetSize.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TADO добавлена функция ParseForIn.&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|В объект TBaseUtils из TBase перенесена функция FillExcelDoc.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция CalcAddressPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Все функции класса TBaseSupport перенесены в TBaseUtils. Класс TBaseSupport больше не существует.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функции RowInsert и RowDelete объекта TExcel добавлен параметр count.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция SendToMeaSoft&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция RecalcSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Новая функция Reverse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 849 &amp;amp;nbsp; 22.02.2018 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TBaseUtils.TownByIndex добавлен параметр PriorityName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TBase добавлена функция GetNewPackagePos&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TSMS доработан метод ExtraResult, добавлен параметр ParamName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBase добавлена функция CalcAgentPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateAddressForActDelivery&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функция CalcTownDeliveryDate заменена на CalcDeliveryDate&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция SignatureUrl&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция LoadFromStr.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetPen.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetBrush.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена поддержка чтения в формате PNG.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TCanvas.DrawPic параметр Mode&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Свойство TPicture.Canvas&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DeleteFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 758 &amp;amp;nbsp; 29.03.2017 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция GetPolygonByAddress&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция ParamsCount&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Объект TZip&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функции CreateEAN и Create128 заменены одной функцией CreateBar, полностью совместимой с Create128, но добавлена поддержка EAN-13 и Interleaved 2-5 (для Почты России). В системе функции оставлены для обратной совместимости, но более не являются документированными и рекомендованными к использованию.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Параметр text в функцию Cell объекта TExcel&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция UrlEncode &lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция IncDay теперь может принимать параметр count&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функции FtpGet, FtpPut, TTable.SetCell()&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 452 &amp;amp;nbsp; 26.02.2014 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция Time&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция FixedIntToStr&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция TimePeriod&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена функция приёма смс -  ReceiveSMS&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция STR2UTF&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция SAVETOFILE&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.SetSheetName&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;FILESTR&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Расширены возможности объекта addressrecord в формулах тарифов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 308 &amp;amp;nbsp; 24.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В функции загрузки таблиц из TADO добавлено условие, что поля, названия которых начинаются с &amp;quot;-&amp;quot; не выгружаются. Таким образом можно скрывать служебные поля из результирующего набора.&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowAutoFit &lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowInsert &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 300 &amp;amp;nbsp; 01.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В объекте TCSVFile добавилась возможность запрашивать значения не только текущей записи через параметр сдвига&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;UPDOWN&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлен объект TCSVFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 266 &amp;amp;nbsp; 14.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена поддержка массивов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 265 &amp;amp;nbsp; 11.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция CreateTrans в интерпретатор&lt;br /&gt;
|-&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15733</id>
		<title>Руководство программиста</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15733"/>
				<updated>2026-01-13T17:14:17Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Объект TBase */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Основные положения ==&lt;br /&gt;
&lt;br /&gt;
В систему «MEASOFT» встроен внутренний интерпретируемый язык программирования. Среда состоит из базовой функциональности, и дополнительно создаваемых объектов. Некоторые объекты автоматически создаются средой перед запуском интерпретатора для предоставления доступа к контексту, в котором работает скрипт. Все типы данных приводятся друг к другу автоматически, иногда при необходимости можно использовать функции приведения типов. &lt;br /&gt;
&lt;br /&gt;
Как интерпретатор приводит типы:&lt;br /&gt;
&lt;br /&gt;
1.	При использовании значения как параметр функции интерпретатор автоматически приводит значение к типу, необходимому функции.&lt;br /&gt;
&lt;br /&gt;
2.	При операциях сложения, а также логических операциях, операнды приводятся к строке если хотя бы один из них имеет тип «строка». Например:&lt;br /&gt;
3.3+5		-&amp;gt;  8.3&lt;br /&gt;
‘3.3’+5		-&amp;gt;  ‘3.35’&lt;br /&gt;
подобную проблему можно решить принудительно преобразовав тип:&lt;br /&gt;
float(‘3.3’)+5	-&amp;gt;  8.3&lt;br /&gt;
&lt;br /&gt;
3.	При операциях умножения, деления и вычитания операнды приводятся к числу с плавающей точкой, однако если результат выполнения операции получается целым числом, то он приводится к целочисленному типу.&lt;br /&gt;
&lt;br /&gt;
Как работают функции приведения типов:&lt;br /&gt;
&lt;br /&gt;
1.	При преобразовании строки к числу: функция «читает» строку до первого символа, не позволяющего создать число с плавающей точкой, при этом разделителем целой и дробной частей может быть как точка так и запятая. Если приведение производится к целочисленному типу, то после этого происходит округление. Например:&lt;br /&gt;
float('3.6qwerty735')	-&amp;gt;  3.6&lt;br /&gt;
int('3.6qwerty735')	-&amp;gt;  4&lt;br /&gt;
&lt;br /&gt;
2.	При преобразовании к булевому типу ложью считается пустая строка либо число 0, все остальное - истина&lt;br /&gt;
&lt;br /&gt;
3.	При преобразовании булевого типа к числу истина преобразуется в 1, ложь – в 0. Такое преобразование позволяет использовать сложение и умножение в качестве логических «ИЛИ» и «И» соответственно:&lt;br /&gt;
if((5=5)+(6=7), &amp;lt;a&amp;gt;, [b]) – условие истинно, выполнится код «a».&lt;br /&gt;
&lt;br /&gt;
4.	При преобразовании булевого типа к строке сначала происходит преобразование к числу:&lt;br /&gt;
(5=5)+'qwerty'	-&amp;gt;  ‘1qwerty’&lt;br /&gt;
&lt;br /&gt;
== Описание синтаксиса ==&lt;br /&gt;
&lt;br /&gt;
Команды разделяются точкой с запятой. Параметры функций разделяются запятыми. Каждая команда (даже цикл while) является функцией, возвращающей некоторое значение. Результатом выполнения составной команды (последовательности функций, разделенных точкой с запятой), является результат выполнения последней функции. Имена переменных, функций, объектов, а также их свойств и методов не чувствительны к регистру.&lt;br /&gt;
Константы: константы бывают целочисленными, дробными и строковыми. Значения целочисленных и дробных констант указываются «как есть» (в этом случае разделитель целой и дробной частей – точка), шестнадцатеричные значения начинаются с символа «$» и, если первая цифра – буква, она упреждается цифрой 0, а строковые – в одинарных кавычках. При этом, если внутри строковой константы встречается символ одинарной кавычки он должен быть задвоен, для указания интерпретатору того, что он не является признаком конца константы.&lt;br /&gt;
Операции сравнения: &amp;gt;, &amp;lt;, =, !  - Больше, меньше, равно, не равно соответственно.&lt;br /&gt;
Логические операции: + (ИЛИ), *  (И).&lt;br /&gt;
Арифметические операции: +, -, *, /&lt;br /&gt;
Операция конкатенации строк: +&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Функциональность базового объекта ===&lt;br /&gt;
&lt;br /&gt;
'''SET($a, a)''' – присваивает переменной (1-й параметр) значение второго параметра. При отсутствии переменной – создает ее. Имена переменных должны начинаться с символа «$», а следующий символ не должен быть цифрой. Возвращает новое значение переменной. Функция используется только для задания значений переменных. Не допускается использования для задания значений свойств объектов. Для этого используются соответствующие методы этих объектов.&lt;br /&gt;
&lt;br /&gt;
'''IF(a,b,c)''' или '''IF(a,b)'''  – Условный оператор. В первом случае возвращает b, если a истинно (не равно нулю или пустой строке), иначе – c. Во втором случае – возвращает a, если оно истинно, иначе – b.&lt;br /&gt;
&lt;br /&gt;
'''WHILE(a, b)''' – Оператор цикла. Выполняет b пока a истинно:&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i&amp;gt;0, set($sum, $sum+$i); set($i, $i-1));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''FOR($a, b, c, d)''' – Оператор цикла. Выполняет d пока $a последовательно присваиваются значения от b до с включительно:&lt;br /&gt;
	set($sum, 0);&lt;br /&gt;
for($i, 1, 10, set($sum, $sum+$i));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''NEW(ClassName, InstanceName)''' – Создает экземпляр класса ClassName, назначает ему имя InstanceName. Возвращает порядковый номер созданного объекта. Доступ к свойствам и методам объектов осуществляется по имени объекта и имени свойства/метода, разделенным точкой. Именем объекта может быть и пустая строка, тогда доступ к его свойствам и методам будет осуществляться без указания имени, и, в случае совпадения имен свойств и/или методов со стандартными или свойствами/методами других объектов, использоваться будут соответствующие свойства/методы объекта, созданного ранее, а также такой объект невозможно уничтожить до окончания выполнения скрипта. Все объекты созданные во время выполнения скрипта уничтожаются автоматически после окончания его выполнения.&lt;br /&gt;
&lt;br /&gt;
'''FREE(InstanceName)''' – Уничтожает объект с именем InstanceName. Возвращает 0. В случае отсутствия объекта с заданным именем вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
'''ShowObjects''' – Возвращает список созданных объектов – названия классов и имена.&lt;br /&gt;
&lt;br /&gt;
'''ERROR(message)''' – Вызывает ошибку с текстом message.&lt;br /&gt;
&lt;br /&gt;
'''SHOWMESSAGE(message)''' – Отображает диалоговое окно с текстом message, останавливает выполнение скрипта до закрытия окна пользователем.&lt;br /&gt;
&lt;br /&gt;
'''SimpleAskUser(Message)''' – Выводит диалоговое окно с текстом Message и кнопками «Да» и «Нет». Возвращает 1, если  пользователь нажал кнопку «Да», иначе – 0.&lt;br /&gt;
&lt;br /&gt;
'''TRY(a)''' – Выполняет a в «защищенном от ошибки» режиме. Если в процессе выполнения a возникает ошибка, возвращает текст ошибки, иначе – 0 (ложь).&lt;br /&gt;
&lt;br /&gt;
'''REM(….)''' – Код в скобках игнорируется (комментарий).&lt;br /&gt;
&lt;br /&gt;
'''EXEC(FileName, Params, Wait, WindowState)''' – Запускает внешнее приложение FileName с параметрами Params. Если Wait истинно – ожидает завершение процесса. Для WindowState доступны следующие числовые значения:&lt;br /&gt;
	0 - SW_HIDE&lt;br /&gt;
	1 - SW_SHOWNORMAL (по-умолчанию)&lt;br /&gt;
	3 - SW_MAXIMIZE&lt;br /&gt;
	6 - SW_MINIMIZE&lt;br /&gt;
Функция возвращает истину если приложение запущено успешно. Иначе – Ложь.&lt;br /&gt;
В случае успеха, при параметре Wait – истина кладет в переменную $LastResult код завершения приложения.&lt;br /&gt;
&lt;br /&gt;
'''CASE''' - Оператор множественного выбора. Позволяет выполнить одно из нескольких действий в зависимости от условий. Синтаксис:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
  case(&lt;br /&gt;
    when(условие1, действие1);&lt;br /&gt;
    when(условие2, действие2);&lt;br /&gt;
    ...&lt;br /&gt;
    else(действие_по_умолчанию);&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 50);&lt;br /&gt;
&lt;br /&gt;
showmessage(&lt;br /&gt;
  case(&lt;br /&gt;
    when($a &amp;lt; 5, 50);&lt;br /&gt;
    when($a &amp;lt; 10, 100);&lt;br /&gt;
    when($a &amp;lt; 250, 200);&lt;br /&gt;
    else($a*$b);&lt;br /&gt;
  )  &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''AttachDebugger''' - Команда позволяет подключить открытый [[Отладчик_встроенных_скриптов]] к текущему скрипту. Команда AttachDebugger должна быть '''первой командой''' в скрипте. Добавьте её в самое начало скрипта:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Как работает:'''&lt;br /&gt;
# При выполнении команды AttachDebugger скрипт останавливается.&lt;br /&gt;
# Отладчик автоматически подключается к выполняющемуся скрипту.&lt;br /&gt;
# Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
# Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Если режим отслеживания не включён, команда `AttachDebugger` игнорируется.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Команда AttachDebugger должна быть первой командой в скрипте.&lt;br /&gt;
&lt;br /&gt;
=== Строковые функции ===&lt;br /&gt;
&lt;br /&gt;
'''UpCase(s)''' – возвращает строку s в верхнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''LCase(s)''' – возвращает строку s в нижнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''Len(s)''' – возвращает количество символов в строке s.&lt;br /&gt;
&lt;br /&gt;
'''Pos(s, substr [,start])''' – возвращает номер первого символа первого включения подстроки substr в строку s, возвращает 0, если включения подстроки отсутствуют. Параметр start - это позиция старта поиска, не обязательный параметр, по умолчанию равен 1. Поиск не чувствителен к регистру.&lt;br /&gt;
&lt;br /&gt;
'''Param(s, i)''' – возвращает i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''ParamsCount(s)''' - возвращает количество элементов строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''SetParam(s, p, i)''' – заменяет на значение p i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''Left(s, i [,full] )''' – возвращает i первых символов строки s. Параметр i, может быть строкой, тогда он считается разделителем и функция, возвращает строку слева от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Mid(s, i, j)''' - возвращает подстроку из s начиная с i символа и длиной j символов&lt;br /&gt;
&lt;br /&gt;
'''Right(s, i [,full])''' – возвращает i последних символов строки s. Параметр i, может быть строкой, тогда он считается разделителем, функция ищет разделитель с конца строки, и возвращает строку справа от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Reverse(s)''' - возвращает строку s задом-наперед. Полезно например для поиска с конца функций Pos().&lt;br /&gt;
&lt;br /&gt;
'''Char(i)''' – возвращает символ с кодом i.&lt;br /&gt;
&lt;br /&gt;
'''Ord(s)''' – возвращает код первого символа строки s.&lt;br /&gt;
&lt;br /&gt;
'''Replace(s, strFind1, strReplace1, [ strFind2, strReplace2, ... ], [caseInsensetive])''' - возвращает строку s, в которой все включения строк strFind заменены строкой strReplace. Параметры поиска и замены всегда должны быть в паре и их может быть несколько. caseInsensetive - неучитывать регистр, не обязательный параметр, по умолчанию включен.&lt;br /&gt;
&lt;br /&gt;
'''RemSpace(s)''' – возвращает сроку s без начальных и конечных запятых и пробелов, а также начальных точек.&lt;br /&gt;
&lt;br /&gt;
'''SumStr(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''с добавлением валюты'''. Необязательные параметры captions - позволяет изменить название валюты, формат строки может зависеть от текущего языка(посмотреть формат можно в &amp;quot;Справочники&amp;quot;-&amp;quot;Статусы&amp;quot;-&amp;quot;32 Валюты&amp;quot;, в разделе &amp;quot;Дополнительная информация&amp;quot;). Language - код языка на котором необходимо вывести сумму прописью. По умолчанию если не обязательные параметры опущены, используются региональные настройки в переменных.&lt;br /&gt;
&lt;br /&gt;
'''NumToStrSimple(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''без валюты'''. Параметры идентичны функции SUMSTR.&lt;br /&gt;
&lt;br /&gt;
'''FullNameToShort(Name)''' – Возвращает фамилию и инициалы по полному ФИО Name.&lt;br /&gt;
&lt;br /&gt;
'''MonthName1(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в именительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''MonthName2(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в родительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''StrForXML(s)''' - Подготавливает строку к парсингу как xml: Если находит в строке подстроку &amp;quot;UTF-8&amp;quot; - перекодирует ее из utf-8 в win-1251, убирает начальный знак вопроса, если такой встречается.&lt;br /&gt;
&lt;br /&gt;
'''FixedIntToStr(i, len[, char])''' - Возвращает целое число i дополненное слева символами char (по-умолчанию - &amp;quot;0&amp;quot;) до длины len.&lt;br /&gt;
&lt;br /&gt;
'''Translate(format, [param1, param2, ...])''' - Функция перевода строки format в язык пользователя. Строка format может содержать параметры %s, %d - строка и число соответственно. &lt;br /&gt;
&lt;br /&gt;
'''ExtractFileName(FilePath)''' - возвращает имя файла с расширением из полного пути к файлу FilePath.&lt;br /&gt;
&lt;br /&gt;
====Функции перекодировки====&lt;br /&gt;
'''DecodeStr(s, charset)''' - Производит перекодировку строки s в кодировку CP1251. Кодировка строки s должна быть заранее известна и может быть :&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866, UNICODE. Имя кодировки следует передавать в точности без лишних символов.&lt;br /&gt;
&lt;br /&gt;
'''EncodeStr(s, charset)''' - Производит перекодировку строки s в кодировку charset. Кодировка строки s должна быть CP1251, возможны следующие варианты перекодировки:&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Имя кодировки следует передавать в точности без лишних символов. UNICODE не работает с версии 2021, в ней строки по умолчанию в кодировке unicode.&lt;br /&gt;
&lt;br /&gt;
Функции EncodeBase64(s), DecodeBase64(s), UrlEncode(s), UTF8Encode(s), UTF8Decode(s), Str2UTF(s) - устарели, используйте EncodeStr, DecodeStr.&lt;br /&gt;
&lt;br /&gt;
====Транслитерация====&lt;br /&gt;
&lt;br /&gt;
'''Translit(s)''' - транслитерация строки русского текста s латиницей&lt;br /&gt;
&lt;br /&gt;
'''UnTranslit(s)''' - транслитерация строки s с латиницы на русский.&lt;br /&gt;
&lt;br /&gt;
==== Экранирование ====&lt;br /&gt;
&lt;br /&gt;
'''QUOTEDSTR(s)''' – квотирует строку s символом «\» (обратный слеш). Возвращает строку s, помещенную между символами одинарной кавычки, при этом все вхождения в строку s символов: «\», «&amp;quot;» и «'» экранируются квотирующим символом, а символы  #0, #10 и #13 заменяются на \0, \n и \r соответственно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SQLFloat(f)''' – Приводит число с плавающей точкой к виду, пригодному для SQL-запроса, т.е. к тексту с разделителем дробной части – точка.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextXML(s)''' - квотирует строку s для использования в XML. Производит замены спец. символов для корректности XML-синтаксиса.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextJSON(s)''' - переводит строку в формат JSON, экранирует служебные символы.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextBlob(s)''' - строка s содержит файл, функция перекодирует переданную строку в байты, используется для заполнения полей формата blob.&lt;br /&gt;
&lt;br /&gt;
====Хеширование ====&lt;br /&gt;
&lt;br /&gt;
'''HMACHash256(key, text)''' - создаёт хэш по алгоритму SHA256 для проверки целостности сообщения, key - секретный ключ, text - хэшируемое сообщение&lt;br /&gt;
&lt;br /&gt;
'''MD5Hash(text)''' - создаёт хеш по алгоритму MD5&lt;br /&gt;
&lt;br /&gt;
'''SignatureUrl(url)''' -  Подписывает переданный URL. Функция возвратит переданный URL с добавленным в конце параметром, в котором будет записана подпись.&lt;br /&gt;
&lt;br /&gt;
=== Функции работы с датой и временем ===&lt;br /&gt;
&lt;br /&gt;
'''CurrTime''' – возвращает текущее время&lt;br /&gt;
&lt;br /&gt;
'''CurrDate''' – возвращает текущую дату&lt;br /&gt;
&lt;br /&gt;
'''CurrMillisecond''' - Возвращает количество миллисекунд прошедших с начала текущего года. Используется для точного расчета временных интервалов.&lt;br /&gt;
&lt;br /&gt;
'''Today''' - возвращает текущую дату в числовом формате.&lt;br /&gt;
&lt;br /&gt;
'''Day(dt)''' – возвращает день месяца даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Month(dt)''' – возвращает месяц года даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Year(dt)''' – возвращает год даты dt.&lt;br /&gt;
&lt;br /&gt;
'''FirstDayOfMonth(dt)''' – Возвращает первый день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( FirstDayOfMonth( CurrDate() ) );&lt;br /&gt;
'''Полужирное начертание'''&lt;br /&gt;
'''LastDayOfMonth(dt)''' – Возвращает последний день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( LastDayOfMonth( CurrDate() ) );&lt;br /&gt;
&lt;br /&gt;
'''DaysInMonth(month, year)''' – Возвращает количество дней в указанном месяце.&lt;br /&gt;
&lt;br /&gt;
'''IncDay(dt, [count=1])''' – Возвращает дату, увеличенную на count дней.&lt;br /&gt;
&lt;br /&gt;
'''SQLDate(dt)''' – Пытается конвертировать dt в дату, вернуть в формате «'YYYY-MM-DD'» (с апострофами), если не удается – возвращает «NULL».&lt;br /&gt;
&lt;br /&gt;
'''SQLDateToDate(dt)''' – Переводит дату из SQL-формата в обычный.&lt;br /&gt;
&lt;br /&gt;
'''DAYSBETWEEN(dt1, dt2)''' – Возвращает количество дней между датами dt1 и dt2. В случае ошибки приведения dt1 или dt2 к дате возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''TimeBetween(t1, t2)''' - Возвращает количество минут между временем t1 и t2. Если t1 &amp;gt; t2 то будет показано количество минут между t2 и t1. Параметр t может быть как в формате &amp;quot;HH:MM&amp;quot;, так и в числовом. Если один из параметров не удалось привести к числовому типу возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''WorkDaysBetween(dt1, dt2, [DecreaseFirstDay=0], [DefaultHolidayVarNum=1])''' - Возвращает количество рабочих дней между датами dt1 и dt2. Параметр DecreaseFirstDay уменьшает dt1 на указанное количество дней (по умолчанию 0).  В случае ошибки приведения dt1 или dt2 к дате возвращает -1000. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней(по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''TimePeriod(time1, time2)''' - Оформляет временной период. Возвращаемое значение зависит от наличия значения в параметрах. Возможные варианты: &amp;quot;time1 - time2&amp;quot; , &amp;quot;С time1&amp;quot; , &amp;quot;ДО time2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''StrDateToFloat(s, [time=false])''' - Переводит строку с датой s в числовой тип. Если параметр time включен, то в строке s должно быть указано время. Дата должна быть в формате &amp;quot;DD.MM.YYYY&amp;quot;, а время &amp;quot;HH:NN&amp;quot;. Если строку перевести не удалось возвращает 0&lt;br /&gt;
&lt;br /&gt;
'''IsAWorkDay(dt)''' - Когда день dt является рабочим, возвращает true. Если произошла ошибка приведения даты возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''IncWorkDay(dt, [count=1],[DefaultHolidayVarNum=1])''' - Прибавляет count рабочих дней к дате dt. Возвращает дату в числовом формате, если произошла ошибка приведения даты возвращает -1000. По умолчанию параметр count равен 1 и не является обязательным. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней (по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''Sleep'''(n) - Задержка выполнения на n миллисекунд.&lt;br /&gt;
&lt;br /&gt;
=== Функции приведения типов ===&lt;br /&gt;
&lt;br /&gt;
'''INT(v)''' – возвращает значение типа “целое”, приводя вариантное значение v к числовому типу, а затем округляя его. В том числе используется как функция округления.&lt;br /&gt;
&lt;br /&gt;
'''FLOAT(v)''' – возвращает значение типа “число”, приводя вариантное значение v к числовому типу, переводя в число цепочку символов до первого нецифрового символа (либо точки или запятой).&lt;br /&gt;
&lt;br /&gt;
'''STR(v)''' – возвращает значение типа “строка”, приводя вариантное значение v к строковому типу.&lt;br /&gt;
&lt;br /&gt;
'''Date(v)''' – возвращает дату, либо пустую строку, если не удается конвертировать v в дату&lt;br /&gt;
&lt;br /&gt;
'''Time(v)''' – возвращает время, либо пустую строку, если не удается конвертировать v во время. Понимает числовое представление времени.&lt;br /&gt;
&lt;br /&gt;
=== Математические функции ===&lt;br /&gt;
&lt;br /&gt;
'''ROUNDUP(f)''' – округляет число f до ближайшего большего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''ROUNDDN(f)''' – округляет число f до ближайшего меньшего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''Money(f, CouldBeEmpty, ZeroFill, MakeSpace)''' - Округляет число f, до двух знаков после запятой. CouldBeEmpty - заменить число меньше 0,0001  на пустую строку. ZeroFill  - Следить чтобы после запятой было два знака, если будет один, то добавить ноль. MakeSpace - Разделить разряды пробелом.&lt;br /&gt;
''Подсказка: для простого округления используется функция int()''&lt;br /&gt;
&lt;br /&gt;
'''Abs(f)''' - возвращает модуль числа f.&lt;br /&gt;
&lt;br /&gt;
'''Mod(x, y)''' - возвращает остаток от деления целочисленного числа x на целочисленное число y.&lt;br /&gt;
&lt;br /&gt;
=== Константы ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Null''' – Возвращает пустое значение.&lt;br /&gt;
&lt;br /&gt;
'''Да''', '''True''', '''Нет''', '''False''' – константы, соответствующие булевым значениям.&lt;br /&gt;
&lt;br /&gt;
=== Прочие функции ===&lt;br /&gt;
&lt;br /&gt;
SetPhoneParams(CountryCode, TownCode) – Устанавливает глобальные настройки кода телефонных кодов страны и города соответственно. По-умолчанию код страны – 7, код города – 495.&lt;br /&gt;
&lt;br /&gt;
PhonesCount(s) – Возвращает количество корректных телефонных номеров, найденных в строке s.&lt;br /&gt;
&lt;br /&gt;
GetPhone(s[, n]) – Возвращает n-й корректный телефонный номер, найденный в строке s. Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
GetEmail(s) – Возвращает все корректные адреса email, найденный в строке s, разделенные запятыми (т.е. готовыми к передаче в функцию SendEmail).&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY).&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
GenEan(ID, Code) – Формирует штрих-код EAN 13 Состоящий из идентификатора типа сущности ID и кода сущности Code, Выравнивает до 13-ти символов, первый – «2», последний – контрольная сума.&lt;br /&gt;
&lt;br /&gt;
CheckEan(s) - Проверяет строку s, что она является кодом EAN13.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(FileName,s, encoding [, append])- Создает текстовый файл по пути, указанному в FileName (если по указанному пути существует файл с указанным именем, он удаляется и создается новый) и производит запись строки s в созданный текстовый файл. encoding - название кодировки, по умолчанию сохраняет в кодировке ANSI. Доступные названия кодировок: KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Если append = true, то производится дописывание данных в файл, а не перезаписывание (не обязательный, по умолчанию выключен).&lt;br /&gt;
&lt;br /&gt;
StrFromFile(FileName) - Читает файл FileName, возвращает в виде строки. При ошибке чтения вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
DownloadAttachment(code, [savefilepath, tablename='attachment', fieldBlob='file', fieldLDtime='ldtime', fieldUID='uid']) - Функция выкачивает аттачмент из базы, по внутреннему коду - Code, всегда возвращает содержимое файла в виде строки, а также может сохранить файл по указанному пути в параметре savefilepath. По умолчанию, функция настроена на таблицу attachment. Code - внутренний код вложения, tablename - название таблицы, fieldBlob - название поля с содержимым файла, fieldLDtime - название поля с временем последнего изменения строки (для работы кэша). Функция использует кэш и умеет выкачивать файлы зауженные на внешние серверы (http, ftp,sftp, measoft). Для выкачивания с сервера measoft обязательно необходимо указывать параметр fieldUID.&lt;br /&gt;
&lt;br /&gt;
DeleteFile(FileName) - Удаляет файл FileName с диска, возвращает истину, если операция прошла успешно и ложь - в противном случае.&lt;br /&gt;
&lt;br /&gt;
HTTPPOST(host, PostParams, Proxy, ContentType, HTTPUser, HTTPPass, Method, CustomHeader, Reconnects) - Отправляет HTTP запрос по адресу host с данными PostParams. Proxy - объект Proxy, задающий прокси-сервер (по-умолчанию - пусто - не использовать прокси). ContentType - Заголовок ContentType. По-умолчанию - &amp;quot;application/x-www-form-urlencoded; Charset=UTF-8&amp;quot;. HTTPUser и HTTPPass - данные для http-авторизации на сервере. Method - метод отправки запроса, по-умолчанию - &amp;quot;POST&amp;quot;. CustomHeader - Дополнительные заголовки HTTP запроса, передается в виде списка параметров через запятую и всегда образуют пару: 1 параметр - название заголовка, 2 параметр - значение. Если значение содержит запятую то его нужно экранировать в двойные кавычки. Reconnects - Количество попыток подключения (по-умолчанию - 2), если больше 100 - это таймаут единственной попытки подключения в миллисекундах.&lt;br /&gt;
Функция возвращает ответ сервера. &amp;lt;br&amp;gt;&lt;br /&gt;
''Обратите внимание:'' Для имитации отправки данных html-формы методом POST может понадобиться перед передаваемыми параметрами добавить &amp;quot;Data=&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
FTPPUT(host, User, Pass, FileName[, Active]) - Отправляет файл на FTP/SFTP-сервер. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
FTPGET(host, User, Pass, SourceFileName, DestFileName[, Active]) - Загружает файл SourceFileName с FTP/SFTP-сервера, сохраняет его в файл DestFileName. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
GetTempDir - Возвращает путь к временной папке.&lt;br /&gt;
&lt;br /&gt;
ApplicationDir - Возвращает путь к файлу программы.&lt;br /&gt;
&lt;br /&gt;
Interpretate(script) - Интерпретирует скрипт указанный в script. Выполнение происходит в текущем инстансе.&lt;br /&gt;
&lt;br /&gt;
LastHttpError - Выводит последний запрос выполненный с ошибкой в функции HttpPost. Содержит подробную информацию по запросу и ответу.&lt;br /&gt;
&lt;br /&gt;
LastHttpResponse - Выводит последний запрос и ответ от сервера после выполнения Http-запроса в функции HttpPost.&lt;br /&gt;
&lt;br /&gt;
== Объект TExcel ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к данным документов MS Excel. Требует установленного приложения MS Excel. Для работы без установленного MS Excel предусмотрен объект TDirectExcel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ввод данных'''''&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Если Headered истинно (по-умолчанию), таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Если TranslateHeader истинно, то заголовки таблицы будут автоматически переведены.&lt;br /&gt;
 &lt;br /&gt;
 MyDB.Open('select * from kurier');&lt;br /&gt;
 xl.LoadFromDB(MyDB.Self);&lt;br /&gt;
 xl.DoNotDestroy(true);&lt;br /&gt;
 xl.SetVisible(true);&lt;br /&gt;
&lt;br /&gt;
Post2Sheet(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) -  Почти полный аналог LoadFromDB. В отличии от LoadFromDB если есть открытый файл, выгрузка данных будет выполнена прямо в него.&lt;br /&gt;
&lt;br /&gt;
OpenFile(aFileName) – Выполняет функции SetFileName и Open. &lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
SetFileName(aFileName) – Задает значение свойства FileName.&lt;br /&gt;
&lt;br /&gt;
Open - Открывает файл с именем, заданным свойством FileName. Если имя файла не задано - создает чистую книгу.&lt;br /&gt;
&lt;br /&gt;
Close – Закрывает текущий файл.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ячейки'''''&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
Cell(x, y, text) – Возвращает значение ячейки, заданной координатами x, y. Необязательный булевый параметр text, в случае истинности, указывает на необходимость возврата данных с учетом формата ячейки, т.е. то, что пользователь видит на экране. Обратите внимание, что если в ячейке число, и ширина столбца не достаточна для отображения, Excel выводит &amp;quot;#####&amp;quot;, что и будет возвращено программе, если text=ИСТИНА. Поэтому перед таким использованием рекомендуется выполнить функцию AutoFit.&lt;br /&gt;
&lt;br /&gt;
SetCell(x, y, v[, x2, y2]) – Устанавливает значение ячейки, заданной координатами x и y, в значение v. Если заданы параметры x2, y2 - объединяет (merge) диапазон ячеек заданных координатами, устанавливает значение объединенной ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Строки'''''&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
RowAutoFit([y1, y2]) - Устанавливает автоматическую высоту строк. Аргументы y1 и y2 необязательны и если не указаны, то процедура будет выполнена для всей страницы, в ином случае только для строк от y1 до y2.&lt;br /&gt;
&lt;br /&gt;
SetRowHeight(r, h[, cnt]) – Устанавливает высоту cnt строк (по-умолчанию 1) начиная со строки r в h пикселей.&lt;br /&gt;
&lt;br /&gt;
GetRowHeight(r) – Возвращает высоту строки r в пикселях.&lt;br /&gt;
&lt;br /&gt;
RowInsert(i[, count]) - Вставляет count (по-умолчанию - 1) строк НАД строкой с номером i.&lt;br /&gt;
&lt;br /&gt;
RowDelete(i[, count]) - Удаляет count (по-умолчанию - 1) строк начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Столбцы'''''&lt;br /&gt;
&lt;br /&gt;
ColCount - Возвращает количество столбцов в листе.&lt;br /&gt;
&lt;br /&gt;
AutoFit – Устанавливает автоматическую ширину столбцов.&lt;br /&gt;
&lt;br /&gt;
ColumnDelete(i[, count]) - Удаляет count (по-умолчанию - 1) столбцов начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
SetColWidth (c, w) – Устанавливает ширину столбца c в w пикселей.&lt;br /&gt;
&lt;br /&gt;
GetColWidth (c) – Возвращает ширину столбца c в пикселях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Листы'''''&lt;br /&gt;
&lt;br /&gt;
SetSheet(No) – Устанавливает номер текущего листа. Если лист с таким номером не существует - он будет создан (и все листы до него). Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetSheetName(Name) - Устанавливает название текущего листа.&lt;br /&gt;
&lt;br /&gt;
SheetsCount – Возвращает количество листов в книге.&lt;br /&gt;
&lt;br /&gt;
CopySheetAfter([SheetFrom[, SheetAfter]]) - Копирует лист SheetFrom (по-умолчанию - текущий), создавая новый лист после листа SheetAfter (по-умолчанию - совпадает с копируемым).&lt;br /&gt;
&lt;br /&gt;
SheetDelete(i) - Удаляет лист с номером i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Форматирование'''''&lt;br /&gt;
&lt;br /&gt;
Align(x1, y1, x2, y2 [,HAlign, VAlign]) - Устанавливает выравнивание данных в указанном диапазоне. HAlign - горизонтальное выравнивание (0 – прижато влево , 1 – по центру , 2 – прижато вправо), VAlign - Вертикальное выравнивание (0 – прижато к верху , 1 – по центру , 2 – прижато к низу).&lt;br /&gt;
&lt;br /&gt;
WrapText(x1, y1, x2, y2, value) – Устанавливает перенос текста прямоугольника в значение value. Если координаты опущены, или 0 – устанавливает границы всей используемой области. Для Value значение по-умолчанию - true.&lt;br /&gt;
&lt;br /&gt;
NumberFormat(x1, y1, x2, y2, Format) - Устанавливает формат вывода чисел в указанном диапазоне ячеек. Например, если Format='0.00' - числа будут выводиться c обязательными 2 знаками после десятичного разделителя.&lt;br /&gt;
&lt;br /&gt;
SetBorders(x1, y1, x2, y2) – Устанавливает границы прямоугольника. Если координаты опущены, или 0 – устанавливает границы всей используемой области.&lt;br /&gt;
&lt;br /&gt;
SetFont(Font[, x1, y1[, x2, y2]]) - Устанавливает шрифт Font для ячеек диапазона. Можно указать координаты только одной ячейки, можно - вообще не указать, тогда будет использован последний выделенный диапазон. Шрифт задается как обычно: 'Arial, 16, T, T, T', порядок параметров: Имя шрифта, размер, жирное начертание, курсивное начертание, одиночное подчеркивание. Если параметры не заданы, то у текущего шрифта они меняться не будут. Примеры: SetFont('Arial, 10, T, F, F', 1,1) - в ячейке A1 будет установлен шрифт Arial жирным начертанием (не курсив и без подчеркивания). SetFont(', , , T, F', 2,1) - в ячейке B1 будет поменяется только начертание курсив и будет отменено подчеркивание (если оно было). &lt;br /&gt;
&lt;br /&gt;
SaveValuesOnly - убирает формулы на текущей странице и оставляет лишь их результативные статичные значения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Цвета'''''&lt;br /&gt;
&lt;br /&gt;
SetRowFontColor(Row,Color) - Устанавливает цвет шрифта в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetRowColor(Row,Color) - Устанавливает цвет фона в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetColumnFontColor(Col,Color) - Устанавливает цвет шрифта в столбце Col. Color -  целое значение (RGB) &lt;br /&gt;
&lt;br /&gt;
SetColumnColor(Col,Color) - Устанавливает цвет фона в столбце Col. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellFontColor(Row,Col,Color) -  Устанавливает цвет шрифта в ячейке с координатами [Row,Col]. Color -  целое значение, равное номеру цвета в палитре (ColorIndex,не RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellColor(Row,Col,Color) -  Устанавливает цвет фона в ячейке с координатами [Row,Col]. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
GetRowFontColor(Row)- Возвращает RGB значение цвета шрифта строки Row&lt;br /&gt;
&lt;br /&gt;
GetRowColor(Row)- Возвращает RGB значение цвета фона строки Row&lt;br /&gt;
&lt;br /&gt;
GetColumnFontColor(Col)- Возвращает RGB значение цвета шрифта столбца Col&lt;br /&gt;
&lt;br /&gt;
GetColumnColor(Col)- Возвращает RGB значение цвета фона столбца Col &lt;br /&gt;
&lt;br /&gt;
GetCellFontColor(Row,Col) - Возвращает номер цвета шрифта в палитре (ColorIndex) в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
GetCellColor(Row,Col) - Возвращает RGB значение цвета фона в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Копи-паст'''''&lt;br /&gt;
&lt;br /&gt;
Copy(x1, y1, x2, y2) - Копирует в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Cut(x1, y1, x2, y2) - Вырезает в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Paste(x1, y1) - Вставляет из буфера экселя. Команды copy-paste неразрывны, если что нибудь сделать в промежутке между ними, например вставить значение в ячейку, то копирование сброситься. (Последовательность использования: copy - paste, cut - paste)&lt;br /&gt;
&lt;br /&gt;
PasteStyle(x1, x2, y1, y2) - Вставляет только оформление из буфера экселя (Последовательность использования:  Copy - PasteStyle)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Изображения'''''&lt;br /&gt;
&lt;br /&gt;
InsertPicture(TPicture, [x=1, y=1, DispX=0, DispY=0, width=0, height=0]) - Функция вставляет рисунок на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки, width, height (не работает для DirectExcel) - ширина и высота области рисунка в пойнтах-единицах Excel &lt;br /&gt;
&lt;br /&gt;
InsertFirmLogo(FirmCode, [x=1, y=1, DispX=0, DispY=0]) - Функция вставляет логотип фирмы с кодом FirmCode на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Вывод'''''&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки. Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SheetFitPageWidth - устанавливает режим масштабирования печати, чтобы печатная форма помещалась в ширину на один лист.&lt;br /&gt;
&lt;br /&gt;
SetOrientation(value) - Устанавливает ориентацию страницы. True (по-умолчанию) - альбомная (ландшафтная), Ложь - портретная.&lt;br /&gt;
&lt;br /&gt;
PrintOut([copies]) - Печатает текущий лист на принтере по умолчанию. Параметр copies - количество копий, по умолчанию равен 1.&lt;br /&gt;
&lt;br /&gt;
Save(filename) - Сохраняет в файл filename. Если файл существует, в основной системе он будет перезаписан, в других проектах - вызовет ошибку &amp;quot;Файл уже существует&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SetVisible(b) – Устанавливает видимость приложения Excel для пользователя. По-умолчанию – false (не видимо).&lt;br /&gt;
&lt;br /&gt;
DoNotDestroy(b) – При уничтожении объекта TExcel (а он уничтожается, как и все остальные объекты автоматически при завершении выполнения скрипта), приложение Excel уничтожается вместе с ним. DoNotDestroy(true) отключает уничтожение приложения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования'''''&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'myxl');&lt;br /&gt;
 myxl.OpenFile('c:\asdf.xlsx');&lt;br /&gt;
 set($sum, 0);&lt;br /&gt;
 while (myxl.EOF=0, &lt;br /&gt;
      set($sum, $sum+int(myxl.c));&lt;br /&gt;
      myxl.next );&lt;br /&gt;
 $sum&lt;br /&gt;
 &lt;br /&gt;
 ''Возвращает сумму всех числовых данных столбца C файла 'c:\asdf.xlsx'''&lt;br /&gt;
&lt;br /&gt;
== Объект TDirectExcel ==&lt;br /&gt;
Объект позволяет работать с файлами Excel напрямую, без установленного пакета MsOffice. Применяется в сервисах и при отсутствии экселя. Он максимально совместим с объектом TExcel, однако некоторые методы могут быть не реализованы. &lt;br /&gt;
&lt;br /&gt;
== Объект TCSVFile ==&lt;br /&gt;
Предназначен для доступа к данным документов CSV. Разделителем столбцов является символ точка с запятой ;&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
OpenFile(FileName) – Открывает файл FileName.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=false]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO.&lt;br /&gt;
&lt;br /&gt;
LoadFromText(s) - Загружает таблицу из строки s.&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). &lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(Filename) - Сохраняет в файл с именем filename.&lt;br /&gt;
&lt;br /&gt;
== Объект TADO ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к базам данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|Connect(ConnectionString)&lt;br /&gt;
|Подключает к источнику данных. ConnectionString – Строка подключения ADO.&lt;br /&gt;
|-&lt;br /&gt;
|ConnectMySQL(DBServer, DBPort, DBUser, DBPass, DBName)&lt;br /&gt;
|Подключает к базе данных MySQL.&lt;br /&gt;
|-&lt;br /&gt;
|Open(Query)&lt;br /&gt;
|Открывает набор данных выполнив запрос Query.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByNo(i)&lt;br /&gt;
|Возвращает значение поля с номером i. Нумерация полей – с нуля.&lt;br /&gt;
|-&lt;br /&gt;
|FieldName(i)&lt;br /&gt;
|Возвращает имя поля с номером i.&lt;br /&gt;
|-&lt;br /&gt;
|FieldCount&lt;br /&gt;
|Возвращает количество  полей.&lt;br /&gt;
|-&lt;br /&gt;
|RecordCount&lt;br /&gt;
|Возвращает количество записей.&lt;br /&gt;
|-&lt;br /&gt;
|RecNo&lt;br /&gt;
|Возвращает номер текущей записи. ''ВНИМАНИЕ! В зависимости от способа подключения к БД нумерация может начинаться как с 0 так и с 1!''&lt;br /&gt;
|-&lt;br /&gt;
|EOF&lt;br /&gt;
|Возвращает признак достижения конца набора данных. Становится истиной когда выполняется команда Next на последней записи.&lt;br /&gt;
|-&lt;br /&gt;
|Next&lt;br /&gt;
|Переход на следующую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|First&lt;br /&gt;
|Переход на первую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|Last&lt;br /&gt;
|Переход на последнюю запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByName(FieldName)&lt;br /&gt;
|Возвращает значение поля по имени. Также возможно указание имени поля как свойства объекта.&lt;br /&gt;
|-&lt;br /&gt;
|Field(Table, ID, FieldName)&lt;br /&gt;
|Возвращает значение поля FieldName записи с кодом ID таблицы Table. Набор данных, если он открыт, при этом не закрывается. Первичный ключ таблицы должен называться «code». Гарантированно работает только с MYSQL!!!&lt;br /&gt;
|-&lt;br /&gt;
|GetSQLValue(Query)&lt;br /&gt;
|Выполняет SQL-запрос. Текст запроса должен начинаться с первого символа строки (перед запросом не должно быть пробелов, переносов строк, комментариев и т.д.). Если запрос Insert – возвращает ID вставленной записи. Если запрос – Update, Delete, Replace, Set, Start, Commit, Rollback – возвращает количество измененных записей (RowsAffected), иначе – Select – значение первого поля первой строки результата как текст.&lt;br /&gt;
|-&lt;br /&gt;
|FillText(s)&lt;br /&gt;
|Возвращает строку s с замененными названиями полей между знаками процента на соответствующие значения текущей записи. Так же в строке возможно использование интерпретируемого кода, заключенного между тегами &amp;quot;&amp;lt;?&amp;gt;&amp;quot; и &amp;quot;&amp;gt;&amp;quot;. При интерпретации система сначала производит замену полей с процентами на значения, потом интерпретирует код. ''Внимание! Функция не создает отельный контекст интерпретатора, а использует существующий, в нем доступны все объекты и переменные, вызывающего скрипта.'' Дополнительно автоматически создается объект TSelfADO, подключенный к той же БД, что и контекст, вызвавший функцию, с пустым именем, а так же с именем &amp;quot;dataset&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|Query(Query)&lt;br /&gt;
|Синоним GetSQLValue.&lt;br /&gt;
|-&lt;br /&gt;
|Close&lt;br /&gt;
|Закрывает набор данных.&lt;br /&gt;
|-&lt;br /&gt;
|Self&lt;br /&gt;
|Возвращает указатель на подключение к БД для использования в других объектах.&lt;br /&gt;
|-&lt;br /&gt;
|ParseForIn([FieldName='code']) &lt;br /&gt;
|Возвращает через запятую значения всех строк в указанном столбце. По умолчанию, используется столбец с именем code.&lt;br /&gt;
|-&lt;br /&gt;
|GetSQL&lt;br /&gt;
|Для отладки. Возвращает последний SQL запрос переданный в методы Open, Query, GetSQLValue&lt;br /&gt;
|-&lt;br /&gt;
|ExportExcel&lt;br /&gt;
|Для отладки. Выгружает в эксель содержимое датасета. Можно использовать в незнакомом окружении для понимания передаваемых полей в : шаблонах, печатных формах и т.д. Аналог команды %echo% в шаблонах, на случай если она не сработает.&lt;br /&gt;
|-&lt;br /&gt;
|OnGetText&lt;br /&gt;
|Функция подменяет текстовый вывод значения поля при выгрузке в эксель. Первый параметр это имя поля, которое надо подменить. Второй параметр это то что необходимо вывести. Работает только с текстовыми полями. &lt;br /&gt;
'''''Пример использования'''''  &lt;br /&gt;
  DB.OnGetText('Зона', IF((DB.FieldByName('-Lat') ! 0) * (DB.FieldByName('-Lon') ! 0),&lt;br /&gt;
       	GetPolygonByLatLon(DB.FieldByName('-Lat'), DB.FieldByName('-Lon'), 'TYPE = 1 AND IFNULL(zone, 0) &amp;gt; 0 AND PRICE = ' + DB.FieldByName('-price'), 'zone')&lt;br /&gt;
  ,&lt;br /&gt;
        ''&lt;br /&gt;
  ));&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования – см. TSelfADO&lt;br /&gt;
&lt;br /&gt;
== Объект TSelfADO ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наследник объекта TADO. Служит для подключения к «родной» для программы, в которой выполняется скрипт, базе данных. Обладает всеми свойствами и методами объекта TADO, кроме Connect. Иногда автоматически создается системой для обеспечения простого доступа к базе данных, а также иногда создается системой с уже открытым набором данных для передачи обрабатываемого системой набора данных в скрипт. В этом случае для скрипта недоступны функции Open и Close.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&lt;br /&gt;
 rem('Копируем данные из &amp;quot;родной&amp;quot; базы данных в базу MSSQL.');&lt;br /&gt;
 new('TSelfADO', 'MyDB');&lt;br /&gt;
 new('TADO', 'MSSQL');&lt;br /&gt;
 MSSQL.Connect('Provider=SQLOLEDB.1;Password=myPassword;Persist Security Info=True;User ID=myUsername;Initial Catalog=myDataBase;Data Source=myServerAddress');&lt;br /&gt;
 MyDB.Open('select code, name, passport from kurier where code&amp;gt;'+Int(MSSQL.Query('select max(code) from kurier'))+' order by code');&lt;br /&gt;
 While(MyDB.EOF=0,&lt;br /&gt;
      MSSQL.Query('insert kurier (code, name, passport) VALUES ('+MyDB.Code+', '+QuotedStr(MyDB.Name)+', '+QuotedStr(MyDB.Passport)+')');&lt;br /&gt;
      MyDB.Next;&lt;br /&gt;
      );&lt;br /&gt;
&lt;br /&gt;
== Объект TPrinter ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к принтерам.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
BeginDoc – Начинает новый документ.&lt;br /&gt;
&lt;br /&gt;
EndDoc – Закрывает документ&lt;br /&gt;
&lt;br /&gt;
PageHeight – Возвращает высоту страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageWidth – Возвращает ширину страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageNumber – Возвращает номер текущей страницы документа&lt;br /&gt;
&lt;br /&gt;
Orientation – Возвращает текущую ориентацию страницы (0 – портретная, 1 – ландшафтная)&lt;br /&gt;
&lt;br /&gt;
Printing – Возвращает истину если документ открыт&lt;br /&gt;
&lt;br /&gt;
SetOrientation(Orientation) – Устанавливает ориентацию страницы. При необходимости начинает новый документ, новую страницу.&lt;br /&gt;
&lt;br /&gt;
ShowDialog – Показывает пользовательский диалог печати. Возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
NewPage – Начинает новую страницу&lt;br /&gt;
&lt;br /&gt;
Canvas – Предоставляет доступ к объекту TCanvas, связанному с принтером.&lt;br /&gt;
&lt;br /&gt;
PrinterNames – Возвращает список принтеров, установленных в системе, разделенный переносами строк&lt;br /&gt;
&lt;br /&gt;
PrintersCount – Возвращает количество установленных в системе принтеров&lt;br /&gt;
&lt;br /&gt;
SetPrinter(Printer) – Устанавливает текущий принтер. Если передана строка – ищет принтер по названию, иначе – по номеру. Нумерация начинается с 0.&lt;br /&gt;
&lt;br /&gt;
PrintTable(Y, Table) – Выводит на печать таблицу Table типа TTable, начиная с координаты Y. При необходимости таблица печатается на нескольких страницах. Возвращает координату Y конца таблицы.&lt;br /&gt;
&lt;br /&gt;
GetDefaultPrinter - Возвращает имя текущего активного принтера.&lt;br /&gt;
&lt;br /&gt;
SetDefaultPrinter(Printer) – Запоминает предыдущий активный принтер и устанавливает новый текущий принтер. Printer - имя принтера. При необходимости нескольких последовательных вызовов SetDefaultPrinter рекомендуется между вызовами использовать RestoreDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
RestoreDefaultPrinter - Устанавливает активным принтер, который был текущим перед последним вызовом SetDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
== Объект TCanvas ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предоставляет доступ к холсту объекта для прорисовки изображения.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
DPIX – Возвращает разрешение холста по горизонтали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
DPIY – Возвращает разрешение холста по вертикали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
TextOut(x, y, s[, x1, y1, x2, y2]) – Выводит строку s начиная с точки с координатами x и y. Если указаны параметры x1, y1, x2, y2 – то выводимый текст ограничивается заданным прямоугольником.&lt;br /&gt;
&lt;br /&gt;
TextOutEx(x1, y1, x2, y2, Alignment, Font, s, Indent) – Выводит строку s в прямоугольнике с координатами x1, y1, x2, y2. По горизонтали строка выравнивается в соответствии с Alignment (0 – прижато влево, 1 – вправо, 2 – по центру), по вертикали выравнивается по центру. Используя шрифт Font (см описание ниже). Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату X фактического окончания текста (правой стороны – если строка прижата влево, и левой – в остальных случаях)&lt;br /&gt;
&lt;br /&gt;
MLTextOut(x1, y1, x2, y2, Alignment, VAlignment, Font, s, Heigth, Indent) – Выводит многострочный текст s в прямоугольнике с координатами x1, y1, x2, y2 с переносом по словам. По горизонтали строки выравниваются в соответствии с Alignment, по вертикали – в соответствии с VAlignment (0 – прижато вверх, 1 – по центру, 2 – прижато вниз). Используя шрифт Font (см описание ниже). Heigth – высота строки. Если опущено или равно нулю – высота определяется автоматически в соответствии с выбранным шрифтом. Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату Y фактического окончания текста (нижней границы последней строки текста. ''ВНИМАНИЕ! Функция использует координаты прямоугольника для позиционирования текста, однако она не ограничивает его верхней и нижней границами этого прямоугольника!''&lt;br /&gt;
&lt;br /&gt;
DrawPic(x1, y1, x2, y2, Pic, Style, Alignment, Mode) – Прорисовывает изображение Pic (ссылка на изображение TPicture.Self) в прямоугольник заданный координатами x1-y2. Style – стиль масштабирования. 0 – растянуть изображение до границ прямоугольника не сохраняя пропорции, 1 – вписать изображение в прямоугольник сохраняя пропорции – вероятно, останутся поля по вертикали или горизонтали, 2 – вписать сохраняя пропорции, обрезав при необходимости изображение по вертикали или горизонтали. Alignment – выравнивание по горизонтали. Работает только в случае если style=1 и при растягивании изображения получились вертикальные поля. 0 – разместить по центру, 1 – прижать влево, 2 – прижать вправо. Функция возвращает координату X правой стороны изображения кроме случая, когда Style=1 и Alignment=2 – в этом случае возвращается координата левой стороны изображения. Mode - способ наложения изображения. 0 (по-умолчанию) - копирование как есть. 1 - Наложение операцией AND (применяется для получения эффекта прозрачности изображения), 2 - наложение операцией XOR (Применяется для возможности повторной операцией убрать изображение), 3 - Наложение операцией OR.&lt;br /&gt;
&lt;br /&gt;
FillRect(x1, y1, x2, y2) – Рисует прямоугольник '''без границ''' и закрашивает цветом BrashColor&lt;br /&gt;
&lt;br /&gt;
Rect(x1, y1, x2, y2) – Рисует прямоугольник '''c границами''', задаваемыми текущим пером, и закрашивает цветом BrashColor &lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Устанавливает шрифт по-умолчанию.&lt;br /&gt;
&lt;br /&gt;
SetPen(Width, Color) - Устанавливает параметры &amp;quot;ручки&amp;quot; - толщину и цвет. Если любой параметр опустить, соответствующее значение не будет изменено.&lt;br /&gt;
&lt;br /&gt;
SetBrush(Color, Style) - Устанавливает параметры заливки - цвет и стиль. Если любой параметр опустить, соответствующее значение не будет изменено. Стили заливки: 0 - сплошная, 1 - отсутствует (прозрачная), 2-7 - различные виды штриховки (горизонтальные, вертикальные, в клеточку и т.д.).&lt;br /&gt;
&lt;br /&gt;
TextHeight(s) – Возвращает высоту текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
TextWidth(s) – Возвращает ширину текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
Использование шрифта (Font): У объекта TCanvas есть «глобальные» установки шрифта. Однако для некоторых функций возможно указание шрифта, отличающегося от глобального. Параметры шрифта – это текстовая строка, состоящая из 6-ти параметров, разделенных запятыми: Название, размер, жирный, курсив, подчеркнутый, цвет. Например:&lt;br /&gt;
&lt;br /&gt;
 'Times New Roman, 8, Y, N, N, 255'&lt;br /&gt;
&lt;br /&gt;
Любой параметр можно опустить, и тогда вместо него будет использовано значение по-умолчанию: шрифт: arial, размер – 10, не жирный, не курсив, не подчеркнутый, цвет – черный. Например: ', 7' – указывает, что по-умолчанию нужно взять все параметры кроме размера шрифта. Также можно вместо всей строки указать тире ('-') или пустую строку, и шрифт будет использоваться «глобальный».&lt;br /&gt;
&lt;br /&gt;
Объект можно создать отдельно, не создавая объект TPrinter. В таком случае объект создастся как ссылка на текущий холст принтера (принтер должен быть запущен и начат новый документ). Такой подход используется в доп. возможности PrintCustomSticker&lt;br /&gt;
&lt;br /&gt;
== Объект TPicture ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с графическими изображениями форматов BMP, GIF, JPEG и PNG, а также для формирования штрих-кодов. Обратите внимание, прозрачность изображений не поддерживается, однако в методе TCanvas.DrawPic есть параметр Mode, призванный создавать эффект прозрачности.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(FileName) – Загружает изображение из файла FileName. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB, Query) – Загружает изображение из базы данных. DB – ссылка на подключение к базе данных TADO.Self, Query – текст запроса. Запрос должен вернуть в первом поле первой строки BLOB-поле с изображением, все остальные данные возвращаемые запросом игнорируются. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromStr($s) – Загружает изображение из строки $s. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
CreateBar(Width, Height, BarCode, Textless, Type) – Формирует штрих-код шириной Width и высотой Height с типом кодирования Type. BarCode – текст штрих-кода. Булево значение Textless указывает, что в штрих-коде не должно быть человеко-читаемых символов если истинно. Type указывает тип кодирования: 0 (по-умолчанию) CODE128, 1 - EAN-13, 2 - Interleaved 2-5, 3-DataMatrix, 4-QRCode.&lt;br /&gt;
Штрихкод должен быть: Для EAN-13 цифровым 12 или 13 символов (13-й, контрольная сумма рассчитывается автоматически), для CODE128 - должен иметь состоять из допустимого для этого кодирования набора символов. Для Interleaved - должен состоять из четного числа цифр, контрольная сумма автоматически не рассчитывается. Если для Interleaved кода указано значение из 14-ти знаков, подпись цифр выводится в формате Почты России.&lt;br /&gt;
Внимание! Для кодов EAN-13 и Interleaved ширина штрих-кода Width не является точным значением получаемого на выходе изображения. Ширина изображения рассчитывается как максимальное кратное минимально возможной ширине, но не меньше минимально возможной. Конечную ширину можно получить в соответствующем свойстве объекта. Для кода CODE128 штрих-код на выходе может оказаться пустым, если указанной ширины штрих-кода не достаточно для его формирования.&lt;br /&gt;
Для кода DataMatrix можно установить режим для печати скрытых символов с кодами 29(GS) и 232(FCN1), которые требуются для формирования Честного Знака. Для этого необходимо в начале строки указать символ &amp;quot;[&amp;quot; и все разделители 01, 21, 91, 92 так же экранировать этими скобками. Должно получиться [01]02900002317701[21]k3LInNbH_oG0Q[91]EE06[92]YXiyKfiHjE4YE8b+YVMC1O5r8VtpplA3AwcCqrcG9Dk= . При формировании кода, включится режим формирования штрих-кода DataMatrix GS1, в начале будет добавлен символ с кодом 232 (FCN1), а потом будут добавлены разделители с кодом 29 (GS)&lt;br /&gt;
Функция возвращает 1 в случае успеха, или текст ошибки, если такая произошла.&lt;br /&gt;
&lt;br /&gt;
SetSize(Width, Height) - Устанавливает размер изображения.&lt;br /&gt;
&lt;br /&gt;
AsString([ImageFormat]) - Возвращает изображение в виде строки с двоичными данными. ImageFormat принимает значения 1 - Bitmap (по-умолчанию), 2 - jpeg, 3 - png, 4 - gif.&lt;br /&gt;
&lt;br /&gt;
Width – Возвращает ширину изображения.&lt;br /&gt;
&lt;br /&gt;
Height – Возвращает высоту изображения.&lt;br /&gt;
&lt;br /&gt;
Rotate(Angle) – Поворачивает изображение по часовой стрелке на угол Angle. Угол указывается в градусах и может принимать любые значения.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с изображением, используется в качестве параметра для функций, работающих с изображениями из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Canvas - ссылка на объект TCanvas холста изображения.&lt;br /&gt;
&lt;br /&gt;
== Объект TTable ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с таблицами. Удобен для печати таблицы на принтере. Алгоритм таков: Загружаем датасет в таблицу, настраиваем ее (шрифты, штрих-коды и т.д.), потом выводим на принтер функцией TPrinter.PrintTable.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Заголовок – это первая строка таблицы.&lt;br /&gt;
&lt;br /&gt;
Cell(С, R) – Возвращает значение ячейки таблицы с координатами (C, R). Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetCell(С, R, Value) – Устанавливает значение ячейки таблицы с координатами (C, R) в Value. Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
RowCount – Возвращает количество строк в таблице.&lt;br /&gt;
&lt;br /&gt;
ColCount – Возвращает количество столбцов в таблице.&lt;br /&gt;
&lt;br /&gt;
SetTitleFont(Font) – Задает шрифт заголовка таблицы (первой строки).&lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Задает шрифт всей таблицы кроме заголовка.&lt;br /&gt;
&lt;br /&gt;
SetColFont(C, Font) - Устанавливает шрифт столбца C.&lt;br /&gt;
&lt;br /&gt;
SetIndent(Indent) – Задает отступ от границы ячейки до текста в процентах от ширины страницы. По-умолчанию значение 0.3&lt;br /&gt;
&lt;br /&gt;
SetWidth(С, Width) – Задает значение ширины столбца C в процентах от ширины страницы.&lt;br /&gt;
&lt;br /&gt;
SetMinRowHeght (Heght) – Задает значение минимальной высоты строки в пикселях. &lt;br /&gt;
&lt;br /&gt;
SetBarCode(Col, Type) - Указывает, что данные из столбца Col должны печататься в виде штрих-кода. Тип штрих-кода - Type. Значение '''&amp;quot;1&amp;quot; - EAN13'''. Для кода EAN13 первая строка данных в ячейке должна иметь вид &amp;quot;тип штрих-кода, номер&amp;quot;, например &amp;quot;7, 123&amp;quot; (без кавычек, конечно). В этом случае система сформирует штрих-код: &amp;quot;2700000001233&amp;quot;. Первая цифра - всегда 2, далее - указанный тип штрих-кода, нули, чтобы получилось 13 символов, номер, указанный в таблице, и один символ - контрольная сумма. Значение '''&amp;quot;2&amp;quot; - CODE128''' (с версии 734). Данные из первой строки ячейки таблицы печатаются в штрих-коде &amp;quot;как есть&amp;quot;. Для всех видов штрих-кода (с версии 734) последующие строки печатаются под штрих-кодом в виде текста.&lt;br /&gt;
&lt;br /&gt;
SetMultiHeader(Active) - Включает печать заголовка при переносе таблицы на несколько страниц. По умолчанию отключено.&lt;br /&gt;
&lt;br /&gt;
SetCustomHeader(script) - Включает печать пользовательского заголовка. Script - это код интерпретатора, который должен печатать заголовок на канву. Печать таблицы может происходить на нескольких листах, по этому скрипт будет вызван для каждого листа. При использовании этого метода, автоматически инициализируются переменные: $TablePageNo - номер страницы, нумерация начинается с нуля; $TableY - координата по оси Y, от которой рисуется заголовок. Чтобы таблица была под заголовком необходимо значение переменной $TableY увеличить на высоту заголовка.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с таблицей, используется в качестве параметра для функций, работающих с таблицами из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 &amp;lt;?&amp;gt;&lt;br /&gt;
 NEW('TPrinter', 'Prn');&lt;br /&gt;
 If(prn.ShowDialog,&lt;br /&gt;
  NEW('TTable', 'Tbl'); &lt;br /&gt;
  NEW('TSelfADO', 'MyDB'); &lt;br /&gt;
  MyDB.Open('SELECT concat(&amp;quot;7&amp;quot;, &amp;quot;, &amp;quot;,  a.code, &amp;quot;\r\n&amp;quot;, a.client_id, &amp;quot;\r\n&amp;quot;, a.zakaz, &amp;quot;-&amp;quot;, a.number) as &amp;quot;Штрих-код&amp;quot;, a.target AS &amp;quot;Заказик&amp;quot;, address, phone, vlog, poruch FROM address a order by code desc limit 10');&lt;br /&gt;
  Tbl.LoadFromDB(MyDB.Self); &lt;br /&gt;
  Tbl.SetBarcode(1, 1);&lt;br /&gt;
  Tbl.SetCustomHeader(     &lt;br /&gt;
    if($TablePageNo&amp;gt;0,&lt;br /&gt;
      Prn.Canvas.TextOut(Prn.Canvas.DPIX*0.1, $TableY, 'Продолжение таблицы');&lt;br /&gt;
      set($TableY, $TableY + Prn.Canvas.TextHeight('H'));&lt;br /&gt;
    ,0)&lt;br /&gt;
  );&lt;br /&gt;
  Prn.BeginDoc; &lt;br /&gt;
  Prn.PrintTable(0, Tbl.Self);   &lt;br /&gt;
  Prn.EndDoc&lt;br /&gt;
 , );&lt;br /&gt;
&lt;br /&gt;
== Объект TBaseUtils ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции, базирующиеся на БД системы «MEASOFT». По-умолчанию, при создании подключается к основной базе данных модуля, в котором выполняется скрипт, если такая определена контекстом, однако это можно изменить, см SetConnection.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
'''MakeAddress(s[,town])''' – возвращает значение, полученное путем преобразований адреса s для приведения его к внутреннему формату программы. В процессе преобразования до нескольких раз происходит замена буквосочетаний по таблице замены (ее редактирование доступно по нажатию кнопки «Автозамена» в интерфейсе импорта БД из Excel системы (см. Руководство пользователя)), поиск улиц по базе КЛАДР с точностью до одного знака, и некоторые другие операции, нацеленные на исправление ошибок в написании адреса.&lt;br /&gt;
&lt;br /&gt;
С версии программы 2008.0.0.615, при вызове функции в формулах загрузки реестра, в первую очередь происходит проверка строки s на условия:&lt;br /&gt;
* в строке s записано  число; &lt;br /&gt;
* строка s начинается с &amp;quot;ПВЗ &amp;quot;. &lt;br /&gt;
Если одно из этих условий выполняется, то функция пытается установить пункт самовывоза - т.е она сама в загружаемой карточке корреспонденции укажет: адрес ПВЗ, город ПВЗ и установит галку самовывоз. &amp;lt;br/&amp;gt;Правила поиска ПВЗ:&lt;br /&gt;
* Если s число -  считаем его внутренним кодом филиала;&lt;br /&gt;
* Если s начинается с &amp;quot;ПВЗ &amp;quot; - Например в адресе передана строка &amp;quot;ПВЗ На Ленинском проспекте&amp;quot;, то искать будем филиал с названием &amp;quot;На Ленинском проспекте&amp;quot; который подчиненный, активный, с галкой ПВЗ и в городе town. Если город не указан, то ищем филиал во всех городах, и считаем его найденным если найдем только один филиал. &lt;br /&gt;
* Если филиалы найти не удалось, функция makeaddress работает как обычно и выполняет преобразование адреса.&lt;br /&gt;
&lt;br /&gt;
Если адрес не содержит русских букв, только латиница, и курьерская служба находится в одной из стран Россия, Белоруссия, Казахстан или Украина, и город-получатель (второй параметр, town) находится так же в одной из этих стран, функция автоматически делает транслитерацию адреса на русский язык.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''SetConnection(DB) – Подключает объект к базе данных DB, где DB – ссылка на объект TADO.Self.'' '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
''SetTown(Town) – Устанавливает код текущего города (используется в некоторых функциях объекта) в значение Town. По-умолчанию текущий город – 1.''  '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
'''SetIndexLength(Length)''' – Устанавливает длину почтового индекса. По-умолчанию – 6.&lt;br /&gt;
&lt;br /&gt;
'''GetIndex(Address)''' – Возвращает почтовый индекс из адреса.&lt;br /&gt;
&lt;br /&gt;
'''GetStreet(Address)''' - Возвращает улицу до первой запятой.&lt;br /&gt;
&lt;br /&gt;
'''GetHome(Address)''' - Возвращает номер дома до второй запятой, но не более пяти символов.&lt;br /&gt;
&lt;br /&gt;
'''GetKurierByStation(station, Mass, Cash, Date_Putn)'''&lt;br /&gt;
&lt;br /&gt;
'''TownByIndex(Index[, PriorityName][, PriorityCountry])''' – Возвращает код города по индексу. В случае ошибки поиска – код текущего города. Если нашлось несколько населенных пунктов, и указано приоритетное название - выбирается населенный пункт, название которого начинается с PriorityName (если есть).&lt;br /&gt;
&lt;br /&gt;
'''TownByName(Name[,NotNeedCL=False, City=0])''' – Возвращает код города по имени. В случае ошибки поиска – возвратит код текущего города. Если параметр NotNeedCL (параметр не обязательный) установить в TRUE, тогда функция возвратит 0, если город не удалось найти. Параметр City (код региона) позволяет ограничить поиск одной областью (не обязательный, по умолчанию не используется).&lt;br /&gt;
&lt;br /&gt;
'''FillClientInfo(Excel, client, Sheet, Row, Col)''' – Выводит в эксель информацию о клиенте с кодом client на лист sheet начиная со строки row и столбца col.&lt;br /&gt;
&lt;br /&gt;
'''SavePrintFormToFile(FormType, FormNumber)''' - Сохраняет на диске файл печатной формы и возвращает путь к нему&lt;br /&gt;
&lt;br /&gt;
'''CreateTrans(Address[, Store][, Operator][,Correction])''' - Формирует запись для печати кассового чека для корреспонденции с кодом Address, для выбора кассового аппарата используется код склада Store. Если Store не указано - при исполнении в среде клиентского модуля системы использует склад, указанный пользователем в окне [[Настройка параметров рабочего места|&amp;quot;Настройка&amp;quot; - &amp;quot;Параметры&amp;quot;]], в остальных модулях - код текущего склада из [[Настройка глобальных параметров|переменной]] &amp;quot;CL&amp;quot; (&amp;quot;Текущий филиал&amp;quot;). Поле Operator позволяет указать кассира (передается код справочника сотрудников). Если не указан, в основной системе будет использован код авторизованного пользователя, в других модулях - 1.&lt;br /&gt;
Поле Correction позволяет указать данные для корректировочного чека, используется в системе Штрих-М. По умолчанию пустая строка. Возвращает идентификаторы записей чеков. Может вернуть пустую строку, если чек создавать не понадобилось, один или несколько кодов через запятую, если создано несколько чеков. В случае ошибки вызывает ошибку, поэтому рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CreateReturnTrans(Address)''' - формирует запись для печати чека возврата для корреспонденции с кодом Address. Чек возврата печатается на полную сумму и с теми же атрибутами, что и чек продажи. Возвращает идентификатор записи чека возврата. В случае ошибки вызывает ошибку, поэтому, как и с CreateTrans,  рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownDeliveryDays(Source, Mode, TownTo, TownFrom)''' - возвращает количество дней необходимых на доставку отправления, только для межгорода. Source - код клиента, Mode - режим срочности, TownFrom - код города отправителя, TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcDeliveryDate(Source, Mode, TownTo, TownFrom, Date_Beg, Time_beg)''' - Возвращает планируемую дату доставки с учетом сроков доставки. Работает при городской и междугородней доставке. Для межгорода сроки доставки берутся из зон. Для городской доставки, из дополнительных параметров статуса (17 статус, 1 параметр в доп. информации)  Если рассчитать дату планируемой доставки не удалось, возвращает пустую строку. Параметры: Source - код клиента, Mode - режим срочности, TownTo - город получатель, TownFrom - город отправитель, date_beg - дата заказа (может быть передана строкой в формате DD.MM.YYYY или в числовом), time_beg - время заказа. &lt;br /&gt;
&lt;br /&gt;
'''GenSpecialSMA(DirectExcel, Code)''' - функция для генерации отчета о доставке по акту передачи денег. Первый параметр - указатель на TDirectExcel, второй параметр - код акта передачи денег. АПД выводится на текущий лист объекта TDirectExcel.&lt;br /&gt;
&lt;br /&gt;
'''CreateSpecialSMA(ClientCode, DateTo)''' - Функция создает исходящий акт передачи денег (АПД). Требует ClientCode - код клиента, DateTo - дату акта. Функция возвращает коды созданных актов. Если возвращаемых параметров два, значит функция пыталась создать два АПД: первым, идет код АПД с наличной оплатой, а вторым с безналичной. Примеры возвращаемого результата: '0'- акт не был создан, отсутствуют корреспонденции; '124' - код созданного акта; '0,0' - пытались создать два акта, но отсутствуют данные; '4556,0' - создан только наличный АПД; '0,445' - создан только безнал.; '4556,445' - созданы нал. и безнал.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressForActDelivery(ActCode, [DeliveryDateMode=0, Delivery=True])''' - Функция создает корреспонденцию на доставку акта. ActCode - код акта; DeliveryDateMode: 0 - установить план. дату доставки текущим рабочим днем, 1 - установить план. дату доставки следующим рабочим днем, 2 - установить план. дату доставки равной планируемой дате оплаты АПД; Delivery - создать корр. на доставку АПД или создать корреспонденцию на забор АПД (по умолчанию, доставка АПД). Работа функции может быть изменена системной доп. возможностью OnCreateAddressForActDelivery.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressTransferAct(ClientCode, Store, DateTo, [AdditionalParam])''' - Функция создает исходящий акт передачи корреспонденции (АПК). Требует  ClientCode - код клиента, Store - код филиала, для которого будет создан акт, DateTo - дату, до которой в акт попадут возвраты, AdditionalParam - дополнительный строковый параметр для передачи в системную доп. возможность ExceptionsForAPK, позволяющий отобрать в акт, например, только полные возвраты.   Возвращает код созданного акта. ВНИМАНИЕ: при создании АПК используется системная функция ExceptionsForAPK. Если в ней используются интерактивные функции (вывод сообщений, диалоговые окна, выполнение скриптов), то акт сформирован не будет, а функция CREATEADDRESSTRANSFERACT вернет ошибку.     &lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByAddress(Address, TownCode, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попал адрес. Если полигон найти не удалось, функция возвратит пустую строку. Address - адрес корреспонденции текстом; TownCode - код города; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByAddress(addressrecord.address, if((addressrecord.number=0)*(addressrecord.strbarcode=&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;), addressrecord.townfrom, addressrecord.townto), '`schema`=1') - пытаемся найти вхождение адреса в полигоны 1 схемы, при выборе города учитывается корр. на забор, у нее нужно использовать город-отправитель (а для обычной корр. нужен город-получатель).&lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByLatLon(Lat, Lon, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попали GPS координаты. Если полигон найти не удалось, функция возвратит пустую строку. Lat - широта  текстом; Lon - долгота текстом; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByLatLon('55.769064','37.590713','zone is not null and price=0') - пытаемся найти вхождение координат в полигоны, где задана зона, для всех клиентских и курьерских зон.&lt;br /&gt;
&lt;br /&gt;
'''GetLatLonByAddress(AddressText, TownCode)''' - возвращает географические координаты вида lat,lon указанного в AddressText адреса. Поиск производится в городе, имеющем код TownCode в таблице Town.&lt;br /&gt;
&lt;br /&gt;
'''GetRouteCode(AddressText, TownCode, LatLon[, Lon])''' - для адреса AddressText в городе с кодом TownCode (из таблицы Town) по географическим координатам lat, lon возвращает код роута (записи, хранящей координаты адреса в городе). Если роут не найден (для адреса в городе не найдено записи с указанными координатами) - создает новый роут и возвращает его код, если роут найден (был создан ранее) - обновляет у роута координаты. Если параметр Lon задан, то параметр LatLon должен содержать одну координату, иначе LatLon должен содержать строку вида 'lat, lon'.&lt;br /&gt;
В случае ошибки возвращает Null.&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode(address, townto, '55.114034, 36.592397'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Троицк, Полковника милиции Курочкина ул., 11', 1, '37.467446, 55.740537'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Обнинск, Маркса пр., 20', TownByName('Обнинск'), 55.114034, 36.592397));&lt;br /&gt;
&lt;br /&gt;
'''CalcAgentPrice(AddressCode, AgentCode, TownFrom, TownTo, Mode, [, Count=1])''' - функция возвращает стоимость доставки рассчитанную по тарифу агента. AddressCode - код адреса, AgenCode - код филиала (агента), TownFrom - код города отправителя, TownTo - код города получателя, Mode - режим срочности, count - тарифная сетку от указанного количества отправлений (по умолчанию 1)&lt;br /&gt;
&lt;br /&gt;
'''SetAddrKol_vo(address, getkol_vo)''' - функция делает прием корреспонденции в текущем ответственном филиале. address - внутренний код адреса, getkol_vo - количество принимаемых мест, может принимать значения: &amp;quot;kol_vo&amp;quot; - принять все места, &amp;quot;getKol_vo+1&amp;quot; - принять еще одно место, &amp;quot;число&amp;quot; - сделать количество принятых мест равным указанному числу.&lt;br /&gt;
&lt;br /&gt;
'''CalcClientCnt(client_code, date, is_intown [, date_put=CurrDate(), skipajust=false])''' - функция расчета количество доставленных корреспонденций у клиента с кодом client_code за предыдущий месяц от даты date (Или за текущий месяц, подробнее смотри переменную UseCurrentMonthCount) среди внутригородских (is_intown = true) либо междугородних (is_intown = false) корреспонденций, date_put - дата доставки (для альтернативного способа подсчета, включаемого переменной UseDatePutForCalcCnt), skipajust - не учитывать принудительно введенные количества (таблица priceclientadjust типы записей 0 и 1).&lt;br /&gt;
&lt;br /&gt;
'''GetBasePrice''' - возвращает базовую стоимость доставки посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов,зоны,типа,срочности,массы, расстояния. В системах с выключенными доп. услугами также считает проценты от суммы и страховки. &lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset._self&amp;quot;.&lt;br /&gt;
  Описание некоторых полей датасета:&lt;br /&gt;
    pmoney - процент от суммы;&lt;br /&gt;
    pmoneycard - процент от суммы при оплате картой;&lt;br /&gt;
    pricecode - код прайса (таблица Price) ;&lt;br /&gt;
    distarea - район метро получателя (актуально при отключённом едином районировании, как правило район от 200 до 299 является признаком области);&lt;br /&gt;
    region - признак области при включенном едином районировании;&lt;br /&gt;
    distareaFrom и regionFrom  - аналог distarea, region только для отправителя;&lt;br /&gt;
    pcncode - код записи таблицы pricecnt &amp;quot;количество от&amp;quot;;&lt;br /&gt;
    Запрос содержит поля таблицы pricelinesnew - начальная стоимость по тарифной сетки, найденные без учета массы,только по типу срочности и режиму.&lt;br /&gt;
    Запрос содержит поля таблицы price.&lt;br /&gt;
&lt;br /&gt;
*addressrecord - ссылка на объектную модель карточки корреспонденции, следует использовать уже созданную addressrecord._self&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*type - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*wait - количество минут ожидания (не учитывается при доп. услугах, есть системная услуга &amp;quot;ожидание&amp;quot;);&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*rur - сумма передаваемых денег (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от суммы&amp;quot;);&lt;br /&gt;
*inshprice - сумма страховки (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от объявленной стоимости&amp;quot;);&lt;br /&gt;
*distance - расстояние до места доставки, обычно поле заполняется при доставке в область (регион в едино районировании). Дополнительная наценка к стоимости доставки;&lt;br /&gt;
*forward - направление доставки: true - туда; false - обратно;&lt;br /&gt;
*Collection - признак заборной корреспонденции: true - забор, false - доставка (В тарифе есть возможность указать стоимость для забора);&lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
В тарифе есть возможность указать формулу, которая может влиять на базовый расчет. Формула может объявить служебные переменные, которые:&lt;br /&gt;
*$FormulaReplace - если true – возвращаемое значение полностью заменяет базовый расчет;&lt;br /&gt;
*$FormulaKoeff - коэффициент на который будет помножена базовая стоимость.&lt;br /&gt;
Также внутри формулы объявлены следующие объекты dataset, addressrecord и переменные:&lt;br /&gt;
*$ForceIntown - Переменная становится истиной, если междугородний расчет был отменен, т.к. адрес попал в нарисованную зону на карте.&lt;br /&gt;
*а также: $forward, $distance, $Count, $Collection, $Wait, $FormulaKoeff, $PriceCode - описание есть выше.&lt;br /&gt;
&lt;br /&gt;
Для направления &amp;quot;туда&amp;quot;, Функция GetBasePrice вызывается  через доп. услугу &amp;quot;База&amp;quot; (при включенных доп. услугах), для направления &amp;quot;Обратно&amp;quot; всегда вызывается напрямую (т.к. доп. услуги работают только в для направления &amp;quot;туда&amp;quot;).&lt;br /&gt;
На расчет этой функции влияют следующие переменные: &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Расчет стоимости по адресу&amp;quot;, &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Зона клиента по умолчанию&amp;quot;,  &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Подсчет кол-ва отправлений за месяц&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownPrice''' - возвращает базовую стоимость междугородней доставки, посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов, типа, срочности, массы, расстояния.&lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset.self&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*tp - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcAddressPrice(AddressCode, [,ZakazCount])''' - полностью пересчитывает стоимость доставки корреспонденции по тарифу клиента. AddressCode - внутренний код адреса, ZakazCount - не обязательный параметр, кол-во заказов от клиента.&lt;br /&gt;
&lt;br /&gt;
'''GetStationCode(s [,town])''' – возвращает код станции метро, ассоциированный в системе с адресом s. В случае невозможности идентифицировать станцию метро – возвращает 0. &lt;br /&gt;
Когда включено районирование по карте, необходим второй параметр &amp;quot;town&amp;quot; - код города в котором нужно искать адрес.  Возвращает код района если удалось его найти; код станции меж-города - если адрес удалось геокодировать, но район не нашли; код 0 - когда не удалось геокодировать адрес.&lt;br /&gt;
&lt;br /&gt;
'''RecalcSpecialSMA(ActCode)''' - пересчитать акт передачи денег (АПД). Также, у корреспонденций входящих в АПД будет пересчитана стоимость доставки. Для Входящего АПД сумма акта не пересчитывается. Параметр ActCode - внутренний код акта, коды можно перечислять через запятую.&lt;br /&gt;
&lt;br /&gt;
'''UserCode''' - Возвращает код текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserName''' - Возвращает имя текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserPass''' - Возвращает пароль текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''UserBaseCode''' – Возвращает код текущего пользователя из таблицы «Сотрудники» (kurier).&lt;br /&gt;
&lt;br /&gt;
'''UserEmail''' - Возвращает e-mail текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''CurrentTown''' – Возвращает код текущего города (из таблицы town).&lt;br /&gt;
&lt;br /&gt;
'''CurrentCity''' – Возвращает код текущего региона (из таблицы city).&lt;br /&gt;
&lt;br /&gt;
'''CurrentLocation''' – Возвращает код текущего филиала (из таблицы store).&lt;br /&gt;
&lt;br /&gt;
'''FromEmailStr''' - строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
'''FillExcelDoc'''(Excel, Dataset, FormType, FormNumber,Print,[printer]) - Выполняет указанную печатную форму в объекте excel. Excel объект можно не указывать, тогда функция сама создаст объект экселя и разрушит его, полезно когда книгу &lt;br /&gt;
нужно распечатать или отправить по email (на листе данных в ячейке 1,1 укажите ключевое слово email). Dataset объект с данными для скрипта в печатной форме, может быть null. Dataset передавать можно так db.self, тогда переданный dataset внутри печатной формы будет доступен по имени dataset. Print - печатает книгу на принтере, после печати объект excel разрушается, при использовании параметра не указываете объект excel. Printer - имя принтера, на котором печатать (по умолчанию пустая строка, что означает &amp;quot;печатать на принтере по умолчанию&amp;quot;). Например:&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'excel');&lt;br /&gt;
 FillExcelDoc(excel.self, null, 12, 1);&lt;br /&gt;
 excel.DoNotDestroy(true);&lt;br /&gt;
 excel.SetVisible(true);&lt;br /&gt;
 ''Покажет эксель с выполненной печатной формой''&lt;br /&gt;
&lt;br /&gt;
'''ValutaSign''' – Возвращает название валюты для суммы.&lt;br /&gt;
&lt;br /&gt;
'''SendToMeasoft(xml)''' - Отправляет запрос в клиентское API Measoft. Автоматически добавляет начальный &amp;quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''InsertFirmAtt(excel, sheet, firmcode)''' - Вставляем на лист эксель по коду фирмы: печать, подпись, подпись бухгалтера, логотип. Тэги &amp;lt;STAMP&amp;gt;, &amp;lt;DIR&amp;gt;, &amp;lt;BUH&amp;gt;, &amp;lt;LOGO&amp;gt; соответственно. После тега можно указать размеры изображения в символах Microsoft Excel. Формат записи: &amp;lt;STAMP&amp;gt; 16, 16&lt;br /&gt;
&lt;br /&gt;
'''PreCalcSalary(kurier, addressCodes)''' - Рассчитывает предварительную зарплату. Kurier - код курьера, используется для определения тарифа. addressCodes - коды адресов, через запятую для которых необходимо посчитать зарплату. Результаты расчета будут записаны в таблицу kurierpaydetail, так как расчет предварительный то записи не будут прикреплены к конкретному начислению. &lt;br /&gt;
&lt;br /&gt;
  select a.code, kpd.price as &amp;quot;туда&amp;quot;, kpd2.price as &amp;quot;обратно&amp;quot; from address a &lt;br /&gt;
  left join kurierpaydetail kpd on kpd.sourcetable=3 and kpd.sourcecode=a.code and kpd.rectype = 1 &lt;br /&gt;
  left join kurierpaydetail kpd2 on kpd2.sourcetable=3 and kpd2.sourcecode=a.code and kpd2.rectype = 2&lt;br /&gt;
  where a.code in (...)&lt;br /&gt;
&lt;br /&gt;
'''CalcSalary(DateTo, [Filter=0, KurierCode = 0, ManagerCode = 0])''' - Полный расчет зарплаты курьерам. DateTo  - дата до которой создается начисление. Условия отбора курьеров для начисления. Filter - роль сотрудника: 0 - Все, 1 - курьеры, 2 - менеджеры; KurierCode - код курьера, ограничить расчет зарплаты одним курьером;ManagerCode - код курьера, ограничить расчет зарплаты курьерами указанного менеджера. Внимание фильтры Filter, KurierCode и ManagerCode накладываются друг на друга. Результатом функции является SubSQL с информацией по созданным начислениям. &lt;br /&gt;
  поля ответа: код курьера, код менеджера, начислено, бонусы, штрафы, аванс, итого;&lt;br /&gt;
  select kurier, manager, profit, bonus, shtraf, prepay, total  [union select ...]&lt;br /&gt;
&lt;br /&gt;
'''SelDistAddr(s)''' – Возвращает строку для вставки в select запрос, для вывода поля с упрощенным адресом. Принимает один необязательный строковый параметр - алиас таблицы из которой будет упрощаться поле address, по умолчанию &amp;quot;a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''VoiceReadStr(str)''' – Озвучивает фразу str голосовым уведомлением доступными словами из базы. Может содержать тег &amp;quot;{break_off}&amp;quot; для того, чтобы сделать эту фразу не пропускаемой в очереди воспроизведения.&lt;br /&gt;
&lt;br /&gt;
'''CalcStorageCost(ClientCodes, DateFrom, DateTo, NeedReport[, Store])''' – рассчитывает стоимость хранения на складе для выбранных клиентов (ClientCodes - коды клиентов через запятую), в период дат с DateFrom до DateTo, с прикреплением к корреспонденции отчета в зависимости от выставленного параметра NeedReport. Может содержать параметр Store - код филиала, по умолчанию пустой (расчет выполняется для всех филиалов). Возвращает коды созданных корреспонденций через запятую.&lt;br /&gt;
&lt;br /&gt;
'''WriteOut(DocId, ItemId, Date, Cnt[, BC])''' – производит списание товара со склада. DocId - код (docs.code) документа списания, ItemId - код товара (item.code), Date - дата операции, Cnt - количество списываемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер. Если указан BC, то параметр ItemId игнорируется и поиск номенклатуры происходит исключительно по штрих-коду. В случае успеха, функция возвращает строку вида: код номенклатуры, списанное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''IncomePurch(DocId, ItemId, Date, Cnt[, BC, Location = CurrentLocation])''' – производит приход товара на склад. DocId - код (docs.code) приходной накладной, ItemId - код товара (item.code), Date - дата операции, Cnt - количество приходуемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер, Location - код склада (store.code).  В случае успеха, функция возвращает строку вида: код номенклатуры, введенное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''CreateLedgerDoc(Date, Client, UserCode, Type[, ExtNumber, Message])''' - создает складской документ и возвращает код этого документа. Date - дата документа. Client - код клиента. UserCode - код пользователя, создавшего документ. Type - тип документа (statetype = 13). ExtNumber - номер у поставщика для документов прихода и расхода. Message - комментарий к документу. Последние два аргумента не обязательные и могут быть пустыми.&lt;br /&gt;
&lt;br /&gt;
== Объект TINIFile ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции работы с ini-файлами. В некоторых контекстах создается автоматически для предоставления доступа к настроечному файлу модуля, выполняющего скрипт.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
IniParam(s[,section='common']) – Существует только если имя экземпляра объекта пустое. Возвращает значение параметра s ini-файла секции «common», изменить секцию можно не обязательным параметром section. В случае отсутствия параметра в файле возвращает пустую строку. &lt;br /&gt;
&lt;br /&gt;
Param(s) – Синоним IniParam с тем отличием, что существует только если имя объекта непустое.&lt;br /&gt;
&lt;br /&gt;
SetText(s) - Загружает ini файл из строки s. Если в файле нет секции «common», то принудительно объявляет ее в начале.&lt;br /&gt;
&lt;br /&gt;
== Объект TSMS ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для отправки SMS, а также проверки статуса их доставки.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetProxy(Server, Port, User, Pass) - Устанавливает настройки прокси-сервера.&lt;br /&gt;
&lt;br /&gt;
Connect(Provider, Host, User, Pass, SenderName, SMSPrefix) – Подключает объект к провайдеру provider, используя адрес Host, имя пользователя User и пароль Pass. Значение SMSPrefix предназначено для того, чтобы провайдер мог различить сообщения от разных филиалов, если этими филиалами используется одно подключение. Если необходимости разделять сообщения нет - значение SMSPrefix можно не указывать.&lt;br /&gt;
Для провайдера доступны значения 'mirsms', 'sms16', 'websms', 'epochta', 'zanzara', 'SMSManager', 'f1sms', 'BitCall', 'mirsmsGET', 'AMD' и другие, либо можно указать числовые значения номера протокола, от 1 до &amp;lt;rspoiler text=&amp;quot;20&amp;quot;&amp;gt;Набор провайдеров все время дополняется, количество и номера можно смотреть в Справочники - Переменные - Подключения - SMS&amp;lt;/rspoiler&amp;gt; соответственно. Эти значения соответствуют значениям переменной SMSProtocol таблицы &amp;quot;Value&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SendSMS(Phone, Text, [ID]) – Отправляет SMS с текстом Text на телефон Phone. Для некоторых провайдеров необходим уникальный идентификатор сообщения ID (для провайдера iVoice - идентификатор сценария (кампании)). Возвращает ID провайдера для последующей проверки статуса доставки.&lt;br /&gt;
&lt;br /&gt;
CheckSMS(ProviderID) – Проверяет состояние доставки сообщения с идентификатором ProviderID. Возвращает: 0 – доставляется, 1 – успешно доставлено, 2 – не доставлено.&lt;br /&gt;
&lt;br /&gt;
ReceiveSMS(InboxID, DateFrom, DateTo, NewOnly) - Получает входящие SMS, с ящика InboxID (идентификатор выдаётся провайдером). DateFrom, DateTo - задается временной интервал в котором были приняты сообщения(формат 08.04.2013 18:00:00 'DD.MM.YYYY HH:NN:SS'). Чтобы получать только новые сообщение поле NewOnly должно быть True. Возвращает XML с сообщениями.&lt;br /&gt;
&lt;br /&gt;
ExtraResult([ParamName='']) - Вызывается после CheckSMS, возвращает дополнительную информацию по последнему статусу смс. В настоящее время работает только для провайдеров BitCall и iVoice. Для BitCall по умолчанию возвращает кнопки, нажатые абонентом во время работы с голосовым меню. Если в paramname указать 'IdentifyText' то будет возвращен JSON  с ответами абонента на заданные вопросы(используется в случае звонков с индивидуальным сценарием). Для iVoice по умолчанию подразумевается параметр 'response', при этом будет возвращен JSON  с ответами абонента на заданные вопросы (в зависимости от сценария)&lt;br /&gt;
&lt;br /&gt;
Log - Возвращает последний HTTP запрос и ответ от сервера смс.&lt;br /&gt;
&lt;br /&gt;
== Объект TXML ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга XML-данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст XML документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию. Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля.&lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
AttribCount – Возвращает количество атрибутов текущего элемента.&lt;br /&gt;
&lt;br /&gt;
AttribName(i) – Возвращает имя атрибута с номером i.&lt;br /&gt;
&lt;br /&gt;
Attrib(V) – Ищет атрибут и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
== Объект TJSON ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга JSON-данных. &lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст JSON документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля. &lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Можно проверять наличие элементов, если элемента нет, вернется пустая строка.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
isArray - Возвращает true, если текущий элемент является массивом (доступ к дочерним элементам возможен только по индексу, нумерация элементов начинается с нуля)&lt;br /&gt;
&lt;br /&gt;
==Объект TZip==&lt;br /&gt;
Предназначен для работы с Zip архивом. &lt;br /&gt;
&lt;br /&gt;
SetZip(s) - Загружает архив в объект из строки s;&lt;br /&gt;
&lt;br /&gt;
GetZip - Возвращает архив в виде строки;&lt;br /&gt;
&lt;br /&gt;
AddFromFile(SrcPath, ZipPath) - Добавляет файл SrcPath в архив и располагает его по пути ZipPath. ZipPath содержит имя файла в архиве, при необходимости можно указать каталог; &lt;br /&gt;
&lt;br /&gt;
AddFromStr(Data, /*ZipPath*/) - '''параметр ZipPath временно не работает'''. Добавляет файл из строки Data в архив и располагает его по пути ZipPath.  -ZipPath содержит имя файла в архиве, при необходимости можно указать каталог;&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(path) - Загружает архив из файла path;&lt;br /&gt;
&lt;br /&gt;
SaveToFile(path) - Сохраняет архив в файл path;&lt;br /&gt;
&lt;br /&gt;
Count - Возвращает кол-во файлов в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByIndex(index) - Возвращает распакованный файл в виде строки. Index - номер файла в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByName(ZipPath) - Возвращает распакованный файл в виде строки. ZipPath - путь к файлу в архиве, может содержать каталоги;&lt;br /&gt;
&lt;br /&gt;
FileName(index) - По номеру файла, функция возвращает полный путь файла в архиве.&lt;br /&gt;
&lt;br /&gt;
==Объект TBase==&lt;br /&gt;
&lt;br /&gt;
'''Функции общего назначения''':&lt;br /&gt;
&lt;br /&gt;
'''ExecSimpleScript(Caption, Text)''' - Выполняет скрипт &amp;quot;Дополнительных возможностей&amp;quot;. Возвращаемые значения, введенные пользователем устанавливает в переменные $scriptvar1..$scriptvarN, Значения кодов списочных переменных - в переменных $scriptvar1codes..$scriptvarNcodes. Функция возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot; в диалоговом окне.&lt;br /&gt;
&lt;br /&gt;
'''FillAdvPriceReport(Excel, AddressCodes, StartLine, StartCol, [ShowSumPrice,InsertColumns,ShowAll])''' - добавляет отчёт по дополнительным услугам. В AddressCodes - указаны коды адресов через запятую, каждый код это отдельная строка отчета. Адреса будут показаны в порядке перечисления их в AddressCodes. Если в отчет нужно добавить пустую строку, то можно указать код адреса -1000. StartLine, StartCol - верхний левый угол выгружаемой таблицы. ShowSumPrice - добавить столбец итоговый столбец с суммой всех услуг, по умолчанию выключено. InsertColumns - раздвинуть таблицу перед вставкой отчета, позволяет встраивать отчет посередине выгрузки, по умолчанию выключено. ShowAll - показать все дополнительные услуги, по умолчанию false и показывает только услуги с начислениями. Функция возвращает количество использованных столбцов.&lt;br /&gt;
&lt;br /&gt;
'''PrintSticker(Codes, [ToBoxes=False])'''&lt;br /&gt;
&lt;br /&gt;
'''PrintBlanc(Codes, BlancNumber)''' - печатать форму из раздела &amp;quot;Заполнить бланк&amp;quot;. Codes - коды корреспонденций, BlancNumber - номер формы из раздела &amp;quot;Бланки для корреспонденции&amp;quot; (3)&lt;br /&gt;
&lt;br /&gt;
'''GetItemByName(Name)'''&lt;br /&gt;
&lt;br /&gt;
'''GetA4Printer''' - возвращает имя принтера выбранного для печати документов&lt;br /&gt;
&lt;br /&gt;
'''GetStickerPrinter''' - возвращает имя принтера выбранного для печати стикеров&lt;br /&gt;
&lt;br /&gt;
'''GetDuplexPrinter''' - возвращает имя принтера выбранного для двусторонней печати, если принтер не выбран, возвращает пустую строку&lt;br /&gt;
&lt;br /&gt;
'''PrintAttachPDFPage(Code, FileName, Page, Printer)''' - печатает страницу из вложенного файла PDF. Code - код вложения (attachment) или путь к файлу, Page - номер страницы, Printer - 0 = принтер A4, 1 = принтер этикеток. &lt;br /&gt;
&lt;br /&gt;
'''AttachPDFToText(Code, [TextFileName])''' - преобразует файл PDF из вложений в текст. Code - код вложения (attachment) или путь к файлу, TextFileName - имя текстового файла, в который записывается результат (если не указан, используется временный файл). Возвращает текст в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''GhostScript(GScript, Code)''' — функция для выполнения консольных команд утилиты [https://ghostscript.readthedocs.io/en/latest/Use.html ghostscript]. Где, GScript — строка с командами Ghostscript; Code — код вложения или путь к PDF-файлу, предназначенному для обработки. В командах доступен специальный тег %MeasoftInFile%, который автоматически заменяется на путь к предварительно загруженному файлу (Code). Если в команде необходимо указать путь для сохранения результата обработки, используйте тег %MeasoftOutFile%. В этом случае функция на основании параметра Code автоматически сформирует имя временного выходного файла. После успешного выполнения команд функция возвращает путь к сгенерированному выходному файлу -  %MeasoftOutFile%.&lt;br /&gt;
&lt;br /&gt;
'''GetActiveForm([SkipFormName])''' - возвращает код активной формы в программе где происходит сканирование. SkipFormName - не обязательны параметр, имя формы которую нужно пропустить при определении интерфейса.&lt;br /&gt;
 '''Список интерфейсов''': &lt;br /&gt;
 0 - неопределенный; &lt;br /&gt;
 1 - прием корреспонденции на склад; &lt;br /&gt;
 2 - АПД; &lt;br /&gt;
 3 - комплектация адресов (ShelfingForm); &lt;br /&gt;
 4 - доска приема; &lt;br /&gt;
 9 - вкладка «Манифесты»; &lt;br /&gt;
 10 - Инвентаризация корреспонденции; &lt;br /&gt;
 11 - АПК; &lt;br /&gt;
 12 - вкладка «Адреса»; &lt;br /&gt;
 13 - вкладка «Выдача»; &lt;br /&gt;
 14 - вкладка «Склад»; &lt;br /&gt;
 15 - Список номенклатуры; &lt;br /&gt;
 16 - Инвентаризация склада; &lt;br /&gt;
 17 - Приходная накладная; &lt;br /&gt;
 18 - Списание товара; &lt;br /&gt;
 19 - Карточка корреспонденции.&lt;br /&gt;
&lt;br /&gt;
'''AddAddressScanLog(Code[, StrBarCode, IsManual, FromInterface, ExtraInfo])''' - добавляет событие сканирование для корреспонденции с кодом Code. Необязательные параметры: StrBarCode - сканируемый ШК корреспонденции (по умолчанию пустой), IsManual - галка ручного сканирования (по умолчанию false), FromInterface - код интерфейса сканирования (StateType=81, по умолчанию 0 - неопределенный), ExtraInfo - текстовый комментарий события.&lt;br /&gt;
&lt;br /&gt;
'''RuleName(alias)''' - Выдает полный путь в дерева прав по псевдониму права.&lt;br /&gt;
&lt;br /&gt;
'''ShowText(Caption:string, Value:string)''' - показывает пользователю окно с заголовком Caption и с многострочным полем со значением Value. Может быть полезен при отображении логов выполненной операции. &lt;br /&gt;
&lt;br /&gt;
'''ShowScanError(msg [, Speek, Color, Abort])''' - выдает пользователю окно с текстом msg блокируя последующие действия сканирования. Если Speek - истинно, то сообщение проговаривается голосовым движком, по умолчанию выключено. Color - целочисленное число цвета, в который будет окрашен фон сообщения (по умолчанию = -1, стандартный). Abort  - прервать выполнение скрипта, не показывая ошибку.&lt;br /&gt;
&lt;br /&gt;
'''CheckRule(alias)''' - функция проверки разрешения у текущего пользователя системы, alias - псевдоним права. Возвращает 1, если право есть и 0, если права нет. &lt;br /&gt;
 Пример: if(CheckRule('RSE'), ShowMessage('У пользователя есть право изменять счета'), ShowMessage('У пользователя нет права изменять счета'));&lt;br /&gt;
&lt;br /&gt;
'''GetKurierMoney(KurierCode, DateEnd, NonCash)''' - возвращает баланс курьера с кодом KurierCode на дату DateEnd. NonCash - булевый флаг, если истинно, то будет рассчитан безнальный баланс; &lt;br /&gt;
&lt;br /&gt;
'''Функции, работающие только в импорте БД из эксель:'''&lt;br /&gt;
&lt;br /&gt;
ReplaceAddress&lt;br /&gt;
&lt;br /&gt;
GetItemByCode - Поиск товара по артикулу. Внимание: в пределах одного клиента может быть несколько товаров с одинаковыми артикулами. В этом случае функция найдет последний заведенный товар.&lt;br /&gt;
&lt;br /&gt;
GetPrice&lt;br /&gt;
&lt;br /&gt;
GetNewNumber - используется при импорте реестра, возвращает номер конверта в загружаемом заказе&lt;br /&gt;
&lt;br /&gt;
GetNewPos - используется при импорте реестра, возвращает порядковый номер вложения&lt;br /&gt;
&lt;br /&gt;
GetNewPackagePos- используется при импорте реестра, возвращает порядковый номер места&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zakaz - возвращает номер заказа куда происходит импорт реестра&lt;br /&gt;
&lt;br /&gt;
addresscode  -  используется при импорте реестра, код созданного адреса&lt;br /&gt;
&lt;br /&gt;
Source  - код заказчика&lt;br /&gt;
&lt;br /&gt;
ClientTown - Узнаем город клиента, через филиал с которым он работает. Сам клиент берется из заказа указанного в окне &amp;quot;Импорт БД из Excel&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Объект TFieldObject ==&lt;br /&gt;
Создается только автоматически. Объект для доступа к записям, используется в картах и дополнительных услугах (addressrecord) и событиях карточки корреспонденции (fieldlist). Методы объекта:&lt;br /&gt;
&lt;br /&gt;
'''_GetTableInfo''' - возвращает данные о полях и примеры данных объекта.&lt;br /&gt;
&lt;br /&gt;
'''_Self''' - возвращает ссылку на объект.&lt;br /&gt;
&lt;br /&gt;
'''_Set(fieldname, fieldvalue [, DoUpdateForm])''' - Если базовый объект строка. Устаналивает для поля fieldname значение fieldvalue. DoUpdateForm по уолчанию false, если указать true то обновление поля будет не только в объекте но и пользовательском интерфейсе. Обновление работает только в карточке корреспнденции для ограниченного набора полей: vlog, mode, type, date_put, time_put, message, kurier, state1.&lt;br /&gt;
&lt;br /&gt;
'''_Set(keyfield, keyvalue, filed, value)''' - Если базовый объект таблица (addressrecord.boxes). Работает перегруженная версия метода _set, cначала происходит поиск строки по ключу, далее меняется значение указанного столбца. keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца.  Пример, отключение услуги база:&lt;br /&gt;
&lt;br /&gt;
 addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
 priceconf - поле где записан код услуги;&lt;br /&gt;
 1 - услуга База;&lt;br /&gt;
 active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
== Объект TMessage ==&lt;br /&gt;
Создается только автоматически. Объект используется для скриптовой обработки письма в [https://wiki.courierexe.ru/index.php/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8#.D0.98.D0.BC.D0.BF.D0.BE.D1.80.D1.82_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85| заданиях импорта данных]. В себе содержит текст письма в очищенном формате и оригинальном формате HTML, отправитель письма, тему письма, дата получения и список прикрепленных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.Text''' - возвращает очищенный от HTML-тегов текст письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.HTMLText''' - возвращает оригинальный текст письма со всеми HTML-тегами.&lt;br /&gt;
&lt;br /&gt;
'''Message.Sender''' - возвращает email-адрес отправителя письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.AttachmentsCount''' - возвращает количество вложенных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.DateTime''' - возвращает дату и время получения письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.Subject''' - возвращает тему письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentDataString(Number)''' - возвращает вложенный файл под номером Number в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentName(Number)''' - возвращает имя вложенного файла под номером Number.&lt;br /&gt;
&lt;br /&gt;
== Объект TStringList ==&lt;br /&gt;
Может использоваться для построчной обработки многостраничных файлов либо для организации текстовых данных. Номер строк начинается с 0. &lt;br /&gt;
Имеет следующий функционал:&lt;br /&gt;
&lt;br /&gt;
'''Count''' - возвращает количество строк в списке.&lt;br /&gt;
&lt;br /&gt;
'''Add(Value:string)''' - добавляет значение Value в конец списка.&lt;br /&gt;
&lt;br /&gt;
'''SetText(Value:string)''' - устанавливает значение списка в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Insert(Number:integer, Value:string)''' - добавляет строку Value в позицию Number.&lt;br /&gt;
&lt;br /&gt;
'''Delete(Number:integer)''' - удаляет строку из списка в позиции Number.&lt;br /&gt;
&lt;br /&gt;
'''Clear''' - очищает элементы списка.&lt;br /&gt;
&lt;br /&gt;
'''LoadFromFile(Path:string)''' - загружает текстовый файл по пути Path.&lt;br /&gt;
&lt;br /&gt;
'''Strings(Number:integer)''' - возвращает строку с номером Number.&lt;br /&gt;
&lt;br /&gt;
'''SetString(Number:integer, Value:string)''' - устанавливает значение строки с номером Number в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Text''' - возвращает полный список строк в виде текста.&lt;br /&gt;
&lt;br /&gt;
'''CommaText([Quoted:boolean])''' - возвращает список значений через запятую. Если Quoted = true, то квотирует элементы списка. По умолчанию равен false.&lt;br /&gt;
&lt;br /&gt;
'''SetCommaText(Value: string)''' - разбивает значение Value на отдельные строки и кладет в список. Разделитель - запятые.&lt;br /&gt;
&lt;br /&gt;
'''IndexOf(Value:string)''' - ищет значение Value среди элементов списка и если находит, то возвращает номер строки. Возвращает -1 если значение не было найдено.&lt;br /&gt;
&lt;br /&gt;
'''Sorted(Value:boolean)''' - устанавливает флаг отсортированности списка в Value. Если Value = true, то сразу же его сортирует. По умолчанию Value = false.&lt;br /&gt;
&lt;br /&gt;
'''Exchange(Pos1:integer, Pos2:integer)''' - меняет элементы списка с позициями Pos1 и Pos2 местами.&lt;br /&gt;
&lt;br /&gt;
'''Duplicates(Value:integer)''' - изменяет параметр управления дубликатами в списке. Если Value = 0 (значение по умолчанию), то список не реагирует на дубликаты. Если Value = 1, то список при добавлении будет игнорировать дубликаты. Если Value = 2, то список будет выдавать исключение, при добавлении дубликата в список.&lt;br /&gt;
&lt;br /&gt;
'''ParamName(Number:integer[, Delimiter:string])''' - возвращает текст до первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает пустоту.&lt;br /&gt;
&lt;br /&gt;
'''ParamValue(Number:integer[, Delimiter:string])''' - возвращает текст после первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает всю строку.&lt;br /&gt;
&lt;br /&gt;
== Объект TFunc ==&lt;br /&gt;
Объект реализует создание и использование функций в скриптовом языке. Позволяет определять переиспользуемые блоки кода с параметрами.&lt;br /&gt;
Важно учитывать, что внтури функции создается свой инстанс интерпретатора и от туда не доступны никакие переменные\объекты кроме переданных в функцию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные методы:&lt;br /&gt;
&lt;br /&gt;
'''New'''(FuncName, Param1, Param2, ..., Body) — создание новой функции.Функция возвращает результат выполнения последней команды в теле функции. Аргументы:&lt;br /&gt;
* `FuncName` — имя функции (строка)&lt;br /&gt;
* `Param1, Param2, ...` — имена параметров функции (переменные начинаются с `$`, объекты — без префикса)&lt;br /&gt;
* `Body` — тело функции (скрипт, выполняемый при вызове)&lt;br /&gt;
&lt;br /&gt;
'''FuncName'''(Arg1, Arg2, ...) — вызов созданной функции по имени. Если в объявлении была указана тип переменная, то и подставлять в аргумент надо обязательно переменную. Будет передано значение этой переменной (переменные словарине поддерживаются!). Если был объявлен объект, то указатель на объект должен быть получен через метод '''_self'''. C функциями поддерживают работу следующие классы: TExcel, TDirectExcel, TCSVFile, TADO, TSelfADO, TPrinter, TCanvas, TPicture, TTable, TINIFile, TSMS, TXML, TJSON, TZip, TStringList, TBaseUtils, а также объект addressrecord (TFieldObject). Результатом работы функции может быть число или строка.&lt;br /&gt;
&lt;br /&gt;
Пример 1, обработка результатов функции:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'calc');&lt;br /&gt;
calc.new('Sum', '$a', '$b',&lt;br /&gt;
  $a + $b&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
set($x, 10);&lt;br /&gt;
set($y, 20);&lt;br /&gt;
showmessage(calc.Sum($x, $y));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример 2, передача объекта в функцию:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'utils');&lt;br /&gt;
utils.new('ProcessDB', 'dbConn', '$value',&lt;br /&gt;
  showmessage($value);&lt;br /&gt;
  dbConn.open('SELECT * FROM address limit 3 ');&lt;br /&gt;
  if(dbConn.recordcount &amp;gt; 0,&lt;br /&gt;
    showmessage('Найдено записей: ' + dbConn.recordcount);&lt;br /&gt;
    dbConn.first;&lt;br /&gt;
    while(dbConn.eof = 0,&lt;br /&gt;
      showmessage(dbConn.fieldbyname('code'));&lt;br /&gt;
      dbConn.next&lt;br /&gt;
    )&lt;br /&gt;
  ,0)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
utils.ProcessDB(db._self,'test!');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Применение языка формул ==&lt;br /&gt;
'''в различных контекстах системы «MEASOFT» и сопутствующих проектах'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MEASOFT ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительная информация на чеке ====&lt;br /&gt;
&lt;br /&gt;
В карточке клиента на закладке «Касса» имеется поле для ввода текста, который будет отображаться на кассовых чеках, печатаемых для корреспонденции от данного клиента. В поле может быть введен как просто текст, так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TSelfDB с открытым набором данных со строчкой корреспонденции, заказа и клиента, на которую печатается чек&lt;br /&gt;
&lt;br /&gt;
TBaseSupport&lt;br /&gt;
&lt;br /&gt;
TBaseValue&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Так же система записывает в переменную $CashRegisterID вычисленный код фискального регистратора, на котором предполагается печать чека.&lt;br /&gt;
&lt;br /&gt;
Результат работы скрипта печатается на создаваемом чеке, если скрипт не возвращает значение “-1” (число или текст) – в этом случае система чек не создает. Подразумевается, что либо скриптом было принято решение об отсутствии необходимости формирования чека, либо скрипт взял эту функцию на себя.&lt;br /&gt;
&lt;br /&gt;
==== Заполнение шаблонов печатных форм ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительные возможности ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Импорт БД из Excel ====&lt;br /&gt;
В окружении интерпретатора создается объект ZakazRecord, он является списком со значениями таблицы zakaz. Именно в этот заказ будут загружены данные. Из этого объекта также доступно :&amp;lt;br&amp;gt;&lt;br /&gt;
*ZakazRecord.userfields - пользовательские поля заказа;&lt;br /&gt;
*ZakazRecord.Clients - данные таблицы clients;&lt;br /&gt;
*ZakazRecord.Clients.userfields - пользовательские поля заказчика.&lt;br /&gt;
&lt;br /&gt;
==== Прайс лист клиента ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в валюте клиента для каждой поездки (туда или обратно) единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Помимо стандартных объектов, система создает объект AddressRecord, в котором, как свойства, доступны все поля текущей записи. Так же она выставляет значение переменной $Forward в 1 (истина), если необходимо произвести расчет для направления &amp;quot;Туда&amp;quot; и 0 (ложь) - если обратно. ВНИМАНИЕ! Как и во всех остальных местах, после формулы нельзя ставить &amp;quot;;&amp;quot;, иначе скрипт вернет 0!&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 if(int(AddressRecord.Time_Put_Max)&amp;gt;19, 100, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Прибавляет 100 рублей в случае, если максимальный срок доставки 20 часов или более''&lt;br /&gt;
&lt;br /&gt;
 if(pos(AddressRecord.Address, 'Аренда')&amp;gt;0, &lt;br /&gt;
           set($FormulaReplace, 1); &lt;br /&gt;
           1500&lt;br /&gt;
 , 0)&lt;br /&gt;
 &lt;br /&gt;
 ''В случае наличия подстроки &amp;quot;Аренда&amp;quot; в адресе заменяет штатное ценообразование на 1500 рублей''&lt;br /&gt;
&lt;br /&gt;
Объект AddressRecord может предоставить доступ к связанным таблицам :&lt;br /&gt;
* addressrecord.boxes&lt;br /&gt;
* addressrecord.packages&lt;br /&gt;
* addressrecord.clients&lt;br /&gt;
* addressrecord.price&lt;br /&gt;
* addressrecord.advprice&lt;br /&gt;
* addressrecord.userfields&lt;br /&gt;
* addressrecord.addressfld&lt;br /&gt;
* addressrecord.clients.userfields&lt;br /&gt;
* addressrecord.price.userfields&lt;br /&gt;
* addressrecord.zakaz&lt;br /&gt;
* addressrecord.zakaz.userfields&lt;br /&gt;
 &lt;br /&gt;
Чтобы получить доступ к полю VarCode из таблицы userfields необходимо записать AddressRecord.Userfields.VarCode. В присоединённой таблице может быть несколько записей чтобы получить к ним доступ предусмотрены функции _First, _EOF, _Next, _RecordCount, _Set.&lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
 set($value1, 0); set($value2, 0);&lt;br /&gt;
 while(AddressRecord.userfields._EOF=0,&lt;br /&gt;
   if(AddressRecord.userfields.varCode=1, &lt;br /&gt;
     set($value1, if(AddressRecord.userFields.VarValue='Праздничная упаковка', 150, 0)), ''''''');&lt;br /&gt;
   if(AddressRecord.userfields.varCode=2, &lt;br /&gt;
     set($value2, AddressRecord.userFields.VarValue), ''''''');&lt;br /&gt;
   AddressRecord.userFields._Next;&lt;br /&gt;
 );&lt;br /&gt;
 int($value1) + int($value2)&lt;br /&gt;
&lt;br /&gt;
Пример делающий тоже самое что и выше но через поиск Locate:&lt;br /&gt;
 set($value1, if(addressrecord.userfields.VarValue('VarCode', 1)='Праздничная упаковка', 150, 0));&lt;br /&gt;
 set($value2, int(addressrecord.userfields.VarValue('VarCode', 2)));&lt;br /&gt;
 $value1 + $value2&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
В скрипте доступны переменные: &lt;br /&gt;
«$FormulaKoeff» - это коэффициент на который умножится конечная цена (по умолчанию равна 1);&lt;br /&gt;
«$PriceCode»  - код прайса;&lt;br /&gt;
«$CurrentPriceConf»  - код услуги;&lt;br /&gt;
«$BasePrice» - стоимость всех услуг с уровнем (pricelevel) меньше текущего.&lt;br /&gt;
&lt;br /&gt;
Для вызова функции CalcBasePrice (Расчёт базовой цены) в скрипте объявленны переменные: $Count,$Collection,$Distance,$Wait.&lt;br /&gt;
&lt;br /&gt;
Существует поиск по ключевому полю (поиск регистронезависимый), например чтобы найти в таблице advprice введённое значение для текущей услуги, нужно сделать такую запись  addressrecord.advprice.value('priceconf', $CurrentPriceConf) - Первый параметр это ключевое поле, второй искомое значение. Если запись найдётся будет возвращено значение поле value, если нет функция вернёт значение 0.&lt;br /&gt;
 &lt;br /&gt;
Пример &lt;br /&gt;
 if(addressrecord.advprice.active('priceconf', 3)='T', addressrecord.advprice.price, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Смотрим включена ли услуга и если да, возвращаем рассчитанную стоимость&lt;br /&gt;
&lt;br /&gt;
Чтобы изменить значение записанное в объект addressrecord, нужно воспользоваться методом _set(keyfield, keyvalue, filed, value). Параметр keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца. Сначала происходит поиск строки по ключу, далее меняется значение указанного столбца.&lt;br /&gt;
Пример, отключение услуги база:&lt;br /&gt;
  addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
  priceconf - поле где записан код услуги;&lt;br /&gt;
  1 - услуга База;&lt;br /&gt;
  active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
Также существует упрощенный метод _set, с двумя параметрами filed, value - он используется в шаблонах загрузки или в системных доп. возможностях где доступен объект addressrecord.&lt;br /&gt;
&lt;br /&gt;
==== Зарплата курьеров ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в основной валюте для каждой единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Переменные «$FormulaTablKoeff» и «$FormulaMoneyKoeff»  позволяют установить повышающий или понижающий коэффициент на стоимость доставки (по тарифной сетке) и услуги соответственно (процент от суммы, процент от стоимости доставки, ожидание).  Переменная «$UsingZoneName» и «$KurierZone» содержат название и код зоны соответственно, есть возможность поменять название зоны для отчета.&lt;br /&gt;
&lt;br /&gt;
=== Планировщик ===&lt;br /&gt;
&lt;br /&gt;
В поле текста задания может быть введен как текст с командами планировщика (см ниже), так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TIniFile, Указывает на настроечный ini-файл планировщика.&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Для записи в лог планировщика нужно использовать функцию Print&lt;br /&gt;
&lt;br /&gt;
=== Репликатор ===&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
ReplaceAddress(target, address) – Возвращает адрес последней доставки корреспонденции получателю target по адресу address от текущего клиента. При отсутствии такой доставки, возвращает address.&lt;br /&gt;
&lt;br /&gt;
GetPrice –возвращает рассчитанное значение цены, на основе прайс-листа клиента и данных о корреспонденции.&lt;br /&gt;
&lt;br /&gt;
GetKurierByStation(i) – возвращает код курьера, ассоциированного со станцией метро с кодом i.&lt;br /&gt;
&lt;br /&gt;
GetNewNumber – Возвращает не занятый номер единицы корреспонденции в текущем заказе.&lt;br /&gt;
&lt;br /&gt;
==История изменений==&lt;br /&gt;
&lt;br /&gt;
=== Недавние изменения ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.539 Добавлена поддержка отладчика AttachDebugger&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.534 Добавлена поддержка оператора CASE и класса TFunc&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 2021.0.0.57 от 18.06.2019 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TExcel добавлен метод ColumnDelete.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция InsertFirmAtt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
||В объект TExcel добавлен метод Align.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция CheckEan&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект функцию FillAdvPriceReport добавлены параметры ShowSumPrice,InsertColumns&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TSMS добавлен метод Log.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Добавлена функция Money.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция ValutaSign.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция GetPolygonByLatLon.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TTable добавлена функция SetMultiHeader, SetCustomHeader.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DownloadAttachment&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию SetRowHeight объекта TExcel добавлен параметр cnt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция AsString.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция SetSize.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TADO добавлена функция ParseForIn.&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|В объект TBaseUtils из TBase перенесена функция FillExcelDoc.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция CalcAddressPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Все функции класса TBaseSupport перенесены в TBaseUtils. Класс TBaseSupport больше не существует.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функции RowInsert и RowDelete объекта TExcel добавлен параметр count.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция SendToMeaSoft&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция RecalcSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Новая функция Reverse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 849 &amp;amp;nbsp; 22.02.2018 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TBaseUtils.TownByIndex добавлен параметр PriorityName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TBase добавлена функция GetNewPackagePos&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TSMS доработан метод ExtraResult, добавлен параметр ParamName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBase добавлена функция CalcAgentPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateAddressForActDelivery&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функция CalcTownDeliveryDate заменена на CalcDeliveryDate&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция SignatureUrl&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция LoadFromStr.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetPen.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetBrush.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена поддержка чтения в формате PNG.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TCanvas.DrawPic параметр Mode&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Свойство TPicture.Canvas&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DeleteFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 758 &amp;amp;nbsp; 29.03.2017 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция GetPolygonByAddress&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция ParamsCount&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Объект TZip&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функции CreateEAN и Create128 заменены одной функцией CreateBar, полностью совместимой с Create128, но добавлена поддержка EAN-13 и Interleaved 2-5 (для Почты России). В системе функции оставлены для обратной совместимости, но более не являются документированными и рекомендованными к использованию.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Параметр text в функцию Cell объекта TExcel&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция UrlEncode &lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция IncDay теперь может принимать параметр count&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функции FtpGet, FtpPut, TTable.SetCell()&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 452 &amp;amp;nbsp; 26.02.2014 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция Time&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция FixedIntToStr&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция TimePeriod&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена функция приёма смс -  ReceiveSMS&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция STR2UTF&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция SAVETOFILE&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.SetSheetName&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;FILESTR&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Расширены возможности объекта addressrecord в формулах тарифов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 308 &amp;amp;nbsp; 24.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В функции загрузки таблиц из TADO добавлено условие, что поля, названия которых начинаются с &amp;quot;-&amp;quot; не выгружаются. Таким образом можно скрывать служебные поля из результирующего набора.&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowAutoFit &lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowInsert &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 300 &amp;amp;nbsp; 01.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В объекте TCSVFile добавилась возможность запрашивать значения не только текущей записи через параметр сдвига&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;UPDOWN&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлен объект TCSVFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 266 &amp;amp;nbsp; 14.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена поддержка массивов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 265 &amp;amp;nbsp; 11.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция CreateTrans в интерпретатор&lt;br /&gt;
|-&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15716</id>
		<title>Руководство программиста</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15716"/>
				<updated>2026-01-07T18:58:44Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Объект TBase */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Основные положения ==&lt;br /&gt;
&lt;br /&gt;
В систему «MEASOFT» встроен внутренний интерпретируемый язык программирования. Среда состоит из базовой функциональности, и дополнительно создаваемых объектов. Некоторые объекты автоматически создаются средой перед запуском интерпретатора для предоставления доступа к контексту, в котором работает скрипт. Все типы данных приводятся друг к другу автоматически, иногда при необходимости можно использовать функции приведения типов. &lt;br /&gt;
&lt;br /&gt;
Как интерпретатор приводит типы:&lt;br /&gt;
&lt;br /&gt;
1.	При использовании значения как параметр функции интерпретатор автоматически приводит значение к типу, необходимому функции.&lt;br /&gt;
&lt;br /&gt;
2.	При операциях сложения, а также логических операциях, операнды приводятся к строке если хотя бы один из них имеет тип «строка». Например:&lt;br /&gt;
3.3+5		-&amp;gt;  8.3&lt;br /&gt;
‘3.3’+5		-&amp;gt;  ‘3.35’&lt;br /&gt;
подобную проблему можно решить принудительно преобразовав тип:&lt;br /&gt;
float(‘3.3’)+5	-&amp;gt;  8.3&lt;br /&gt;
&lt;br /&gt;
3.	При операциях умножения, деления и вычитания операнды приводятся к числу с плавающей точкой, однако если результат выполнения операции получается целым числом, то он приводится к целочисленному типу.&lt;br /&gt;
&lt;br /&gt;
Как работают функции приведения типов:&lt;br /&gt;
&lt;br /&gt;
1.	При преобразовании строки к числу: функция «читает» строку до первого символа, не позволяющего создать число с плавающей точкой, при этом разделителем целой и дробной частей может быть как точка так и запятая. Если приведение производится к целочисленному типу, то после этого происходит округление. Например:&lt;br /&gt;
float('3.6qwerty735')	-&amp;gt;  3.6&lt;br /&gt;
int('3.6qwerty735')	-&amp;gt;  4&lt;br /&gt;
&lt;br /&gt;
2.	При преобразовании к булевому типу ложью считается пустая строка либо число 0, все остальное - истина&lt;br /&gt;
&lt;br /&gt;
3.	При преобразовании булевого типа к числу истина преобразуется в 1, ложь – в 0. Такое преобразование позволяет использовать сложение и умножение в качестве логических «ИЛИ» и «И» соответственно:&lt;br /&gt;
if((5=5)+(6=7), &amp;lt;a&amp;gt;, [b]) – условие истинно, выполнится код «a».&lt;br /&gt;
&lt;br /&gt;
4.	При преобразовании булевого типа к строке сначала происходит преобразование к числу:&lt;br /&gt;
(5=5)+'qwerty'	-&amp;gt;  ‘1qwerty’&lt;br /&gt;
&lt;br /&gt;
== Описание синтаксиса ==&lt;br /&gt;
&lt;br /&gt;
Команды разделяются точкой с запятой. Параметры функций разделяются запятыми. Каждая команда (даже цикл while) является функцией, возвращающей некоторое значение. Результатом выполнения составной команды (последовательности функций, разделенных точкой с запятой), является результат выполнения последней функции. Имена переменных, функций, объектов, а также их свойств и методов не чувствительны к регистру.&lt;br /&gt;
Константы: константы бывают целочисленными, дробными и строковыми. Значения целочисленных и дробных констант указываются «как есть» (в этом случае разделитель целой и дробной частей – точка), шестнадцатеричные значения начинаются с символа «$» и, если первая цифра – буква, она упреждается цифрой 0, а строковые – в одинарных кавычках. При этом, если внутри строковой константы встречается символ одинарной кавычки он должен быть задвоен, для указания интерпретатору того, что он не является признаком конца константы.&lt;br /&gt;
Операции сравнения: &amp;gt;, &amp;lt;, =, !  - Больше, меньше, равно, не равно соответственно.&lt;br /&gt;
Логические операции: + (ИЛИ), *  (И).&lt;br /&gt;
Арифметические операции: +, -, *, /&lt;br /&gt;
Операция конкатенации строк: +&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Функциональность базового объекта ===&lt;br /&gt;
&lt;br /&gt;
'''SET($a, a)''' – присваивает переменной (1-й параметр) значение второго параметра. При отсутствии переменной – создает ее. Имена переменных должны начинаться с символа «$», а следующий символ не должен быть цифрой. Возвращает новое значение переменной. Функция используется только для задания значений переменных. Не допускается использования для задания значений свойств объектов. Для этого используются соответствующие методы этих объектов.&lt;br /&gt;
&lt;br /&gt;
'''IF(a,b,c)''' или '''IF(a,b)'''  – Условный оператор. В первом случае возвращает b, если a истинно (не равно нулю или пустой строке), иначе – c. Во втором случае – возвращает a, если оно истинно, иначе – b.&lt;br /&gt;
&lt;br /&gt;
'''WHILE(a, b)''' – Оператор цикла. Выполняет b пока a истинно:&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i&amp;gt;0, set($sum, $sum+$i); set($i, $i-1));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''FOR($a, b, c, d)''' – Оператор цикла. Выполняет d пока $a последовательно присваиваются значения от b до с включительно:&lt;br /&gt;
	set($sum, 0);&lt;br /&gt;
for($i, 1, 10, set($sum, $sum+$i));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''NEW(ClassName, InstanceName)''' – Создает экземпляр класса ClassName, назначает ему имя InstanceName. Возвращает порядковый номер созданного объекта. Доступ к свойствам и методам объектов осуществляется по имени объекта и имени свойства/метода, разделенным точкой. Именем объекта может быть и пустая строка, тогда доступ к его свойствам и методам будет осуществляться без указания имени, и, в случае совпадения имен свойств и/или методов со стандартными или свойствами/методами других объектов, использоваться будут соответствующие свойства/методы объекта, созданного ранее, а также такой объект невозможно уничтожить до окончания выполнения скрипта. Все объекты созданные во время выполнения скрипта уничтожаются автоматически после окончания его выполнения.&lt;br /&gt;
&lt;br /&gt;
'''FREE(InstanceName)''' – Уничтожает объект с именем InstanceName. Возвращает 0. В случае отсутствия объекта с заданным именем вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
'''ShowObjects''' – Возвращает список созданных объектов – названия классов и имена.&lt;br /&gt;
&lt;br /&gt;
'''ERROR(message)''' – Вызывает ошибку с текстом message.&lt;br /&gt;
&lt;br /&gt;
'''SHOWMESSAGE(message)''' – Отображает диалоговое окно с текстом message, останавливает выполнение скрипта до закрытия окна пользователем.&lt;br /&gt;
&lt;br /&gt;
'''SimpleAskUser(Message)''' – Выводит диалоговое окно с текстом Message и кнопками «Да» и «Нет». Возвращает 1, если  пользователь нажал кнопку «Да», иначе – 0.&lt;br /&gt;
&lt;br /&gt;
'''TRY(a)''' – Выполняет a в «защищенном от ошибки» режиме. Если в процессе выполнения a возникает ошибка, возвращает текст ошибки, иначе – 0 (ложь).&lt;br /&gt;
&lt;br /&gt;
'''REM(….)''' – Код в скобках игнорируется (комментарий).&lt;br /&gt;
&lt;br /&gt;
'''EXEC(FileName, Params, Wait, WindowState)''' – Запускает внешнее приложение FileName с параметрами Params. Если Wait истинно – ожидает завершение процесса. Для WindowState доступны следующие числовые значения:&lt;br /&gt;
	0 - SW_HIDE&lt;br /&gt;
	1 - SW_SHOWNORMAL (по-умолчанию)&lt;br /&gt;
	3 - SW_MAXIMIZE&lt;br /&gt;
	6 - SW_MINIMIZE&lt;br /&gt;
Функция возвращает истину если приложение запущено успешно. Иначе – Ложь.&lt;br /&gt;
В случае успеха, при параметре Wait – истина кладет в переменную $LastResult код завершения приложения.&lt;br /&gt;
&lt;br /&gt;
'''CASE''' - Оператор множественного выбора. Позволяет выполнить одно из нескольких действий в зависимости от условий. Синтаксис:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
  case(&lt;br /&gt;
    when(условие1, действие1);&lt;br /&gt;
    when(условие2, действие2);&lt;br /&gt;
    ...&lt;br /&gt;
    else(действие_по_умолчанию);&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 50);&lt;br /&gt;
&lt;br /&gt;
showmessage(&lt;br /&gt;
  case(&lt;br /&gt;
    when($a &amp;lt; 5, 50);&lt;br /&gt;
    when($a &amp;lt; 10, 100);&lt;br /&gt;
    when($a &amp;lt; 250, 200);&lt;br /&gt;
    else($a*$b);&lt;br /&gt;
  )  &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''AttachDebugger''' - Команда позволяет подключить открытый [[Отладчик_встроенных_скриптов]] к текущему скрипту. Команда AttachDebugger должна быть '''первой командой''' в скрипте. Добавьте её в самое начало скрипта:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Как работает:'''&lt;br /&gt;
# При выполнении команды AttachDebugger скрипт останавливается.&lt;br /&gt;
# Отладчик автоматически подключается к выполняющемуся скрипту.&lt;br /&gt;
# Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
# Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Если режим отслеживания не включён, команда `AttachDebugger` игнорируется.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Команда AttachDebugger должна быть первой командой в скрипте.&lt;br /&gt;
&lt;br /&gt;
=== Строковые функции ===&lt;br /&gt;
&lt;br /&gt;
'''UpCase(s)''' – возвращает строку s в верхнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''LCase(s)''' – возвращает строку s в нижнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''Len(s)''' – возвращает количество символов в строке s.&lt;br /&gt;
&lt;br /&gt;
'''Pos(s, substr [,start])''' – возвращает номер первого символа первого включения подстроки substr в строку s, возвращает 0, если включения подстроки отсутствуют. Параметр start - это позиция старта поиска, не обязательный параметр, по умолчанию равен 1. Поиск не чувствителен к регистру.&lt;br /&gt;
&lt;br /&gt;
'''Param(s, i)''' – возвращает i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''ParamsCount(s)''' - возвращает количество элементов строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''SetParam(s, p, i)''' – заменяет на значение p i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''Left(s, i [,full] )''' – возвращает i первых символов строки s. Параметр i, может быть строкой, тогда он считается разделителем и функция, возвращает строку слева от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Mid(s, i, j)''' - возвращает подстроку из s начиная с i символа и длиной j символов&lt;br /&gt;
&lt;br /&gt;
'''Right(s, i [,full])''' – возвращает i последних символов строки s. Параметр i, может быть строкой, тогда он считается разделителем, функция ищет разделитель с конца строки, и возвращает строку справа от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Reverse(s)''' - возвращает строку s задом-наперед. Полезно например для поиска с конца функций Pos().&lt;br /&gt;
&lt;br /&gt;
'''Char(i)''' – возвращает символ с кодом i.&lt;br /&gt;
&lt;br /&gt;
'''Ord(s)''' – возвращает код первого символа строки s.&lt;br /&gt;
&lt;br /&gt;
'''Replace(s, strFind1, strReplace1, [ strFind2, strReplace2, ... ], [caseInsensetive])''' - возвращает строку s, в которой все включения строк strFind заменены строкой strReplace. Параметры поиска и замены всегда должны быть в паре и их может быть несколько. caseInsensetive - неучитывать регистр, не обязательный параметр, по умолчанию включен.&lt;br /&gt;
&lt;br /&gt;
'''RemSpace(s)''' – возвращает сроку s без начальных и конечных запятых и пробелов, а также начальных точек.&lt;br /&gt;
&lt;br /&gt;
'''SumStr(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''с добавлением валюты'''. Необязательные параметры captions - позволяет изменить название валюты, формат строки может зависеть от текущего языка(посмотреть формат можно в &amp;quot;Справочники&amp;quot;-&amp;quot;Статусы&amp;quot;-&amp;quot;32 Валюты&amp;quot;, в разделе &amp;quot;Дополнительная информация&amp;quot;). Language - код языка на котором необходимо вывести сумму прописью. По умолчанию если не обязательные параметры опущены, используются региональные настройки в переменных.&lt;br /&gt;
&lt;br /&gt;
'''NumToStrSimple(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''без валюты'''. Параметры идентичны функции SUMSTR.&lt;br /&gt;
&lt;br /&gt;
'''FullNameToShort(Name)''' – Возвращает фамилию и инициалы по полному ФИО Name.&lt;br /&gt;
&lt;br /&gt;
'''MonthName1(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в именительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''MonthName2(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в родительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''StrForXML(s)''' - Подготавливает строку к парсингу как xml: Если находит в строке подстроку &amp;quot;UTF-8&amp;quot; - перекодирует ее из utf-8 в win-1251, убирает начальный знак вопроса, если такой встречается.&lt;br /&gt;
&lt;br /&gt;
'''FixedIntToStr(i, len[, char])''' - Возвращает целое число i дополненное слева символами char (по-умолчанию - &amp;quot;0&amp;quot;) до длины len.&lt;br /&gt;
&lt;br /&gt;
'''Translate(format, [param1, param2, ...])''' - Функция перевода строки format в язык пользователя. Строка format может содержать параметры %s, %d - строка и число соответственно. &lt;br /&gt;
&lt;br /&gt;
'''ExtractFileName(FilePath)''' - возвращает имя файла с расширением из полного пути к файлу FilePath.&lt;br /&gt;
&lt;br /&gt;
====Функции перекодировки====&lt;br /&gt;
'''DecodeStr(s, charset)''' - Производит перекодировку строки s в кодировку CP1251. Кодировка строки s должна быть заранее известна и может быть :&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866, UNICODE. Имя кодировки следует передавать в точности без лишних символов.&lt;br /&gt;
&lt;br /&gt;
'''EncodeStr(s, charset)''' - Производит перекодировку строки s в кодировку charset. Кодировка строки s должна быть CP1251, возможны следующие варианты перекодировки:&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Имя кодировки следует передавать в точности без лишних символов. UNICODE не работает с версии 2021, в ней строки по умолчанию в кодировке unicode.&lt;br /&gt;
&lt;br /&gt;
Функции EncodeBase64(s), DecodeBase64(s), UrlEncode(s), UTF8Encode(s), UTF8Decode(s), Str2UTF(s) - устарели, используйте EncodeStr, DecodeStr.&lt;br /&gt;
&lt;br /&gt;
====Транслитерация====&lt;br /&gt;
&lt;br /&gt;
'''Translit(s)''' - транслитерация строки русского текста s латиницей&lt;br /&gt;
&lt;br /&gt;
'''UnTranslit(s)''' - транслитерация строки s с латиницы на русский.&lt;br /&gt;
&lt;br /&gt;
==== Экранирование ====&lt;br /&gt;
&lt;br /&gt;
'''QUOTEDSTR(s)''' – квотирует строку s символом «\» (обратный слеш). Возвращает строку s, помещенную между символами одинарной кавычки, при этом все вхождения в строку s символов: «\», «&amp;quot;» и «'» экранируются квотирующим символом, а символы  #0, #10 и #13 заменяются на \0, \n и \r соответственно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SQLFloat(f)''' – Приводит число с плавающей точкой к виду, пригодному для SQL-запроса, т.е. к тексту с разделителем дробной части – точка.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextXML(s)''' - квотирует строку s для использования в XML. Производит замены спец. символов для корректности XML-синтаксиса.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextJSON(s)''' - переводит строку в формат JSON, экранирует служебные символы.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextBlob(s)''' - строка s содержит файл, функция перекодирует переданную строку в байты, используется для заполнения полей формата blob.&lt;br /&gt;
&lt;br /&gt;
====Хеширование ====&lt;br /&gt;
&lt;br /&gt;
'''HMACHash256(key, text)''' - создаёт хэш по алгоритму SHA256 для проверки целостности сообщения, key - секретный ключ, text - хэшируемое сообщение&lt;br /&gt;
&lt;br /&gt;
'''MD5Hash(text)''' - создаёт хеш по алгоритму MD5&lt;br /&gt;
&lt;br /&gt;
'''SignatureUrl(url)''' -  Подписывает переданный URL. Функция возвратит переданный URL с добавленным в конце параметром, в котором будет записана подпись.&lt;br /&gt;
&lt;br /&gt;
=== Функции работы с датой и временем ===&lt;br /&gt;
&lt;br /&gt;
'''CurrTime''' – возвращает текущее время&lt;br /&gt;
&lt;br /&gt;
'''CurrDate''' – возвращает текущую дату&lt;br /&gt;
&lt;br /&gt;
'''CurrMillisecond''' - Возвращает количество миллисекунд прошедших с начала текущего года. Используется для точного расчета временных интервалов.&lt;br /&gt;
&lt;br /&gt;
'''Today''' - возвращает текущую дату в числовом формате.&lt;br /&gt;
&lt;br /&gt;
'''Day(dt)''' – возвращает день месяца даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Month(dt)''' – возвращает месяц года даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Year(dt)''' – возвращает год даты dt.&lt;br /&gt;
&lt;br /&gt;
'''FirstDayOfMonth(dt)''' – Возвращает первый день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( FirstDayOfMonth( CurrDate() ) );&lt;br /&gt;
'''Полужирное начертание'''&lt;br /&gt;
'''LastDayOfMonth(dt)''' – Возвращает последний день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( LastDayOfMonth( CurrDate() ) );&lt;br /&gt;
&lt;br /&gt;
'''DaysInMonth(month, year)''' – Возвращает количество дней в указанном месяце.&lt;br /&gt;
&lt;br /&gt;
'''IncDay(dt, [count=1])''' – Возвращает дату, увеличенную на count дней.&lt;br /&gt;
&lt;br /&gt;
'''SQLDate(dt)''' – Пытается конвертировать dt в дату, вернуть в формате «'YYYY-MM-DD'» (с апострофами), если не удается – возвращает «NULL».&lt;br /&gt;
&lt;br /&gt;
'''SQLDateToDate(dt)''' – Переводит дату из SQL-формата в обычный.&lt;br /&gt;
&lt;br /&gt;
'''DAYSBETWEEN(dt1, dt2)''' – Возвращает количество дней между датами dt1 и dt2. В случае ошибки приведения dt1 или dt2 к дате возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''TimeBetween(t1, t2)''' - Возвращает количество минут между временем t1 и t2. Если t1 &amp;gt; t2 то будет показано количество минут между t2 и t1. Параметр t может быть как в формате &amp;quot;HH:MM&amp;quot;, так и в числовом. Если один из параметров не удалось привести к числовому типу возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''WorkDaysBetween(dt1, dt2, [DecreaseFirstDay=0], [DefaultHolidayVarNum=1])''' - Возвращает количество рабочих дней между датами dt1 и dt2. Параметр DecreaseFirstDay уменьшает dt1 на указанное количество дней (по умолчанию 0).  В случае ошибки приведения dt1 или dt2 к дате возвращает -1000. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней(по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''TimePeriod(time1, time2)''' - Оформляет временной период. Возвращаемое значение зависит от наличия значения в параметрах. Возможные варианты: &amp;quot;time1 - time2&amp;quot; , &amp;quot;С time1&amp;quot; , &amp;quot;ДО time2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''StrDateToFloat(s, [time=false])''' - Переводит строку с датой s в числовой тип. Если параметр time включен, то в строке s должно быть указано время. Дата должна быть в формате &amp;quot;DD.MM.YYYY&amp;quot;, а время &amp;quot;HH:NN&amp;quot;. Если строку перевести не удалось возвращает 0&lt;br /&gt;
&lt;br /&gt;
'''IsAWorkDay(dt)''' - Когда день dt является рабочим, возвращает true. Если произошла ошибка приведения даты возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''IncWorkDay(dt, [count=1],[DefaultHolidayVarNum=1])''' - Прибавляет count рабочих дней к дате dt. Возвращает дату в числовом формате, если произошла ошибка приведения даты возвращает -1000. По умолчанию параметр count равен 1 и не является обязательным. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней (по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''Sleep'''(n) - Задержка выполнения на n миллисекунд.&lt;br /&gt;
&lt;br /&gt;
=== Функции приведения типов ===&lt;br /&gt;
&lt;br /&gt;
'''INT(v)''' – возвращает значение типа “целое”, приводя вариантное значение v к числовому типу, а затем округляя его. В том числе используется как функция округления.&lt;br /&gt;
&lt;br /&gt;
'''FLOAT(v)''' – возвращает значение типа “число”, приводя вариантное значение v к числовому типу, переводя в число цепочку символов до первого нецифрового символа (либо точки или запятой).&lt;br /&gt;
&lt;br /&gt;
'''STR(v)''' – возвращает значение типа “строка”, приводя вариантное значение v к строковому типу.&lt;br /&gt;
&lt;br /&gt;
'''Date(v)''' – возвращает дату, либо пустую строку, если не удается конвертировать v в дату&lt;br /&gt;
&lt;br /&gt;
'''Time(v)''' – возвращает время, либо пустую строку, если не удается конвертировать v во время. Понимает числовое представление времени.&lt;br /&gt;
&lt;br /&gt;
=== Математические функции ===&lt;br /&gt;
&lt;br /&gt;
'''ROUNDUP(f)''' – округляет число f до ближайшего большего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''ROUNDDN(f)''' – округляет число f до ближайшего меньшего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''Money(f, CouldBeEmpty, ZeroFill, MakeSpace)''' - Округляет число f, до двух знаков после запятой. CouldBeEmpty - заменить число меньше 0,0001  на пустую строку. ZeroFill  - Следить чтобы после запятой было два знака, если будет один, то добавить ноль. MakeSpace - Разделить разряды пробелом.&lt;br /&gt;
''Подсказка: для простого округления используется функция int()''&lt;br /&gt;
&lt;br /&gt;
'''Abs(f)''' - возвращает модуль числа f.&lt;br /&gt;
&lt;br /&gt;
'''Mod(x, y)''' - возвращает остаток от деления целочисленного числа x на целочисленное число y.&lt;br /&gt;
&lt;br /&gt;
=== Константы ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Null''' – Возвращает пустое значение.&lt;br /&gt;
&lt;br /&gt;
'''Да''', '''True''', '''Нет''', '''False''' – константы, соответствующие булевым значениям.&lt;br /&gt;
&lt;br /&gt;
=== Прочие функции ===&lt;br /&gt;
&lt;br /&gt;
SetPhoneParams(CountryCode, TownCode) – Устанавливает глобальные настройки кода телефонных кодов страны и города соответственно. По-умолчанию код страны – 7, код города – 495.&lt;br /&gt;
&lt;br /&gt;
PhonesCount(s) – Возвращает количество корректных телефонных номеров, найденных в строке s.&lt;br /&gt;
&lt;br /&gt;
GetPhone(s[, n]) – Возвращает n-й корректный телефонный номер, найденный в строке s. Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
GetEmail(s) – Возвращает все корректные адреса email, найденный в строке s, разделенные запятыми (т.е. готовыми к передаче в функцию SendEmail).&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY).&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
GenEan(ID, Code) – Формирует штрих-код EAN 13 Состоящий из идентификатора типа сущности ID и кода сущности Code, Выравнивает до 13-ти символов, первый – «2», последний – контрольная сума.&lt;br /&gt;
&lt;br /&gt;
CheckEan(s) - Проверяет строку s, что она является кодом EAN13.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(FileName,s, encoding [, append])- Создает текстовый файл по пути, указанному в FileName (если по указанному пути существует файл с указанным именем, он удаляется и создается новый) и производит запись строки s в созданный текстовый файл. encoding - название кодировки, по умолчанию сохраняет в кодировке ANSI. Доступные названия кодировок: KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Если append = true, то производится дописывание данных в файл, а не перезаписывание (не обязательный, по умолчанию выключен).&lt;br /&gt;
&lt;br /&gt;
StrFromFile(FileName) - Читает файл FileName, возвращает в виде строки. При ошибке чтения вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
DownloadAttachment(code, [savefilepath, tablename='attachment', fieldBlob='file', fieldLDtime='ldtime', fieldUID='uid']) - Функция выкачивает аттачмент из базы, по внутреннему коду - Code, всегда возвращает содержимое файла в виде строки, а также может сохранить файл по указанному пути в параметре savefilepath. По умолчанию, функция настроена на таблицу attachment. Code - внутренний код вложения, tablename - название таблицы, fieldBlob - название поля с содержимым файла, fieldLDtime - название поля с временем последнего изменения строки (для работы кэша). Функция использует кэш и умеет выкачивать файлы зауженные на внешние серверы (http, ftp,sftp, measoft). Для выкачивания с сервера measoft обязательно необходимо указывать параметр fieldUID.&lt;br /&gt;
&lt;br /&gt;
DeleteFile(FileName) - Удаляет файл FileName с диска, возвращает истину, если операция прошла успешно и ложь - в противном случае.&lt;br /&gt;
&lt;br /&gt;
HTTPPOST(host, PostParams, Proxy, ContentType, HTTPUser, HTTPPass, Method, CustomHeader, Reconnects) - Отправляет HTTP запрос по адресу host с данными PostParams. Proxy - объект Proxy, задающий прокси-сервер (по-умолчанию - пусто - не использовать прокси). ContentType - Заголовок ContentType. По-умолчанию - &amp;quot;application/x-www-form-urlencoded; Charset=UTF-8&amp;quot;. HTTPUser и HTTPPass - данные для http-авторизации на сервере. Method - метод отправки запроса, по-умолчанию - &amp;quot;POST&amp;quot;. CustomHeader - Дополнительные заголовки HTTP запроса, передается в виде списка параметров через запятую и всегда образуют пару: 1 параметр - название заголовка, 2 параметр - значение. Если значение содержит запятую то его нужно экранировать в двойные кавычки. Reconnects - Количество попыток подключения (по-умолчанию - 2), если больше 100 - это таймаут единственной попытки подключения в миллисекундах.&lt;br /&gt;
Функция возвращает ответ сервера. &amp;lt;br&amp;gt;&lt;br /&gt;
''Обратите внимание:'' Для имитации отправки данных html-формы методом POST может понадобиться перед передаваемыми параметрами добавить &amp;quot;Data=&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
FTPPUT(host, User, Pass, FileName[, Active]) - Отправляет файл на FTP/SFTP-сервер. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
FTPGET(host, User, Pass, SourceFileName, DestFileName[, Active]) - Загружает файл SourceFileName с FTP/SFTP-сервера, сохраняет его в файл DestFileName. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
GetTempDir - Возвращает путь к временной папке.&lt;br /&gt;
&lt;br /&gt;
ApplicationDir - Возвращает путь к файлу программы.&lt;br /&gt;
&lt;br /&gt;
Interpretate(script) - Интерпретирует скрипт указанный в script. Выполнение происходит в текущем инстансе.&lt;br /&gt;
&lt;br /&gt;
LastHttpError - Выводит последний запрос выполненный с ошибкой в функции HttpPost. Содержит подробную информацию по запросу и ответу.&lt;br /&gt;
&lt;br /&gt;
LastHttpResponse - Выводит последний запрос и ответ от сервера после выполнения Http-запроса в функции HttpPost.&lt;br /&gt;
&lt;br /&gt;
== Объект TExcel ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к данным документов MS Excel. Требует установленного приложения MS Excel. Для работы без установленного MS Excel предусмотрен объект TDirectExcel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ввод данных'''''&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Если Headered истинно (по-умолчанию), таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Если TranslateHeader истинно, то заголовки таблицы будут автоматически переведены.&lt;br /&gt;
 &lt;br /&gt;
 MyDB.Open('select * from kurier');&lt;br /&gt;
 xl.LoadFromDB(MyDB.Self);&lt;br /&gt;
 xl.DoNotDestroy(true);&lt;br /&gt;
 xl.SetVisible(true);&lt;br /&gt;
&lt;br /&gt;
Post2Sheet(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) -  Почти полный аналог LoadFromDB. В отличии от LoadFromDB если есть открытый файл, выгрузка данных будет выполнена прямо в него.&lt;br /&gt;
&lt;br /&gt;
OpenFile(aFileName) – Выполняет функции SetFileName и Open. &lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
SetFileName(aFileName) – Задает значение свойства FileName.&lt;br /&gt;
&lt;br /&gt;
Open - Открывает файл с именем, заданным свойством FileName. Если имя файла не задано - создает чистую книгу.&lt;br /&gt;
&lt;br /&gt;
Close – Закрывает текущий файл.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ячейки'''''&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
Cell(x, y, text) – Возвращает значение ячейки, заданной координатами x, y. Необязательный булевый параметр text, в случае истинности, указывает на необходимость возврата данных с учетом формата ячейки, т.е. то, что пользователь видит на экране. Обратите внимание, что если в ячейке число, и ширина столбца не достаточна для отображения, Excel выводит &amp;quot;#####&amp;quot;, что и будет возвращено программе, если text=ИСТИНА. Поэтому перед таким использованием рекомендуется выполнить функцию AutoFit.&lt;br /&gt;
&lt;br /&gt;
SetCell(x, y, v[, x2, y2]) – Устанавливает значение ячейки, заданной координатами x и y, в значение v. Если заданы параметры x2, y2 - объединяет (merge) диапазон ячеек заданных координатами, устанавливает значение объединенной ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Строки'''''&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
RowAutoFit([y1, y2]) - Устанавливает автоматическую высоту строк. Аргументы y1 и y2 необязательны и если не указаны, то процедура будет выполнена для всей страницы, в ином случае только для строк от y1 до y2.&lt;br /&gt;
&lt;br /&gt;
SetRowHeight(r, h[, cnt]) – Устанавливает высоту cnt строк (по-умолчанию 1) начиная со строки r в h пикселей.&lt;br /&gt;
&lt;br /&gt;
GetRowHeight(r) – Возвращает высоту строки r в пикселях.&lt;br /&gt;
&lt;br /&gt;
RowInsert(i[, count]) - Вставляет count (по-умолчанию - 1) строк НАД строкой с номером i.&lt;br /&gt;
&lt;br /&gt;
RowDelete(i[, count]) - Удаляет count (по-умолчанию - 1) строк начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Столбцы'''''&lt;br /&gt;
&lt;br /&gt;
ColCount - Возвращает количество столбцов в листе.&lt;br /&gt;
&lt;br /&gt;
AutoFit – Устанавливает автоматическую ширину столбцов.&lt;br /&gt;
&lt;br /&gt;
ColumnDelete(i[, count]) - Удаляет count (по-умолчанию - 1) столбцов начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
SetColWidth (c, w) – Устанавливает ширину столбца c в w пикселей.&lt;br /&gt;
&lt;br /&gt;
GetColWidth (c) – Возвращает ширину столбца c в пикселях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Листы'''''&lt;br /&gt;
&lt;br /&gt;
SetSheet(No) – Устанавливает номер текущего листа. Если лист с таким номером не существует - он будет создан (и все листы до него). Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetSheetName(Name) - Устанавливает название текущего листа.&lt;br /&gt;
&lt;br /&gt;
SheetsCount – Возвращает количество листов в книге.&lt;br /&gt;
&lt;br /&gt;
CopySheetAfter([SheetFrom[, SheetAfter]]) - Копирует лист SheetFrom (по-умолчанию - текущий), создавая новый лист после листа SheetAfter (по-умолчанию - совпадает с копируемым).&lt;br /&gt;
&lt;br /&gt;
SheetDelete(i) - Удаляет лист с номером i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Форматирование'''''&lt;br /&gt;
&lt;br /&gt;
Align(x1, y1, x2, y2 [,HAlign, VAlign]) - Устанавливает выравнивание данных в указанном диапазоне. HAlign - горизонтальное выравнивание (0 – прижато влево , 1 – по центру , 2 – прижато вправо), VAlign - Вертикальное выравнивание (0 – прижато к верху , 1 – по центру , 2 – прижато к низу).&lt;br /&gt;
&lt;br /&gt;
WrapText(x1, y1, x2, y2, value) – Устанавливает перенос текста прямоугольника в значение value. Если координаты опущены, или 0 – устанавливает границы всей используемой области. Для Value значение по-умолчанию - true.&lt;br /&gt;
&lt;br /&gt;
NumberFormat(x1, y1, x2, y2, Format) - Устанавливает формат вывода чисел в указанном диапазоне ячеек. Например, если Format='0.00' - числа будут выводиться c обязательными 2 знаками после десятичного разделителя.&lt;br /&gt;
&lt;br /&gt;
SetBorders(x1, y1, x2, y2) – Устанавливает границы прямоугольника. Если координаты опущены, или 0 – устанавливает границы всей используемой области.&lt;br /&gt;
&lt;br /&gt;
SetFont(Font[, x1, y1[, x2, y2]]) - Устанавливает шрифт Font для ячеек диапазона. Можно указать координаты только одной ячейки, можно - вообще не указать, тогда будет использован последний выделенный диапазон. Шрифт задается как обычно: 'Arial, 16, T, T, T', порядок параметров: Имя шрифта, размер, жирное начертание, курсивное начертание, одиночное подчеркивание. Если параметры не заданы, то у текущего шрифта они меняться не будут. Примеры: SetFont('Arial, 10, T, F, F', 1,1) - в ячейке A1 будет установлен шрифт Arial жирным начертанием (не курсив и без подчеркивания). SetFont(', , , T, F', 2,1) - в ячейке B1 будет поменяется только начертание курсив и будет отменено подчеркивание (если оно было). &lt;br /&gt;
&lt;br /&gt;
SaveValuesOnly - убирает формулы на текущей странице и оставляет лишь их результативные статичные значения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Цвета'''''&lt;br /&gt;
&lt;br /&gt;
SetRowFontColor(Row,Color) - Устанавливает цвет шрифта в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetRowColor(Row,Color) - Устанавливает цвет фона в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetColumnFontColor(Col,Color) - Устанавливает цвет шрифта в столбце Col. Color -  целое значение (RGB) &lt;br /&gt;
&lt;br /&gt;
SetColumnColor(Col,Color) - Устанавливает цвет фона в столбце Col. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellFontColor(Row,Col,Color) -  Устанавливает цвет шрифта в ячейке с координатами [Row,Col]. Color -  целое значение, равное номеру цвета в палитре (ColorIndex,не RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellColor(Row,Col,Color) -  Устанавливает цвет фона в ячейке с координатами [Row,Col]. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
GetRowFontColor(Row)- Возвращает RGB значение цвета шрифта строки Row&lt;br /&gt;
&lt;br /&gt;
GetRowColor(Row)- Возвращает RGB значение цвета фона строки Row&lt;br /&gt;
&lt;br /&gt;
GetColumnFontColor(Col)- Возвращает RGB значение цвета шрифта столбца Col&lt;br /&gt;
&lt;br /&gt;
GetColumnColor(Col)- Возвращает RGB значение цвета фона столбца Col &lt;br /&gt;
&lt;br /&gt;
GetCellFontColor(Row,Col) - Возвращает номер цвета шрифта в палитре (ColorIndex) в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
GetCellColor(Row,Col) - Возвращает RGB значение цвета фона в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Копи-паст'''''&lt;br /&gt;
&lt;br /&gt;
Copy(x1, y1, x2, y2) - Копирует в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Cut(x1, y1, x2, y2) - Вырезает в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Paste(x1, y1) - Вставляет из буфера экселя. Команды copy-paste неразрывны, если что нибудь сделать в промежутке между ними, например вставить значение в ячейку, то копирование сброситься. (Последовательность использования: copy - paste, cut - paste)&lt;br /&gt;
&lt;br /&gt;
PasteStyle(x1, x2, y1, y2) - Вставляет только оформление из буфера экселя (Последовательность использования:  Copy - PasteStyle)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Изображения'''''&lt;br /&gt;
&lt;br /&gt;
InsertPicture(TPicture, [x=1, y=1, DispX=0, DispY=0, width=0, height=0]) - Функция вставляет рисунок на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки, width, height (не работает для DirectExcel) - ширина и высота области рисунка в пойнтах-единицах Excel &lt;br /&gt;
&lt;br /&gt;
InsertFirmLogo(FirmCode, [x=1, y=1, DispX=0, DispY=0]) - Функция вставляет логотип фирмы с кодом FirmCode на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Вывод'''''&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки. Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SheetFitPageWidth - устанавливает режим масштабирования печати, чтобы печатная форма помещалась в ширину на один лист.&lt;br /&gt;
&lt;br /&gt;
SetOrientation(value) - Устанавливает ориентацию страницы. True (по-умолчанию) - альбомная (ландшафтная), Ложь - портретная.&lt;br /&gt;
&lt;br /&gt;
PrintOut([copies]) - Печатает текущий лист на принтере по умолчанию. Параметр copies - количество копий, по умолчанию равен 1.&lt;br /&gt;
&lt;br /&gt;
Save(filename) - Сохраняет в файл filename. Если файл существует, в основной системе он будет перезаписан, в других проектах - вызовет ошибку &amp;quot;Файл уже существует&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SetVisible(b) – Устанавливает видимость приложения Excel для пользователя. По-умолчанию – false (не видимо).&lt;br /&gt;
&lt;br /&gt;
DoNotDestroy(b) – При уничтожении объекта TExcel (а он уничтожается, как и все остальные объекты автоматически при завершении выполнения скрипта), приложение Excel уничтожается вместе с ним. DoNotDestroy(true) отключает уничтожение приложения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования'''''&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'myxl');&lt;br /&gt;
 myxl.OpenFile('c:\asdf.xlsx');&lt;br /&gt;
 set($sum, 0);&lt;br /&gt;
 while (myxl.EOF=0, &lt;br /&gt;
      set($sum, $sum+int(myxl.c));&lt;br /&gt;
      myxl.next );&lt;br /&gt;
 $sum&lt;br /&gt;
 &lt;br /&gt;
 ''Возвращает сумму всех числовых данных столбца C файла 'c:\asdf.xlsx'''&lt;br /&gt;
&lt;br /&gt;
== Объект TDirectExcel ==&lt;br /&gt;
Объект позволяет работать с файлами Excel напрямую, без установленного пакета MsOffice. Применяется в сервисах и при отсутствии экселя. Он максимально совместим с объектом TExcel, однако некоторые методы могут быть не реализованы. &lt;br /&gt;
&lt;br /&gt;
== Объект TCSVFile ==&lt;br /&gt;
Предназначен для доступа к данным документов CSV. Разделителем столбцов является символ точка с запятой ;&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
OpenFile(FileName) – Открывает файл FileName.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=false]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO.&lt;br /&gt;
&lt;br /&gt;
LoadFromText(s) - Загружает таблицу из строки s.&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). &lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(Filename) - Сохраняет в файл с именем filename.&lt;br /&gt;
&lt;br /&gt;
== Объект TADO ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к базам данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|Connect(ConnectionString)&lt;br /&gt;
|Подключает к источнику данных. ConnectionString – Строка подключения ADO.&lt;br /&gt;
|-&lt;br /&gt;
|ConnectMySQL(DBServer, DBPort, DBUser, DBPass, DBName)&lt;br /&gt;
|Подключает к базе данных MySQL.&lt;br /&gt;
|-&lt;br /&gt;
|Open(Query)&lt;br /&gt;
|Открывает набор данных выполнив запрос Query.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByNo(i)&lt;br /&gt;
|Возвращает значение поля с номером i. Нумерация полей – с нуля.&lt;br /&gt;
|-&lt;br /&gt;
|FieldName(i)&lt;br /&gt;
|Возвращает имя поля с номером i.&lt;br /&gt;
|-&lt;br /&gt;
|FieldCount&lt;br /&gt;
|Возвращает количество  полей.&lt;br /&gt;
|-&lt;br /&gt;
|RecordCount&lt;br /&gt;
|Возвращает количество записей.&lt;br /&gt;
|-&lt;br /&gt;
|RecNo&lt;br /&gt;
|Возвращает номер текущей записи. ''ВНИМАНИЕ! В зависимости от способа подключения к БД нумерация может начинаться как с 0 так и с 1!''&lt;br /&gt;
|-&lt;br /&gt;
|EOF&lt;br /&gt;
|Возвращает признак достижения конца набора данных. Становится истиной когда выполняется команда Next на последней записи.&lt;br /&gt;
|-&lt;br /&gt;
|Next&lt;br /&gt;
|Переход на следующую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|First&lt;br /&gt;
|Переход на первую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|Last&lt;br /&gt;
|Переход на последнюю запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByName(FieldName)&lt;br /&gt;
|Возвращает значение поля по имени. Также возможно указание имени поля как свойства объекта.&lt;br /&gt;
|-&lt;br /&gt;
|Field(Table, ID, FieldName)&lt;br /&gt;
|Возвращает значение поля FieldName записи с кодом ID таблицы Table. Набор данных, если он открыт, при этом не закрывается. Первичный ключ таблицы должен называться «code». Гарантированно работает только с MYSQL!!!&lt;br /&gt;
|-&lt;br /&gt;
|GetSQLValue(Query)&lt;br /&gt;
|Выполняет SQL-запрос. Текст запроса должен начинаться с первого символа строки (перед запросом не должно быть пробелов, переносов строк, комментариев и т.д.). Если запрос Insert – возвращает ID вставленной записи. Если запрос – Update, Delete, Replace, Set, Start, Commit, Rollback – возвращает количество измененных записей (RowsAffected), иначе – Select – значение первого поля первой строки результата как текст.&lt;br /&gt;
|-&lt;br /&gt;
|FillText(s)&lt;br /&gt;
|Возвращает строку s с замененными названиями полей между знаками процента на соответствующие значения текущей записи. Так же в строке возможно использование интерпретируемого кода, заключенного между тегами &amp;quot;&amp;lt;?&amp;gt;&amp;quot; и &amp;quot;&amp;gt;&amp;quot;. При интерпретации система сначала производит замену полей с процентами на значения, потом интерпретирует код. ''Внимание! Функция не создает отельный контекст интерпретатора, а использует существующий, в нем доступны все объекты и переменные, вызывающего скрипта.'' Дополнительно автоматически создается объект TSelfADO, подключенный к той же БД, что и контекст, вызвавший функцию, с пустым именем, а так же с именем &amp;quot;dataset&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|Query(Query)&lt;br /&gt;
|Синоним GetSQLValue.&lt;br /&gt;
|-&lt;br /&gt;
|Close&lt;br /&gt;
|Закрывает набор данных.&lt;br /&gt;
|-&lt;br /&gt;
|Self&lt;br /&gt;
|Возвращает указатель на подключение к БД для использования в других объектах.&lt;br /&gt;
|-&lt;br /&gt;
|ParseForIn([FieldName='code']) &lt;br /&gt;
|Возвращает через запятую значения всех строк в указанном столбце. По умолчанию, используется столбец с именем code.&lt;br /&gt;
|-&lt;br /&gt;
|GetSQL&lt;br /&gt;
|Для отладки. Возвращает последний SQL запрос переданный в методы Open, Query, GetSQLValue&lt;br /&gt;
|-&lt;br /&gt;
|ExportExcel&lt;br /&gt;
|Для отладки. Выгружает в эксель содержимое датасета. Можно использовать в незнакомом окружении для понимания передаваемых полей в : шаблонах, печатных формах и т.д. Аналог команды %echo% в шаблонах, на случай если она не сработает.&lt;br /&gt;
|-&lt;br /&gt;
|OnGetText&lt;br /&gt;
|Функция подменяет текстовый вывод значения поля при выгрузке в эксель. Первый параметр это имя поля, которое надо подменить. Второй параметр это то что необходимо вывести. Работает только с текстовыми полями. &lt;br /&gt;
'''''Пример использования'''''  &lt;br /&gt;
  DB.OnGetText('Зона', IF((DB.FieldByName('-Lat') ! 0) * (DB.FieldByName('-Lon') ! 0),&lt;br /&gt;
       	GetPolygonByLatLon(DB.FieldByName('-Lat'), DB.FieldByName('-Lon'), 'TYPE = 1 AND IFNULL(zone, 0) &amp;gt; 0 AND PRICE = ' + DB.FieldByName('-price'), 'zone')&lt;br /&gt;
  ,&lt;br /&gt;
        ''&lt;br /&gt;
  ));&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования – см. TSelfADO&lt;br /&gt;
&lt;br /&gt;
== Объект TSelfADO ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наследник объекта TADO. Служит для подключения к «родной» для программы, в которой выполняется скрипт, базе данных. Обладает всеми свойствами и методами объекта TADO, кроме Connect. Иногда автоматически создается системой для обеспечения простого доступа к базе данных, а также иногда создается системой с уже открытым набором данных для передачи обрабатываемого системой набора данных в скрипт. В этом случае для скрипта недоступны функции Open и Close.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&lt;br /&gt;
 rem('Копируем данные из &amp;quot;родной&amp;quot; базы данных в базу MSSQL.');&lt;br /&gt;
 new('TSelfADO', 'MyDB');&lt;br /&gt;
 new('TADO', 'MSSQL');&lt;br /&gt;
 MSSQL.Connect('Provider=SQLOLEDB.1;Password=myPassword;Persist Security Info=True;User ID=myUsername;Initial Catalog=myDataBase;Data Source=myServerAddress');&lt;br /&gt;
 MyDB.Open('select code, name, passport from kurier where code&amp;gt;'+Int(MSSQL.Query('select max(code) from kurier'))+' order by code');&lt;br /&gt;
 While(MyDB.EOF=0,&lt;br /&gt;
      MSSQL.Query('insert kurier (code, name, passport) VALUES ('+MyDB.Code+', '+QuotedStr(MyDB.Name)+', '+QuotedStr(MyDB.Passport)+')');&lt;br /&gt;
      MyDB.Next;&lt;br /&gt;
      );&lt;br /&gt;
&lt;br /&gt;
== Объект TPrinter ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к принтерам.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
BeginDoc – Начинает новый документ.&lt;br /&gt;
&lt;br /&gt;
EndDoc – Закрывает документ&lt;br /&gt;
&lt;br /&gt;
PageHeight – Возвращает высоту страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageWidth – Возвращает ширину страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageNumber – Возвращает номер текущей страницы документа&lt;br /&gt;
&lt;br /&gt;
Orientation – Возвращает текущую ориентацию страницы (0 – портретная, 1 – ландшафтная)&lt;br /&gt;
&lt;br /&gt;
Printing – Возвращает истину если документ открыт&lt;br /&gt;
&lt;br /&gt;
SetOrientation(Orientation) – Устанавливает ориентацию страницы. При необходимости начинает новый документ, новую страницу.&lt;br /&gt;
&lt;br /&gt;
ShowDialog – Показывает пользовательский диалог печати. Возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
NewPage – Начинает новую страницу&lt;br /&gt;
&lt;br /&gt;
Canvas – Предоставляет доступ к объекту TCanvas, связанному с принтером.&lt;br /&gt;
&lt;br /&gt;
PrinterNames – Возвращает список принтеров, установленных в системе, разделенный переносами строк&lt;br /&gt;
&lt;br /&gt;
PrintersCount – Возвращает количество установленных в системе принтеров&lt;br /&gt;
&lt;br /&gt;
SetPrinter(Printer) – Устанавливает текущий принтер. Если передана строка – ищет принтер по названию, иначе – по номеру. Нумерация начинается с 0.&lt;br /&gt;
&lt;br /&gt;
PrintTable(Y, Table) – Выводит на печать таблицу Table типа TTable, начиная с координаты Y. При необходимости таблица печатается на нескольких страницах. Возвращает координату Y конца таблицы.&lt;br /&gt;
&lt;br /&gt;
GetDefaultPrinter - Возвращает имя текущего активного принтера.&lt;br /&gt;
&lt;br /&gt;
SetDefaultPrinter(Printer) – Запоминает предыдущий активный принтер и устанавливает новый текущий принтер. Printer - имя принтера. При необходимости нескольких последовательных вызовов SetDefaultPrinter рекомендуется между вызовами использовать RestoreDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
RestoreDefaultPrinter - Устанавливает активным принтер, который был текущим перед последним вызовом SetDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
== Объект TCanvas ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предоставляет доступ к холсту объекта для прорисовки изображения.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
DPIX – Возвращает разрешение холста по горизонтали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
DPIY – Возвращает разрешение холста по вертикали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
TextOut(x, y, s[, x1, y1, x2, y2]) – Выводит строку s начиная с точки с координатами x и y. Если указаны параметры x1, y1, x2, y2 – то выводимый текст ограничивается заданным прямоугольником.&lt;br /&gt;
&lt;br /&gt;
TextOutEx(x1, y1, x2, y2, Alignment, Font, s, Indent) – Выводит строку s в прямоугольнике с координатами x1, y1, x2, y2. По горизонтали строка выравнивается в соответствии с Alignment (0 – прижато влево, 1 – вправо, 2 – по центру), по вертикали выравнивается по центру. Используя шрифт Font (см описание ниже). Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату X фактического окончания текста (правой стороны – если строка прижата влево, и левой – в остальных случаях)&lt;br /&gt;
&lt;br /&gt;
MLTextOut(x1, y1, x2, y2, Alignment, VAlignment, Font, s, Heigth, Indent) – Выводит многострочный текст s в прямоугольнике с координатами x1, y1, x2, y2 с переносом по словам. По горизонтали строки выравниваются в соответствии с Alignment, по вертикали – в соответствии с VAlignment (0 – прижато вверх, 1 – по центру, 2 – прижато вниз). Используя шрифт Font (см описание ниже). Heigth – высота строки. Если опущено или равно нулю – высота определяется автоматически в соответствии с выбранным шрифтом. Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату Y фактического окончания текста (нижней границы последней строки текста. ''ВНИМАНИЕ! Функция использует координаты прямоугольника для позиционирования текста, однако она не ограничивает его верхней и нижней границами этого прямоугольника!''&lt;br /&gt;
&lt;br /&gt;
DrawPic(x1, y1, x2, y2, Pic, Style, Alignment, Mode) – Прорисовывает изображение Pic (ссылка на изображение TPicture.Self) в прямоугольник заданный координатами x1-y2. Style – стиль масштабирования. 0 – растянуть изображение до границ прямоугольника не сохраняя пропорции, 1 – вписать изображение в прямоугольник сохраняя пропорции – вероятно, останутся поля по вертикали или горизонтали, 2 – вписать сохраняя пропорции, обрезав при необходимости изображение по вертикали или горизонтали. Alignment – выравнивание по горизонтали. Работает только в случае если style=1 и при растягивании изображения получились вертикальные поля. 0 – разместить по центру, 1 – прижать влево, 2 – прижать вправо. Функция возвращает координату X правой стороны изображения кроме случая, когда Style=1 и Alignment=2 – в этом случае возвращается координата левой стороны изображения. Mode - способ наложения изображения. 0 (по-умолчанию) - копирование как есть. 1 - Наложение операцией AND (применяется для получения эффекта прозрачности изображения), 2 - наложение операцией XOR (Применяется для возможности повторной операцией убрать изображение), 3 - Наложение операцией OR.&lt;br /&gt;
&lt;br /&gt;
FillRect(x1, y1, x2, y2) – Рисует прямоугольник '''без границ''' и закрашивает цветом BrashColor&lt;br /&gt;
&lt;br /&gt;
Rect(x1, y1, x2, y2) – Рисует прямоугольник '''c границами''', задаваемыми текущим пером, и закрашивает цветом BrashColor &lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Устанавливает шрифт по-умолчанию.&lt;br /&gt;
&lt;br /&gt;
SetPen(Width, Color) - Устанавливает параметры &amp;quot;ручки&amp;quot; - толщину и цвет. Если любой параметр опустить, соответствующее значение не будет изменено.&lt;br /&gt;
&lt;br /&gt;
SetBrush(Color, Style) - Устанавливает параметры заливки - цвет и стиль. Если любой параметр опустить, соответствующее значение не будет изменено. Стили заливки: 0 - сплошная, 1 - отсутствует (прозрачная), 2-7 - различные виды штриховки (горизонтальные, вертикальные, в клеточку и т.д.).&lt;br /&gt;
&lt;br /&gt;
TextHeight(s) – Возвращает высоту текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
TextWidth(s) – Возвращает ширину текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
Использование шрифта (Font): У объекта TCanvas есть «глобальные» установки шрифта. Однако для некоторых функций возможно указание шрифта, отличающегося от глобального. Параметры шрифта – это текстовая строка, состоящая из 6-ти параметров, разделенных запятыми: Название, размер, жирный, курсив, подчеркнутый, цвет. Например:&lt;br /&gt;
&lt;br /&gt;
 'Times New Roman, 8, Y, N, N, 255'&lt;br /&gt;
&lt;br /&gt;
Любой параметр можно опустить, и тогда вместо него будет использовано значение по-умолчанию: шрифт: arial, размер – 10, не жирный, не курсив, не подчеркнутый, цвет – черный. Например: ', 7' – указывает, что по-умолчанию нужно взять все параметры кроме размера шрифта. Также можно вместо всей строки указать тире ('-') или пустую строку, и шрифт будет использоваться «глобальный».&lt;br /&gt;
&lt;br /&gt;
Объект можно создать отдельно, не создавая объект TPrinter. В таком случае объект создастся как ссылка на текущий холст принтера (принтер должен быть запущен и начат новый документ). Такой подход используется в доп. возможности PrintCustomSticker&lt;br /&gt;
&lt;br /&gt;
== Объект TPicture ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с графическими изображениями форматов BMP, GIF, JPEG и PNG, а также для формирования штрих-кодов. Обратите внимание, прозрачность изображений не поддерживается, однако в методе TCanvas.DrawPic есть параметр Mode, призванный создавать эффект прозрачности.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(FileName) – Загружает изображение из файла FileName. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB, Query) – Загружает изображение из базы данных. DB – ссылка на подключение к базе данных TADO.Self, Query – текст запроса. Запрос должен вернуть в первом поле первой строки BLOB-поле с изображением, все остальные данные возвращаемые запросом игнорируются. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromStr($s) – Загружает изображение из строки $s. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
CreateBar(Width, Height, BarCode, Textless, Type) – Формирует штрих-код шириной Width и высотой Height с типом кодирования Type. BarCode – текст штрих-кода. Булево значение Textless указывает, что в штрих-коде не должно быть человеко-читаемых символов если истинно. Type указывает тип кодирования: 0 (по-умолчанию) CODE128, 1 - EAN-13, 2 - Interleaved 2-5, 3-DataMatrix, 4-QRCode.&lt;br /&gt;
Штрихкод должен быть: Для EAN-13 цифровым 12 или 13 символов (13-й, контрольная сумма рассчитывается автоматически), для CODE128 - должен иметь состоять из допустимого для этого кодирования набора символов. Для Interleaved - должен состоять из четного числа цифр, контрольная сумма автоматически не рассчитывается. Если для Interleaved кода указано значение из 14-ти знаков, подпись цифр выводится в формате Почты России.&lt;br /&gt;
Внимание! Для кодов EAN-13 и Interleaved ширина штрих-кода Width не является точным значением получаемого на выходе изображения. Ширина изображения рассчитывается как максимальное кратное минимально возможной ширине, но не меньше минимально возможной. Конечную ширину можно получить в соответствующем свойстве объекта. Для кода CODE128 штрих-код на выходе может оказаться пустым, если указанной ширины штрих-кода не достаточно для его формирования.&lt;br /&gt;
Для кода DataMatrix можно установить режим для печати скрытых символов с кодами 29(GS) и 232(FCN1), которые требуются для формирования Честного Знака. Для этого необходимо в начале строки указать символ &amp;quot;[&amp;quot; и все разделители 01, 21, 91, 92 так же экранировать этими скобками. Должно получиться [01]02900002317701[21]k3LInNbH_oG0Q[91]EE06[92]YXiyKfiHjE4YE8b+YVMC1O5r8VtpplA3AwcCqrcG9Dk= . При формировании кода, включится режим формирования штрих-кода DataMatrix GS1, в начале будет добавлен символ с кодом 232 (FCN1), а потом будут добавлены разделители с кодом 29 (GS)&lt;br /&gt;
Функция возвращает 1 в случае успеха, или текст ошибки, если такая произошла.&lt;br /&gt;
&lt;br /&gt;
SetSize(Width, Height) - Устанавливает размер изображения.&lt;br /&gt;
&lt;br /&gt;
AsString([ImageFormat]) - Возвращает изображение в виде строки с двоичными данными. ImageFormat принимает значения 1 - Bitmap (по-умолчанию), 2 - jpeg, 3 - png, 4 - gif.&lt;br /&gt;
&lt;br /&gt;
Width – Возвращает ширину изображения.&lt;br /&gt;
&lt;br /&gt;
Height – Возвращает высоту изображения.&lt;br /&gt;
&lt;br /&gt;
Rotate(Angle) – Поворачивает изображение по часовой стрелке на угол Angle. Угол указывается в градусах и может принимать любые значения.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с изображением, используется в качестве параметра для функций, работающих с изображениями из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Canvas - ссылка на объект TCanvas холста изображения.&lt;br /&gt;
&lt;br /&gt;
== Объект TTable ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с таблицами. Удобен для печати таблицы на принтере. Алгоритм таков: Загружаем датасет в таблицу, настраиваем ее (шрифты, штрих-коды и т.д.), потом выводим на принтер функцией TPrinter.PrintTable.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Заголовок – это первая строка таблицы.&lt;br /&gt;
&lt;br /&gt;
Cell(С, R) – Возвращает значение ячейки таблицы с координатами (C, R). Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetCell(С, R, Value) – Устанавливает значение ячейки таблицы с координатами (C, R) в Value. Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
RowCount – Возвращает количество строк в таблице.&lt;br /&gt;
&lt;br /&gt;
ColCount – Возвращает количество столбцов в таблице.&lt;br /&gt;
&lt;br /&gt;
SetTitleFont(Font) – Задает шрифт заголовка таблицы (первой строки).&lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Задает шрифт всей таблицы кроме заголовка.&lt;br /&gt;
&lt;br /&gt;
SetColFont(C, Font) - Устанавливает шрифт столбца C.&lt;br /&gt;
&lt;br /&gt;
SetIndent(Indent) – Задает отступ от границы ячейки до текста в процентах от ширины страницы. По-умолчанию значение 0.3&lt;br /&gt;
&lt;br /&gt;
SetWidth(С, Width) – Задает значение ширины столбца C в процентах от ширины страницы.&lt;br /&gt;
&lt;br /&gt;
SetMinRowHeght (Heght) – Задает значение минимальной высоты строки в пикселях. &lt;br /&gt;
&lt;br /&gt;
SetBarCode(Col, Type) - Указывает, что данные из столбца Col должны печататься в виде штрих-кода. Тип штрих-кода - Type. Значение '''&amp;quot;1&amp;quot; - EAN13'''. Для кода EAN13 первая строка данных в ячейке должна иметь вид &amp;quot;тип штрих-кода, номер&amp;quot;, например &amp;quot;7, 123&amp;quot; (без кавычек, конечно). В этом случае система сформирует штрих-код: &amp;quot;2700000001233&amp;quot;. Первая цифра - всегда 2, далее - указанный тип штрих-кода, нули, чтобы получилось 13 символов, номер, указанный в таблице, и один символ - контрольная сумма. Значение '''&amp;quot;2&amp;quot; - CODE128''' (с версии 734). Данные из первой строки ячейки таблицы печатаются в штрих-коде &amp;quot;как есть&amp;quot;. Для всех видов штрих-кода (с версии 734) последующие строки печатаются под штрих-кодом в виде текста.&lt;br /&gt;
&lt;br /&gt;
SetMultiHeader(Active) - Включает печать заголовка при переносе таблицы на несколько страниц. По умолчанию отключено.&lt;br /&gt;
&lt;br /&gt;
SetCustomHeader(script) - Включает печать пользовательского заголовка. Script - это код интерпретатора, который должен печатать заголовок на канву. Печать таблицы может происходить на нескольких листах, по этому скрипт будет вызван для каждого листа. При использовании этого метода, автоматически инициализируются переменные: $TablePageNo - номер страницы, нумерация начинается с нуля; $TableY - координата по оси Y, от которой рисуется заголовок. Чтобы таблица была под заголовком необходимо значение переменной $TableY увеличить на высоту заголовка.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с таблицей, используется в качестве параметра для функций, работающих с таблицами из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 &amp;lt;?&amp;gt;&lt;br /&gt;
 NEW('TPrinter', 'Prn');&lt;br /&gt;
 If(prn.ShowDialog,&lt;br /&gt;
  NEW('TTable', 'Tbl'); &lt;br /&gt;
  NEW('TSelfADO', 'MyDB'); &lt;br /&gt;
  MyDB.Open('SELECT concat(&amp;quot;7&amp;quot;, &amp;quot;, &amp;quot;,  a.code, &amp;quot;\r\n&amp;quot;, a.client_id, &amp;quot;\r\n&amp;quot;, a.zakaz, &amp;quot;-&amp;quot;, a.number) as &amp;quot;Штрих-код&amp;quot;, a.target AS &amp;quot;Заказик&amp;quot;, address, phone, vlog, poruch FROM address a order by code desc limit 10');&lt;br /&gt;
  Tbl.LoadFromDB(MyDB.Self); &lt;br /&gt;
  Tbl.SetBarcode(1, 1);&lt;br /&gt;
  Tbl.SetCustomHeader(     &lt;br /&gt;
    if($TablePageNo&amp;gt;0,&lt;br /&gt;
      Prn.Canvas.TextOut(Prn.Canvas.DPIX*0.1, $TableY, 'Продолжение таблицы');&lt;br /&gt;
      set($TableY, $TableY + Prn.Canvas.TextHeight('H'));&lt;br /&gt;
    ,0)&lt;br /&gt;
  );&lt;br /&gt;
  Prn.BeginDoc; &lt;br /&gt;
  Prn.PrintTable(0, Tbl.Self);   &lt;br /&gt;
  Prn.EndDoc&lt;br /&gt;
 , );&lt;br /&gt;
&lt;br /&gt;
== Объект TBaseUtils ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции, базирующиеся на БД системы «MEASOFT». По-умолчанию, при создании подключается к основной базе данных модуля, в котором выполняется скрипт, если такая определена контекстом, однако это можно изменить, см SetConnection.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
'''MakeAddress(s[,town])''' – возвращает значение, полученное путем преобразований адреса s для приведения его к внутреннему формату программы. В процессе преобразования до нескольких раз происходит замена буквосочетаний по таблице замены (ее редактирование доступно по нажатию кнопки «Автозамена» в интерфейсе импорта БД из Excel системы (см. Руководство пользователя)), поиск улиц по базе КЛАДР с точностью до одного знака, и некоторые другие операции, нацеленные на исправление ошибок в написании адреса.&lt;br /&gt;
&lt;br /&gt;
С версии программы 2008.0.0.615, при вызове функции в формулах загрузки реестра, в первую очередь происходит проверка строки s на условия:&lt;br /&gt;
* в строке s записано  число; &lt;br /&gt;
* строка s начинается с &amp;quot;ПВЗ &amp;quot;. &lt;br /&gt;
Если одно из этих условий выполняется, то функция пытается установить пункт самовывоза - т.е она сама в загружаемой карточке корреспонденции укажет: адрес ПВЗ, город ПВЗ и установит галку самовывоз. &amp;lt;br/&amp;gt;Правила поиска ПВЗ:&lt;br /&gt;
* Если s число -  считаем его внутренним кодом филиала;&lt;br /&gt;
* Если s начинается с &amp;quot;ПВЗ &amp;quot; - Например в адресе передана строка &amp;quot;ПВЗ На Ленинском проспекте&amp;quot;, то искать будем филиал с названием &amp;quot;На Ленинском проспекте&amp;quot; который подчиненный, активный, с галкой ПВЗ и в городе town. Если город не указан, то ищем филиал во всех городах, и считаем его найденным если найдем только один филиал. &lt;br /&gt;
* Если филиалы найти не удалось, функция makeaddress работает как обычно и выполняет преобразование адреса.&lt;br /&gt;
&lt;br /&gt;
Если адрес не содержит русских букв, только латиница, и курьерская служба находится в одной из стран Россия, Белоруссия, Казахстан или Украина, и город-получатель (второй параметр, town) находится так же в одной из этих стран, функция автоматически делает транслитерацию адреса на русский язык.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''SetConnection(DB) – Подключает объект к базе данных DB, где DB – ссылка на объект TADO.Self.'' '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
''SetTown(Town) – Устанавливает код текущего города (используется в некоторых функциях объекта) в значение Town. По-умолчанию текущий город – 1.''  '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
'''SetIndexLength(Length)''' – Устанавливает длину почтового индекса. По-умолчанию – 6.&lt;br /&gt;
&lt;br /&gt;
'''GetIndex(Address)''' – Возвращает почтовый индекс из адреса.&lt;br /&gt;
&lt;br /&gt;
'''GetStreet(Address)''' - Возвращает улицу до первой запятой.&lt;br /&gt;
&lt;br /&gt;
'''GetHome(Address)''' - Возвращает номер дома до второй запятой, но не более пяти символов.&lt;br /&gt;
&lt;br /&gt;
'''GetKurierByStation(station, Mass, Cash, Date_Putn)'''&lt;br /&gt;
&lt;br /&gt;
'''TownByIndex(Index[, PriorityName][, PriorityCountry])''' – Возвращает код города по индексу. В случае ошибки поиска – код текущего города. Если нашлось несколько населенных пунктов, и указано приоритетное название - выбирается населенный пункт, название которого начинается с PriorityName (если есть).&lt;br /&gt;
&lt;br /&gt;
'''TownByName(Name[,NotNeedCL=False, City=0])''' – Возвращает код города по имени. В случае ошибки поиска – возвратит код текущего города. Если параметр NotNeedCL (параметр не обязательный) установить в TRUE, тогда функция возвратит 0, если город не удалось найти. Параметр City (код региона) позволяет ограничить поиск одной областью (не обязательный, по умолчанию не используется).&lt;br /&gt;
&lt;br /&gt;
'''FillClientInfo(Excel, client, Sheet, Row, Col)''' – Выводит в эксель информацию о клиенте с кодом client на лист sheet начиная со строки row и столбца col.&lt;br /&gt;
&lt;br /&gt;
'''SavePrintFormToFile(FormType, FormNumber)''' - Сохраняет на диске файл печатной формы и возвращает путь к нему&lt;br /&gt;
&lt;br /&gt;
'''CreateTrans(Address[, Store][, Operator][,Correction])''' - Формирует запись для печати кассового чека для корреспонденции с кодом Address, для выбора кассового аппарата используется код склада Store. Если Store не указано - при исполнении в среде клиентского модуля системы использует склад, указанный пользователем в окне [[Настройка параметров рабочего места|&amp;quot;Настройка&amp;quot; - &amp;quot;Параметры&amp;quot;]], в остальных модулях - код текущего склада из [[Настройка глобальных параметров|переменной]] &amp;quot;CL&amp;quot; (&amp;quot;Текущий филиал&amp;quot;). Поле Operator позволяет указать кассира (передается код справочника сотрудников). Если не указан, в основной системе будет использован код авторизованного пользователя, в других модулях - 1.&lt;br /&gt;
Поле Correction позволяет указать данные для корректировочного чека, используется в системе Штрих-М. По умолчанию пустая строка. Возвращает идентификаторы записей чеков. Может вернуть пустую строку, если чек создавать не понадобилось, один или несколько кодов через запятую, если создано несколько чеков. В случае ошибки вызывает ошибку, поэтому рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CreateReturnTrans(Address)''' - формирует запись для печати чека возврата для корреспонденции с кодом Address. Чек возврата печатается на полную сумму и с теми же атрибутами, что и чек продажи. Возвращает идентификатор записи чека возврата. В случае ошибки вызывает ошибку, поэтому, как и с CreateTrans,  рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownDeliveryDays(Source, Mode, TownTo, TownFrom)''' - возвращает количество дней необходимых на доставку отправления, только для межгорода. Source - код клиента, Mode - режим срочности, TownFrom - код города отправителя, TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcDeliveryDate(Source, Mode, TownTo, TownFrom, Date_Beg, Time_beg)''' - Возвращает планируемую дату доставки с учетом сроков доставки. Работает при городской и междугородней доставке. Для межгорода сроки доставки берутся из зон. Для городской доставки, из дополнительных параметров статуса (17 статус, 1 параметр в доп. информации)  Если рассчитать дату планируемой доставки не удалось, возвращает пустую строку. Параметры: Source - код клиента, Mode - режим срочности, TownTo - город получатель, TownFrom - город отправитель, date_beg - дата заказа (может быть передана строкой в формате DD.MM.YYYY или в числовом), time_beg - время заказа. &lt;br /&gt;
&lt;br /&gt;
'''GenSpecialSMA(DirectExcel, Code)''' - функция для генерации отчета о доставке по акту передачи денег. Первый параметр - указатель на TDirectExcel, второй параметр - код акта передачи денег. АПД выводится на текущий лист объекта TDirectExcel.&lt;br /&gt;
&lt;br /&gt;
'''CreateSpecialSMA(ClientCode, DateTo)''' - Функция создает исходящий акт передачи денег (АПД). Требует ClientCode - код клиента, DateTo - дату акта. Функция возвращает коды созданных актов. Если возвращаемых параметров два, значит функция пыталась создать два АПД: первым, идет код АПД с наличной оплатой, а вторым с безналичной. Примеры возвращаемого результата: '0'- акт не был создан, отсутствуют корреспонденции; '124' - код созданного акта; '0,0' - пытались создать два акта, но отсутствуют данные; '4556,0' - создан только наличный АПД; '0,445' - создан только безнал.; '4556,445' - созданы нал. и безнал.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressForActDelivery(ActCode, [DeliveryDateMode=0, Delivery=True])''' - Функция создает корреспонденцию на доставку акта. ActCode - код акта; DeliveryDateMode: 0 - установить план. дату доставки текущим рабочим днем, 1 - установить план. дату доставки следующим рабочим днем, 2 - установить план. дату доставки равной планируемой дате оплаты АПД; Delivery - создать корр. на доставку АПД или создать корреспонденцию на забор АПД (по умолчанию, доставка АПД). Работа функции может быть изменена системной доп. возможностью OnCreateAddressForActDelivery.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressTransferAct(ClientCode, Store, DateTo, [AdditionalParam])''' - Функция создает исходящий акт передачи корреспонденции (АПК). Требует  ClientCode - код клиента, Store - код филиала, для которого будет создан акт, DateTo - дату, до которой в акт попадут возвраты, AdditionalParam - дополнительный строковый параметр для передачи в системную доп. возможность ExceptionsForAPK, позволяющий отобрать в акт, например, только полные возвраты.   Возвращает код созданного акта. ВНИМАНИЕ: при создании АПК используется системная функция ExceptionsForAPK. Если в ней используются интерактивные функции (вывод сообщений, диалоговые окна, выполнение скриптов), то акт сформирован не будет, а функция CREATEADDRESSTRANSFERACT вернет ошибку.     &lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByAddress(Address, TownCode, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попал адрес. Если полигон найти не удалось, функция возвратит пустую строку. Address - адрес корреспонденции текстом; TownCode - код города; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByAddress(addressrecord.address, if((addressrecord.number=0)*(addressrecord.strbarcode=&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;), addressrecord.townfrom, addressrecord.townto), '`schema`=1') - пытаемся найти вхождение адреса в полигоны 1 схемы, при выборе города учитывается корр. на забор, у нее нужно использовать город-отправитель (а для обычной корр. нужен город-получатель).&lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByLatLon(Lat, Lon, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попали GPS координаты. Если полигон найти не удалось, функция возвратит пустую строку. Lat - широта  текстом; Lon - долгота текстом; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByLatLon('55.769064','37.590713','zone is not null and price=0') - пытаемся найти вхождение координат в полигоны, где задана зона, для всех клиентских и курьерских зон.&lt;br /&gt;
&lt;br /&gt;
'''GetLatLonByAddress(AddressText, TownCode)''' - возвращает географические координаты вида lat,lon указанного в AddressText адреса. Поиск производится в городе, имеющем код TownCode в таблице Town.&lt;br /&gt;
&lt;br /&gt;
'''GetRouteCode(AddressText, TownCode, LatLon[, Lon])''' - для адреса AddressText в городе с кодом TownCode (из таблицы Town) по географическим координатам lat, lon возвращает код роута (записи, хранящей координаты адреса в городе). Если роут не найден (для адреса в городе не найдено записи с указанными координатами) - создает новый роут и возвращает его код, если роут найден (был создан ранее) - обновляет у роута координаты. Если параметр Lon задан, то параметр LatLon должен содержать одну координату, иначе LatLon должен содержать строку вида 'lat, lon'.&lt;br /&gt;
В случае ошибки возвращает Null.&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode(address, townto, '55.114034, 36.592397'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Троицк, Полковника милиции Курочкина ул., 11', 1, '37.467446, 55.740537'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Обнинск, Маркса пр., 20', TownByName('Обнинск'), 55.114034, 36.592397));&lt;br /&gt;
&lt;br /&gt;
'''CalcAgentPrice(AddressCode, AgentCode, TownFrom, TownTo, Mode, [, Count=1])''' - функция возвращает стоимость доставки рассчитанную по тарифу агента. AddressCode - код адреса, AgenCode - код филиала (агента), TownFrom - код города отправителя, TownTo - код города получателя, Mode - режим срочности, count - тарифная сетку от указанного количества отправлений (по умолчанию 1)&lt;br /&gt;
&lt;br /&gt;
'''SetAddrKol_vo(address, getkol_vo)''' - функция делает прием корреспонденции в текущем ответственном филиале. address - внутренний код адреса, getkol_vo - количество принимаемых мест, может принимать значения: &amp;quot;kol_vo&amp;quot; - принять все места, &amp;quot;getKol_vo+1&amp;quot; - принять еще одно место, &amp;quot;число&amp;quot; - сделать количество принятых мест равным указанному числу.&lt;br /&gt;
&lt;br /&gt;
'''CalcClientCnt(client_code, date, is_intown [, date_put=CurrDate(), skipajust=false])''' - функция расчета количество доставленных корреспонденций у клиента с кодом client_code за предыдущий месяц от даты date (Или за текущий месяц, подробнее смотри переменную UseCurrentMonthCount) среди внутригородских (is_intown = true) либо междугородних (is_intown = false) корреспонденций, date_put - дата доставки (для альтернативного способа подсчета, включаемого переменной UseDatePutForCalcCnt), skipajust - не учитывать принудительно введенные количества (таблица priceclientadjust типы записей 0 и 1).&lt;br /&gt;
&lt;br /&gt;
'''GetBasePrice''' - возвращает базовую стоимость доставки посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов,зоны,типа,срочности,массы, расстояния. В системах с выключенными доп. услугами также считает проценты от суммы и страховки. &lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset._self&amp;quot;.&lt;br /&gt;
  Описание некоторых полей датасета:&lt;br /&gt;
    pmoney - процент от суммы;&lt;br /&gt;
    pmoneycard - процент от суммы при оплате картой;&lt;br /&gt;
    pricecode - код прайса (таблица Price) ;&lt;br /&gt;
    distarea - район метро получателя (актуально при отключённом едином районировании, как правило район от 200 до 299 является признаком области);&lt;br /&gt;
    region - признак области при включенном едином районировании;&lt;br /&gt;
    distareaFrom и regionFrom  - аналог distarea, region только для отправителя;&lt;br /&gt;
    pcncode - код записи таблицы pricecnt &amp;quot;количество от&amp;quot;;&lt;br /&gt;
    Запрос содержит поля таблицы pricelinesnew - начальная стоимость по тарифной сетки, найденные без учета массы,только по типу срочности и режиму.&lt;br /&gt;
    Запрос содержит поля таблицы price.&lt;br /&gt;
&lt;br /&gt;
*addressrecord - ссылка на объектную модель карточки корреспонденции, следует использовать уже созданную addressrecord._self&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*type - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*wait - количество минут ожидания (не учитывается при доп. услугах, есть системная услуга &amp;quot;ожидание&amp;quot;);&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*rur - сумма передаваемых денег (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от суммы&amp;quot;);&lt;br /&gt;
*inshprice - сумма страховки (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от объявленной стоимости&amp;quot;);&lt;br /&gt;
*distance - расстояние до места доставки, обычно поле заполняется при доставке в область (регион в едино районировании). Дополнительная наценка к стоимости доставки;&lt;br /&gt;
*forward - направление доставки: true - туда; false - обратно;&lt;br /&gt;
*Collection - признак заборной корреспонденции: true - забор, false - доставка (В тарифе есть возможность указать стоимость для забора);&lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
В тарифе есть возможность указать формулу, которая может влиять на базовый расчет. Формула может объявить служебные переменные, которые:&lt;br /&gt;
*$FormulaReplace - если true – возвращаемое значение полностью заменяет базовый расчет;&lt;br /&gt;
*$FormulaKoeff - коэффициент на который будет помножена базовая стоимость.&lt;br /&gt;
Также внутри формулы объявлены следующие объекты dataset, addressrecord и переменные:&lt;br /&gt;
*$ForceIntown - Переменная становится истиной, если междугородний расчет был отменен, т.к. адрес попал в нарисованную зону на карте.&lt;br /&gt;
*а также: $forward, $distance, $Count, $Collection, $Wait, $FormulaKoeff, $PriceCode - описание есть выше.&lt;br /&gt;
&lt;br /&gt;
Для направления &amp;quot;туда&amp;quot;, Функция GetBasePrice вызывается  через доп. услугу &amp;quot;База&amp;quot; (при включенных доп. услугах), для направления &amp;quot;Обратно&amp;quot; всегда вызывается напрямую (т.к. доп. услуги работают только в для направления &amp;quot;туда&amp;quot;).&lt;br /&gt;
На расчет этой функции влияют следующие переменные: &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Расчет стоимости по адресу&amp;quot;, &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Зона клиента по умолчанию&amp;quot;,  &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Подсчет кол-ва отправлений за месяц&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownPrice''' - возвращает базовую стоимость междугородней доставки, посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов, типа, срочности, массы, расстояния.&lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset.self&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*tp - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcAddressPrice(AddressCode, [,ZakazCount])''' - полностью пересчитывает стоимость доставки корреспонденции по тарифу клиента. AddressCode - внутренний код адреса, ZakazCount - не обязательный параметр, кол-во заказов от клиента.&lt;br /&gt;
&lt;br /&gt;
'''GetStationCode(s [,town])''' – возвращает код станции метро, ассоциированный в системе с адресом s. В случае невозможности идентифицировать станцию метро – возвращает 0. &lt;br /&gt;
Когда включено районирование по карте, необходим второй параметр &amp;quot;town&amp;quot; - код города в котором нужно искать адрес.  Возвращает код района если удалось его найти; код станции меж-города - если адрес удалось геокодировать, но район не нашли; код 0 - когда не удалось геокодировать адрес.&lt;br /&gt;
&lt;br /&gt;
'''RecalcSpecialSMA(ActCode)''' - пересчитать акт передачи денег (АПД). Также, у корреспонденций входящих в АПД будет пересчитана стоимость доставки. Для Входящего АПД сумма акта не пересчитывается. Параметр ActCode - внутренний код акта, коды можно перечислять через запятую.&lt;br /&gt;
&lt;br /&gt;
'''UserCode''' - Возвращает код текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserName''' - Возвращает имя текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserPass''' - Возвращает пароль текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''UserBaseCode''' – Возвращает код текущего пользователя из таблицы «Сотрудники» (kurier).&lt;br /&gt;
&lt;br /&gt;
'''UserEmail''' - Возвращает e-mail текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''CurrentTown''' – Возвращает код текущего города (из таблицы town).&lt;br /&gt;
&lt;br /&gt;
'''CurrentCity''' – Возвращает код текущего региона (из таблицы city).&lt;br /&gt;
&lt;br /&gt;
'''CurrentLocation''' – Возвращает код текущего филиала (из таблицы store).&lt;br /&gt;
&lt;br /&gt;
'''FromEmailStr''' - строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
'''FillExcelDoc'''(Excel, Dataset, FormType, FormNumber,Print,[printer]) - Выполняет указанную печатную форму в объекте excel. Excel объект можно не указывать, тогда функция сама создаст объект экселя и разрушит его, полезно когда книгу &lt;br /&gt;
нужно распечатать или отправить по email (на листе данных в ячейке 1,1 укажите ключевое слово email). Dataset объект с данными для скрипта в печатной форме, может быть null. Dataset передавать можно так db.self, тогда переданный dataset внутри печатной формы будет доступен по имени dataset. Print - печатает книгу на принтере, после печати объект excel разрушается, при использовании параметра не указываете объект excel. Printer - имя принтера, на котором печатать (по умолчанию пустая строка, что означает &amp;quot;печатать на принтере по умолчанию&amp;quot;). Например:&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'excel');&lt;br /&gt;
 FillExcelDoc(excel.self, null, 12, 1);&lt;br /&gt;
 excel.DoNotDestroy(true);&lt;br /&gt;
 excel.SetVisible(true);&lt;br /&gt;
 ''Покажет эксель с выполненной печатной формой''&lt;br /&gt;
&lt;br /&gt;
'''ValutaSign''' – Возвращает название валюты для суммы.&lt;br /&gt;
&lt;br /&gt;
'''SendToMeasoft(xml)''' - Отправляет запрос в клиентское API Measoft. Автоматически добавляет начальный &amp;quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''InsertFirmAtt(excel, sheet, firmcode)''' - Вставляем на лист эксель по коду фирмы: печать, подпись, подпись бухгалтера, логотип. Тэги &amp;lt;STAMP&amp;gt;, &amp;lt;DIR&amp;gt;, &amp;lt;BUH&amp;gt;, &amp;lt;LOGO&amp;gt; соответственно. После тега можно указать размеры изображения в символах Microsoft Excel. Формат записи: &amp;lt;STAMP&amp;gt; 16, 16&lt;br /&gt;
&lt;br /&gt;
'''PreCalcSalary(kurier, addressCodes)''' - Рассчитывает предварительную зарплату. Kurier - код курьера, используется для определения тарифа. addressCodes - коды адресов, через запятую для которых необходимо посчитать зарплату. Результаты расчета будут записаны в таблицу kurierpaydetail, так как расчет предварительный то записи не будут прикреплены к конкретному начислению. &lt;br /&gt;
&lt;br /&gt;
  select a.code, kpd.price as &amp;quot;туда&amp;quot;, kpd2.price as &amp;quot;обратно&amp;quot; from address a &lt;br /&gt;
  left join kurierpaydetail kpd on kpd.sourcetable=3 and kpd.sourcecode=a.code and kpd.rectype = 1 &lt;br /&gt;
  left join kurierpaydetail kpd2 on kpd2.sourcetable=3 and kpd2.sourcecode=a.code and kpd2.rectype = 2&lt;br /&gt;
  where a.code in (...)&lt;br /&gt;
&lt;br /&gt;
'''CalcSalary(DateTo, [Filter=0, KurierCode = 0, ManagerCode = 0])''' - Полный расчет зарплаты курьерам. DateTo  - дата до которой создается начисление. Условия отбора курьеров для начисления. Filter - роль сотрудника: 0 - Все, 1 - курьеры, 2 - менеджеры; KurierCode - код курьера, ограничить расчет зарплаты одним курьером;ManagerCode - код курьера, ограничить расчет зарплаты курьерами указанного менеджера. Внимание фильтры Filter, KurierCode и ManagerCode накладываются друг на друга. Результатом функции является SubSQL с информацией по созданным начислениям. &lt;br /&gt;
  поля ответа: код курьера, код менеджера, начислено, бонусы, штрафы, аванс, итого;&lt;br /&gt;
  select kurier, manager, profit, bonus, shtraf, prepay, total  [union select ...]&lt;br /&gt;
&lt;br /&gt;
'''SelDistAddr(s)''' – Возвращает строку для вставки в select запрос, для вывода поля с упрощенным адресом. Принимает один необязательный строковый параметр - алиас таблицы из которой будет упрощаться поле address, по умолчанию &amp;quot;a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''VoiceReadStr(str)''' – Озвучивает фразу str голосовым уведомлением доступными словами из базы. Может содержать тег &amp;quot;{break_off}&amp;quot; для того, чтобы сделать эту фразу не пропускаемой в очереди воспроизведения.&lt;br /&gt;
&lt;br /&gt;
'''CalcStorageCost(ClientCodes, DateFrom, DateTo, NeedReport[, Store])''' – рассчитывает стоимость хранения на складе для выбранных клиентов (ClientCodes - коды клиентов через запятую), в период дат с DateFrom до DateTo, с прикреплением к корреспонденции отчета в зависимости от выставленного параметра NeedReport. Может содержать параметр Store - код филиала, по умолчанию пустой (расчет выполняется для всех филиалов). Возвращает коды созданных корреспонденций через запятую.&lt;br /&gt;
&lt;br /&gt;
'''WriteOut(DocId, ItemId, Date, Cnt[, BC])''' – производит списание товара со склада. DocId - код (docs.code) документа списания, ItemId - код товара (item.code), Date - дата операции, Cnt - количество списываемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер. Если указан BC, то параметр ItemId игнорируется и поиск номенклатуры происходит исключительно по штрих-коду. В случае успеха, функция возвращает строку вида: код номенклатуры, списанное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''IncomePurch(DocId, ItemId, Date, Cnt[, BC, Location = CurrentLocation])''' – производит приход товара на склад. DocId - код (docs.code) приходной накладной, ItemId - код товара (item.code), Date - дата операции, Cnt - количество приходуемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер, Location - код склада (store.code).  В случае успеха, функция возвращает строку вида: код номенклатуры, введенное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''CreateLedgerDoc(Date, Client, UserCode, Type[, ExtNumber, Message])''' - создает складской документ и возвращает код этого документа. Date - дата документа. Client - код клиента. UserCode - код пользователя, создавшего документ. Type - тип документа (statetype = 13). ExtNumber - номер у поставщика для документов прихода и расхода. Message - комментарий к документу. Последние два аргумента не обязательные и могут быть пустыми.&lt;br /&gt;
&lt;br /&gt;
== Объект TINIFile ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции работы с ini-файлами. В некоторых контекстах создается автоматически для предоставления доступа к настроечному файлу модуля, выполняющего скрипт.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
IniParam(s[,section='common']) – Существует только если имя экземпляра объекта пустое. Возвращает значение параметра s ini-файла секции «common», изменить секцию можно не обязательным параметром section. В случае отсутствия параметра в файле возвращает пустую строку. &lt;br /&gt;
&lt;br /&gt;
Param(s) – Синоним IniParam с тем отличием, что существует только если имя объекта непустое.&lt;br /&gt;
&lt;br /&gt;
SetText(s) - Загружает ini файл из строки s. Если в файле нет секции «common», то принудительно объявляет ее в начале.&lt;br /&gt;
&lt;br /&gt;
== Объект TSMS ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для отправки SMS, а также проверки статуса их доставки.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetProxy(Server, Port, User, Pass) - Устанавливает настройки прокси-сервера.&lt;br /&gt;
&lt;br /&gt;
Connect(Provider, Host, User, Pass, SenderName, SMSPrefix) – Подключает объект к провайдеру provider, используя адрес Host, имя пользователя User и пароль Pass. Значение SMSPrefix предназначено для того, чтобы провайдер мог различить сообщения от разных филиалов, если этими филиалами используется одно подключение. Если необходимости разделять сообщения нет - значение SMSPrefix можно не указывать.&lt;br /&gt;
Для провайдера доступны значения 'mirsms', 'sms16', 'websms', 'epochta', 'zanzara', 'SMSManager', 'f1sms', 'BitCall', 'mirsmsGET', 'AMD' и другие, либо можно указать числовые значения номера протокола, от 1 до &amp;lt;rspoiler text=&amp;quot;20&amp;quot;&amp;gt;Набор провайдеров все время дополняется, количество и номера можно смотреть в Справочники - Переменные - Подключения - SMS&amp;lt;/rspoiler&amp;gt; соответственно. Эти значения соответствуют значениям переменной SMSProtocol таблицы &amp;quot;Value&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SendSMS(Phone, Text, [ID]) – Отправляет SMS с текстом Text на телефон Phone. Для некоторых провайдеров необходим уникальный идентификатор сообщения ID (для провайдера iVoice - идентификатор сценария (кампании)). Возвращает ID провайдера для последующей проверки статуса доставки.&lt;br /&gt;
&lt;br /&gt;
CheckSMS(ProviderID) – Проверяет состояние доставки сообщения с идентификатором ProviderID. Возвращает: 0 – доставляется, 1 – успешно доставлено, 2 – не доставлено.&lt;br /&gt;
&lt;br /&gt;
ReceiveSMS(InboxID, DateFrom, DateTo, NewOnly) - Получает входящие SMS, с ящика InboxID (идентификатор выдаётся провайдером). DateFrom, DateTo - задается временной интервал в котором были приняты сообщения(формат 08.04.2013 18:00:00 'DD.MM.YYYY HH:NN:SS'). Чтобы получать только новые сообщение поле NewOnly должно быть True. Возвращает XML с сообщениями.&lt;br /&gt;
&lt;br /&gt;
ExtraResult([ParamName='']) - Вызывается после CheckSMS, возвращает дополнительную информацию по последнему статусу смс. В настоящее время работает только для провайдеров BitCall и iVoice. Для BitCall по умолчанию возвращает кнопки, нажатые абонентом во время работы с голосовым меню. Если в paramname указать 'IdentifyText' то будет возвращен JSON  с ответами абонента на заданные вопросы(используется в случае звонков с индивидуальным сценарием). Для iVoice по умолчанию подразумевается параметр 'response', при этом будет возвращен JSON  с ответами абонента на заданные вопросы (в зависимости от сценария)&lt;br /&gt;
&lt;br /&gt;
Log - Возвращает последний HTTP запрос и ответ от сервера смс.&lt;br /&gt;
&lt;br /&gt;
== Объект TXML ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга XML-данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст XML документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию. Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля.&lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
AttribCount – Возвращает количество атрибутов текущего элемента.&lt;br /&gt;
&lt;br /&gt;
AttribName(i) – Возвращает имя атрибута с номером i.&lt;br /&gt;
&lt;br /&gt;
Attrib(V) – Ищет атрибут и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
== Объект TJSON ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга JSON-данных. &lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст JSON документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля. &lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Можно проверять наличие элементов, если элемента нет, вернется пустая строка.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
isArray - Возвращает true, если текущий элемент является массивом (доступ к дочерним элементам возможен только по индексу, нумерация элементов начинается с нуля)&lt;br /&gt;
&lt;br /&gt;
==Объект TZip==&lt;br /&gt;
Предназначен для работы с Zip архивом. &lt;br /&gt;
&lt;br /&gt;
SetZip(s) - Загружает архив в объект из строки s;&lt;br /&gt;
&lt;br /&gt;
GetZip - Возвращает архив в виде строки;&lt;br /&gt;
&lt;br /&gt;
AddFromFile(SrcPath, ZipPath) - Добавляет файл SrcPath в архив и располагает его по пути ZipPath. ZipPath содержит имя файла в архиве, при необходимости можно указать каталог; &lt;br /&gt;
&lt;br /&gt;
AddFromStr(Data, /*ZipPath*/) - '''параметр ZipPath временно не работает'''. Добавляет файл из строки Data в архив и располагает его по пути ZipPath.  -ZipPath содержит имя файла в архиве, при необходимости можно указать каталог;&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(path) - Загружает архив из файла path;&lt;br /&gt;
&lt;br /&gt;
SaveToFile(path) - Сохраняет архив в файл path;&lt;br /&gt;
&lt;br /&gt;
Count - Возвращает кол-во файлов в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByIndex(index) - Возвращает распакованный файл в виде строки. Index - номер файла в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByName(ZipPath) - Возвращает распакованный файл в виде строки. ZipPath - путь к файлу в архиве, может содержать каталоги;&lt;br /&gt;
&lt;br /&gt;
FileName(index) - По номеру файла, функция возвращает полный путь файла в архиве.&lt;br /&gt;
&lt;br /&gt;
==Объект TBase==&lt;br /&gt;
&lt;br /&gt;
'''Функции общего назначения''':&lt;br /&gt;
&lt;br /&gt;
'''ExecSimpleScript(Caption, Text)''' - Выполняет скрипт &amp;quot;Дополнительных возможностей&amp;quot;. Возвращаемые значения, введенные пользователем устанавливает в переменные $scriptvar1..$scriptvarN, Значения кодов списочных переменных - в переменных $scriptvar1codes..$scriptvarNcodes. Функция возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot; в диалоговом окне.&lt;br /&gt;
&lt;br /&gt;
'''FillAdvPriceReport(Excel, AddressCodes, StartLine, StartCol, [ShowSumPrice,InsertColumns,ShowAll])''' - добавляет отчёт по дополнительным услугам. В AddressCodes - указаны коды адресов через запятую, каждый код это отдельная строка отчета. Адреса будут показаны в порядке перечисления их в AddressCodes. Если в отчет нужно добавить пустую строку, то можно указать код адреса -1000. StartLine, StartCol - верхний левый угол выгружаемой таблицы. ShowSumPrice - добавить столбец итоговый столбец с суммой всех услуг, по умолчанию выключено. InsertColumns - раздвинуть таблицу перед вставкой отчета, позволяет встраивать отчет посередине выгрузки, по умолчанию выключено. ShowAll - показать все дополнительные услуги, по умолчанию false и показывает только услуги с начислениями. Функция возвращает количество использованных столбцов.&lt;br /&gt;
&lt;br /&gt;
'''PrintSticker(Codes, [ToBoxes=False])'''&lt;br /&gt;
&lt;br /&gt;
'''PrintBlanc(Codes, BlancNumber)''' - печатать форму из раздела &amp;quot;Заполнить бланк&amp;quot;. Codes - коды корреспонденций, BlancNumber - номер формы из раздела &amp;quot;Бланки для корреспонденции&amp;quot; (3)&lt;br /&gt;
&lt;br /&gt;
'''GetItemByName(Name)'''&lt;br /&gt;
&lt;br /&gt;
'''GetA4Printer''' - возвращает имя принтера выбранного для печати документов&lt;br /&gt;
&lt;br /&gt;
'''GetStickerPrinter''' - возвращает имя принтера выбранного для печати стикеров&lt;br /&gt;
&lt;br /&gt;
'''GetDuplexPrinter''' - возвращает имя принтера выбранного для двусторонней печати, если принтер не выбран, возвращает пустую строку&lt;br /&gt;
&lt;br /&gt;
'''PrintAttachPDFPage(Code, FileName, Page, Printer)''' - печатает страницу из вложенного файла PDF. Code - код вложения (attachment), Page - номер страницы, Printer - 0 = принтер A4, 1 = принтер этикеток. &lt;br /&gt;
&lt;br /&gt;
'''AttachPDFToText(Code, [TextFileName])''' - преобразует файл PDF из вложений в текст. Code - код вложения (attachment), TextFileName - имя текстового файла, в который записывается результат (если не указан, используется временный файл). Возвращает текст в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''GhostScript(GScript, Code)''' — функция для выполнения консольных команд утилиты [https://ghostscript.readthedocs.io/en/latest/Use.html ghostscript]. Где, GScript — строка с командами Ghostscript; Code — код вложения или путь к PDF-файлу, предназначенному для обработки. В командах доступен специальный тег %MeasoftInFile%, который автоматически заменяется на путь к предварительно загруженному файлу (Code). Если в команде необходимо указать путь для сохранения результата обработки, используйте тег %MeasoftOutFile%. В этом случае функция на основании параметра Code автоматически сформирует имя временного выходного файла. После успешного выполнения команд функция возвращает путь к сгенерированному выходному файлу -  %MeasoftOutFile%.&lt;br /&gt;
&lt;br /&gt;
'''GetActiveForm([SkipFormName])''' - возвращает код активной формы в программе где происходит сканирование. SkipFormName - не обязательны параметр, имя формы которую нужно пропустить при определении интерфейса.&lt;br /&gt;
 '''Список интерфейсов''': &lt;br /&gt;
 0 - неопределенный; &lt;br /&gt;
 1 - прием корреспонденции на склад; &lt;br /&gt;
 2 - АПД; &lt;br /&gt;
 3 - комплектация адресов (ShelfingForm); &lt;br /&gt;
 4 - доска приема; &lt;br /&gt;
 9 - вкладка «Манифесты»; &lt;br /&gt;
 10 - Инвентаризация корреспонденции; &lt;br /&gt;
 11 - АПК; &lt;br /&gt;
 12 - вкладка «Адреса»; &lt;br /&gt;
 13 - вкладка «Выдача»; &lt;br /&gt;
 14 - вкладка «Склад»; &lt;br /&gt;
 15 - Список номенклатуры; &lt;br /&gt;
 16 - Инвентаризация склада; &lt;br /&gt;
 17 - Приходная накладная; &lt;br /&gt;
 18 - Списание товара; &lt;br /&gt;
 19 - Карточка корреспонденции.&lt;br /&gt;
&lt;br /&gt;
'''AddAddressScanLog(Code[, StrBarCode, IsManual, FromInterface, ExtraInfo])''' - добавляет событие сканирование для корреспонденции с кодом Code. Необязательные параметры: StrBarCode - сканируемый ШК корреспонденции (по умолчанию пустой), IsManual - галка ручного сканирования (по умолчанию false), FromInterface - код интерфейса сканирования (StateType=81, по умолчанию 0 - неопределенный), ExtraInfo - текстовый комментарий события.&lt;br /&gt;
&lt;br /&gt;
'''RuleName(alias)''' - Выдает полный путь в дерева прав по псевдониму права.&lt;br /&gt;
&lt;br /&gt;
'''ShowText(Caption:string, Value:string)''' - показывает пользователю окно с заголовком Caption и с многострочным полем со значением Value. Может быть полезен при отображении логов выполненной операции. &lt;br /&gt;
&lt;br /&gt;
'''ShowScanError(msg [, Speek, Color, Abort])''' - выдает пользователю окно с текстом msg блокируя последующие действия сканирования. Если Speek - истинно, то сообщение проговаривается голосовым движком, по умолчанию выключено. Color - целочисленное число цвета, в который будет окрашен фон сообщения (по умолчанию = -1, стандартный). Abort  - прервать выполнение скрипта, не показывая ошибку.&lt;br /&gt;
&lt;br /&gt;
'''CheckRule(alias)''' - функция проверки разрешения у текущего пользователя системы, alias - псевдоним права. Возвращает 1, если право есть и 0, если права нет. &lt;br /&gt;
 Пример: if(CheckRule('RSE'), ShowMessage('У пользователя есть право изменять счета'), ShowMessage('У пользователя нет права изменять счета'));&lt;br /&gt;
&lt;br /&gt;
'''GetKurierMoney(KurierCode, DateEnd, NonCash)''' - возвращает баланс курьера с кодом KurierCode на дату DateEnd. NonCash - булевый флаг, если истинно, то будет рассчитан безнальный баланс; &lt;br /&gt;
&lt;br /&gt;
'''Функции, работающие только в импорте БД из эксель:'''&lt;br /&gt;
&lt;br /&gt;
ReplaceAddress&lt;br /&gt;
&lt;br /&gt;
GetItemByCode - Поиск товара по артикулу. Внимание: в пределах одного клиента может быть несколько товаров с одинаковыми артикулами. В этом случае функция найдет последний заведенный товар.&lt;br /&gt;
&lt;br /&gt;
GetPrice&lt;br /&gt;
&lt;br /&gt;
GetNewNumber - используется при импорте реестра, возвращает номер конверта в загружаемом заказе&lt;br /&gt;
&lt;br /&gt;
GetNewPos - используется при импорте реестра, возвращает порядковый номер вложения&lt;br /&gt;
&lt;br /&gt;
GetNewPackagePos- используется при импорте реестра, возвращает порядковый номер места&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zakaz - возвращает номер заказа куда происходит импорт реестра&lt;br /&gt;
&lt;br /&gt;
addresscode  -  используется при импорте реестра, код созданного адреса&lt;br /&gt;
&lt;br /&gt;
Source  - код заказчика&lt;br /&gt;
&lt;br /&gt;
ClientTown - Узнаем город клиента, через филиал с которым он работает. Сам клиент берется из заказа указанного в окне &amp;quot;Импорт БД из Excel&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Объект TFieldObject ==&lt;br /&gt;
Создается только автоматически. Объект для доступа к записям, используется в картах и дополнительных услугах (addressrecord) и событиях карточки корреспонденции (fieldlist). Методы объекта:&lt;br /&gt;
&lt;br /&gt;
'''_GetTableInfo''' - возвращает данные о полях и примеры данных объекта.&lt;br /&gt;
&lt;br /&gt;
'''_Self''' - возвращает ссылку на объект.&lt;br /&gt;
&lt;br /&gt;
'''_Set(fieldname, fieldvalue [, DoUpdateForm])''' - Если базовый объект строка. Устаналивает для поля fieldname значение fieldvalue. DoUpdateForm по уолчанию false, если указать true то обновление поля будет не только в объекте но и пользовательском интерфейсе. Обновление работает только в карточке корреспнденции для ограниченного набора полей: vlog, mode, type, date_put, time_put, message, kurier, state1.&lt;br /&gt;
&lt;br /&gt;
'''_Set(keyfield, keyvalue, filed, value)''' - Если базовый объект таблица (addressrecord.boxes). Работает перегруженная версия метода _set, cначала происходит поиск строки по ключу, далее меняется значение указанного столбца. keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца.  Пример, отключение услуги база:&lt;br /&gt;
&lt;br /&gt;
 addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
 priceconf - поле где записан код услуги;&lt;br /&gt;
 1 - услуга База;&lt;br /&gt;
 active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
== Объект TMessage ==&lt;br /&gt;
Создается только автоматически. Объект используется для скриптовой обработки письма в [https://wiki.courierexe.ru/index.php/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8#.D0.98.D0.BC.D0.BF.D0.BE.D1.80.D1.82_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85| заданиях импорта данных]. В себе содержит текст письма в очищенном формате и оригинальном формате HTML, отправитель письма, тему письма, дата получения и список прикрепленных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.Text''' - возвращает очищенный от HTML-тегов текст письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.HTMLText''' - возвращает оригинальный текст письма со всеми HTML-тегами.&lt;br /&gt;
&lt;br /&gt;
'''Message.Sender''' - возвращает email-адрес отправителя письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.AttachmentsCount''' - возвращает количество вложенных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.DateTime''' - возвращает дату и время получения письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.Subject''' - возвращает тему письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentDataString(Number)''' - возвращает вложенный файл под номером Number в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentName(Number)''' - возвращает имя вложенного файла под номером Number.&lt;br /&gt;
&lt;br /&gt;
== Объект TStringList ==&lt;br /&gt;
Может использоваться для построчной обработки многостраничных файлов либо для организации текстовых данных. Номер строк начинается с 0. &lt;br /&gt;
Имеет следующий функционал:&lt;br /&gt;
&lt;br /&gt;
'''Count''' - возвращает количество строк в списке.&lt;br /&gt;
&lt;br /&gt;
'''Add(Value:string)''' - добавляет значение Value в конец списка.&lt;br /&gt;
&lt;br /&gt;
'''SetText(Value:string)''' - устанавливает значение списка в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Insert(Number:integer, Value:string)''' - добавляет строку Value в позицию Number.&lt;br /&gt;
&lt;br /&gt;
'''Delete(Number:integer)''' - удаляет строку из списка в позиции Number.&lt;br /&gt;
&lt;br /&gt;
'''Clear''' - очищает элементы списка.&lt;br /&gt;
&lt;br /&gt;
'''LoadFromFile(Path:string)''' - загружает текстовый файл по пути Path.&lt;br /&gt;
&lt;br /&gt;
'''Strings(Number:integer)''' - возвращает строку с номером Number.&lt;br /&gt;
&lt;br /&gt;
'''SetString(Number:integer, Value:string)''' - устанавливает значение строки с номером Number в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Text''' - возвращает полный список строк в виде текста.&lt;br /&gt;
&lt;br /&gt;
'''CommaText([Quoted:boolean])''' - возвращает список значений через запятую. Если Quoted = true, то квотирует элементы списка. По умолчанию равен false.&lt;br /&gt;
&lt;br /&gt;
'''SetCommaText(Value: string)''' - разбивает значение Value на отдельные строки и кладет в список. Разделитель - запятые.&lt;br /&gt;
&lt;br /&gt;
'''IndexOf(Value:string)''' - ищет значение Value среди элементов списка и если находит, то возвращает номер строки. Возвращает -1 если значение не было найдено.&lt;br /&gt;
&lt;br /&gt;
'''Sorted(Value:boolean)''' - устанавливает флаг отсортированности списка в Value. Если Value = true, то сразу же его сортирует. По умолчанию Value = false.&lt;br /&gt;
&lt;br /&gt;
'''Exchange(Pos1:integer, Pos2:integer)''' - меняет элементы списка с позициями Pos1 и Pos2 местами.&lt;br /&gt;
&lt;br /&gt;
'''Duplicates(Value:integer)''' - изменяет параметр управления дубликатами в списке. Если Value = 0 (значение по умолчанию), то список не реагирует на дубликаты. Если Value = 1, то список при добавлении будет игнорировать дубликаты. Если Value = 2, то список будет выдавать исключение, при добавлении дубликата в список.&lt;br /&gt;
&lt;br /&gt;
'''ParamName(Number:integer[, Delimiter:string])''' - возвращает текст до первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает пустоту.&lt;br /&gt;
&lt;br /&gt;
'''ParamValue(Number:integer[, Delimiter:string])''' - возвращает текст после первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает всю строку.&lt;br /&gt;
&lt;br /&gt;
== Объект TFunc ==&lt;br /&gt;
Объект реализует создание и использование функций в скриптовом языке. Позволяет определять переиспользуемые блоки кода с параметрами.&lt;br /&gt;
Важно учитывать, что внтури функции создается свой инстанс интерпретатора и от туда не доступны никакие переменные\объекты кроме переданных в функцию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные методы:&lt;br /&gt;
&lt;br /&gt;
'''New'''(FuncName, Param1, Param2, ..., Body) — создание новой функции.Функция возвращает результат выполнения последней команды в теле функции. Аргументы:&lt;br /&gt;
* `FuncName` — имя функции (строка)&lt;br /&gt;
* `Param1, Param2, ...` — имена параметров функции (переменные начинаются с `$`, объекты — без префикса)&lt;br /&gt;
* `Body` — тело функции (скрипт, выполняемый при вызове)&lt;br /&gt;
&lt;br /&gt;
'''FuncName'''(Arg1, Arg2, ...) — вызов созданной функции по имени. Если в объявлении была указана тип переменная, то и подставлять в аргумент надо обязательно переменную. Будет передано значение этой переменной (переменные словарине поддерживаются!). Если был объявлен объект, то указатель на объект должен быть получен через метод '''_self'''. C функциями поддерживают работу следующие классы: TExcel, TDirectExcel, TCSVFile, TADO, TSelfADO, TPrinter, TCanvas, TPicture, TTable, TINIFile, TSMS, TXML, TJSON, TZip, TStringList, TBaseUtils, а также объект addressrecord (TFieldObject). Результатом работы функции может быть число или строка.&lt;br /&gt;
&lt;br /&gt;
Пример 1, обработка результатов функции:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'calc');&lt;br /&gt;
calc.new('Sum', '$a', '$b',&lt;br /&gt;
  $a + $b&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
set($x, 10);&lt;br /&gt;
set($y, 20);&lt;br /&gt;
showmessage(calc.Sum($x, $y));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример 2, передача объекта в функцию:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'utils');&lt;br /&gt;
utils.new('ProcessDB', 'dbConn', '$value',&lt;br /&gt;
  showmessage($value);&lt;br /&gt;
  dbConn.open('SELECT * FROM address limit 3 ');&lt;br /&gt;
  if(dbConn.recordcount &amp;gt; 0,&lt;br /&gt;
    showmessage('Найдено записей: ' + dbConn.recordcount);&lt;br /&gt;
    dbConn.first;&lt;br /&gt;
    while(dbConn.eof = 0,&lt;br /&gt;
      showmessage(dbConn.fieldbyname('code'));&lt;br /&gt;
      dbConn.next&lt;br /&gt;
    )&lt;br /&gt;
  ,0)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
utils.ProcessDB(db._self,'test!');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Применение языка формул ==&lt;br /&gt;
'''в различных контекстах системы «MEASOFT» и сопутствующих проектах'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MEASOFT ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительная информация на чеке ====&lt;br /&gt;
&lt;br /&gt;
В карточке клиента на закладке «Касса» имеется поле для ввода текста, который будет отображаться на кассовых чеках, печатаемых для корреспонденции от данного клиента. В поле может быть введен как просто текст, так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TSelfDB с открытым набором данных со строчкой корреспонденции, заказа и клиента, на которую печатается чек&lt;br /&gt;
&lt;br /&gt;
TBaseSupport&lt;br /&gt;
&lt;br /&gt;
TBaseValue&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Так же система записывает в переменную $CashRegisterID вычисленный код фискального регистратора, на котором предполагается печать чека.&lt;br /&gt;
&lt;br /&gt;
Результат работы скрипта печатается на создаваемом чеке, если скрипт не возвращает значение “-1” (число или текст) – в этом случае система чек не создает. Подразумевается, что либо скриптом было принято решение об отсутствии необходимости формирования чека, либо скрипт взял эту функцию на себя.&lt;br /&gt;
&lt;br /&gt;
==== Заполнение шаблонов печатных форм ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительные возможности ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Импорт БД из Excel ====&lt;br /&gt;
В окружении интерпретатора создается объект ZakazRecord, он является списком со значениями таблицы zakaz. Именно в этот заказ будут загружены данные. Из этого объекта также доступно :&amp;lt;br&amp;gt;&lt;br /&gt;
*ZakazRecord.userfields - пользовательские поля заказа;&lt;br /&gt;
*ZakazRecord.Clients - данные таблицы clients;&lt;br /&gt;
*ZakazRecord.Clients.userfields - пользовательские поля заказчика.&lt;br /&gt;
&lt;br /&gt;
==== Прайс лист клиента ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в валюте клиента для каждой поездки (туда или обратно) единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Помимо стандартных объектов, система создает объект AddressRecord, в котором, как свойства, доступны все поля текущей записи. Так же она выставляет значение переменной $Forward в 1 (истина), если необходимо произвести расчет для направления &amp;quot;Туда&amp;quot; и 0 (ложь) - если обратно. ВНИМАНИЕ! Как и во всех остальных местах, после формулы нельзя ставить &amp;quot;;&amp;quot;, иначе скрипт вернет 0!&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 if(int(AddressRecord.Time_Put_Max)&amp;gt;19, 100, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Прибавляет 100 рублей в случае, если максимальный срок доставки 20 часов или более''&lt;br /&gt;
&lt;br /&gt;
 if(pos(AddressRecord.Address, 'Аренда')&amp;gt;0, &lt;br /&gt;
           set($FormulaReplace, 1); &lt;br /&gt;
           1500&lt;br /&gt;
 , 0)&lt;br /&gt;
 &lt;br /&gt;
 ''В случае наличия подстроки &amp;quot;Аренда&amp;quot; в адресе заменяет штатное ценообразование на 1500 рублей''&lt;br /&gt;
&lt;br /&gt;
Объект AddressRecord может предоставить доступ к связанным таблицам :&lt;br /&gt;
* addressrecord.boxes&lt;br /&gt;
* addressrecord.packages&lt;br /&gt;
* addressrecord.clients&lt;br /&gt;
* addressrecord.price&lt;br /&gt;
* addressrecord.advprice&lt;br /&gt;
* addressrecord.userfields&lt;br /&gt;
* addressrecord.addressfld&lt;br /&gt;
* addressrecord.clients.userfields&lt;br /&gt;
* addressrecord.price.userfields&lt;br /&gt;
* addressrecord.zakaz&lt;br /&gt;
* addressrecord.zakaz.userfields&lt;br /&gt;
 &lt;br /&gt;
Чтобы получить доступ к полю VarCode из таблицы userfields необходимо записать AddressRecord.Userfields.VarCode. В присоединённой таблице может быть несколько записей чтобы получить к ним доступ предусмотрены функции _First, _EOF, _Next, _RecordCount, _Set.&lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
 set($value1, 0); set($value2, 0);&lt;br /&gt;
 while(AddressRecord.userfields._EOF=0,&lt;br /&gt;
   if(AddressRecord.userfields.varCode=1, &lt;br /&gt;
     set($value1, if(AddressRecord.userFields.VarValue='Праздничная упаковка', 150, 0)), ''''''');&lt;br /&gt;
   if(AddressRecord.userfields.varCode=2, &lt;br /&gt;
     set($value2, AddressRecord.userFields.VarValue), ''''''');&lt;br /&gt;
   AddressRecord.userFields._Next;&lt;br /&gt;
 );&lt;br /&gt;
 int($value1) + int($value2)&lt;br /&gt;
&lt;br /&gt;
Пример делающий тоже самое что и выше но через поиск Locate:&lt;br /&gt;
 set($value1, if(addressrecord.userfields.VarValue('VarCode', 1)='Праздничная упаковка', 150, 0));&lt;br /&gt;
 set($value2, int(addressrecord.userfields.VarValue('VarCode', 2)));&lt;br /&gt;
 $value1 + $value2&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
В скрипте доступны переменные: &lt;br /&gt;
«$FormulaKoeff» - это коэффициент на который умножится конечная цена (по умолчанию равна 1);&lt;br /&gt;
«$PriceCode»  - код прайса;&lt;br /&gt;
«$CurrentPriceConf»  - код услуги;&lt;br /&gt;
«$BasePrice» - стоимость всех услуг с уровнем (pricelevel) меньше текущего.&lt;br /&gt;
&lt;br /&gt;
Для вызова функции CalcBasePrice (Расчёт базовой цены) в скрипте объявленны переменные: $Count,$Collection,$Distance,$Wait.&lt;br /&gt;
&lt;br /&gt;
Существует поиск по ключевому полю (поиск регистронезависимый), например чтобы найти в таблице advprice введённое значение для текущей услуги, нужно сделать такую запись  addressrecord.advprice.value('priceconf', $CurrentPriceConf) - Первый параметр это ключевое поле, второй искомое значение. Если запись найдётся будет возвращено значение поле value, если нет функция вернёт значение 0.&lt;br /&gt;
 &lt;br /&gt;
Пример &lt;br /&gt;
 if(addressrecord.advprice.active('priceconf', 3)='T', addressrecord.advprice.price, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Смотрим включена ли услуга и если да, возвращаем рассчитанную стоимость&lt;br /&gt;
&lt;br /&gt;
Чтобы изменить значение записанное в объект addressrecord, нужно воспользоваться методом _set(keyfield, keyvalue, filed, value). Параметр keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца. Сначала происходит поиск строки по ключу, далее меняется значение указанного столбца.&lt;br /&gt;
Пример, отключение услуги база:&lt;br /&gt;
  addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
  priceconf - поле где записан код услуги;&lt;br /&gt;
  1 - услуга База;&lt;br /&gt;
  active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
Также существует упрощенный метод _set, с двумя параметрами filed, value - он используется в шаблонах загрузки или в системных доп. возможностях где доступен объект addressrecord.&lt;br /&gt;
&lt;br /&gt;
==== Зарплата курьеров ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в основной валюте для каждой единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Переменные «$FormulaTablKoeff» и «$FormulaMoneyKoeff»  позволяют установить повышающий или понижающий коэффициент на стоимость доставки (по тарифной сетке) и услуги соответственно (процент от суммы, процент от стоимости доставки, ожидание).  Переменная «$UsingZoneName» и «$KurierZone» содержат название и код зоны соответственно, есть возможность поменять название зоны для отчета.&lt;br /&gt;
&lt;br /&gt;
=== Планировщик ===&lt;br /&gt;
&lt;br /&gt;
В поле текста задания может быть введен как текст с командами планировщика (см ниже), так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TIniFile, Указывает на настроечный ini-файл планировщика.&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Для записи в лог планировщика нужно использовать функцию Print&lt;br /&gt;
&lt;br /&gt;
=== Репликатор ===&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
ReplaceAddress(target, address) – Возвращает адрес последней доставки корреспонденции получателю target по адресу address от текущего клиента. При отсутствии такой доставки, возвращает address.&lt;br /&gt;
&lt;br /&gt;
GetPrice –возвращает рассчитанное значение цены, на основе прайс-листа клиента и данных о корреспонденции.&lt;br /&gt;
&lt;br /&gt;
GetKurierByStation(i) – возвращает код курьера, ассоциированного со станцией метро с кодом i.&lt;br /&gt;
&lt;br /&gt;
GetNewNumber – Возвращает не занятый номер единицы корреспонденции в текущем заказе.&lt;br /&gt;
&lt;br /&gt;
==История изменений==&lt;br /&gt;
&lt;br /&gt;
=== Недавние изменения ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.539 Добавлена поддержка отладчика AttachDebugger&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.534 Добавлена поддержка оператора CASE и класса TFunc&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 2021.0.0.57 от 18.06.2019 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TExcel добавлен метод ColumnDelete.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция InsertFirmAtt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
||В объект TExcel добавлен метод Align.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция CheckEan&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект функцию FillAdvPriceReport добавлены параметры ShowSumPrice,InsertColumns&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TSMS добавлен метод Log.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Добавлена функция Money.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция ValutaSign.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция GetPolygonByLatLon.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TTable добавлена функция SetMultiHeader, SetCustomHeader.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DownloadAttachment&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию SetRowHeight объекта TExcel добавлен параметр cnt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция AsString.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция SetSize.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TADO добавлена функция ParseForIn.&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|В объект TBaseUtils из TBase перенесена функция FillExcelDoc.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция CalcAddressPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Все функции класса TBaseSupport перенесены в TBaseUtils. Класс TBaseSupport больше не существует.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функции RowInsert и RowDelete объекта TExcel добавлен параметр count.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция SendToMeaSoft&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция RecalcSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Новая функция Reverse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 849 &amp;amp;nbsp; 22.02.2018 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TBaseUtils.TownByIndex добавлен параметр PriorityName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TBase добавлена функция GetNewPackagePos&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TSMS доработан метод ExtraResult, добавлен параметр ParamName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBase добавлена функция CalcAgentPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateAddressForActDelivery&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функция CalcTownDeliveryDate заменена на CalcDeliveryDate&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция SignatureUrl&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция LoadFromStr.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetPen.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetBrush.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена поддержка чтения в формате PNG.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TCanvas.DrawPic параметр Mode&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Свойство TPicture.Canvas&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DeleteFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 758 &amp;amp;nbsp; 29.03.2017 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция GetPolygonByAddress&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция ParamsCount&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Объект TZip&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функции CreateEAN и Create128 заменены одной функцией CreateBar, полностью совместимой с Create128, но добавлена поддержка EAN-13 и Interleaved 2-5 (для Почты России). В системе функции оставлены для обратной совместимости, но более не являются документированными и рекомендованными к использованию.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Параметр text в функцию Cell объекта TExcel&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция UrlEncode &lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция IncDay теперь может принимать параметр count&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функции FtpGet, FtpPut, TTable.SetCell()&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 452 &amp;amp;nbsp; 26.02.2014 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция Time&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция FixedIntToStr&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция TimePeriod&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена функция приёма смс -  ReceiveSMS&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция STR2UTF&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция SAVETOFILE&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.SetSheetName&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;FILESTR&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Расширены возможности объекта addressrecord в формулах тарифов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 308 &amp;amp;nbsp; 24.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В функции загрузки таблиц из TADO добавлено условие, что поля, названия которых начинаются с &amp;quot;-&amp;quot; не выгружаются. Таким образом можно скрывать служебные поля из результирующего набора.&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowAutoFit &lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowInsert &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 300 &amp;amp;nbsp; 01.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В объекте TCSVFile добавилась возможность запрашивать значения не только текущей записи через параметр сдвига&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;UPDOWN&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлен объект TCSVFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 266 &amp;amp;nbsp; 14.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена поддержка массивов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 265 &amp;amp;nbsp; 11.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция CreateTrans в интерпретатор&lt;br /&gt;
|-&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15711</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15711"/>
				<updated>2025-12-08T08:53:29Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Подключение отладчика к работающим скриптам */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики [[Руководство_программиста|скриптов встроенного языка]].  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* Через меню '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик'''. &lt;br /&gt;
* Через меню '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''.&lt;br /&gt;
* Горячей клавишей '''Ctrl+Alt+D''' в главном окне приложения.&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Всегда есть возможность сохранить скрипт в файл.&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить в файл''' — Сохраняет текущий текст скрипта в файл. Если файл был сохранен ранее, по умолчанию предлагается предыдуший путь.&lt;br /&gt;
&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — Когда отладчик открыт без привязки к конкретному скрипту, то сохраняет изменения в файл. &lt;br /&gt;
 '''Важно!''' Если отладчик открыли например из '''Отчеты''' &amp;gt; '''Дополнительные возможности''' &amp;gt; '''Редактировать''' то сохранения через пункт '''Сохранить (Ctrl+S)''' сохранения '''всегда''' будет происходить в базу, в файл изменения сохранены не будут.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* [[Печатные формы|Скриптов из печатных форм]]&lt;br /&gt;
* [[Дополнительные_возможности|Скриптов из системных событий]]  &lt;br /&gt;
* [[Пользовательские_отчеты|Скриптов дополнительных возможностей]]&lt;br /&gt;
* [[Дополнительные услуги|Скриптов из дополнительных услуг]]&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+U''' || Двигать выбранный блок влево&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+I''' || Двигать выбранный блок вправо&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15710</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15710"/>
				<updated>2025-12-08T08:53:12Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Подключение отладчика к работающим скриптам */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики [[Руководство_программиста|скриптов встроенного языка]].  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* Через меню '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик'''. &lt;br /&gt;
* Через меню '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''.&lt;br /&gt;
* Горячей клавишей '''Ctrl+Alt+D''' в главном окне приложения.&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Всегда есть возможность сохранить скрипт в файл.&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить в файл''' — Сохраняет текущий текст скрипта в файл. Если файл был сохранен ранее, по умолчанию предлагается предыдуший путь.&lt;br /&gt;
&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — Когда отладчик открыт без привязки к конкретному скрипту, то сохраняет изменения в файл. &lt;br /&gt;
 '''Важно!''' Если отладчик открыли например из '''Отчеты''' &amp;gt; '''Дополнительные возможности''' &amp;gt; '''Редактировать''' то сохранения через пункт '''Сохранить (Ctrl+S)''' сохранения '''всегда''' будет происходить в базу, в файл изменения сохранены не будут.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* [[Печатные формы|Скриптов из печатных форм]&lt;br /&gt;
* [[Дополнительные_возможности|Скриптов из системных событий]]  &lt;br /&gt;
* [[Пользовательские_отчеты|Скриптов дополнительных возможностей]]&lt;br /&gt;
* [[Дополнительные услуги|Скриптов из дополнительных услуг]]&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+U''' || Двигать выбранный блок влево&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+I''' || Двигать выбранный блок вправо&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15709</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15709"/>
				<updated>2025-12-08T08:51:41Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Подключение отладчика к работающим скриптам */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики [[Руководство_программиста|скриптов встроенного языка]].  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* Через меню '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик'''. &lt;br /&gt;
* Через меню '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''.&lt;br /&gt;
* Горячей клавишей '''Ctrl+Alt+D''' в главном окне приложения.&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Всегда есть возможность сохранить скрипт в файл.&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить в файл''' — Сохраняет текущий текст скрипта в файл. Если файл был сохранен ранее, по умолчанию предлагается предыдуший путь.&lt;br /&gt;
&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — Когда отладчик открыт без привязки к конкретному скрипту, то сохраняет изменения в файл. &lt;br /&gt;
 '''Важно!''' Если отладчик открыли например из '''Отчеты''' &amp;gt; '''Дополнительные возможности''' &amp;gt; '''Редактировать''' то сохранения через пункт '''Сохранить (Ctrl+S)''' сохранения '''всегда''' будет происходить в базу, в файл изменения сохранены не будут.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* [[Дополнительные_возможности|Скриптов из системных событий]]  &lt;br /&gt;
* [[Пользовательские_отчеты|Скриптов дополнительных возможностей]]&lt;br /&gt;
* [[Дополнительные услуги|Скриптов из дополнительных услуг]]&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+U''' || Двигать выбранный блок влево&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+I''' || Двигать выбранный блок вправо&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15708</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15708"/>
				<updated>2025-12-08T08:45:52Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Интерфейс */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики [[Руководство_программиста|скриптов встроенного языка]].  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* Через меню '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик'''. &lt;br /&gt;
* Через меню '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''.&lt;br /&gt;
* Горячей клавишей '''Ctrl+Alt+D''' в главном окне приложения.&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Всегда есть возможность сохранить скрипт в файл.&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить в файл''' — Сохраняет текущий текст скрипта в файл. Если файл был сохранен ранее, по умолчанию предлагается предыдуший путь.&lt;br /&gt;
&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — Когда отладчик открыт без привязки к конкретному скрипту, то сохраняет изменения в файл. &lt;br /&gt;
 '''Важно!''' Если отладчик открыли например из '''Отчеты''' &amp;gt; '''Дополнительные возможности''' &amp;gt; '''Редактировать''' то сохранения через пункт '''Сохранить (Ctrl+S)''' сохранения '''всегда''' будет происходить в базу, в файл изменения сохранены не будут.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+U''' || Двигать выбранный блок влево&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+I''' || Двигать выбранный блок вправо&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15707</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15707"/>
				<updated>2025-12-08T07:31:58Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Интерфейс */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* Через меню '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик'''. &lt;br /&gt;
* Через меню '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''.&lt;br /&gt;
* Горячей клавишей '''Ctrl+Alt+D''' в главном окне приложения.&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Всегда есть возможность сохранить скрипт в файл.&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить в файл''' — Сохраняет текущий текст скрипта в файл. Если файл был сохранен ранее, по умолчанию предлагается предыдуший путь.&lt;br /&gt;
&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — Когда отладчик открыт без привязки к конкретному скрипту, то сохраняет изменения в файл. &lt;br /&gt;
 '''Важно!''' Если отладчик открыли например из '''Отчеты''' &amp;gt; '''Дополнительные возможности''' &amp;gt; '''Редактировать''' то сохранения через пункт '''Сохранить (Ctrl+S)''' сохранения '''всегда''' будет происходить в базу, в файл изменения сохранены не будут.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+U''' || Двигать выбранный блок влево&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+I''' || Двигать выбранный блок вправо&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15706</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15706"/>
				<updated>2025-12-08T07:31:09Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Интерфейс */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* Через меню '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик'''. &lt;br /&gt;
* Через меню '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''.&lt;br /&gt;
* Горячей клавишей '''Ctrl+Shift+D''' в главном окне приложения.&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Всегда есть возможность сохранить скрипт в файл.&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить в файл''' — Сохраняет текущий текст скрипта в файл. Если файл был сохранен ранее, по умолчанию предлагается предыдуший путь.&lt;br /&gt;
&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — Когда отладчик открыт без привязки к конкретному скрипту, то сохраняет изменения в файл. &lt;br /&gt;
 '''Важно!''' Если отладчик открыли например из '''Отчеты''' &amp;gt; '''Дополнительные возможности''' &amp;gt; '''Редактировать''' то сохранения через пункт '''Сохранить (Ctrl+S)''' сохранения '''всегда''' будет происходить в базу, в файл изменения сохранены не будут.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+U''' || Двигать выбранный блок влево&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+I''' || Двигать выбранный блок вправо&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15705</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15705"/>
				<updated>2025-12-05T15:42:17Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Интерфейс */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* Через меню '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик'''. &lt;br /&gt;
* Через меню'''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''.&lt;br /&gt;
* Горячей клавишей '''Ctrl+Shift+D''' в главном окне приложения.&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Всегда есть возможность сохранить скрипт в файл.&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить в файл''' — Сохраняет текущий текст скрипта в файл. Если файл был сохранен ранее, по умолчанию предлагается предыдуший путь.&lt;br /&gt;
&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — Когда отладчик открыт без привязки к конкретному скрипту, то сохраняет изменения в файл. &lt;br /&gt;
 '''Важно!''' Если отладчик открыли например из '''Отчеты''' &amp;gt; '''Дополнительные возможности''' &amp;gt; '''Редактировать''' то сохранения через пункт '''Сохранить (Ctrl+S)''' сохранения '''всегда''' будет происходить в базу, в файл изменения сохранены не будут.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+U''' || Двигать выбранный блок влево&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+I''' || Двигать выбранный блок вправо&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15704</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15704"/>
				<updated>2025-12-05T15:34:11Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Интерфейс */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* Через меню '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик'''. &lt;br /&gt;
* Через меню'''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''.&lt;br /&gt;
* Горячей клавишей '''Ctrl+Alt+D''' в главном окне приложения.&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Всегда есть возможность сохранить скрипт в файл.&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить в файл''' — Сохраняет текущий текст скрипта в файл. Если файл был сохранен ранее, по умолчанию предлагается предыдуший путь.&lt;br /&gt;
&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — Когда отладчик открыт без привязки к конкретному скрипту, то сохраняет изменения в файл. &lt;br /&gt;
 '''Важно!''' Если отладчик открыли например из '''Отчеты''' &amp;gt; '''Дополнительные возможности''' &amp;gt; '''Редактировать''' то сохранения через пункт '''Сохранить (Ctrl+S)''' сохранения '''всегда''' будет происходить в базу, в файл изменения сохранены не будут.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+U''' || Двигать выбранный блок влево&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+I''' || Двигать выбранный блок вправо&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15703</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15703"/>
				<updated>2025-12-05T14:26:46Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Горячие клавиши */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* Через меню '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик'''. &lt;br /&gt;
* Через меню'''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''.&lt;br /&gt;
* Горячей клавишей '''Ctrl+Shift+D''' в главном окне приложения.&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Всегда есть возможность сохранить скрипт в файл.&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить в файл''' — Сохраняет текущий текст скрипта в файл. Если файл был сохранен ранее, по умолчанию предлагается предыдуший путь.&lt;br /&gt;
&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — Когда отладчик открыт без привязки к конкретному скрипту, то сохраняет изменения в файл. &lt;br /&gt;
 '''Важно!''' Если отладчик открыли например из '''Отчеты''' &amp;gt; '''Дополнительные возможности''' &amp;gt; '''Редактировать''' то сохранения через пункт '''Сохранить (Ctrl+S)''' сохранения '''всегда''' будет происходить в базу, в файл изменения сохранены не будут.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+U''' || Двигать выбранный блок влево&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+I''' || Двигать выбранный блок вправо&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15702</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15702"/>
				<updated>2025-12-05T13:58:40Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Интерфейс */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* Через меню '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик'''. &lt;br /&gt;
* Через меню'''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''.&lt;br /&gt;
* Горячей клавишей '''Ctrl+Shift+D''' в главном окне приложения.&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Всегда есть возможность сохранить скрипт в файл.&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить в файл''' — Сохраняет текущий текст скрипта в файл. Если файл был сохранен ранее, по умолчанию предлагается предыдуший путь.&lt;br /&gt;
&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — Когда отладчик открыт без привязки к конкретному скрипту, то сохраняет изменения в файл. &lt;br /&gt;
 '''Важно!''' Если отладчик открыли например из '''Отчеты''' &amp;gt; '''Дополнительные возможности''' &amp;gt; '''Редактировать''' то сохранения через пункт '''Сохранить (Ctrl+S)''' сохранения '''всегда''' будет происходить в базу, в файл изменения сохранены не будут.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15700</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15700"/>
				<updated>2025-12-05T12:44:23Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Горячие клавиши */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик''' &lt;br /&gt;
* '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''&lt;br /&gt;
* В главном окне приложения комбинацией '''Ctrl+Shift+D'''&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Всегда есть возможность сохранить скрипт в файл.&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить в файл''' — Сохраняет текущий текст скрипта в файл. Если файл был сохранен ранее, по умолчанию предлагается предыдуший путь.&lt;br /&gt;
&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — Когда отладчик открыт без привязки к конкретному скрипту, то сохраняет изменения в файл. &lt;br /&gt;
 '''Важно!''' Если отладчик открыли например из '''Отчеты''' &amp;gt; '''Дополнительные возможности''' &amp;gt; '''Редактировать''' то сохранения через пункт '''Сохранить (Ctrl+S)''' сохранения '''всегда''' будет происходить в базу, в файл изменения сохранены не будут.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15699</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15699"/>
				<updated>2025-12-05T12:42:37Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Горячие клавиши */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик''' &lt;br /&gt;
* '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Всегда есть возможность сохранить скрипт в файл.&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить в файл''' — Сохраняет текущий текст скрипта в файл. Если файл был сохранен ранее, по умолчанию предлагается предыдуший путь.&lt;br /&gt;
&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — Когда отладчик открыт без привязки к конкретному скрипту, то сохраняет изменения в файл. &lt;br /&gt;
 '''Важно!''' Если отладчик открыли например из '''Отчеты''' &amp;gt; '''Дополнительные возможности''' &amp;gt; '''Редактировать''' то сохранения через пункт '''Сохранить (Ctrl+S)''' сохранения '''всегда''' будет происходить в базу, в файл изменения сохранены не будут.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+U''' || Двигать выбранные строки влево или Shift+Tab&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+I''' || Двигать выбранные строки вправо или выделенный текст и Tab &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15698</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15698"/>
				<updated>2025-12-04T11:35:21Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Сохранение в файл */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик''' &lt;br /&gt;
* '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Всегда есть возможность сохранить скрипт в файл.&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить в файл''' — Сохраняет текущий текст скрипта в файл. Если файл был сохранен ранее, по умолчанию предлагается предыдуший путь.&lt;br /&gt;
&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — Когда отладчик открыт без привязки к конкретному скрипту, то сохраняет изменения в файл. &lt;br /&gt;
 '''Важно!''' Если отладчик открыли например из '''Отчеты''' &amp;gt; '''Дополнительные возможности''' &amp;gt; '''Редактировать''' то сохранения через пункт '''Сохранить (Ctrl+S)''' сохранения '''всегда''' будет происходить в базу, в файл изменения сохранены не будут.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15697</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15697"/>
				<updated>2025-12-04T11:34:29Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Сохранение в файл */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик''' &lt;br /&gt;
* '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Всегда есть возможность сохранить скрипт в файл.&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить в файл''' — Сохраняет текущий текст скрипта в файл. Если файл был сохранен ранее, по умолчанию предлагается предыдуший путь.&lt;br /&gt;
&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — Когда отладчик открыт без привязки к конкретному скрипту, то сохраняет изменения в файл. &lt;br /&gt;
 '''Важно!''' Если отладчик открыли например из '''Отчеты''' &amp;gt; '''Дополнительные возможности''' &amp;gt; '''Редактировать''' то сохранения '''всегда''' будет происходить в базу, в файл изменения сохранены не будут.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15696</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15696"/>
				<updated>2025-12-04T11:33:32Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Сохранение в файл */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик''' &lt;br /&gt;
* '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Сохранить в файл''' — Сохраняет текущий текст скрипта в файл. Если файл был сохранен ранее, по умолчанию предлагается предыдуший путь.&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — Когда отладчик открыт без привязки к конкретному скрипту, то сохраняет изменения в файл. Если отладчик открыли например из '''Отчеты''' &amp;gt; '''Дополнительные возможности''' &amp;gt; '''Редактировать''' то сохранения '''всегда''' будет происходить в базу, в файл изменения сохранены не будут.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15695</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15695"/>
				<updated>2025-12-04T11:27:55Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Сохранение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик''' &lt;br /&gt;
* '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Сохранить в файл'''.&lt;br /&gt;
&lt;br /&gt;
Сохраняет текущий текст скрипта в файл.  &lt;br /&gt;
Если файл был открыт ранее, по умолчанию предлагается исходный путь.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить (Ctrl+S)''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15693</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15693"/>
				<updated>2025-12-03T10:43:05Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Интерфейс */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик из:&lt;br /&gt;
* '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик''' &lt;br /&gt;
* '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Сохранить в файл'''.&lt;br /&gt;
&lt;br /&gt;
Сохраняет текущий текст скрипта в файл.  &lt;br /&gt;
Если файл был открыт ранее, по умолчанию предлагается исходный путь.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15692</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15692"/>
				<updated>2025-12-03T10:42:06Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Отладчик скриптов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Интерфейс =&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик при наличии прав Администратора:&lt;br /&gt;
* '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик''' &lt;br /&gt;
* '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Сохранить в файл'''.&lt;br /&gt;
&lt;br /&gt;
Сохраняет текущий текст скрипта в файл.  &lt;br /&gt;
Если файл был открыт ранее, по умолчанию предлагается исходный путь.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15691</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15691"/>
				<updated>2025-12-03T06:47:33Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Подключение отладчика к работающим скриптам */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Отладчик скриптов=&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик при наличии прав Администратора:&lt;br /&gt;
* '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик''' &lt;br /&gt;
* '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Сохранить в файл'''.&lt;br /&gt;
&lt;br /&gt;
Сохраняет текущий текст скрипта в файл.  &lt;br /&gt;
Если файл был открыт ранее, по умолчанию предлагается исходный путь.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15690</id>
		<title>Руководство программиста</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15690"/>
				<updated>2025-12-02T21:17:48Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Функциональность базового объекта */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Основные положения ==&lt;br /&gt;
&lt;br /&gt;
В систему «MEASOFT» встроен внутренний интерпретируемый язык программирования. Среда состоит из базовой функциональности, и дополнительно создаваемых объектов. Некоторые объекты автоматически создаются средой перед запуском интерпретатора для предоставления доступа к контексту, в котором работает скрипт. Все типы данных приводятся друг к другу автоматически, иногда при необходимости можно использовать функции приведения типов. &lt;br /&gt;
&lt;br /&gt;
Как интерпретатор приводит типы:&lt;br /&gt;
&lt;br /&gt;
1.	При использовании значения как параметр функции интерпретатор автоматически приводит значение к типу, необходимому функции.&lt;br /&gt;
&lt;br /&gt;
2.	При операциях сложения, а также логических операциях, операнды приводятся к строке если хотя бы один из них имеет тип «строка». Например:&lt;br /&gt;
3.3+5		-&amp;gt;  8.3&lt;br /&gt;
‘3.3’+5		-&amp;gt;  ‘3.35’&lt;br /&gt;
подобную проблему можно решить принудительно преобразовав тип:&lt;br /&gt;
float(‘3.3’)+5	-&amp;gt;  8.3&lt;br /&gt;
&lt;br /&gt;
3.	При операциях умножения, деления и вычитания операнды приводятся к числу с плавающей точкой, однако если результат выполнения операции получается целым числом, то он приводится к целочисленному типу.&lt;br /&gt;
&lt;br /&gt;
Как работают функции приведения типов:&lt;br /&gt;
&lt;br /&gt;
1.	При преобразовании строки к числу: функция «читает» строку до первого символа, не позволяющего создать число с плавающей точкой, при этом разделителем целой и дробной частей может быть как точка так и запятая. Если приведение производится к целочисленному типу, то после этого происходит округление. Например:&lt;br /&gt;
float('3.6qwerty735')	-&amp;gt;  3.6&lt;br /&gt;
int('3.6qwerty735')	-&amp;gt;  4&lt;br /&gt;
&lt;br /&gt;
2.	При преобразовании к булевому типу ложью считается пустая строка либо число 0, все остальное - истина&lt;br /&gt;
&lt;br /&gt;
3.	При преобразовании булевого типа к числу истина преобразуется в 1, ложь – в 0. Такое преобразование позволяет использовать сложение и умножение в качестве логических «ИЛИ» и «И» соответственно:&lt;br /&gt;
if((5=5)+(6=7), &amp;lt;a&amp;gt;, [b]) – условие истинно, выполнится код «a».&lt;br /&gt;
&lt;br /&gt;
4.	При преобразовании булевого типа к строке сначала происходит преобразование к числу:&lt;br /&gt;
(5=5)+'qwerty'	-&amp;gt;  ‘1qwerty’&lt;br /&gt;
&lt;br /&gt;
== Описание синтаксиса ==&lt;br /&gt;
&lt;br /&gt;
Команды разделяются точкой с запятой. Параметры функций разделяются запятыми. Каждая команда (даже цикл while) является функцией, возвращающей некоторое значение. Результатом выполнения составной команды (последовательности функций, разделенных точкой с запятой), является результат выполнения последней функции. Имена переменных, функций, объектов, а также их свойств и методов не чувствительны к регистру.&lt;br /&gt;
Константы: константы бывают целочисленными, дробными и строковыми. Значения целочисленных и дробных констант указываются «как есть» (в этом случае разделитель целой и дробной частей – точка), шестнадцатеричные значения начинаются с символа «$» и, если первая цифра – буква, она упреждается цифрой 0, а строковые – в одинарных кавычках. При этом, если внутри строковой константы встречается символ одинарной кавычки он должен быть задвоен, для указания интерпретатору того, что он не является признаком конца константы.&lt;br /&gt;
Операции сравнения: &amp;gt;, &amp;lt;, =, !  - Больше, меньше, равно, не равно соответственно.&lt;br /&gt;
Логические операции: + (ИЛИ), *  (И).&lt;br /&gt;
Арифметические операции: +, -, *, /&lt;br /&gt;
Операция конкатенации строк: +&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Функциональность базового объекта ===&lt;br /&gt;
&lt;br /&gt;
'''SET($a, a)''' – присваивает переменной (1-й параметр) значение второго параметра. При отсутствии переменной – создает ее. Имена переменных должны начинаться с символа «$», а следующий символ не должен быть цифрой. Возвращает новое значение переменной. Функция используется только для задания значений переменных. Не допускается использования для задания значений свойств объектов. Для этого используются соответствующие методы этих объектов.&lt;br /&gt;
&lt;br /&gt;
'''IF(a,b,c)''' или '''IF(a,b)'''  – Условный оператор. В первом случае возвращает b, если a истинно (не равно нулю или пустой строке), иначе – c. Во втором случае – возвращает a, если оно истинно, иначе – b.&lt;br /&gt;
&lt;br /&gt;
'''WHILE(a, b)''' – Оператор цикла. Выполняет b пока a истинно:&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i&amp;gt;0, set($sum, $sum+$i); set($i, $i-1));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''FOR($a, b, c, d)''' – Оператор цикла. Выполняет d пока $a последовательно присваиваются значения от b до с включительно:&lt;br /&gt;
	set($sum, 0);&lt;br /&gt;
for($i, 1, 10, set($sum, $sum+$i));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''NEW(ClassName, InstanceName)''' – Создает экземпляр класса ClassName, назначает ему имя InstanceName. Возвращает порядковый номер созданного объекта. Доступ к свойствам и методам объектов осуществляется по имени объекта и имени свойства/метода, разделенным точкой. Именем объекта может быть и пустая строка, тогда доступ к его свойствам и методам будет осуществляться без указания имени, и, в случае совпадения имен свойств и/или методов со стандартными или свойствами/методами других объектов, использоваться будут соответствующие свойства/методы объекта, созданного ранее, а также такой объект невозможно уничтожить до окончания выполнения скрипта. Все объекты созданные во время выполнения скрипта уничтожаются автоматически после окончания его выполнения.&lt;br /&gt;
&lt;br /&gt;
'''FREE(InstanceName)''' – Уничтожает объект с именем InstanceName. Возвращает 0. В случае отсутствия объекта с заданным именем вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
'''ShowObjects''' – Возвращает список созданных объектов – названия классов и имена.&lt;br /&gt;
&lt;br /&gt;
'''ERROR(message)''' – Вызывает ошибку с текстом message.&lt;br /&gt;
&lt;br /&gt;
'''SHOWMESSAGE(message)''' – Отображает диалоговое окно с текстом message, останавливает выполнение скрипта до закрытия окна пользователем.&lt;br /&gt;
&lt;br /&gt;
'''SimpleAskUser(Message)''' – Выводит диалоговое окно с текстом Message и кнопками «Да» и «Нет». Возвращает 1, если  пользователь нажал кнопку «Да», иначе – 0.&lt;br /&gt;
&lt;br /&gt;
'''TRY(a)''' – Выполняет a в «защищенном от ошибки» режиме. Если в процессе выполнения a возникает ошибка, возвращает текст ошибки, иначе – 0 (ложь).&lt;br /&gt;
&lt;br /&gt;
'''REM(….)''' – Код в скобках игнорируется (комментарий).&lt;br /&gt;
&lt;br /&gt;
'''EXEC(FileName, Params, Wait, WindowState)''' – Запускает внешнее приложение FileName с параметрами Params. Если Wait истинно – ожидает завершение процесса. Для WindowState доступны следующие числовые значения:&lt;br /&gt;
	0 - SW_HIDE&lt;br /&gt;
	1 - SW_SHOWNORMAL (по-умолчанию)&lt;br /&gt;
	3 - SW_MAXIMIZE&lt;br /&gt;
	6 - SW_MINIMIZE&lt;br /&gt;
Функция возвращает истину если приложение запущено успешно. Иначе – Ложь.&lt;br /&gt;
В случае успеха, при параметре Wait – истина кладет в переменную $LastResult код завершения приложения.&lt;br /&gt;
&lt;br /&gt;
'''CASE''' - Оператор множественного выбора. Позволяет выполнить одно из нескольких действий в зависимости от условий. Синтаксис:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
  case(&lt;br /&gt;
    when(условие1, действие1);&lt;br /&gt;
    when(условие2, действие2);&lt;br /&gt;
    ...&lt;br /&gt;
    else(действие_по_умолчанию);&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 50);&lt;br /&gt;
&lt;br /&gt;
showmessage(&lt;br /&gt;
  case(&lt;br /&gt;
    when($a &amp;lt; 5, 50);&lt;br /&gt;
    when($a &amp;lt; 10, 100);&lt;br /&gt;
    when($a &amp;lt; 250, 200);&lt;br /&gt;
    else($a*$b);&lt;br /&gt;
  )  &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''AttachDebugger''' - Команда позволяет подключить открытый [[Отладчик_встроенных_скриптов]] к текущему скрипту. Команда AttachDebugger должна быть '''первой командой''' в скрипте. Добавьте её в самое начало скрипта:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Как работает:'''&lt;br /&gt;
# При выполнении команды AttachDebugger скрипт останавливается.&lt;br /&gt;
# Отладчик автоматически подключается к выполняющемуся скрипту.&lt;br /&gt;
# Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
# Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Если режим отслеживания не включён, команда `AttachDebugger` игнорируется.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Команда AttachDebugger должна быть первой командой в скрипте.&lt;br /&gt;
&lt;br /&gt;
=== Строковые функции ===&lt;br /&gt;
&lt;br /&gt;
'''UpCase(s)''' – возвращает строку s в верхнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''LCase(s)''' – возвращает строку s в нижнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''Len(s)''' – возвращает количество символов в строке s.&lt;br /&gt;
&lt;br /&gt;
'''Pos(s, substr [,start])''' – возвращает номер первого символа первого включения подстроки substr в строку s, возвращает 0, если включения подстроки отсутствуют. Параметр start - это позиция старта поиска, не обязательный параметр, по умолчанию равен 1. Поиск не чувствителен к регистру.&lt;br /&gt;
&lt;br /&gt;
'''Param(s, i)''' – возвращает i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''ParamsCount(s)''' - возвращает количество элементов строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''SetParam(s, p, i)''' – заменяет на значение p i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''Left(s, i [,full] )''' – возвращает i первых символов строки s. Параметр i, может быть строкой, тогда он считается разделителем и функция, возвращает строку слева от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Mid(s, i, j)''' - возвращает подстроку из s начиная с i символа и длиной j символов&lt;br /&gt;
&lt;br /&gt;
'''Right(s, i [,full])''' – возвращает i последних символов строки s. Параметр i, может быть строкой, тогда он считается разделителем, функция ищет разделитель с конца строки, и возвращает строку справа от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Reverse(s)''' - возвращает строку s задом-наперед. Полезно например для поиска с конца функций Pos().&lt;br /&gt;
&lt;br /&gt;
'''Char(i)''' – возвращает символ с кодом i.&lt;br /&gt;
&lt;br /&gt;
'''Ord(s)''' – возвращает код первого символа строки s.&lt;br /&gt;
&lt;br /&gt;
'''Replace(s, strFind1, strReplace1, [ strFind2, strReplace2, ... ], [caseInsensetive])''' - возвращает строку s, в которой все включения строк strFind заменены строкой strReplace. Параметры поиска и замены всегда должны быть в паре и их может быть несколько. caseInsensetive - неучитывать регистр, не обязательный параметр, по умолчанию включен.&lt;br /&gt;
&lt;br /&gt;
'''RemSpace(s)''' – возвращает сроку s без начальных и конечных запятых и пробелов, а также начальных точек.&lt;br /&gt;
&lt;br /&gt;
'''SumStr(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''с добавлением валюты'''. Необязательные параметры captions - позволяет изменить название валюты, формат строки может зависеть от текущего языка(посмотреть формат можно в &amp;quot;Справочники&amp;quot;-&amp;quot;Статусы&amp;quot;-&amp;quot;32 Валюты&amp;quot;, в разделе &amp;quot;Дополнительная информация&amp;quot;). Language - код языка на котором необходимо вывести сумму прописью. По умолчанию если не обязательные параметры опущены, используются региональные настройки в переменных.&lt;br /&gt;
&lt;br /&gt;
'''NumToStrSimple(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''без валюты'''. Параметры идентичны функции SUMSTR.&lt;br /&gt;
&lt;br /&gt;
'''FullNameToShort(Name)''' – Возвращает фамилию и инициалы по полному ФИО Name.&lt;br /&gt;
&lt;br /&gt;
'''MonthName1(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в именительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''MonthName2(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в родительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''StrForXML(s)''' - Подготавливает строку к парсингу как xml: Если находит в строке подстроку &amp;quot;UTF-8&amp;quot; - перекодирует ее из utf-8 в win-1251, убирает начальный знак вопроса, если такой встречается.&lt;br /&gt;
&lt;br /&gt;
'''FixedIntToStr(i, len[, char])''' - Возвращает целое число i дополненное слева символами char (по-умолчанию - &amp;quot;0&amp;quot;) до длины len.&lt;br /&gt;
&lt;br /&gt;
'''Translate(format, [param1, param2, ...])''' - Функция перевода строки format в язык пользователя. Строка format может содержать параметры %s, %d - строка и число соответственно. &lt;br /&gt;
&lt;br /&gt;
'''ExtractFileName(FilePath)''' - возвращает имя файла с расширением из полного пути к файлу FilePath.&lt;br /&gt;
&lt;br /&gt;
====Функции перекодировки====&lt;br /&gt;
'''DecodeStr(s, charset)''' - Производит перекодировку строки s в кодировку CP1251. Кодировка строки s должна быть заранее известна и может быть :&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866, UNICODE. Имя кодировки следует передавать в точности без лишних символов.&lt;br /&gt;
&lt;br /&gt;
'''EncodeStr(s, charset)''' - Производит перекодировку строки s в кодировку charset. Кодировка строки s должна быть CP1251, возможны следующие варианты перекодировки:&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Имя кодировки следует передавать в точности без лишних символов. UNICODE не работает с версии 2021, в ней строки по умолчанию в кодировке unicode.&lt;br /&gt;
&lt;br /&gt;
Функции EncodeBase64(s), DecodeBase64(s), UrlEncode(s), UTF8Encode(s), UTF8Decode(s), Str2UTF(s) - устарели, используйте EncodeStr, DecodeStr.&lt;br /&gt;
&lt;br /&gt;
====Транслитерация====&lt;br /&gt;
&lt;br /&gt;
'''Translit(s)''' - транслитерация строки русского текста s латиницей&lt;br /&gt;
&lt;br /&gt;
'''UnTranslit(s)''' - транслитерация строки s с латиницы на русский.&lt;br /&gt;
&lt;br /&gt;
==== Экранирование ====&lt;br /&gt;
&lt;br /&gt;
'''QUOTEDSTR(s)''' – квотирует строку s символом «\» (обратный слеш). Возвращает строку s, помещенную между символами одинарной кавычки, при этом все вхождения в строку s символов: «\», «&amp;quot;» и «'» экранируются квотирующим символом, а символы  #0, #10 и #13 заменяются на \0, \n и \r соответственно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SQLFloat(f)''' – Приводит число с плавающей точкой к виду, пригодному для SQL-запроса, т.е. к тексту с разделителем дробной части – точка.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextXML(s)''' - квотирует строку s для использования в XML. Производит замены спец. символов для корректности XML-синтаксиса.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextJSON(s)''' - переводит строку в формат JSON, экранирует служебные символы.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextBlob(s)''' - строка s содержит файл, функция перекодирует переданную строку в байты, используется для заполнения полей формата blob.&lt;br /&gt;
&lt;br /&gt;
====Хеширование ====&lt;br /&gt;
&lt;br /&gt;
'''HMACHash256(key, text)''' - создаёт хэш по алгоритму SHA256 для проверки целостности сообщения, key - секретный ключ, text - хэшируемое сообщение&lt;br /&gt;
&lt;br /&gt;
'''MD5Hash(text)''' - создаёт хеш по алгоритму MD5&lt;br /&gt;
&lt;br /&gt;
'''SignatureUrl(url)''' -  Подписывает переданный URL. Функция возвратит переданный URL с добавленным в конце параметром, в котором будет записана подпись.&lt;br /&gt;
&lt;br /&gt;
=== Функции работы с датой и временем ===&lt;br /&gt;
&lt;br /&gt;
'''CurrTime''' – возвращает текущее время&lt;br /&gt;
&lt;br /&gt;
'''CurrDate''' – возвращает текущую дату&lt;br /&gt;
&lt;br /&gt;
'''CurrMillisecond''' - Возвращает количество миллисекунд прошедших с начала текущего года. Используется для точного расчета временных интервалов.&lt;br /&gt;
&lt;br /&gt;
'''Today''' - возвращает текущую дату в числовом формате.&lt;br /&gt;
&lt;br /&gt;
'''Day(dt)''' – возвращает день месяца даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Month(dt)''' – возвращает месяц года даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Year(dt)''' – возвращает год даты dt.&lt;br /&gt;
&lt;br /&gt;
'''FirstDayOfMonth(dt)''' – Возвращает первый день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( FirstDayOfMonth( CurrDate() ) );&lt;br /&gt;
'''Полужирное начертание'''&lt;br /&gt;
'''LastDayOfMonth(dt)''' – Возвращает последний день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( LastDayOfMonth( CurrDate() ) );&lt;br /&gt;
&lt;br /&gt;
'''DaysInMonth(month, year)''' – Возвращает количество дней в указанном месяце.&lt;br /&gt;
&lt;br /&gt;
'''IncDay(dt, [count=1])''' – Возвращает дату, увеличенную на count дней.&lt;br /&gt;
&lt;br /&gt;
'''SQLDate(dt)''' – Пытается конвертировать dt в дату, вернуть в формате «'YYYY-MM-DD'» (с апострофами), если не удается – возвращает «NULL».&lt;br /&gt;
&lt;br /&gt;
'''SQLDateToDate(dt)''' – Переводит дату из SQL-формата в обычный.&lt;br /&gt;
&lt;br /&gt;
'''DAYSBETWEEN(dt1, dt2)''' – Возвращает количество дней между датами dt1 и dt2. В случае ошибки приведения dt1 или dt2 к дате возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''TimeBetween(t1, t2)''' - Возвращает количество минут между временем t1 и t2. Если t1 &amp;gt; t2 то будет показано количество минут между t2 и t1. Параметр t может быть как в формате &amp;quot;HH:MM&amp;quot;, так и в числовом. Если один из параметров не удалось привести к числовому типу возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''WorkDaysBetween(dt1, dt2, [DecreaseFirstDay=0], [DefaultHolidayVarNum=1])''' - Возвращает количество рабочих дней между датами dt1 и dt2. Параметр DecreaseFirstDay уменьшает dt1 на указанное количество дней (по умолчанию 0).  В случае ошибки приведения dt1 или dt2 к дате возвращает -1000. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней(по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''TimePeriod(time1, time2)''' - Оформляет временной период. Возвращаемое значение зависит от наличия значения в параметрах. Возможные варианты: &amp;quot;time1 - time2&amp;quot; , &amp;quot;С time1&amp;quot; , &amp;quot;ДО time2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''StrDateToFloat(s, [time=false])''' - Переводит строку с датой s в числовой тип. Если параметр time включен, то в строке s должно быть указано время. Дата должна быть в формате &amp;quot;DD.MM.YYYY&amp;quot;, а время &amp;quot;HH:NN&amp;quot;. Если строку перевести не удалось возвращает 0&lt;br /&gt;
&lt;br /&gt;
'''IsAWorkDay(dt)''' - Когда день dt является рабочим, возвращает true. Если произошла ошибка приведения даты возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''IncWorkDay(dt, [count=1],[DefaultHolidayVarNum=1])''' - Прибавляет count рабочих дней к дате dt. Возвращает дату в числовом формате, если произошла ошибка приведения даты возвращает -1000. По умолчанию параметр count равен 1 и не является обязательным. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней (по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''Sleep'''(n) - Задержка выполнения на n миллисекунд.&lt;br /&gt;
&lt;br /&gt;
=== Функции приведения типов ===&lt;br /&gt;
&lt;br /&gt;
'''INT(v)''' – возвращает значение типа “целое”, приводя вариантное значение v к числовому типу, а затем округляя его. В том числе используется как функция округления.&lt;br /&gt;
&lt;br /&gt;
'''FLOAT(v)''' – возвращает значение типа “число”, приводя вариантное значение v к числовому типу, переводя в число цепочку символов до первого нецифрового символа (либо точки или запятой).&lt;br /&gt;
&lt;br /&gt;
'''STR(v)''' – возвращает значение типа “строка”, приводя вариантное значение v к строковому типу.&lt;br /&gt;
&lt;br /&gt;
'''Date(v)''' – возвращает дату, либо пустую строку, если не удается конвертировать v в дату&lt;br /&gt;
&lt;br /&gt;
'''Time(v)''' – возвращает время, либо пустую строку, если не удается конвертировать v во время. Понимает числовое представление времени.&lt;br /&gt;
&lt;br /&gt;
=== Математические функции ===&lt;br /&gt;
&lt;br /&gt;
'''ROUNDUP(f)''' – округляет число f до ближайшего большего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''ROUNDDN(f)''' – округляет число f до ближайшего меньшего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''Money(f, CouldBeEmpty, ZeroFill, MakeSpace)''' - Округляет число f, до двух знаков после запятой. CouldBeEmpty - заменить число меньше 0,0001  на пустую строку. ZeroFill  - Следить чтобы после запятой было два знака, если будет один, то добавить ноль. MakeSpace - Разделить разряды пробелом.&lt;br /&gt;
''Подсказка: для простого округления используется функция int()''&lt;br /&gt;
&lt;br /&gt;
'''Abs(f)''' - возвращает модуль числа f.&lt;br /&gt;
&lt;br /&gt;
'''Mod(x, y)''' - возвращает остаток от деления целочисленного числа x на целочисленное число y.&lt;br /&gt;
&lt;br /&gt;
=== Константы ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Null''' – Возвращает пустое значение.&lt;br /&gt;
&lt;br /&gt;
'''Да''', '''True''', '''Нет''', '''False''' – константы, соответствующие булевым значениям.&lt;br /&gt;
&lt;br /&gt;
=== Прочие функции ===&lt;br /&gt;
&lt;br /&gt;
SetPhoneParams(CountryCode, TownCode) – Устанавливает глобальные настройки кода телефонных кодов страны и города соответственно. По-умолчанию код страны – 7, код города – 495.&lt;br /&gt;
&lt;br /&gt;
PhonesCount(s) – Возвращает количество корректных телефонных номеров, найденных в строке s.&lt;br /&gt;
&lt;br /&gt;
GetPhone(s[, n]) – Возвращает n-й корректный телефонный номер, найденный в строке s. Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
GetEmail(s) – Возвращает все корректные адреса email, найденный в строке s, разделенные запятыми (т.е. готовыми к передаче в функцию SendEmail).&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY).&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
GenEan(ID, Code) – Формирует штрих-код EAN 13 Состоящий из идентификатора типа сущности ID и кода сущности Code, Выравнивает до 13-ти символов, первый – «2», последний – контрольная сума.&lt;br /&gt;
&lt;br /&gt;
CheckEan(s) - Проверяет строку s, что она является кодом EAN13.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(FileName,s, encoding [, append])- Создает текстовый файл по пути, указанному в FileName (если по указанному пути существует файл с указанным именем, он удаляется и создается новый) и производит запись строки s в созданный текстовый файл. encoding - название кодировки, по умолчанию сохраняет в кодировке ANSI. Доступные названия кодировок: KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Если append = true, то производится дописывание данных в файл, а не перезаписывание (не обязательный, по умолчанию выключен).&lt;br /&gt;
&lt;br /&gt;
StrFromFile(FileName) - Читает файл FileName, возвращает в виде строки. При ошибке чтения вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
DownloadAttachment(code, [savefilepath, tablename='attachment', fieldBlob='file', fieldLDtime='ldtime', fieldUID='uid']) - Функция выкачивает аттачмент из базы, по внутреннему коду - Code, всегда возвращает содержимое файла в виде строки, а также может сохранить файл по указанному пути в параметре savefilepath. По умолчанию, функция настроена на таблицу attachment. Code - внутренний код вложения, tablename - название таблицы, fieldBlob - название поля с содержимым файла, fieldLDtime - название поля с временем последнего изменения строки (для работы кэша). Функция использует кэш и умеет выкачивать файлы зауженные на внешние серверы (http, ftp,sftp, measoft). Для выкачивания с сервера measoft обязательно необходимо указывать параметр fieldUID.&lt;br /&gt;
&lt;br /&gt;
DeleteFile(FileName) - Удаляет файл FileName с диска, возвращает истину, если операция прошла успешно и ложь - в противном случае.&lt;br /&gt;
&lt;br /&gt;
HTTPPOST(host, PostParams, Proxy, ContentType, HTTPUser, HTTPPass, Method, CustomHeader, Reconnects) - Отправляет HTTP запрос по адресу host с данными PostParams. Proxy - объект Proxy, задающий прокси-сервер (по-умолчанию - пусто - не использовать прокси). ContentType - Заголовок ContentType. По-умолчанию - &amp;quot;application/x-www-form-urlencoded; Charset=UTF-8&amp;quot;. HTTPUser и HTTPPass - данные для http-авторизации на сервере. Method - метод отправки запроса, по-умолчанию - &amp;quot;POST&amp;quot;. CustomHeader - Дополнительные заголовки HTTP запроса, передается в виде списка параметров через запятую и всегда образуют пару: 1 параметр - название заголовка, 2 параметр - значение. Если значение содержит запятую то его нужно экранировать в двойные кавычки. Reconnects - Количество попыток подключения (по-умолчанию - 2), если больше 100 - это таймаут единственной попытки подключения в миллисекундах.&lt;br /&gt;
Функция возвращает ответ сервера. &amp;lt;br&amp;gt;&lt;br /&gt;
''Обратите внимание:'' Для имитации отправки данных html-формы методом POST может понадобиться перед передаваемыми параметрами добавить &amp;quot;Data=&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
FTPPUT(host, User, Pass, FileName[, Active]) - Отправляет файл на FTP/SFTP-сервер. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
FTPGET(host, User, Pass, SourceFileName, DestFileName[, Active]) - Загружает файл SourceFileName с FTP/SFTP-сервера, сохраняет его в файл DestFileName. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
GetTempDir - Возвращает путь к временной папке.&lt;br /&gt;
&lt;br /&gt;
ApplicationDir - Возвращает путь к файлу программы.&lt;br /&gt;
&lt;br /&gt;
Interpretate(script) - Интерпретирует скрипт указанный в script. Выполнение происходит в текущем инстансе.&lt;br /&gt;
&lt;br /&gt;
LastHttpError - Выводит последний запрос выполненный с ошибкой в функции HttpPost. Содержит подробную информацию по запросу и ответу.&lt;br /&gt;
&lt;br /&gt;
LastHttpResponse - Выводит последний запрос и ответ от сервера после выполнения Http-запроса в функции HttpPost.&lt;br /&gt;
&lt;br /&gt;
== Объект TExcel ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к данным документов MS Excel. Требует установленного приложения MS Excel. Для работы без установленного MS Excel предусмотрен объект TDirectExcel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ввод данных'''''&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Если Headered истинно (по-умолчанию), таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Если TranslateHeader истинно, то заголовки таблицы будут автоматически переведены.&lt;br /&gt;
 &lt;br /&gt;
 MyDB.Open('select * from kurier');&lt;br /&gt;
 xl.LoadFromDB(MyDB.Self);&lt;br /&gt;
 xl.DoNotDestroy(true);&lt;br /&gt;
 xl.SetVisible(true);&lt;br /&gt;
&lt;br /&gt;
Post2Sheet(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) -  Почти полный аналог LoadFromDB. В отличии от LoadFromDB если есть открытый файл, выгрузка данных будет выполнена прямо в него.&lt;br /&gt;
&lt;br /&gt;
OpenFile(aFileName) – Выполняет функции SetFileName и Open. &lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
SetFileName(aFileName) – Задает значение свойства FileName.&lt;br /&gt;
&lt;br /&gt;
Open - Открывает файл с именем, заданным свойством FileName. Если имя файла не задано - создает чистую книгу.&lt;br /&gt;
&lt;br /&gt;
Close – Закрывает текущий файл.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ячейки'''''&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
Cell(x, y, text) – Возвращает значение ячейки, заданной координатами x, y. Необязательный булевый параметр text, в случае истинности, указывает на необходимость возврата данных с учетом формата ячейки, т.е. то, что пользователь видит на экране. Обратите внимание, что если в ячейке число, и ширина столбца не достаточна для отображения, Excel выводит &amp;quot;#####&amp;quot;, что и будет возвращено программе, если text=ИСТИНА. Поэтому перед таким использованием рекомендуется выполнить функцию AutoFit.&lt;br /&gt;
&lt;br /&gt;
SetCell(x, y, v[, x2, y2]) – Устанавливает значение ячейки, заданной координатами x и y, в значение v. Если заданы параметры x2, y2 - объединяет (merge) диапазон ячеек заданных координатами, устанавливает значение объединенной ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Строки'''''&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
RowAutoFit([y1, y2]) - Устанавливает автоматическую высоту строк. Аргументы y1 и y2 необязательны и если не указаны, то процедура будет выполнена для всей страницы, в ином случае только для строк от y1 до y2.&lt;br /&gt;
&lt;br /&gt;
SetRowHeight(r, h[, cnt]) – Устанавливает высоту cnt строк (по-умолчанию 1) начиная со строки r в h пикселей.&lt;br /&gt;
&lt;br /&gt;
GetRowHeight(r) – Возвращает высоту строки r в пикселях.&lt;br /&gt;
&lt;br /&gt;
RowInsert(i[, count]) - Вставляет count (по-умолчанию - 1) строк НАД строкой с номером i.&lt;br /&gt;
&lt;br /&gt;
RowDelete(i[, count]) - Удаляет count (по-умолчанию - 1) строк начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Столбцы'''''&lt;br /&gt;
&lt;br /&gt;
ColCount - Возвращает количество столбцов в листе.&lt;br /&gt;
&lt;br /&gt;
AutoFit – Устанавливает автоматическую ширину столбцов.&lt;br /&gt;
&lt;br /&gt;
ColumnDelete(i[, count]) - Удаляет count (по-умолчанию - 1) столбцов начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
SetColWidth (c, w) – Устанавливает ширину столбца c в w пикселей.&lt;br /&gt;
&lt;br /&gt;
GetColWidth (c) – Возвращает ширину столбца c в пикселях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Листы'''''&lt;br /&gt;
&lt;br /&gt;
SetSheet(No) – Устанавливает номер текущего листа. Если лист с таким номером не существует - он будет создан (и все листы до него). Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetSheetName(Name) - Устанавливает название текущего листа.&lt;br /&gt;
&lt;br /&gt;
SheetsCount – Возвращает количество листов в книге.&lt;br /&gt;
&lt;br /&gt;
CopySheetAfter([SheetFrom[, SheetAfter]]) - Копирует лист SheetFrom (по-умолчанию - текущий), создавая новый лист после листа SheetAfter (по-умолчанию - совпадает с копируемым).&lt;br /&gt;
&lt;br /&gt;
SheetDelete(i) - Удаляет лист с номером i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Форматирование'''''&lt;br /&gt;
&lt;br /&gt;
Align(x1, y1, x2, y2 [,HAlign, VAlign]) - Устанавливает выравнивание данных в указанном диапазоне. HAlign - горизонтальное выравнивание (0 – прижато влево , 1 – по центру , 2 – прижато вправо), VAlign - Вертикальное выравнивание (0 – прижато к верху , 1 – по центру , 2 – прижато к низу).&lt;br /&gt;
&lt;br /&gt;
WrapText(x1, y1, x2, y2, value) – Устанавливает перенос текста прямоугольника в значение value. Если координаты опущены, или 0 – устанавливает границы всей используемой области. Для Value значение по-умолчанию - true.&lt;br /&gt;
&lt;br /&gt;
NumberFormat(x1, y1, x2, y2, Format) - Устанавливает формат вывода чисел в указанном диапазоне ячеек. Например, если Format='0.00' - числа будут выводиться c обязательными 2 знаками после десятичного разделителя.&lt;br /&gt;
&lt;br /&gt;
SetBorders(x1, y1, x2, y2) – Устанавливает границы прямоугольника. Если координаты опущены, или 0 – устанавливает границы всей используемой области.&lt;br /&gt;
&lt;br /&gt;
SetFont(Font[, x1, y1[, x2, y2]]) - Устанавливает шрифт Font для ячеек диапазона. Можно указать координаты только одной ячейки, можно - вообще не указать, тогда будет использован последний выделенный диапазон. Шрифт задается как обычно: 'Arial, 16, T, T, T', порядок параметров: Имя шрифта, размер, жирное начертание, курсивное начертание, одиночное подчеркивание. Если параметры не заданы, то у текущего шрифта они меняться не будут. Примеры: SetFont('Arial, 10, T, F, F', 1,1) - в ячейке A1 будет установлен шрифт Arial жирным начертанием (не курсив и без подчеркивания). SetFont(', , , T, F', 2,1) - в ячейке B1 будет поменяется только начертание курсив и будет отменено подчеркивание (если оно было). &lt;br /&gt;
&lt;br /&gt;
SaveValuesOnly - убирает формулы на текущей странице и оставляет лишь их результативные статичные значения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Цвета'''''&lt;br /&gt;
&lt;br /&gt;
SetRowFontColor(Row,Color) - Устанавливает цвет шрифта в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetRowColor(Row,Color) - Устанавливает цвет фона в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetColumnFontColor(Col,Color) - Устанавливает цвет шрифта в столбце Col. Color -  целое значение (RGB) &lt;br /&gt;
&lt;br /&gt;
SetColumnColor(Col,Color) - Устанавливает цвет фона в столбце Col. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellFontColor(Row,Col,Color) -  Устанавливает цвет шрифта в ячейке с координатами [Row,Col]. Color -  целое значение, равное номеру цвета в палитре (ColorIndex,не RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellColor(Row,Col,Color) -  Устанавливает цвет фона в ячейке с координатами [Row,Col]. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
GetRowFontColor(Row)- Возвращает RGB значение цвета шрифта строки Row&lt;br /&gt;
&lt;br /&gt;
GetRowColor(Row)- Возвращает RGB значение цвета фона строки Row&lt;br /&gt;
&lt;br /&gt;
GetColumnFontColor(Col)- Возвращает RGB значение цвета шрифта столбца Col&lt;br /&gt;
&lt;br /&gt;
GetColumnColor(Col)- Возвращает RGB значение цвета фона столбца Col &lt;br /&gt;
&lt;br /&gt;
GetCellFontColor(Row,Col) - Возвращает номер цвета шрифта в палитре (ColorIndex) в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
GetCellColor(Row,Col) - Возвращает RGB значение цвета фона в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Копи-паст'''''&lt;br /&gt;
&lt;br /&gt;
Copy(x1, y1, x2, y2) - Копирует в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Cut(x1, y1, x2, y2) - Вырезает в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Paste(x1, y1) - Вставляет из буфера экселя. Команды copy-paste неразрывны, если что нибудь сделать в промежутке между ними, например вставить значение в ячейку, то копирование сброситься. (Последовательность использования: copy - paste, cut - paste)&lt;br /&gt;
&lt;br /&gt;
PasteStyle(x1, x2, y1, y2) - Вставляет только оформление из буфера экселя (Последовательность использования:  Copy - PasteStyle)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Изображения'''''&lt;br /&gt;
&lt;br /&gt;
InsertPicture(TPicture, [x=1, y=1, DispX=0, DispY=0, width=0, height=0]) - Функция вставляет рисунок на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки, width, height (не работает для DirectExcel) - ширина и высота области рисунка в пойнтах-единицах Excel &lt;br /&gt;
&lt;br /&gt;
InsertFirmLogo(FirmCode, [x=1, y=1, DispX=0, DispY=0]) - Функция вставляет логотип фирмы с кодом FirmCode на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Вывод'''''&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки. Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SheetFitPageWidth - устанавливает режим масштабирования печати, чтобы печатная форма помещалась в ширину на один лист.&lt;br /&gt;
&lt;br /&gt;
SetOrientation(value) - Устанавливает ориентацию страницы. True (по-умолчанию) - альбомная (ландшафтная), Ложь - портретная.&lt;br /&gt;
&lt;br /&gt;
PrintOut([copies]) - Печатает текущий лист на принтере по умолчанию. Параметр copies - количество копий, по умолчанию равен 1.&lt;br /&gt;
&lt;br /&gt;
Save(filename) - Сохраняет в файл filename. Если файл существует, в основной системе он будет перезаписан, в других проектах - вызовет ошибку &amp;quot;Файл уже существует&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SetVisible(b) – Устанавливает видимость приложения Excel для пользователя. По-умолчанию – false (не видимо).&lt;br /&gt;
&lt;br /&gt;
DoNotDestroy(b) – При уничтожении объекта TExcel (а он уничтожается, как и все остальные объекты автоматически при завершении выполнения скрипта), приложение Excel уничтожается вместе с ним. DoNotDestroy(true) отключает уничтожение приложения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования'''''&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'myxl');&lt;br /&gt;
 myxl.OpenFile('c:\asdf.xlsx');&lt;br /&gt;
 set($sum, 0);&lt;br /&gt;
 while (myxl.EOF=0, &lt;br /&gt;
      set($sum, $sum+int(myxl.c));&lt;br /&gt;
      myxl.next );&lt;br /&gt;
 $sum&lt;br /&gt;
 &lt;br /&gt;
 ''Возвращает сумму всех числовых данных столбца C файла 'c:\asdf.xlsx'''&lt;br /&gt;
&lt;br /&gt;
== Объект TDirectExcel ==&lt;br /&gt;
Объект позволяет работать с файлами Excel напрямую, без установленного пакета MsOffice. Применяется в сервисах и при отсутствии экселя. Он максимально совместим с объектом TExcel, однако некоторые методы могут быть не реализованы. &lt;br /&gt;
&lt;br /&gt;
== Объект TCSVFile ==&lt;br /&gt;
Предназначен для доступа к данным документов CSV. Разделителем столбцов является символ точка с запятой ;&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
OpenFile(FileName) – Открывает файл FileName.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=false]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO.&lt;br /&gt;
&lt;br /&gt;
LoadFromText(s) - Загружает таблицу из строки s.&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). &lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(Filename) - Сохраняет в файл с именем filename.&lt;br /&gt;
&lt;br /&gt;
== Объект TADO ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к базам данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|Connect(ConnectionString)&lt;br /&gt;
|Подключает к источнику данных. ConnectionString – Строка подключения ADO.&lt;br /&gt;
|-&lt;br /&gt;
|ConnectMySQL(DBServer, DBPort, DBUser, DBPass, DBName)&lt;br /&gt;
|Подключает к базе данных MySQL.&lt;br /&gt;
|-&lt;br /&gt;
|Open(Query)&lt;br /&gt;
|Открывает набор данных выполнив запрос Query.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByNo(i)&lt;br /&gt;
|Возвращает значение поля с номером i. Нумерация полей – с нуля.&lt;br /&gt;
|-&lt;br /&gt;
|FieldName(i)&lt;br /&gt;
|Возвращает имя поля с номером i.&lt;br /&gt;
|-&lt;br /&gt;
|FieldCount&lt;br /&gt;
|Возвращает количество  полей.&lt;br /&gt;
|-&lt;br /&gt;
|RecordCount&lt;br /&gt;
|Возвращает количество записей.&lt;br /&gt;
|-&lt;br /&gt;
|RecNo&lt;br /&gt;
|Возвращает номер текущей записи. ''ВНИМАНИЕ! В зависимости от способа подключения к БД нумерация может начинаться как с 0 так и с 1!''&lt;br /&gt;
|-&lt;br /&gt;
|EOF&lt;br /&gt;
|Возвращает признак достижения конца набора данных. Становится истиной когда выполняется команда Next на последней записи.&lt;br /&gt;
|-&lt;br /&gt;
|Next&lt;br /&gt;
|Переход на следующую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|First&lt;br /&gt;
|Переход на первую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|Last&lt;br /&gt;
|Переход на последнюю запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByName(FieldName)&lt;br /&gt;
|Возвращает значение поля по имени. Также возможно указание имени поля как свойства объекта.&lt;br /&gt;
|-&lt;br /&gt;
|Field(Table, ID, FieldName)&lt;br /&gt;
|Возвращает значение поля FieldName записи с кодом ID таблицы Table. Набор данных, если он открыт, при этом не закрывается. Первичный ключ таблицы должен называться «code». Гарантированно работает только с MYSQL!!!&lt;br /&gt;
|-&lt;br /&gt;
|GetSQLValue(Query)&lt;br /&gt;
|Выполняет SQL-запрос. Текст запроса должен начинаться с первого символа строки (перед запросом не должно быть пробелов, переносов строк, комментариев и т.д.). Если запрос Insert – возвращает ID вставленной записи. Если запрос – Update, Delete, Replace, Set, Start, Commit, Rollback – возвращает количество измененных записей (RowsAffected), иначе – Select – значение первого поля первой строки результата как текст.&lt;br /&gt;
|-&lt;br /&gt;
|FillText(s)&lt;br /&gt;
|Возвращает строку s с замененными названиями полей между знаками процента на соответствующие значения текущей записи. Так же в строке возможно использование интерпретируемого кода, заключенного между тегами &amp;quot;&amp;lt;?&amp;gt;&amp;quot; и &amp;quot;&amp;gt;&amp;quot;. При интерпретации система сначала производит замену полей с процентами на значения, потом интерпретирует код. ''Внимание! Функция не создает отельный контекст интерпретатора, а использует существующий, в нем доступны все объекты и переменные, вызывающего скрипта.'' Дополнительно автоматически создается объект TSelfADO, подключенный к той же БД, что и контекст, вызвавший функцию, с пустым именем, а так же с именем &amp;quot;dataset&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|Query(Query)&lt;br /&gt;
|Синоним GetSQLValue.&lt;br /&gt;
|-&lt;br /&gt;
|Close&lt;br /&gt;
|Закрывает набор данных.&lt;br /&gt;
|-&lt;br /&gt;
|Self&lt;br /&gt;
|Возвращает указатель на подключение к БД для использования в других объектах.&lt;br /&gt;
|-&lt;br /&gt;
|ParseForIn([FieldName='code']) &lt;br /&gt;
|Возвращает через запятую значения всех строк в указанном столбце. По умолчанию, используется столбец с именем code.&lt;br /&gt;
|-&lt;br /&gt;
|GetSQL&lt;br /&gt;
|Для отладки. Возвращает последний SQL запрос переданный в методы Open, Query, GetSQLValue&lt;br /&gt;
|-&lt;br /&gt;
|ExportExcel&lt;br /&gt;
|Для отладки. Выгружает в эксель содержимое датасета. Можно использовать в незнакомом окружении для понимания передаваемых полей в : шаблонах, печатных формах и т.д. Аналог команды %echo% в шаблонах, на случай если она не сработает.&lt;br /&gt;
|-&lt;br /&gt;
|OnGetText&lt;br /&gt;
|Функция подменяет текстовый вывод значения поля при выгрузке в эксель. Первый параметр это имя поля, которое надо подменить. Второй параметр это то что необходимо вывести. Работает только с текстовыми полями. &lt;br /&gt;
'''''Пример использования'''''  &lt;br /&gt;
  DB.OnGetText('Зона', IF((DB.FieldByName('-Lat') ! 0) * (DB.FieldByName('-Lon') ! 0),&lt;br /&gt;
       	GetPolygonByLatLon(DB.FieldByName('-Lat'), DB.FieldByName('-Lon'), 'TYPE = 1 AND IFNULL(zone, 0) &amp;gt; 0 AND PRICE = ' + DB.FieldByName('-price'), 'zone')&lt;br /&gt;
  ,&lt;br /&gt;
        ''&lt;br /&gt;
  ));&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования – см. TSelfADO&lt;br /&gt;
&lt;br /&gt;
== Объект TSelfADO ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наследник объекта TADO. Служит для подключения к «родной» для программы, в которой выполняется скрипт, базе данных. Обладает всеми свойствами и методами объекта TADO, кроме Connect. Иногда автоматически создается системой для обеспечения простого доступа к базе данных, а также иногда создается системой с уже открытым набором данных для передачи обрабатываемого системой набора данных в скрипт. В этом случае для скрипта недоступны функции Open и Close.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&lt;br /&gt;
 rem('Копируем данные из &amp;quot;родной&amp;quot; базы данных в базу MSSQL.');&lt;br /&gt;
 new('TSelfADO', 'MyDB');&lt;br /&gt;
 new('TADO', 'MSSQL');&lt;br /&gt;
 MSSQL.Connect('Provider=SQLOLEDB.1;Password=myPassword;Persist Security Info=True;User ID=myUsername;Initial Catalog=myDataBase;Data Source=myServerAddress');&lt;br /&gt;
 MyDB.Open('select code, name, passport from kurier where code&amp;gt;'+Int(MSSQL.Query('select max(code) from kurier'))+' order by code');&lt;br /&gt;
 While(MyDB.EOF=0,&lt;br /&gt;
      MSSQL.Query('insert kurier (code, name, passport) VALUES ('+MyDB.Code+', '+QuotedStr(MyDB.Name)+', '+QuotedStr(MyDB.Passport)+')');&lt;br /&gt;
      MyDB.Next;&lt;br /&gt;
      );&lt;br /&gt;
&lt;br /&gt;
== Объект TPrinter ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к принтерам.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
BeginDoc – Начинает новый документ.&lt;br /&gt;
&lt;br /&gt;
EndDoc – Закрывает документ&lt;br /&gt;
&lt;br /&gt;
PageHeight – Возвращает высоту страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageWidth – Возвращает ширину страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageNumber – Возвращает номер текущей страницы документа&lt;br /&gt;
&lt;br /&gt;
Orientation – Возвращает текущую ориентацию страницы (0 – портретная, 1 – ландшафтная)&lt;br /&gt;
&lt;br /&gt;
Printing – Возвращает истину если документ открыт&lt;br /&gt;
&lt;br /&gt;
SetOrientation(Orientation) – Устанавливает ориентацию страницы. При необходимости начинает новый документ, новую страницу.&lt;br /&gt;
&lt;br /&gt;
ShowDialog – Показывает пользовательский диалог печати. Возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
NewPage – Начинает новую страницу&lt;br /&gt;
&lt;br /&gt;
Canvas – Предоставляет доступ к объекту TCanvas, связанному с принтером.&lt;br /&gt;
&lt;br /&gt;
PrinterNames – Возвращает список принтеров, установленных в системе, разделенный переносами строк&lt;br /&gt;
&lt;br /&gt;
PrintersCount – Возвращает количество установленных в системе принтеров&lt;br /&gt;
&lt;br /&gt;
SetPrinter(Printer) – Устанавливает текущий принтер. Если передана строка – ищет принтер по названию, иначе – по номеру. Нумерация начинается с 0.&lt;br /&gt;
&lt;br /&gt;
PrintTable(Y, Table) – Выводит на печать таблицу Table типа TTable, начиная с координаты Y. При необходимости таблица печатается на нескольких страницах. Возвращает координату Y конца таблицы.&lt;br /&gt;
&lt;br /&gt;
GetDefaultPrinter - Возвращает имя текущего активного принтера.&lt;br /&gt;
&lt;br /&gt;
SetDefaultPrinter(Printer) – Запоминает предыдущий активный принтер и устанавливает новый текущий принтер. Printer - имя принтера. При необходимости нескольких последовательных вызовов SetDefaultPrinter рекомендуется между вызовами использовать RestoreDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
RestoreDefaultPrinter - Устанавливает активным принтер, который был текущим перед последним вызовом SetDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
== Объект TCanvas ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предоставляет доступ к холсту объекта для прорисовки изображения.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
DPIX – Возвращает разрешение холста по горизонтали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
DPIY – Возвращает разрешение холста по вертикали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
TextOut(x, y, s[, x1, y1, x2, y2]) – Выводит строку s начиная с точки с координатами x и y. Если указаны параметры x1, y1, x2, y2 – то выводимый текст ограничивается заданным прямоугольником.&lt;br /&gt;
&lt;br /&gt;
TextOutEx(x1, y1, x2, y2, Alignment, Font, s, Indent) – Выводит строку s в прямоугольнике с координатами x1, y1, x2, y2. По горизонтали строка выравнивается в соответствии с Alignment (0 – прижато влево, 1 – вправо, 2 – по центру), по вертикали выравнивается по центру. Используя шрифт Font (см описание ниже). Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату X фактического окончания текста (правой стороны – если строка прижата влево, и левой – в остальных случаях)&lt;br /&gt;
&lt;br /&gt;
MLTextOut(x1, y1, x2, y2, Alignment, VAlignment, Font, s, Heigth, Indent) – Выводит многострочный текст s в прямоугольнике с координатами x1, y1, x2, y2 с переносом по словам. По горизонтали строки выравниваются в соответствии с Alignment, по вертикали – в соответствии с VAlignment (0 – прижато вверх, 1 – по центру, 2 – прижато вниз). Используя шрифт Font (см описание ниже). Heigth – высота строки. Если опущено или равно нулю – высота определяется автоматически в соответствии с выбранным шрифтом. Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату Y фактического окончания текста (нижней границы последней строки текста. ''ВНИМАНИЕ! Функция использует координаты прямоугольника для позиционирования текста, однако она не ограничивает его верхней и нижней границами этого прямоугольника!''&lt;br /&gt;
&lt;br /&gt;
DrawPic(x1, y1, x2, y2, Pic, Style, Alignment, Mode) – Прорисовывает изображение Pic (ссылка на изображение TPicture.Self) в прямоугольник заданный координатами x1-y2. Style – стиль масштабирования. 0 – растянуть изображение до границ прямоугольника не сохраняя пропорции, 1 – вписать изображение в прямоугольник сохраняя пропорции – вероятно, останутся поля по вертикали или горизонтали, 2 – вписать сохраняя пропорции, обрезав при необходимости изображение по вертикали или горизонтали. Alignment – выравнивание по горизонтали. Работает только в случае если style=1 и при растягивании изображения получились вертикальные поля. 0 – разместить по центру, 1 – прижать влево, 2 – прижать вправо. Функция возвращает координату X правой стороны изображения кроме случая, когда Style=1 и Alignment=2 – в этом случае возвращается координата левой стороны изображения. Mode - способ наложения изображения. 0 (по-умолчанию) - копирование как есть. 1 - Наложение операцией AND (применяется для получения эффекта прозрачности изображения), 2 - наложение операцией XOR (Применяется для возможности повторной операцией убрать изображение), 3 - Наложение операцией OR.&lt;br /&gt;
&lt;br /&gt;
FillRect(x1, y1, x2, y2) – Рисует прямоугольник '''без границ''' и закрашивает цветом BrashColor&lt;br /&gt;
&lt;br /&gt;
Rect(x1, y1, x2, y2) – Рисует прямоугольник '''c границами''', задаваемыми текущим пером, и закрашивает цветом BrashColor &lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Устанавливает шрифт по-умолчанию.&lt;br /&gt;
&lt;br /&gt;
SetPen(Width, Color) - Устанавливает параметры &amp;quot;ручки&amp;quot; - толщину и цвет. Если любой параметр опустить, соответствующее значение не будет изменено.&lt;br /&gt;
&lt;br /&gt;
SetBrush(Color, Style) - Устанавливает параметры заливки - цвет и стиль. Если любой параметр опустить, соответствующее значение не будет изменено. Стили заливки: 0 - сплошная, 1 - отсутствует (прозрачная), 2-7 - различные виды штриховки (горизонтальные, вертикальные, в клеточку и т.д.).&lt;br /&gt;
&lt;br /&gt;
TextHeight(s) – Возвращает высоту текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
TextWidth(s) – Возвращает ширину текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
Использование шрифта (Font): У объекта TCanvas есть «глобальные» установки шрифта. Однако для некоторых функций возможно указание шрифта, отличающегося от глобального. Параметры шрифта – это текстовая строка, состоящая из 6-ти параметров, разделенных запятыми: Название, размер, жирный, курсив, подчеркнутый, цвет. Например:&lt;br /&gt;
&lt;br /&gt;
 'Times New Roman, 8, Y, N, N, 255'&lt;br /&gt;
&lt;br /&gt;
Любой параметр можно опустить, и тогда вместо него будет использовано значение по-умолчанию: шрифт: arial, размер – 10, не жирный, не курсив, не подчеркнутый, цвет – черный. Например: ', 7' – указывает, что по-умолчанию нужно взять все параметры кроме размера шрифта. Также можно вместо всей строки указать тире ('-') или пустую строку, и шрифт будет использоваться «глобальный».&lt;br /&gt;
&lt;br /&gt;
Объект можно создать отдельно, не создавая объект TPrinter. В таком случае объект создастся как ссылка на текущий холст принтера (принтер должен быть запущен и начат новый документ). Такой подход используется в доп. возможности PrintCustomSticker&lt;br /&gt;
&lt;br /&gt;
== Объект TPicture ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с графическими изображениями форматов BMP, GIF, JPEG и PNG, а также для формирования штрих-кодов. Обратите внимание, прозрачность изображений не поддерживается, однако в методе TCanvas.DrawPic есть параметр Mode, призванный создавать эффект прозрачности.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(FileName) – Загружает изображение из файла FileName. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB, Query) – Загружает изображение из базы данных. DB – ссылка на подключение к базе данных TADO.Self, Query – текст запроса. Запрос должен вернуть в первом поле первой строки BLOB-поле с изображением, все остальные данные возвращаемые запросом игнорируются. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromStr($s) – Загружает изображение из строки $s. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
CreateBar(Width, Height, BarCode, Textless, Type) – Формирует штрих-код шириной Width и высотой Height с типом кодирования Type. BarCode – текст штрих-кода. Булево значение Textless указывает, что в штрих-коде не должно быть человеко-читаемых символов если истинно. Type указывает тип кодирования: 0 (по-умолчанию) CODE128, 1 - EAN-13, 2 - Interleaved 2-5, 3-DataMatrix, 4-QRCode.&lt;br /&gt;
Штрихкод должен быть: Для EAN-13 цифровым 12 или 13 символов (13-й, контрольная сумма рассчитывается автоматически), для CODE128 - должен иметь состоять из допустимого для этого кодирования набора символов. Для Interleaved - должен состоять из четного числа цифр, контрольная сумма автоматически не рассчитывается. Если для Interleaved кода указано значение из 14-ти знаков, подпись цифр выводится в формате Почты России.&lt;br /&gt;
Внимание! Для кодов EAN-13 и Interleaved ширина штрих-кода Width не является точным значением получаемого на выходе изображения. Ширина изображения рассчитывается как максимальное кратное минимально возможной ширине, но не меньше минимально возможной. Конечную ширину можно получить в соответствующем свойстве объекта. Для кода CODE128 штрих-код на выходе может оказаться пустым, если указанной ширины штрих-кода не достаточно для его формирования.&lt;br /&gt;
Для кода DataMatrix можно установить режим для печати скрытых символов с кодами 29(GS) и 232(FCN1), которые требуются для формирования Честного Знака. Для этого необходимо в начале строки указать символ &amp;quot;[&amp;quot; и все разделители 01, 21, 91, 92 так же экранировать этими скобками. Должно получиться [01]02900002317701[21]k3LInNbH_oG0Q[91]EE06[92]YXiyKfiHjE4YE8b+YVMC1O5r8VtpplA3AwcCqrcG9Dk= . При формировании кода, включится режим формирования штрих-кода DataMatrix GS1, в начале будет добавлен символ с кодом 232 (FCN1), а потом будут добавлены разделители с кодом 29 (GS)&lt;br /&gt;
Функция возвращает 1 в случае успеха, или текст ошибки, если такая произошла.&lt;br /&gt;
&lt;br /&gt;
SetSize(Width, Height) - Устанавливает размер изображения.&lt;br /&gt;
&lt;br /&gt;
AsString([ImageFormat]) - Возвращает изображение в виде строки с двоичными данными. ImageFormat принимает значения 1 - Bitmap (по-умолчанию), 2 - jpeg, 3 - png, 4 - gif.&lt;br /&gt;
&lt;br /&gt;
Width – Возвращает ширину изображения.&lt;br /&gt;
&lt;br /&gt;
Height – Возвращает высоту изображения.&lt;br /&gt;
&lt;br /&gt;
Rotate(Angle) – Поворачивает изображение по часовой стрелке на угол Angle. Угол указывается в градусах и может принимать любые значения.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с изображением, используется в качестве параметра для функций, работающих с изображениями из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Canvas - ссылка на объект TCanvas холста изображения.&lt;br /&gt;
&lt;br /&gt;
== Объект TTable ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с таблицами. Удобен для печати таблицы на принтере. Алгоритм таков: Загружаем датасет в таблицу, настраиваем ее (шрифты, штрих-коды и т.д.), потом выводим на принтер функцией TPrinter.PrintTable.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Заголовок – это первая строка таблицы.&lt;br /&gt;
&lt;br /&gt;
Cell(С, R) – Возвращает значение ячейки таблицы с координатами (C, R). Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetCell(С, R, Value) – Устанавливает значение ячейки таблицы с координатами (C, R) в Value. Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
RowCount – Возвращает количество строк в таблице.&lt;br /&gt;
&lt;br /&gt;
ColCount – Возвращает количество столбцов в таблице.&lt;br /&gt;
&lt;br /&gt;
SetTitleFont(Font) – Задает шрифт заголовка таблицы (первой строки).&lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Задает шрифт всей таблицы кроме заголовка.&lt;br /&gt;
&lt;br /&gt;
SetColFont(C, Font) - Устанавливает шрифт столбца C.&lt;br /&gt;
&lt;br /&gt;
SetIndent(Indent) – Задает отступ от границы ячейки до текста в процентах от ширины страницы. По-умолчанию значение 0.3&lt;br /&gt;
&lt;br /&gt;
SetWidth(С, Width) – Задает значение ширины столбца C в процентах от ширины страницы.&lt;br /&gt;
&lt;br /&gt;
SetMinRowHeght (Heght) – Задает значение минимальной высоты строки в пикселях. &lt;br /&gt;
&lt;br /&gt;
SetBarCode(Col, Type) - Указывает, что данные из столбца Col должны печататься в виде штрих-кода. Тип штрих-кода - Type. Значение '''&amp;quot;1&amp;quot; - EAN13'''. Для кода EAN13 первая строка данных в ячейке должна иметь вид &amp;quot;тип штрих-кода, номер&amp;quot;, например &amp;quot;7, 123&amp;quot; (без кавычек, конечно). В этом случае система сформирует штрих-код: &amp;quot;2700000001233&amp;quot;. Первая цифра - всегда 2, далее - указанный тип штрих-кода, нули, чтобы получилось 13 символов, номер, указанный в таблице, и один символ - контрольная сумма. Значение '''&amp;quot;2&amp;quot; - CODE128''' (с версии 734). Данные из первой строки ячейки таблицы печатаются в штрих-коде &amp;quot;как есть&amp;quot;. Для всех видов штрих-кода (с версии 734) последующие строки печатаются под штрих-кодом в виде текста.&lt;br /&gt;
&lt;br /&gt;
SetMultiHeader(Active) - Включает печать заголовка при переносе таблицы на несколько страниц. По умолчанию отключено.&lt;br /&gt;
&lt;br /&gt;
SetCustomHeader(script) - Включает печать пользовательского заголовка. Script - это код интерпретатора, который должен печатать заголовок на канву. Печать таблицы может происходить на нескольких листах, по этому скрипт будет вызван для каждого листа. При использовании этого метода, автоматически инициализируются переменные: $TablePageNo - номер страницы, нумерация начинается с нуля; $TableY - координата по оси Y, от которой рисуется заголовок. Чтобы таблица была под заголовком необходимо значение переменной $TableY увеличить на высоту заголовка.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с таблицей, используется в качестве параметра для функций, работающих с таблицами из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 &amp;lt;?&amp;gt;&lt;br /&gt;
 NEW('TPrinter', 'Prn');&lt;br /&gt;
 If(prn.ShowDialog,&lt;br /&gt;
  NEW('TTable', 'Tbl'); &lt;br /&gt;
  NEW('TSelfADO', 'MyDB'); &lt;br /&gt;
  MyDB.Open('SELECT concat(&amp;quot;7&amp;quot;, &amp;quot;, &amp;quot;,  a.code, &amp;quot;\r\n&amp;quot;, a.client_id, &amp;quot;\r\n&amp;quot;, a.zakaz, &amp;quot;-&amp;quot;, a.number) as &amp;quot;Штрих-код&amp;quot;, a.target AS &amp;quot;Заказик&amp;quot;, address, phone, vlog, poruch FROM address a order by code desc limit 10');&lt;br /&gt;
  Tbl.LoadFromDB(MyDB.Self); &lt;br /&gt;
  Tbl.SetBarcode(1, 1);&lt;br /&gt;
  Tbl.SetCustomHeader(     &lt;br /&gt;
    if($TablePageNo&amp;gt;0,&lt;br /&gt;
      Prn.Canvas.TextOut(Prn.Canvas.DPIX*0.1, $TableY, 'Продолжение таблицы');&lt;br /&gt;
      set($TableY, $TableY + Prn.Canvas.TextHeight('H'));&lt;br /&gt;
    ,0)&lt;br /&gt;
  );&lt;br /&gt;
  Prn.BeginDoc; &lt;br /&gt;
  Prn.PrintTable(0, Tbl.Self);   &lt;br /&gt;
  Prn.EndDoc&lt;br /&gt;
 , );&lt;br /&gt;
&lt;br /&gt;
== Объект TBaseUtils ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции, базирующиеся на БД системы «MEASOFT». По-умолчанию, при создании подключается к основной базе данных модуля, в котором выполняется скрипт, если такая определена контекстом, однако это можно изменить, см SetConnection.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
'''MakeAddress(s[,town])''' – возвращает значение, полученное путем преобразований адреса s для приведения его к внутреннему формату программы. В процессе преобразования до нескольких раз происходит замена буквосочетаний по таблице замены (ее редактирование доступно по нажатию кнопки «Автозамена» в интерфейсе импорта БД из Excel системы (см. Руководство пользователя)), поиск улиц по базе КЛАДР с точностью до одного знака, и некоторые другие операции, нацеленные на исправление ошибок в написании адреса.&lt;br /&gt;
&lt;br /&gt;
С версии программы 2008.0.0.615, при вызове функции в формулах загрузки реестра, в первую очередь происходит проверка строки s на условия:&lt;br /&gt;
* в строке s записано  число; &lt;br /&gt;
* строка s начинается с &amp;quot;ПВЗ &amp;quot;. &lt;br /&gt;
Если одно из этих условий выполняется, то функция пытается установить пункт самовывоза - т.е она сама в загружаемой карточке корреспонденции укажет: адрес ПВЗ, город ПВЗ и установит галку самовывоз. &amp;lt;br/&amp;gt;Правила поиска ПВЗ:&lt;br /&gt;
* Если s число -  считаем его внутренним кодом филиала;&lt;br /&gt;
* Если s начинается с &amp;quot;ПВЗ &amp;quot; - Например в адресе передана строка &amp;quot;ПВЗ На Ленинском проспекте&amp;quot;, то искать будем филиал с названием &amp;quot;На Ленинском проспекте&amp;quot; который подчиненный, активный, с галкой ПВЗ и в городе town. Если город не указан, то ищем филиал во всех городах, и считаем его найденным если найдем только один филиал. &lt;br /&gt;
* Если филиалы найти не удалось, функция makeaddress работает как обычно и выполняет преобразование адреса.&lt;br /&gt;
&lt;br /&gt;
Если адрес не содержит русских букв, только латиница, и курьерская служба находится в одной из стран Россия, Белоруссия, Казахстан или Украина, и город-получатель (второй параметр, town) находится так же в одной из этих стран, функция автоматически делает транслитерацию адреса на русский язык.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''SetConnection(DB) – Подключает объект к базе данных DB, где DB – ссылка на объект TADO.Self.'' '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
''SetTown(Town) – Устанавливает код текущего города (используется в некоторых функциях объекта) в значение Town. По-умолчанию текущий город – 1.''  '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
'''SetIndexLength(Length)''' – Устанавливает длину почтового индекса. По-умолчанию – 6.&lt;br /&gt;
&lt;br /&gt;
'''GetIndex(Address)''' – Возвращает почтовый индекс из адреса.&lt;br /&gt;
&lt;br /&gt;
'''GetStreet(Address)''' - Возвращает улицу до первой запятой.&lt;br /&gt;
&lt;br /&gt;
'''GetHome(Address)''' - Возвращает номер дома до второй запятой, но не более пяти символов.&lt;br /&gt;
&lt;br /&gt;
'''GetKurierByStation(station, Mass, Cash, Date_Putn)'''&lt;br /&gt;
&lt;br /&gt;
'''TownByIndex(Index[, PriorityName][, PriorityCountry])''' – Возвращает код города по индексу. В случае ошибки поиска – код текущего города. Если нашлось несколько населенных пунктов, и указано приоритетное название - выбирается населенный пункт, название которого начинается с PriorityName (если есть).&lt;br /&gt;
&lt;br /&gt;
'''TownByName(Name[,NotNeedCL=False, City=0])''' – Возвращает код города по имени. В случае ошибки поиска – возвратит код текущего города. Если параметр NotNeedCL (параметр не обязательный) установить в TRUE, тогда функция возвратит 0, если город не удалось найти. Параметр City (код региона) позволяет ограничить поиск одной областью (не обязательный, по умолчанию не используется).&lt;br /&gt;
&lt;br /&gt;
'''FillClientInfo(Excel, client, Sheet, Row, Col)''' – Выводит в эксель информацию о клиенте с кодом client на лист sheet начиная со строки row и столбца col.&lt;br /&gt;
&lt;br /&gt;
'''SavePrintFormToFile(FormType, FormNumber)''' - Сохраняет на диске файл печатной формы и возвращает путь к нему&lt;br /&gt;
&lt;br /&gt;
'''CreateTrans(Address[, Store][, Operator][,Correction])''' - Формирует запись для печати кассового чека для корреспонденции с кодом Address, для выбора кассового аппарата используется код склада Store. Если Store не указано - при исполнении в среде клиентского модуля системы использует склад, указанный пользователем в окне [[Настройка параметров рабочего места|&amp;quot;Настройка&amp;quot; - &amp;quot;Параметры&amp;quot;]], в остальных модулях - код текущего склада из [[Настройка глобальных параметров|переменной]] &amp;quot;CL&amp;quot; (&amp;quot;Текущий филиал&amp;quot;). Поле Operator позволяет указать кассира (передается код справочника сотрудников). Если не указан, в основной системе будет использован код авторизованного пользователя, в других модулях - 1.&lt;br /&gt;
Поле Correction позволяет указать данные для корректировочного чека, используется в системе Штрих-М. По умолчанию пустая строка. Возвращает идентификаторы записей чеков. Может вернуть пустую строку, если чек создавать не понадобилось, один или несколько кодов через запятую, если создано несколько чеков. В случае ошибки вызывает ошибку, поэтому рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CreateReturnTrans(Address)''' - формирует запись для печати чека возврата для корреспонденции с кодом Address. Чек возврата печатается на полную сумму и с теми же атрибутами, что и чек продажи. Возвращает идентификатор записи чека возврата. В случае ошибки вызывает ошибку, поэтому, как и с CreateTrans,  рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownDeliveryDays(Source, Mode, TownTo, TownFrom)''' - возвращает количество дней необходимых на доставку отправления, только для межгорода. Source - код клиента, Mode - режим срочности, TownFrom - код города отправителя, TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcDeliveryDate(Source, Mode, TownTo, TownFrom, Date_Beg, Time_beg)''' - Возвращает планируемую дату доставки с учетом сроков доставки. Работает при городской и междугородней доставке. Для межгорода сроки доставки берутся из зон. Для городской доставки, из дополнительных параметров статуса (17 статус, 1 параметр в доп. информации)  Если рассчитать дату планируемой доставки не удалось, возвращает пустую строку. Параметры: Source - код клиента, Mode - режим срочности, TownTo - город получатель, TownFrom - город отправитель, date_beg - дата заказа (может быть передана строкой в формате DD.MM.YYYY или в числовом), time_beg - время заказа. &lt;br /&gt;
&lt;br /&gt;
'''GenSpecialSMA(DirectExcel, Code)''' - функция для генерации отчета о доставке по акту передачи денег. Первый параметр - указатель на TDirectExcel, второй параметр - код акта передачи денег. АПД выводится на текущий лист объекта TDirectExcel.&lt;br /&gt;
&lt;br /&gt;
'''CreateSpecialSMA(ClientCode, DateTo)''' - Функция создает исходящий акт передачи денег (АПД). Требует ClientCode - код клиента, DateTo - дату акта. Функция возвращает коды созданных актов. Если возвращаемых параметров два, значит функция пыталась создать два АПД: первым, идет код АПД с наличной оплатой, а вторым с безналичной. Примеры возвращаемого результата: '0'- акт не был создан, отсутствуют корреспонденции; '124' - код созданного акта; '0,0' - пытались создать два акта, но отсутствуют данные; '4556,0' - создан только наличный АПД; '0,445' - создан только безнал.; '4556,445' - созданы нал. и безнал.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressForActDelivery(ActCode, [DeliveryDateMode=0, Delivery=True])''' - Функция создает корреспонденцию на доставку акта. ActCode - код акта; DeliveryDateMode: 0 - установить план. дату доставки текущим рабочим днем, 1 - установить план. дату доставки следующим рабочим днем, 2 - установить план. дату доставки равной планируемой дате оплаты АПД; Delivery - создать корр. на доставку АПД или создать корреспонденцию на забор АПД (по умолчанию, доставка АПД). Работа функции может быть изменена системной доп. возможностью OnCreateAddressForActDelivery.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressTransferAct(ClientCode, Store, DateTo, [AdditionalParam])''' - Функция создает исходящий акт передачи корреспонденции (АПК). Требует  ClientCode - код клиента, Store - код филиала, для которого будет создан акт, DateTo - дату, до которой в акт попадут возвраты, AdditionalParam - дополнительный строковый параметр для передачи в системную доп. возможность ExceptionsForAPK, позволяющий отобрать в акт, например, только полные возвраты.   Возвращает код созданного акта. ВНИМАНИЕ: при создании АПК используется системная функция ExceptionsForAPK. Если в ней используются интерактивные функции (вывод сообщений, диалоговые окна, выполнение скриптов), то акт сформирован не будет, а функция CREATEADDRESSTRANSFERACT вернет ошибку.     &lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByAddress(Address, TownCode, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попал адрес. Если полигон найти не удалось, функция возвратит пустую строку. Address - адрес корреспонденции текстом; TownCode - код города; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByAddress(addressrecord.address, if((addressrecord.number=0)*(addressrecord.strbarcode=&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;), addressrecord.townfrom, addressrecord.townto), '`schema`=1') - пытаемся найти вхождение адреса в полигоны 1 схемы, при выборе города учитывается корр. на забор, у нее нужно использовать город-отправитель (а для обычной корр. нужен город-получатель).&lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByLatLon(Lat, Lon, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попали GPS координаты. Если полигон найти не удалось, функция возвратит пустую строку. Lat - широта  текстом; Lon - долгота текстом; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByLatLon('55.769064','37.590713','zone is not null and price=0') - пытаемся найти вхождение координат в полигоны, где задана зона, для всех клиентских и курьерских зон.&lt;br /&gt;
&lt;br /&gt;
'''GetLatLonByAddress(AddressText, TownCode)''' - возвращает географические координаты вида lat,lon указанного в AddressText адреса. Поиск производится в городе, имеющем код TownCode в таблице Town.&lt;br /&gt;
&lt;br /&gt;
'''GetRouteCode(AddressText, TownCode, LatLon[, Lon])''' - для адреса AddressText в городе с кодом TownCode (из таблицы Town) по географическим координатам lat, lon возвращает код роута (записи, хранящей координаты адреса в городе). Если роут не найден (для адреса в городе не найдено записи с указанными координатами) - создает новый роут и возвращает его код, если роут найден (был создан ранее) - обновляет у роута координаты. Если параметр Lon задан, то параметр LatLon должен содержать одну координату, иначе LatLon должен содержать строку вида 'lat, lon'.&lt;br /&gt;
В случае ошибки возвращает Null.&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode(address, townto, '55.114034, 36.592397'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Троицк, Полковника милиции Курочкина ул., 11', 1, '37.467446, 55.740537'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Обнинск, Маркса пр., 20', TownByName('Обнинск'), 55.114034, 36.592397));&lt;br /&gt;
&lt;br /&gt;
'''CalcAgentPrice(AddressCode, AgentCode, TownFrom, TownTo, Mode, [, Count=1])''' - функция возвращает стоимость доставки рассчитанную по тарифу агента. AddressCode - код адреса, AgenCode - код филиала (агента), TownFrom - код города отправителя, TownTo - код города получателя, Mode - режим срочности, count - тарифная сетку от указанного количества отправлений (по умолчанию 1)&lt;br /&gt;
&lt;br /&gt;
'''SetAddrKol_vo(address, getkol_vo)''' - функция делает прием корреспонденции в текущем ответственном филиале. address - внутренний код адреса, getkol_vo - количество принимаемых мест, может принимать значения: &amp;quot;kol_vo&amp;quot; - принять все места, &amp;quot;getKol_vo+1&amp;quot; - принять еще одно место, &amp;quot;число&amp;quot; - сделать количество принятых мест равным указанному числу.&lt;br /&gt;
&lt;br /&gt;
'''CalcClientCnt(client_code, date, is_intown [, date_put=CurrDate(), skipajust=false])''' - функция расчета количество доставленных корреспонденций у клиента с кодом client_code за предыдущий месяц от даты date (Или за текущий месяц, подробнее смотри переменную UseCurrentMonthCount) среди внутригородских (is_intown = true) либо междугородних (is_intown = false) корреспонденций, date_put - дата доставки (для альтернативного способа подсчета, включаемого переменной UseDatePutForCalcCnt), skipajust - не учитывать принудительно введенные количества (таблица priceclientadjust типы записей 0 и 1).&lt;br /&gt;
&lt;br /&gt;
'''GetBasePrice''' - возвращает базовую стоимость доставки посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов,зоны,типа,срочности,массы, расстояния. В системах с выключенными доп. услугами также считает проценты от суммы и страховки. &lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset._self&amp;quot;.&lt;br /&gt;
  Описание некоторых полей датасета:&lt;br /&gt;
    pmoney - процент от суммы;&lt;br /&gt;
    pmoneycard - процент от суммы при оплате картой;&lt;br /&gt;
    pricecode - код прайса (таблица Price) ;&lt;br /&gt;
    distarea - район метро получателя (актуально при отключённом едином районировании, как правило район от 200 до 299 является признаком области);&lt;br /&gt;
    region - признак области при включенном едином районировании;&lt;br /&gt;
    distareaFrom и regionFrom  - аналог distarea, region только для отправителя;&lt;br /&gt;
    pcncode - код записи таблицы pricecnt &amp;quot;количество от&amp;quot;;&lt;br /&gt;
    Запрос содержит поля таблицы pricelinesnew - начальная стоимость по тарифной сетки, найденные без учета массы,только по типу срочности и режиму.&lt;br /&gt;
    Запрос содержит поля таблицы price.&lt;br /&gt;
&lt;br /&gt;
*addressrecord - ссылка на объектную модель карточки корреспонденции, следует использовать уже созданную addressrecord._self&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*type - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*wait - количество минут ожидания (не учитывается при доп. услугах, есть системная услуга &amp;quot;ожидание&amp;quot;);&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*rur - сумма передаваемых денег (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от суммы&amp;quot;);&lt;br /&gt;
*inshprice - сумма страховки (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от объявленной стоимости&amp;quot;);&lt;br /&gt;
*distance - расстояние до места доставки, обычно поле заполняется при доставке в область (регион в едино районировании). Дополнительная наценка к стоимости доставки;&lt;br /&gt;
*forward - направление доставки: true - туда; false - обратно;&lt;br /&gt;
*Collection - признак заборной корреспонденции: true - забор, false - доставка (В тарифе есть возможность указать стоимость для забора);&lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
В тарифе есть возможность указать формулу, которая может влиять на базовый расчет. Формула может объявить служебные переменные, которые:&lt;br /&gt;
*$FormulaReplace - если true – возвращаемое значение полностью заменяет базовый расчет;&lt;br /&gt;
*$FormulaKoeff - коэффициент на который будет помножена базовая стоимость.&lt;br /&gt;
Также внутри формулы объявлены следующие объекты dataset, addressrecord и переменные:&lt;br /&gt;
*$ForceIntown - Переменная становится истиной, если междугородний расчет был отменен, т.к. адрес попал в нарисованную зону на карте.&lt;br /&gt;
*а также: $forward, $distance, $Count, $Collection, $Wait, $FormulaKoeff, $PriceCode - описание есть выше.&lt;br /&gt;
&lt;br /&gt;
Для направления &amp;quot;туда&amp;quot;, Функция GetBasePrice вызывается  через доп. услугу &amp;quot;База&amp;quot; (при включенных доп. услугах), для направления &amp;quot;Обратно&amp;quot; всегда вызывается напрямую (т.к. доп. услуги работают только в для направления &amp;quot;туда&amp;quot;).&lt;br /&gt;
На расчет этой функции влияют следующие переменные: &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Расчет стоимости по адресу&amp;quot;, &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Зона клиента по умолчанию&amp;quot;,  &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Подсчет кол-ва отправлений за месяц&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownPrice''' - возвращает базовую стоимость междугородней доставки, посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов, типа, срочности, массы, расстояния.&lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset.self&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*tp - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcAddressPrice(AddressCode, [,ZakazCount])''' - полностью пересчитывает стоимость доставки корреспонденции по тарифу клиента. AddressCode - внутренний код адреса, ZakazCount - не обязательный параметр, кол-во заказов от клиента.&lt;br /&gt;
&lt;br /&gt;
'''GetStationCode(s [,town])''' – возвращает код станции метро, ассоциированный в системе с адресом s. В случае невозможности идентифицировать станцию метро – возвращает 0. &lt;br /&gt;
Когда включено районирование по карте, необходим второй параметр &amp;quot;town&amp;quot; - код города в котором нужно искать адрес.  Возвращает код района если удалось его найти; код станции меж-города - если адрес удалось геокодировать, но район не нашли; код 0 - когда не удалось геокодировать адрес.&lt;br /&gt;
&lt;br /&gt;
'''RecalcSpecialSMA(ActCode)''' - пересчитать акт передачи денег (АПД). Также, у корреспонденций входящих в АПД будет пересчитана стоимость доставки. Для Входящего АПД сумма акта не пересчитывается. Параметр ActCode - внутренний код акта, коды можно перечислять через запятую.&lt;br /&gt;
&lt;br /&gt;
'''UserCode''' - Возвращает код текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserName''' - Возвращает имя текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserPass''' - Возвращает пароль текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''UserBaseCode''' – Возвращает код текущего пользователя из таблицы «Сотрудники» (kurier).&lt;br /&gt;
&lt;br /&gt;
'''UserEmail''' - Возвращает e-mail текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''CurrentTown''' – Возвращает код текущего города (из таблицы town).&lt;br /&gt;
&lt;br /&gt;
'''CurrentCity''' – Возвращает код текущего региона (из таблицы city).&lt;br /&gt;
&lt;br /&gt;
'''CurrentLocation''' – Возвращает код текущего филиала (из таблицы store).&lt;br /&gt;
&lt;br /&gt;
'''FromEmailStr''' - строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
'''FillExcelDoc'''(Excel, Dataset, FormType, FormNumber,Print,[printer]) - Выполняет указанную печатную форму в объекте excel. Excel объект можно не указывать, тогда функция сама создаст объект экселя и разрушит его, полезно когда книгу &lt;br /&gt;
нужно распечатать или отправить по email (на листе данных в ячейке 1,1 укажите ключевое слово email). Dataset объект с данными для скрипта в печатной форме, может быть null. Dataset передавать можно так db.self, тогда переданный dataset внутри печатной формы будет доступен по имени dataset. Print - печатает книгу на принтере, после печати объект excel разрушается, при использовании параметра не указываете объект excel. Printer - имя принтера, на котором печатать (по умолчанию пустая строка, что означает &amp;quot;печатать на принтере по умолчанию&amp;quot;). Например:&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'excel');&lt;br /&gt;
 FillExcelDoc(excel.self, null, 12, 1);&lt;br /&gt;
 excel.DoNotDestroy(true);&lt;br /&gt;
 excel.SetVisible(true);&lt;br /&gt;
 ''Покажет эксель с выполненной печатной формой''&lt;br /&gt;
&lt;br /&gt;
'''ValutaSign''' – Возвращает название валюты для суммы.&lt;br /&gt;
&lt;br /&gt;
'''SendToMeasoft(xml)''' - Отправляет запрос в клиентское API Measoft. Автоматически добавляет начальный &amp;quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''InsertFirmAtt(excel, sheet, firmcode)''' - Вставляем на лист эксель по коду фирмы: печать, подпись, подпись бухгалтера, логотип. Тэги &amp;lt;STAMP&amp;gt;, &amp;lt;DIR&amp;gt;, &amp;lt;BUH&amp;gt;, &amp;lt;LOGO&amp;gt; соответственно. После тега можно указать размеры изображения в символах Microsoft Excel. Формат записи: &amp;lt;STAMP&amp;gt; 16, 16&lt;br /&gt;
&lt;br /&gt;
'''PreCalcSalary(kurier, addressCodes)''' - Рассчитывает предварительную зарплату. Kurier - код курьера, используется для определения тарифа. addressCodes - коды адресов, через запятую для которых необходимо посчитать зарплату. Результаты расчета будут записаны в таблицу kurierpaydetail, так как расчет предварительный то записи не будут прикреплены к конкретному начислению. &lt;br /&gt;
&lt;br /&gt;
  select a.code, kpd.price as &amp;quot;туда&amp;quot;, kpd2.price as &amp;quot;обратно&amp;quot; from address a &lt;br /&gt;
  left join kurierpaydetail kpd on kpd.sourcetable=3 and kpd.sourcecode=a.code and kpd.rectype = 1 &lt;br /&gt;
  left join kurierpaydetail kpd2 on kpd2.sourcetable=3 and kpd2.sourcecode=a.code and kpd2.rectype = 2&lt;br /&gt;
  where a.code in (...)&lt;br /&gt;
&lt;br /&gt;
'''CalcSalary(DateTo, [Filter=0, KurierCode = 0, ManagerCode = 0])''' - Полный расчет зарплаты курьерам. DateTo  - дата до которой создается начисление. Условия отбора курьеров для начисления. Filter - роль сотрудника: 0 - Все, 1 - курьеры, 2 - менеджеры; KurierCode - код курьера, ограничить расчет зарплаты одним курьером;ManagerCode - код курьера, ограничить расчет зарплаты курьерами указанного менеджера. Внимание фильтры Filter, KurierCode и ManagerCode накладываются друг на друга. Результатом функции является SubSQL с информацией по созданным начислениям. &lt;br /&gt;
  поля ответа: код курьера, код менеджера, начислено, бонусы, штрафы, аванс, итого;&lt;br /&gt;
  select kurier, manager, profit, bonus, shtraf, prepay, total  [union select ...]&lt;br /&gt;
&lt;br /&gt;
'''SelDistAddr(s)''' – Возвращает строку для вставки в select запрос, для вывода поля с упрощенным адресом. Принимает один необязательный строковый параметр - алиас таблицы из которой будет упрощаться поле address, по умолчанию &amp;quot;a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''VoiceReadStr(str)''' – Озвучивает фразу str голосовым уведомлением доступными словами из базы. Может содержать тег &amp;quot;{break_off}&amp;quot; для того, чтобы сделать эту фразу не пропускаемой в очереди воспроизведения.&lt;br /&gt;
&lt;br /&gt;
'''CalcStorageCost(ClientCodes, DateFrom, DateTo, NeedReport[, Store])''' – рассчитывает стоимость хранения на складе для выбранных клиентов (ClientCodes - коды клиентов через запятую), в период дат с DateFrom до DateTo, с прикреплением к корреспонденции отчета в зависимости от выставленного параметра NeedReport. Может содержать параметр Store - код филиала, по умолчанию пустой (расчет выполняется для всех филиалов). Возвращает коды созданных корреспонденций через запятую.&lt;br /&gt;
&lt;br /&gt;
'''WriteOut(DocId, ItemId, Date, Cnt[, BC])''' – производит списание товара со склада. DocId - код (docs.code) документа списания, ItemId - код товара (item.code), Date - дата операции, Cnt - количество списываемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер. Если указан BC, то параметр ItemId игнорируется и поиск номенклатуры происходит исключительно по штрих-коду. В случае успеха, функция возвращает строку вида: код номенклатуры, списанное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''IncomePurch(DocId, ItemId, Date, Cnt[, BC, Location = CurrentLocation])''' – производит приход товара на склад. DocId - код (docs.code) приходной накладной, ItemId - код товара (item.code), Date - дата операции, Cnt - количество приходуемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер, Location - код склада (store.code).  В случае успеха, функция возвращает строку вида: код номенклатуры, введенное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''CreateLedgerDoc(Date, Client, UserCode, Type[, ExtNumber, Message])''' - создает складской документ и возвращает код этого документа. Date - дата документа. Client - код клиента. UserCode - код пользователя, создавшего документ. Type - тип документа (statetype = 13). ExtNumber - номер у поставщика для документов прихода и расхода. Message - комментарий к документу. Последние два аргумента не обязательные и могут быть пустыми.&lt;br /&gt;
&lt;br /&gt;
== Объект TINIFile ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции работы с ini-файлами. В некоторых контекстах создается автоматически для предоставления доступа к настроечному файлу модуля, выполняющего скрипт.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
IniParam(s[,section='common']) – Существует только если имя экземпляра объекта пустое. Возвращает значение параметра s ini-файла секции «common», изменить секцию можно не обязательным параметром section. В случае отсутствия параметра в файле возвращает пустую строку. &lt;br /&gt;
&lt;br /&gt;
Param(s) – Синоним IniParam с тем отличием, что существует только если имя объекта непустое.&lt;br /&gt;
&lt;br /&gt;
SetText(s) - Загружает ini файл из строки s. Если в файле нет секции «common», то принудительно объявляет ее в начале.&lt;br /&gt;
&lt;br /&gt;
== Объект TSMS ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для отправки SMS, а также проверки статуса их доставки.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetProxy(Server, Port, User, Pass) - Устанавливает настройки прокси-сервера.&lt;br /&gt;
&lt;br /&gt;
Connect(Provider, Host, User, Pass, SenderName, SMSPrefix) – Подключает объект к провайдеру provider, используя адрес Host, имя пользователя User и пароль Pass. Значение SMSPrefix предназначено для того, чтобы провайдер мог различить сообщения от разных филиалов, если этими филиалами используется одно подключение. Если необходимости разделять сообщения нет - значение SMSPrefix можно не указывать.&lt;br /&gt;
Для провайдера доступны значения 'mirsms', 'sms16', 'websms', 'epochta', 'zanzara', 'SMSManager', 'f1sms', 'BitCall', 'mirsmsGET', 'AMD' и другие, либо можно указать числовые значения номера протокола, от 1 до &amp;lt;rspoiler text=&amp;quot;20&amp;quot;&amp;gt;Набор провайдеров все время дополняется, количество и номера можно смотреть в Справочники - Переменные - Подключения - SMS&amp;lt;/rspoiler&amp;gt; соответственно. Эти значения соответствуют значениям переменной SMSProtocol таблицы &amp;quot;Value&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SendSMS(Phone, Text, [ID]) – Отправляет SMS с текстом Text на телефон Phone. Для некоторых провайдеров необходим уникальный идентификатор сообщения ID (для провайдера iVoice - идентификатор сценария (кампании)). Возвращает ID провайдера для последующей проверки статуса доставки.&lt;br /&gt;
&lt;br /&gt;
CheckSMS(ProviderID) – Проверяет состояние доставки сообщения с идентификатором ProviderID. Возвращает: 0 – доставляется, 1 – успешно доставлено, 2 – не доставлено.&lt;br /&gt;
&lt;br /&gt;
ReceiveSMS(InboxID, DateFrom, DateTo, NewOnly) - Получает входящие SMS, с ящика InboxID (идентификатор выдаётся провайдером). DateFrom, DateTo - задается временной интервал в котором были приняты сообщения(формат 08.04.2013 18:00:00 'DD.MM.YYYY HH:NN:SS'). Чтобы получать только новые сообщение поле NewOnly должно быть True. Возвращает XML с сообщениями.&lt;br /&gt;
&lt;br /&gt;
ExtraResult([ParamName='']) - Вызывается после CheckSMS, возвращает дополнительную информацию по последнему статусу смс. В настоящее время работает только для провайдеров BitCall и iVoice. Для BitCall по умолчанию возвращает кнопки, нажатые абонентом во время работы с голосовым меню. Если в paramname указать 'IdentifyText' то будет возвращен JSON  с ответами абонента на заданные вопросы(используется в случае звонков с индивидуальным сценарием). Для iVoice по умолчанию подразумевается параметр 'response', при этом будет возвращен JSON  с ответами абонента на заданные вопросы (в зависимости от сценария)&lt;br /&gt;
&lt;br /&gt;
Log - Возвращает последний HTTP запрос и ответ от сервера смс.&lt;br /&gt;
&lt;br /&gt;
== Объект TXML ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга XML-данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст XML документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию. Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля.&lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
AttribCount – Возвращает количество атрибутов текущего элемента.&lt;br /&gt;
&lt;br /&gt;
AttribName(i) – Возвращает имя атрибута с номером i.&lt;br /&gt;
&lt;br /&gt;
Attrib(V) – Ищет атрибут и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
== Объект TJSON ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга JSON-данных. &lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст JSON документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля. &lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Можно проверять наличие элементов, если элемента нет, вернется пустая строка.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
isArray - Возвращает true, если текущий элемент является массивом (доступ к дочерним элементам возможен только по индексу, нумерация элементов начинается с нуля)&lt;br /&gt;
&lt;br /&gt;
==Объект TZip==&lt;br /&gt;
Предназначен для работы с Zip архивом. &lt;br /&gt;
&lt;br /&gt;
SetZip(s) - Загружает архив в объект из строки s;&lt;br /&gt;
&lt;br /&gt;
GetZip - Возвращает архив в виде строки;&lt;br /&gt;
&lt;br /&gt;
AddFromFile(SrcPath, ZipPath) - Добавляет файл SrcPath в архив и располагает его по пути ZipPath. ZipPath содержит имя файла в архиве, при необходимости можно указать каталог; &lt;br /&gt;
&lt;br /&gt;
AddFromStr(Data, /*ZipPath*/) - '''параметр ZipPath временно не работает'''. Добавляет файл из строки Data в архив и располагает его по пути ZipPath.  -ZipPath содержит имя файла в архиве, при необходимости можно указать каталог;&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(path) - Загружает архив из файла path;&lt;br /&gt;
&lt;br /&gt;
SaveToFile(path) - Сохраняет архив в файл path;&lt;br /&gt;
&lt;br /&gt;
Count - Возвращает кол-во файлов в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByIndex(index) - Возвращает распакованный файл в виде строки. Index - номер файла в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByName(ZipPath) - Возвращает распакованный файл в виде строки. ZipPath - путь к файлу в архиве, может содержать каталоги;&lt;br /&gt;
&lt;br /&gt;
FileName(index) - По номеру файла, функция возвращает полный путь файла в архиве.&lt;br /&gt;
&lt;br /&gt;
==Объект TBase==&lt;br /&gt;
&lt;br /&gt;
'''Функции общего назначения''':&lt;br /&gt;
&lt;br /&gt;
'''ExecSimpleScript(Caption, Text)''' - Выполняет скрипт &amp;quot;Дополнительных возможностей&amp;quot;. Возвращаемые значения, введенные пользователем устанавливает в переменные $scriptvar1..$scriptvarN, Значения кодов списочных переменных - в переменных $scriptvar1codes..$scriptvarNcodes. Функция возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot; в диалоговом окне.&lt;br /&gt;
&lt;br /&gt;
'''FillAdvPriceReport(Excel, AddressCodes, StartLine, StartCol, [ShowSumPrice,InsertColumns,ShowAll])''' - добавляет отчёт по дополнительным услугам. В AddressCodes - указаны коды адресов через запятую, каждый код это отдельная строка отчета. Адреса будут показаны в порядке перечисления их в AddressCodes. Если в отчет нужно добавить пустую строку, то можно указать код адреса -1000. StartLine, StartCol - верхний левый угол выгружаемой таблицы. ShowSumPrice - добавить столбец итоговый столбец с суммой всех услуг, по умолчанию выключено. InsertColumns - раздвинуть таблицу перед вставкой отчета, позволяет встраивать отчет посередине выгрузки, по умолчанию выключено. ShowAll - показать все дополнительные услуги, по умолчанию false и показывает только услуги с начислениями. Функция возвращает количество использованных столбцов.&lt;br /&gt;
&lt;br /&gt;
'''PrintSticker(Codes, [ToBoxes=False])'''&lt;br /&gt;
&lt;br /&gt;
'''PrintBlanc(Codes, BlancNumber)''' - печатать форму из раздела &amp;quot;Заполнить бланк&amp;quot;. Codes - коды корреспонденций, BlancNumber - номер формы из раздела &amp;quot;Бланки для корреспонденции&amp;quot; (3)&lt;br /&gt;
&lt;br /&gt;
'''GetItemByName(Name)'''&lt;br /&gt;
&lt;br /&gt;
'''GetA4Printer''' - возвращает имя принтера выбранного для печати документов&lt;br /&gt;
&lt;br /&gt;
'''GetStickerPrinter''' - возвращает имя принтера выбранного для печати стикеров&lt;br /&gt;
&lt;br /&gt;
'''GetDuplexPrinter''' - возвращает имя принтера выбранного для двусторонней печати, если принтер не выбран, возвращает пустую строку&lt;br /&gt;
&lt;br /&gt;
'''PrintAttachPDFPage(Code, FileName, Page, Printer)''' - печатает страницу из вложенного файла PDF. Code - код вложения (attachment), Page - номер страницы, Printer - 0 = принтер A4, 1 = принтер этикеток. &lt;br /&gt;
&lt;br /&gt;
'''AttachPDFToText(Code, [TextFileName])''' - преобразует файл PDF из вложений в текст. Code - код вложения (attachment), TextFileName - имя текстового файла, в который записывается результат (если не указан, используется временный файл). Возвращает текст в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''GetActiveForm([SkipFormName])''' - возвращает код активной формы в программе где происходит сканирование. SkipFormName - не обязательны параметр, имя формы которую нужно пропустить при определении интерфейса.&lt;br /&gt;
 '''Список интерфейсов''': &lt;br /&gt;
 0 - неопределенный; &lt;br /&gt;
 1 - прием корреспонденции на склад; &lt;br /&gt;
 2 - АПД; &lt;br /&gt;
 3 - комплектация адресов (ShelfingForm); &lt;br /&gt;
 4 - доска приема; &lt;br /&gt;
 9 - вкладка «Манифесты»; &lt;br /&gt;
 10 - Инвентаризация корреспонденции; &lt;br /&gt;
 11 - АПК; &lt;br /&gt;
 12 - вкладка «Адреса»; &lt;br /&gt;
 13 - вкладка «Выдача»; &lt;br /&gt;
 14 - вкладка «Склад»; &lt;br /&gt;
 15 - Список номенклатуры; &lt;br /&gt;
 16 - Инвентаризация склада; &lt;br /&gt;
 17 - Приходная накладная; &lt;br /&gt;
 18 - Списание товара; &lt;br /&gt;
 19 - Карточка корреспонденции.&lt;br /&gt;
&lt;br /&gt;
'''AddAddressScanLog(Code[, StrBarCode, IsManual, FromInterface, ExtraInfo])''' - добавляет событие сканирование для корреспонденции с кодом Code. Необязательные параметры: StrBarCode - сканируемый ШК корреспонденции (по умолчанию пустой), IsManual - галка ручного сканирования (по умолчанию false), FromInterface - код интерфейса сканирования (StateType=81, по умолчанию 0 - неопределенный), ExtraInfo - текстовый комментарий события.&lt;br /&gt;
&lt;br /&gt;
'''RuleName(alias)''' - Выдает полный путь в дерева прав по псевдониму права.&lt;br /&gt;
&lt;br /&gt;
'''ShowText(Caption:string, Value:string)''' - показывает пользователю окно с заголовком Caption и с многострочным полем со значением Value. Может быть полезен при отображении логов выполненной операции. &lt;br /&gt;
&lt;br /&gt;
'''ShowScanError(msg [, Speek, Color, Abort])''' - выдает пользователю окно с текстом msg блокируя последующие действия сканирования. Если Speek - истинно, то сообщение проговаривается голосовым движком, по умолчанию выключено. Color - целочисленное число цвета, в который будет окрашен фон сообщения (по умолчанию = -1, стандартный). Abort  - прервать выполнение скрипта, не показывая ошибку.&lt;br /&gt;
&lt;br /&gt;
'''CheckRule(alias)''' - функция проверки разрешения у текущего пользователя системы, alias - псевдоним права. Возвращает 1, если право есть и 0, если права нет. &lt;br /&gt;
 Пример: if(CheckRule('RSE'), ShowMessage('У пользователя есть право изменять счета'), ShowMessage('У пользователя нет права изменять счета'));&lt;br /&gt;
&lt;br /&gt;
'''GetKurierMoney(KurierCode, DateEnd, NonCash)''' - возвращает баланс курьера с кодом KurierCode на дату DateEnd. NonCash - булевый флаг, если истинно, то будет рассчитан безнальный баланс; &lt;br /&gt;
&lt;br /&gt;
'''Функции, работающие только в импорте БД из эксель:'''&lt;br /&gt;
&lt;br /&gt;
ReplaceAddress&lt;br /&gt;
&lt;br /&gt;
GetItemByCode - Поиск товара по артикулу. Внимание: в пределах одного клиента может быть несколько товаров с одинаковыми артикулами. В этом случае функция найдет последний заведенный товар.&lt;br /&gt;
&lt;br /&gt;
GetPrice&lt;br /&gt;
&lt;br /&gt;
GetNewNumber - используется при импорте реестра, возвращает номер конверта в загружаемом заказе&lt;br /&gt;
&lt;br /&gt;
GetNewPos - используется при импорте реестра, возвращает порядковый номер вложения&lt;br /&gt;
&lt;br /&gt;
GetNewPackagePos- используется при импорте реестра, возвращает порядковый номер места&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zakaz - возвращает номер заказа куда происходит импорт реестра&lt;br /&gt;
&lt;br /&gt;
addresscode  -  используется при импорте реестра, код созданного адреса&lt;br /&gt;
&lt;br /&gt;
Source  - код заказчика&lt;br /&gt;
&lt;br /&gt;
ClientTown - Узнаем город клиента, через филиал с которым он работает. Сам клиент берется из заказа указанного в окне &amp;quot;Импорт БД из Excel&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Объект TFieldObject ==&lt;br /&gt;
Создается только автоматически. Объект для доступа к записям, используется в картах и дополнительных услугах (addressrecord) и событиях карточки корреспонденции (fieldlist). Методы объекта:&lt;br /&gt;
&lt;br /&gt;
'''_GetTableInfo''' - возвращает данные о полях и примеры данных объекта.&lt;br /&gt;
&lt;br /&gt;
'''_Self''' - возвращает ссылку на объект.&lt;br /&gt;
&lt;br /&gt;
'''_Set(fieldname, fieldvalue [, DoUpdateForm])''' - Если базовый объект строка. Устаналивает для поля fieldname значение fieldvalue. DoUpdateForm по уолчанию false, если указать true то обновление поля будет не только в объекте но и пользовательском интерфейсе. Обновление работает только в карточке корреспнденции для ограниченного набора полей: vlog, mode, type, date_put, time_put, message, kurier, state1.&lt;br /&gt;
&lt;br /&gt;
'''_Set(keyfield, keyvalue, filed, value)''' - Если базовый объект таблица (addressrecord.boxes). Работает перегруженная версия метода _set, cначала происходит поиск строки по ключу, далее меняется значение указанного столбца. keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца.  Пример, отключение услуги база:&lt;br /&gt;
&lt;br /&gt;
 addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
 priceconf - поле где записан код услуги;&lt;br /&gt;
 1 - услуга База;&lt;br /&gt;
 active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
== Объект TMessage ==&lt;br /&gt;
Создается только автоматически. Объект используется для скриптовой обработки письма в [https://wiki.courierexe.ru/index.php/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8#.D0.98.D0.BC.D0.BF.D0.BE.D1.80.D1.82_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85| заданиях импорта данных]. В себе содержит текст письма в очищенном формате и оригинальном формате HTML, отправитель письма, тему письма, дата получения и список прикрепленных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.Text''' - возвращает очищенный от HTML-тегов текст письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.HTMLText''' - возвращает оригинальный текст письма со всеми HTML-тегами.&lt;br /&gt;
&lt;br /&gt;
'''Message.Sender''' - возвращает email-адрес отправителя письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.AttachmentsCount''' - возвращает количество вложенных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.DateTime''' - возвращает дату и время получения письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.Subject''' - возвращает тему письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentDataString(Number)''' - возвращает вложенный файл под номером Number в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentName(Number)''' - возвращает имя вложенного файла под номером Number.&lt;br /&gt;
&lt;br /&gt;
== Объект TStringList ==&lt;br /&gt;
Может использоваться для построчной обработки многостраничных файлов либо для организации текстовых данных. Номер строк начинается с 0. &lt;br /&gt;
Имеет следующий функционал:&lt;br /&gt;
&lt;br /&gt;
'''Count''' - возвращает количество строк в списке.&lt;br /&gt;
&lt;br /&gt;
'''Add(Value:string)''' - добавляет значение Value в конец списка.&lt;br /&gt;
&lt;br /&gt;
'''SetText(Value:string)''' - устанавливает значение списка в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Insert(Number:integer, Value:string)''' - добавляет строку Value в позицию Number.&lt;br /&gt;
&lt;br /&gt;
'''Delete(Number:integer)''' - удаляет строку из списка в позиции Number.&lt;br /&gt;
&lt;br /&gt;
'''Clear''' - очищает элементы списка.&lt;br /&gt;
&lt;br /&gt;
'''LoadFromFile(Path:string)''' - загружает текстовый файл по пути Path.&lt;br /&gt;
&lt;br /&gt;
'''Strings(Number:integer)''' - возвращает строку с номером Number.&lt;br /&gt;
&lt;br /&gt;
'''SetString(Number:integer, Value:string)''' - устанавливает значение строки с номером Number в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Text''' - возвращает полный список строк в виде текста.&lt;br /&gt;
&lt;br /&gt;
'''CommaText([Quoted:boolean])''' - возвращает список значений через запятую. Если Quoted = true, то квотирует элементы списка. По умолчанию равен false.&lt;br /&gt;
&lt;br /&gt;
'''SetCommaText(Value: string)''' - разбивает значение Value на отдельные строки и кладет в список. Разделитель - запятые.&lt;br /&gt;
&lt;br /&gt;
'''IndexOf(Value:string)''' - ищет значение Value среди элементов списка и если находит, то возвращает номер строки. Возвращает -1 если значение не было найдено.&lt;br /&gt;
&lt;br /&gt;
'''Sorted(Value:boolean)''' - устанавливает флаг отсортированности списка в Value. Если Value = true, то сразу же его сортирует. По умолчанию Value = false.&lt;br /&gt;
&lt;br /&gt;
'''Exchange(Pos1:integer, Pos2:integer)''' - меняет элементы списка с позициями Pos1 и Pos2 местами.&lt;br /&gt;
&lt;br /&gt;
'''Duplicates(Value:integer)''' - изменяет параметр управления дубликатами в списке. Если Value = 0 (значение по умолчанию), то список не реагирует на дубликаты. Если Value = 1, то список при добавлении будет игнорировать дубликаты. Если Value = 2, то список будет выдавать исключение, при добавлении дубликата в список.&lt;br /&gt;
&lt;br /&gt;
'''ParamName(Number:integer[, Delimiter:string])''' - возвращает текст до первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает пустоту.&lt;br /&gt;
&lt;br /&gt;
'''ParamValue(Number:integer[, Delimiter:string])''' - возвращает текст после первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает всю строку.&lt;br /&gt;
&lt;br /&gt;
== Объект TFunc ==&lt;br /&gt;
Объект реализует создание и использование функций в скриптовом языке. Позволяет определять переиспользуемые блоки кода с параметрами.&lt;br /&gt;
Важно учитывать, что внтури функции создается свой инстанс интерпретатора и от туда не доступны никакие переменные\объекты кроме переданных в функцию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные методы:&lt;br /&gt;
&lt;br /&gt;
'''New'''(FuncName, Param1, Param2, ..., Body) — создание новой функции.Функция возвращает результат выполнения последней команды в теле функции. Аргументы:&lt;br /&gt;
* `FuncName` — имя функции (строка)&lt;br /&gt;
* `Param1, Param2, ...` — имена параметров функции (переменные начинаются с `$`, объекты — без префикса)&lt;br /&gt;
* `Body` — тело функции (скрипт, выполняемый при вызове)&lt;br /&gt;
&lt;br /&gt;
'''FuncName'''(Arg1, Arg2, ...) — вызов созданной функции по имени. Если в объявлении была указана тип переменная, то и подставлять в аргумент надо обязательно переменную. Будет передано значение этой переменной (переменные словарине поддерживаются!). Если был объявлен объект, то указатель на объект должен быть получен через метод '''_self'''. C функциями поддерживают работу следующие классы: TExcel, TDirectExcel, TCSVFile, TADO, TSelfADO, TPrinter, TCanvas, TPicture, TTable, TINIFile, TSMS, TXML, TJSON, TZip, TStringList, TBaseUtils, а также объект addressrecord (TFieldObject). Результатом работы функции может быть число или строка.&lt;br /&gt;
&lt;br /&gt;
Пример 1, обработка результатов функции:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'calc');&lt;br /&gt;
calc.new('Sum', '$a', '$b',&lt;br /&gt;
  $a + $b&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
set($x, 10);&lt;br /&gt;
set($y, 20);&lt;br /&gt;
showmessage(calc.Sum($x, $y));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример 2, передача объекта в функцию:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'utils');&lt;br /&gt;
utils.new('ProcessDB', 'dbConn', '$value',&lt;br /&gt;
  showmessage($value);&lt;br /&gt;
  dbConn.open('SELECT * FROM address limit 3 ');&lt;br /&gt;
  if(dbConn.recordcount &amp;gt; 0,&lt;br /&gt;
    showmessage('Найдено записей: ' + dbConn.recordcount);&lt;br /&gt;
    dbConn.first;&lt;br /&gt;
    while(dbConn.eof = 0,&lt;br /&gt;
      showmessage(dbConn.fieldbyname('code'));&lt;br /&gt;
      dbConn.next&lt;br /&gt;
    )&lt;br /&gt;
  ,0)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
utils.ProcessDB(db._self,'test!');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Применение языка формул ==&lt;br /&gt;
'''в различных контекстах системы «MEASOFT» и сопутствующих проектах'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MEASOFT ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительная информация на чеке ====&lt;br /&gt;
&lt;br /&gt;
В карточке клиента на закладке «Касса» имеется поле для ввода текста, который будет отображаться на кассовых чеках, печатаемых для корреспонденции от данного клиента. В поле может быть введен как просто текст, так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TSelfDB с открытым набором данных со строчкой корреспонденции, заказа и клиента, на которую печатается чек&lt;br /&gt;
&lt;br /&gt;
TBaseSupport&lt;br /&gt;
&lt;br /&gt;
TBaseValue&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Так же система записывает в переменную $CashRegisterID вычисленный код фискального регистратора, на котором предполагается печать чека.&lt;br /&gt;
&lt;br /&gt;
Результат работы скрипта печатается на создаваемом чеке, если скрипт не возвращает значение “-1” (число или текст) – в этом случае система чек не создает. Подразумевается, что либо скриптом было принято решение об отсутствии необходимости формирования чека, либо скрипт взял эту функцию на себя.&lt;br /&gt;
&lt;br /&gt;
==== Заполнение шаблонов печатных форм ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительные возможности ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Импорт БД из Excel ====&lt;br /&gt;
В окружении интерпретатора создается объект ZakazRecord, он является списком со значениями таблицы zakaz. Именно в этот заказ будут загружены данные. Из этого объекта также доступно :&amp;lt;br&amp;gt;&lt;br /&gt;
*ZakazRecord.userfields - пользовательские поля заказа;&lt;br /&gt;
*ZakazRecord.Clients - данные таблицы clients;&lt;br /&gt;
*ZakazRecord.Clients.userfields - пользовательские поля заказчика.&lt;br /&gt;
&lt;br /&gt;
==== Прайс лист клиента ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в валюте клиента для каждой поездки (туда или обратно) единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Помимо стандартных объектов, система создает объект AddressRecord, в котором, как свойства, доступны все поля текущей записи. Так же она выставляет значение переменной $Forward в 1 (истина), если необходимо произвести расчет для направления &amp;quot;Туда&amp;quot; и 0 (ложь) - если обратно. ВНИМАНИЕ! Как и во всех остальных местах, после формулы нельзя ставить &amp;quot;;&amp;quot;, иначе скрипт вернет 0!&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 if(int(AddressRecord.Time_Put_Max)&amp;gt;19, 100, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Прибавляет 100 рублей в случае, если максимальный срок доставки 20 часов или более''&lt;br /&gt;
&lt;br /&gt;
 if(pos(AddressRecord.Address, 'Аренда')&amp;gt;0, &lt;br /&gt;
           set($FormulaReplace, 1); &lt;br /&gt;
           1500&lt;br /&gt;
 , 0)&lt;br /&gt;
 &lt;br /&gt;
 ''В случае наличия подстроки &amp;quot;Аренда&amp;quot; в адресе заменяет штатное ценообразование на 1500 рублей''&lt;br /&gt;
&lt;br /&gt;
Объект AddressRecord может предоставить доступ к связанным таблицам :&lt;br /&gt;
* addressrecord.boxes&lt;br /&gt;
* addressrecord.packages&lt;br /&gt;
* addressrecord.clients&lt;br /&gt;
* addressrecord.price&lt;br /&gt;
* addressrecord.advprice&lt;br /&gt;
* addressrecord.userfields&lt;br /&gt;
* addressrecord.addressfld&lt;br /&gt;
* addressrecord.clients.userfields&lt;br /&gt;
* addressrecord.price.userfields&lt;br /&gt;
* addressrecord.zakaz&lt;br /&gt;
* addressrecord.zakaz.userfields&lt;br /&gt;
 &lt;br /&gt;
Чтобы получить доступ к полю VarCode из таблицы userfields необходимо записать AddressRecord.Userfields.VarCode. В присоединённой таблице может быть несколько записей чтобы получить к ним доступ предусмотрены функции _First, _EOF, _Next, _RecordCount, _Set.&lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
 set($value1, 0); set($value2, 0);&lt;br /&gt;
 while(AddressRecord.userfields._EOF=0,&lt;br /&gt;
   if(AddressRecord.userfields.varCode=1, &lt;br /&gt;
     set($value1, if(AddressRecord.userFields.VarValue='Праздничная упаковка', 150, 0)), ''''''');&lt;br /&gt;
   if(AddressRecord.userfields.varCode=2, &lt;br /&gt;
     set($value2, AddressRecord.userFields.VarValue), ''''''');&lt;br /&gt;
   AddressRecord.userFields._Next;&lt;br /&gt;
 );&lt;br /&gt;
 int($value1) + int($value2)&lt;br /&gt;
&lt;br /&gt;
Пример делающий тоже самое что и выше но через поиск Locate:&lt;br /&gt;
 set($value1, if(addressrecord.userfields.VarValue('VarCode', 1)='Праздничная упаковка', 150, 0));&lt;br /&gt;
 set($value2, int(addressrecord.userfields.VarValue('VarCode', 2)));&lt;br /&gt;
 $value1 + $value2&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
В скрипте доступны переменные: &lt;br /&gt;
«$FormulaKoeff» - это коэффициент на который умножится конечная цена (по умолчанию равна 1);&lt;br /&gt;
«$PriceCode»  - код прайса;&lt;br /&gt;
«$CurrentPriceConf»  - код услуги;&lt;br /&gt;
«$BasePrice» - стоимость всех услуг с уровнем (pricelevel) меньше текущего.&lt;br /&gt;
&lt;br /&gt;
Для вызова функции CalcBasePrice (Расчёт базовой цены) в скрипте объявленны переменные: $Count,$Collection,$Distance,$Wait.&lt;br /&gt;
&lt;br /&gt;
Существует поиск по ключевому полю (поиск регистронезависимый), например чтобы найти в таблице advprice введённое значение для текущей услуги, нужно сделать такую запись  addressrecord.advprice.value('priceconf', $CurrentPriceConf) - Первый параметр это ключевое поле, второй искомое значение. Если запись найдётся будет возвращено значение поле value, если нет функция вернёт значение 0.&lt;br /&gt;
 &lt;br /&gt;
Пример &lt;br /&gt;
 if(addressrecord.advprice.active('priceconf', 3)='T', addressrecord.advprice.price, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Смотрим включена ли услуга и если да, возвращаем рассчитанную стоимость&lt;br /&gt;
&lt;br /&gt;
Чтобы изменить значение записанное в объект addressrecord, нужно воспользоваться методом _set(keyfield, keyvalue, filed, value). Параметр keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца. Сначала происходит поиск строки по ключу, далее меняется значение указанного столбца.&lt;br /&gt;
Пример, отключение услуги база:&lt;br /&gt;
  addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
  priceconf - поле где записан код услуги;&lt;br /&gt;
  1 - услуга База;&lt;br /&gt;
  active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
Также существует упрощенный метод _set, с двумя параметрами filed, value - он используется в шаблонах загрузки или в системных доп. возможностях где доступен объект addressrecord.&lt;br /&gt;
&lt;br /&gt;
==== Зарплата курьеров ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в основной валюте для каждой единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Переменные «$FormulaTablKoeff» и «$FormulaMoneyKoeff»  позволяют установить повышающий или понижающий коэффициент на стоимость доставки (по тарифной сетке) и услуги соответственно (процент от суммы, процент от стоимости доставки, ожидание).  Переменная «$UsingZoneName» и «$KurierZone» содержат название и код зоны соответственно, есть возможность поменять название зоны для отчета.&lt;br /&gt;
&lt;br /&gt;
=== Планировщик ===&lt;br /&gt;
&lt;br /&gt;
В поле текста задания может быть введен как текст с командами планировщика (см ниже), так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TIniFile, Указывает на настроечный ini-файл планировщика.&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Для записи в лог планировщика нужно использовать функцию Print&lt;br /&gt;
&lt;br /&gt;
=== Репликатор ===&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
ReplaceAddress(target, address) – Возвращает адрес последней доставки корреспонденции получателю target по адресу address от текущего клиента. При отсутствии такой доставки, возвращает address.&lt;br /&gt;
&lt;br /&gt;
GetPrice –возвращает рассчитанное значение цены, на основе прайс-листа клиента и данных о корреспонденции.&lt;br /&gt;
&lt;br /&gt;
GetKurierByStation(i) – возвращает код курьера, ассоциированного со станцией метро с кодом i.&lt;br /&gt;
&lt;br /&gt;
GetNewNumber – Возвращает не занятый номер единицы корреспонденции в текущем заказе.&lt;br /&gt;
&lt;br /&gt;
==История изменений==&lt;br /&gt;
&lt;br /&gt;
=== Недавние изменения ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.539 Добавлена поддержка отладчика AttachDebugger&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.534 Добавлена поддержка оператора CASE и класса TFunc&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 2021.0.0.57 от 18.06.2019 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TExcel добавлен метод ColumnDelete.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция InsertFirmAtt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
||В объект TExcel добавлен метод Align.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция CheckEan&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект функцию FillAdvPriceReport добавлены параметры ShowSumPrice,InsertColumns&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TSMS добавлен метод Log.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Добавлена функция Money.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция ValutaSign.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция GetPolygonByLatLon.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TTable добавлена функция SetMultiHeader, SetCustomHeader.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DownloadAttachment&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию SetRowHeight объекта TExcel добавлен параметр cnt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция AsString.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция SetSize.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TADO добавлена функция ParseForIn.&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|В объект TBaseUtils из TBase перенесена функция FillExcelDoc.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция CalcAddressPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Все функции класса TBaseSupport перенесены в TBaseUtils. Класс TBaseSupport больше не существует.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функции RowInsert и RowDelete объекта TExcel добавлен параметр count.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция SendToMeaSoft&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция RecalcSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Новая функция Reverse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 849 &amp;amp;nbsp; 22.02.2018 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TBaseUtils.TownByIndex добавлен параметр PriorityName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TBase добавлена функция GetNewPackagePos&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TSMS доработан метод ExtraResult, добавлен параметр ParamName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBase добавлена функция CalcAgentPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateAddressForActDelivery&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функция CalcTownDeliveryDate заменена на CalcDeliveryDate&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция SignatureUrl&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция LoadFromStr.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetPen.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetBrush.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена поддержка чтения в формате PNG.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TCanvas.DrawPic параметр Mode&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Свойство TPicture.Canvas&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DeleteFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 758 &amp;amp;nbsp; 29.03.2017 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция GetPolygonByAddress&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция ParamsCount&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Объект TZip&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функции CreateEAN и Create128 заменены одной функцией CreateBar, полностью совместимой с Create128, но добавлена поддержка EAN-13 и Interleaved 2-5 (для Почты России). В системе функции оставлены для обратной совместимости, но более не являются документированными и рекомендованными к использованию.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Параметр text в функцию Cell объекта TExcel&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция UrlEncode &lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция IncDay теперь может принимать параметр count&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функции FtpGet, FtpPut, TTable.SetCell()&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 452 &amp;amp;nbsp; 26.02.2014 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция Time&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция FixedIntToStr&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция TimePeriod&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена функция приёма смс -  ReceiveSMS&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция STR2UTF&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция SAVETOFILE&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.SetSheetName&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;FILESTR&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Расширены возможности объекта addressrecord в формулах тарифов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 308 &amp;amp;nbsp; 24.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В функции загрузки таблиц из TADO добавлено условие, что поля, названия которых начинаются с &amp;quot;-&amp;quot; не выгружаются. Таким образом можно скрывать служебные поля из результирующего набора.&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowAutoFit &lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowInsert &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 300 &amp;amp;nbsp; 01.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В объекте TCSVFile добавилась возможность запрашивать значения не только текущей записи через параметр сдвига&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;UPDOWN&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлен объект TCSVFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 266 &amp;amp;nbsp; 14.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена поддержка массивов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 265 &amp;amp;nbsp; 11.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция CreateTrans в интерпретатор&lt;br /&gt;
|-&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15689</id>
		<title>Руководство программиста</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0&amp;diff=15689"/>
				<updated>2025-12-02T21:16:41Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Функциональность базового объекта */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Основные положения ==&lt;br /&gt;
&lt;br /&gt;
В систему «MEASOFT» встроен внутренний интерпретируемый язык программирования. Среда состоит из базовой функциональности, и дополнительно создаваемых объектов. Некоторые объекты автоматически создаются средой перед запуском интерпретатора для предоставления доступа к контексту, в котором работает скрипт. Все типы данных приводятся друг к другу автоматически, иногда при необходимости можно использовать функции приведения типов. &lt;br /&gt;
&lt;br /&gt;
Как интерпретатор приводит типы:&lt;br /&gt;
&lt;br /&gt;
1.	При использовании значения как параметр функции интерпретатор автоматически приводит значение к типу, необходимому функции.&lt;br /&gt;
&lt;br /&gt;
2.	При операциях сложения, а также логических операциях, операнды приводятся к строке если хотя бы один из них имеет тип «строка». Например:&lt;br /&gt;
3.3+5		-&amp;gt;  8.3&lt;br /&gt;
‘3.3’+5		-&amp;gt;  ‘3.35’&lt;br /&gt;
подобную проблему можно решить принудительно преобразовав тип:&lt;br /&gt;
float(‘3.3’)+5	-&amp;gt;  8.3&lt;br /&gt;
&lt;br /&gt;
3.	При операциях умножения, деления и вычитания операнды приводятся к числу с плавающей точкой, однако если результат выполнения операции получается целым числом, то он приводится к целочисленному типу.&lt;br /&gt;
&lt;br /&gt;
Как работают функции приведения типов:&lt;br /&gt;
&lt;br /&gt;
1.	При преобразовании строки к числу: функция «читает» строку до первого символа, не позволяющего создать число с плавающей точкой, при этом разделителем целой и дробной частей может быть как точка так и запятая. Если приведение производится к целочисленному типу, то после этого происходит округление. Например:&lt;br /&gt;
float('3.6qwerty735')	-&amp;gt;  3.6&lt;br /&gt;
int('3.6qwerty735')	-&amp;gt;  4&lt;br /&gt;
&lt;br /&gt;
2.	При преобразовании к булевому типу ложью считается пустая строка либо число 0, все остальное - истина&lt;br /&gt;
&lt;br /&gt;
3.	При преобразовании булевого типа к числу истина преобразуется в 1, ложь – в 0. Такое преобразование позволяет использовать сложение и умножение в качестве логических «ИЛИ» и «И» соответственно:&lt;br /&gt;
if((5=5)+(6=7), &amp;lt;a&amp;gt;, [b]) – условие истинно, выполнится код «a».&lt;br /&gt;
&lt;br /&gt;
4.	При преобразовании булевого типа к строке сначала происходит преобразование к числу:&lt;br /&gt;
(5=5)+'qwerty'	-&amp;gt;  ‘1qwerty’&lt;br /&gt;
&lt;br /&gt;
== Описание синтаксиса ==&lt;br /&gt;
&lt;br /&gt;
Команды разделяются точкой с запятой. Параметры функций разделяются запятыми. Каждая команда (даже цикл while) является функцией, возвращающей некоторое значение. Результатом выполнения составной команды (последовательности функций, разделенных точкой с запятой), является результат выполнения последней функции. Имена переменных, функций, объектов, а также их свойств и методов не чувствительны к регистру.&lt;br /&gt;
Константы: константы бывают целочисленными, дробными и строковыми. Значения целочисленных и дробных констант указываются «как есть» (в этом случае разделитель целой и дробной частей – точка), шестнадцатеричные значения начинаются с символа «$» и, если первая цифра – буква, она упреждается цифрой 0, а строковые – в одинарных кавычках. При этом, если внутри строковой константы встречается символ одинарной кавычки он должен быть задвоен, для указания интерпретатору того, что он не является признаком конца константы.&lt;br /&gt;
Операции сравнения: &amp;gt;, &amp;lt;, =, !  - Больше, меньше, равно, не равно соответственно.&lt;br /&gt;
Логические операции: + (ИЛИ), *  (И).&lt;br /&gt;
Арифметические операции: +, -, *, /&lt;br /&gt;
Операция конкатенации строк: +&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Функциональность базового объекта ===&lt;br /&gt;
&lt;br /&gt;
'''SET($a, a)''' – присваивает переменной (1-й параметр) значение второго параметра. При отсутствии переменной – создает ее. Имена переменных должны начинаться с символа «$», а следующий символ не должен быть цифрой. Возвращает новое значение переменной. Функция используется только для задания значений переменных. Не допускается использования для задания значений свойств объектов. Для этого используются соответствующие методы этих объектов.&lt;br /&gt;
&lt;br /&gt;
'''IF(a,b,c)''' или '''IF(a,b)'''  – Условный оператор. В первом случае возвращает b, если a истинно (не равно нулю или пустой строке), иначе – c. Во втором случае – возвращает a, если оно истинно, иначе – b.&lt;br /&gt;
&lt;br /&gt;
'''WHILE(a, b)''' – Оператор цикла. Выполняет b пока a истинно:&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i&amp;gt;0, set($sum, $sum+$i); set($i, $i-1));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''FOR($a, b, c, d)''' – Оператор цикла. Выполняет d пока $a последовательно присваиваются значения от b до с включительно:&lt;br /&gt;
	set($sum, 0);&lt;br /&gt;
for($i, 1, 10, set($sum, $sum+$i));&lt;br /&gt;
$sum&lt;br /&gt;
Результат – 55&lt;br /&gt;
&lt;br /&gt;
'''NEW(ClassName, InstanceName)''' – Создает экземпляр класса ClassName, назначает ему имя InstanceName. Возвращает порядковый номер созданного объекта. Доступ к свойствам и методам объектов осуществляется по имени объекта и имени свойства/метода, разделенным точкой. Именем объекта может быть и пустая строка, тогда доступ к его свойствам и методам будет осуществляться без указания имени, и, в случае совпадения имен свойств и/или методов со стандартными или свойствами/методами других объектов, использоваться будут соответствующие свойства/методы объекта, созданного ранее, а также такой объект невозможно уничтожить до окончания выполнения скрипта. Все объекты созданные во время выполнения скрипта уничтожаются автоматически после окончания его выполнения.&lt;br /&gt;
&lt;br /&gt;
'''FREE(InstanceName)''' – Уничтожает объект с именем InstanceName. Возвращает 0. В случае отсутствия объекта с заданным именем вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
'''ShowObjects''' – Возвращает список созданных объектов – названия классов и имена.&lt;br /&gt;
&lt;br /&gt;
'''ERROR(message)''' – Вызывает ошибку с текстом message.&lt;br /&gt;
&lt;br /&gt;
'''SHOWMESSAGE(message)''' – Отображает диалоговое окно с текстом message, останавливает выполнение скрипта до закрытия окна пользователем.&lt;br /&gt;
&lt;br /&gt;
'''SimpleAskUser(Message)''' – Выводит диалоговое окно с текстом Message и кнопками «Да» и «Нет». Возвращает 1, если  пользователь нажал кнопку «Да», иначе – 0.&lt;br /&gt;
&lt;br /&gt;
'''TRY(a)''' – Выполняет a в «защищенном от ошибки» режиме. Если в процессе выполнения a возникает ошибка, возвращает текст ошибки, иначе – 0 (ложь).&lt;br /&gt;
&lt;br /&gt;
'''REM(….)''' – Код в скобках игнорируется (комментарий).&lt;br /&gt;
&lt;br /&gt;
'''EXEC(FileName, Params, Wait, WindowState)''' – Запускает внешнее приложение FileName с параметрами Params. Если Wait истинно – ожидает завершение процесса. Для WindowState доступны следующие числовые значения:&lt;br /&gt;
	0 - SW_HIDE&lt;br /&gt;
	1 - SW_SHOWNORMAL (по-умолчанию)&lt;br /&gt;
	3 - SW_MAXIMIZE&lt;br /&gt;
	6 - SW_MINIMIZE&lt;br /&gt;
Функция возвращает истину если приложение запущено успешно. Иначе – Ложь.&lt;br /&gt;
В случае успеха, при параметре Wait – истина кладет в переменную $LastResult код завершения приложения.&lt;br /&gt;
&lt;br /&gt;
'''CASE''' - Оператор множественного выбора. Позволяет выполнить одно из нескольких действий в зависимости от условий. Синтаксис:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
  case(&lt;br /&gt;
    when(условие1, действие1);&lt;br /&gt;
    when(условие2, действие2);&lt;br /&gt;
    ...&lt;br /&gt;
    else(действие_по_умолчанию);&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 50);&lt;br /&gt;
&lt;br /&gt;
showmessage(&lt;br /&gt;
  case(&lt;br /&gt;
    when($a &amp;lt; 5, 50);&lt;br /&gt;
    when($a &amp;lt; 10, 100);&lt;br /&gt;
    when($a &amp;lt; 250, 200);&lt;br /&gt;
    else($a*$b);&lt;br /&gt;
  )  &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''AttachDebugger''' - Команда позволяет подключить открытый [[Отладчик_встроенных_скриптов]] к текущему скрипту. Команда AttachDebugger должна быть '''первой командой''' в скрипте. Добавьте её в самое начало скрипта:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Как работает:'''&lt;br /&gt;
# При выполнении команды AttachDebugger скрипт останавливается.&lt;br /&gt;
# Отладчик автоматически подключается к выполняющемуся скрипту.&lt;br /&gt;
# Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
# Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Если режим отслеживания не включён, команда `AttachDebugger` игнорируется.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Команда AttachDebugger должна быть первой командой в скрипте.&lt;br /&gt;
&lt;br /&gt;
=== Строковые функции ===&lt;br /&gt;
&lt;br /&gt;
'''UpCase(s)''' – возвращает строку s в верхнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''LCase(s)''' – возвращает строку s в нижнем регистре.&lt;br /&gt;
&lt;br /&gt;
'''Len(s)''' – возвращает количество символов в строке s.&lt;br /&gt;
&lt;br /&gt;
'''Pos(s, substr [,start])''' – возвращает номер первого символа первого включения подстроки substr в строку s, возвращает 0, если включения подстроки отсутствуют. Параметр start - это позиция старта поиска, не обязательный параметр, по умолчанию равен 1. Поиск не чувствителен к регистру.&lt;br /&gt;
&lt;br /&gt;
'''Param(s, i)''' – возвращает i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''ParamsCount(s)''' - возвращает количество элементов строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''SetParam(s, p, i)''' – заменяет на значение p i-й элемент строки s, разделенной запятыми на элементы.&lt;br /&gt;
&lt;br /&gt;
'''Left(s, i [,full] )''' – возвращает i первых символов строки s. Параметр i, может быть строкой, тогда он считается разделителем и функция, возвращает строку слева от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Mid(s, i, j)''' - возвращает подстроку из s начиная с i символа и длиной j символов&lt;br /&gt;
&lt;br /&gt;
'''Right(s, i [,full])''' – возвращает i последних символов строки s. Параметр i, может быть строкой, тогда он считается разделителем, функция ищет разделитель с конца строки, и возвращает строку справа от разделителя. Параметр full разрешает функции вернуть всю строку s, если по параметру i ничего не нашли, параметр не обязательный, по умолчанию выключен.&lt;br /&gt;
&lt;br /&gt;
'''Reverse(s)''' - возвращает строку s задом-наперед. Полезно например для поиска с конца функций Pos().&lt;br /&gt;
&lt;br /&gt;
'''Char(i)''' – возвращает символ с кодом i.&lt;br /&gt;
&lt;br /&gt;
'''Ord(s)''' – возвращает код первого символа строки s.&lt;br /&gt;
&lt;br /&gt;
'''Replace(s, strFind1, strReplace1, [ strFind2, strReplace2, ... ], [caseInsensetive])''' - возвращает строку s, в которой все включения строк strFind заменены строкой strReplace. Параметры поиска и замены всегда должны быть в паре и их может быть несколько. caseInsensetive - неучитывать регистр, не обязательный параметр, по умолчанию включен.&lt;br /&gt;
&lt;br /&gt;
'''RemSpace(s)''' – возвращает сроку s без начальных и конечных запятых и пробелов, а также начальных точек.&lt;br /&gt;
&lt;br /&gt;
'''SumStr(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''с добавлением валюты'''. Необязательные параметры captions - позволяет изменить название валюты, формат строки может зависеть от текущего языка(посмотреть формат можно в &amp;quot;Справочники&amp;quot;-&amp;quot;Статусы&amp;quot;-&amp;quot;32 Валюты&amp;quot;, в разделе &amp;quot;Дополнительная информация&amp;quot;). Language - код языка на котором необходимо вывести сумму прописью. По умолчанию если не обязательные параметры опущены, используются региональные настройки в переменных.&lt;br /&gt;
&lt;br /&gt;
'''NumToStrSimple(f [, captions, language])''' – Возвращает сумму f, написанную прописью, по умолчанию '''без валюты'''. Параметры идентичны функции SUMSTR.&lt;br /&gt;
&lt;br /&gt;
'''FullNameToShort(Name)''' – Возвращает фамилию и инициалы по полному ФИО Name.&lt;br /&gt;
&lt;br /&gt;
'''MonthName1(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в именительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''MonthName2(m)''' – Возвращает имя месяца с номером m с большой буквы на русском языке в родительном падеже.&lt;br /&gt;
&lt;br /&gt;
'''StrForXML(s)''' - Подготавливает строку к парсингу как xml: Если находит в строке подстроку &amp;quot;UTF-8&amp;quot; - перекодирует ее из utf-8 в win-1251, убирает начальный знак вопроса, если такой встречается.&lt;br /&gt;
&lt;br /&gt;
'''FixedIntToStr(i, len[, char])''' - Возвращает целое число i дополненное слева символами char (по-умолчанию - &amp;quot;0&amp;quot;) до длины len.&lt;br /&gt;
&lt;br /&gt;
'''Translate(format, [param1, param2, ...])''' - Функция перевода строки format в язык пользователя. Строка format может содержать параметры %s, %d - строка и число соответственно. &lt;br /&gt;
&lt;br /&gt;
'''ExtractFileName(FilePath)''' - возвращает имя файла с расширением из полного пути к файлу FilePath.&lt;br /&gt;
&lt;br /&gt;
====Функции перекодировки====&lt;br /&gt;
'''DecodeStr(s, charset)''' - Производит перекодировку строки s в кодировку CP1251. Кодировка строки s должна быть заранее известна и может быть :&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866, UNICODE. Имя кодировки следует передавать в точности без лишних символов.&lt;br /&gt;
&lt;br /&gt;
'''EncodeStr(s, charset)''' - Производит перекодировку строки s в кодировку charset. Кодировка строки s должна быть CP1251, возможны следующие варианты перекодировки:&lt;br /&gt;
KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Имя кодировки следует передавать в точности без лишних символов. UNICODE не работает с версии 2021, в ней строки по умолчанию в кодировке unicode.&lt;br /&gt;
&lt;br /&gt;
Функции EncodeBase64(s), DecodeBase64(s), UrlEncode(s), UTF8Encode(s), UTF8Decode(s), Str2UTF(s) - устарели, используйте EncodeStr, DecodeStr.&lt;br /&gt;
&lt;br /&gt;
====Транслитерация====&lt;br /&gt;
&lt;br /&gt;
'''Translit(s)''' - транслитерация строки русского текста s латиницей&lt;br /&gt;
&lt;br /&gt;
'''UnTranslit(s)''' - транслитерация строки s с латиницы на русский.&lt;br /&gt;
&lt;br /&gt;
==== Экранирование ====&lt;br /&gt;
&lt;br /&gt;
'''QUOTEDSTR(s)''' – квотирует строку s символом «\» (обратный слеш). Возвращает строку s, помещенную между символами одинарной кавычки, при этом все вхождения в строку s символов: «\», «&amp;quot;» и «'» экранируются квотирующим символом, а символы  #0, #10 и #13 заменяются на \0, \n и \r соответственно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SQLFloat(f)''' – Приводит число с плавающей точкой к виду, пригодному для SQL-запроса, т.е. к тексту с разделителем дробной части – точка.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextXML(s)''' - квотирует строку s для использования в XML. Производит замены спец. символов для корректности XML-синтаксиса.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextJSON(s)''' - переводит строку в формат JSON, экранирует служебные символы.&lt;br /&gt;
&lt;br /&gt;
'''FormatTextBlob(s)''' - строка s содержит файл, функция перекодирует переданную строку в байты, используется для заполнения полей формата blob.&lt;br /&gt;
&lt;br /&gt;
====Хеширование ====&lt;br /&gt;
&lt;br /&gt;
'''HMACHash256(key, text)''' - создаёт хэш по алгоритму SHA256 для проверки целостности сообщения, key - секретный ключ, text - хэшируемое сообщение&lt;br /&gt;
&lt;br /&gt;
'''MD5Hash(text)''' - создаёт хеш по алгоритму MD5&lt;br /&gt;
&lt;br /&gt;
'''SignatureUrl(url)''' -  Подписывает переданный URL. Функция возвратит переданный URL с добавленным в конце параметром, в котором будет записана подпись.&lt;br /&gt;
&lt;br /&gt;
=== Функции работы с датой и временем ===&lt;br /&gt;
&lt;br /&gt;
'''CurrTime''' – возвращает текущее время&lt;br /&gt;
&lt;br /&gt;
'''CurrDate''' – возвращает текущую дату&lt;br /&gt;
&lt;br /&gt;
'''CurrMillisecond''' - Возвращает количество миллисекунд прошедших с начала текущего года. Используется для точного расчета временных интервалов.&lt;br /&gt;
&lt;br /&gt;
'''Today''' - возвращает текущую дату в числовом формате.&lt;br /&gt;
&lt;br /&gt;
'''Day(dt)''' – возвращает день месяца даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Month(dt)''' – возвращает месяц года даты dt.&lt;br /&gt;
&lt;br /&gt;
'''Year(dt)''' – возвращает год даты dt.&lt;br /&gt;
&lt;br /&gt;
'''FirstDayOfMonth(dt)''' – Возвращает первый день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( FirstDayOfMonth( CurrDate() ) );&lt;br /&gt;
'''Полужирное начертание'''&lt;br /&gt;
'''LastDayOfMonth(dt)''' – Возвращает последний день месяца в формате DD.MM.YYYY для даты dt в формате DD.MM.YYYY. Пример вызова: Error( LastDayOfMonth( CurrDate() ) );&lt;br /&gt;
&lt;br /&gt;
'''DaysInMonth(month, year)''' – Возвращает количество дней в указанном месяце.&lt;br /&gt;
&lt;br /&gt;
'''IncDay(dt, [count=1])''' – Возвращает дату, увеличенную на count дней.&lt;br /&gt;
&lt;br /&gt;
'''SQLDate(dt)''' – Пытается конвертировать dt в дату, вернуть в формате «'YYYY-MM-DD'» (с апострофами), если не удается – возвращает «NULL».&lt;br /&gt;
&lt;br /&gt;
'''SQLDateToDate(dt)''' – Переводит дату из SQL-формата в обычный.&lt;br /&gt;
&lt;br /&gt;
'''DAYSBETWEEN(dt1, dt2)''' – Возвращает количество дней между датами dt1 и dt2. В случае ошибки приведения dt1 или dt2 к дате возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''TimeBetween(t1, t2)''' - Возвращает количество минут между временем t1 и t2. Если t1 &amp;gt; t2 то будет показано количество минут между t2 и t1. Параметр t может быть как в формате &amp;quot;HH:MM&amp;quot;, так и в числовом. Если один из параметров не удалось привести к числовому типу возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''WorkDaysBetween(dt1, dt2, [DecreaseFirstDay=0], [DefaultHolidayVarNum=1])''' - Возвращает количество рабочих дней между датами dt1 и dt2. Параметр DecreaseFirstDay уменьшает dt1 на указанное количество дней (по умолчанию 0).  В случае ошибки приведения dt1 или dt2 к дате возвращает -1000. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней(по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''TimePeriod(time1, time2)''' - Оформляет временной период. Возвращаемое значение зависит от наличия значения в параметрах. Возможные варианты: &amp;quot;time1 - time2&amp;quot; , &amp;quot;С time1&amp;quot; , &amp;quot;ДО time2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''StrDateToFloat(s, [time=false])''' - Переводит строку с датой s в числовой тип. Если параметр time включен, то в строке s должно быть указано время. Дата должна быть в формате &amp;quot;DD.MM.YYYY&amp;quot;, а время &amp;quot;HH:NN&amp;quot;. Если строку перевести не удалось возвращает 0&lt;br /&gt;
&lt;br /&gt;
'''IsAWorkDay(dt)''' - Когда день dt является рабочим, возвращает true. Если произошла ошибка приведения даты возвращает -1000.&lt;br /&gt;
&lt;br /&gt;
'''IncWorkDay(dt, [count=1],[DefaultHolidayVarNum=1])''' - Прибавляет count рабочих дней к дате dt. Возвращает дату в числовом формате, если произошла ошибка приведения даты возвращает -1000. По умолчанию параметр count равен 1 и не является обязательным. Параметр DefaultHolidayVarNum - использовать для расчета справочник: 1 - выходных дней (по умолчанию); 2 - выходных дней для доставки по городу; 3 - выходных дней для доставки&lt;br /&gt;
&lt;br /&gt;
'''Sleep'''(n) - Задержка выполнения на n миллисекунд.&lt;br /&gt;
&lt;br /&gt;
=== Функции приведения типов ===&lt;br /&gt;
&lt;br /&gt;
'''INT(v)''' – возвращает значение типа “целое”, приводя вариантное значение v к числовому типу, а затем округляя его. В том числе используется как функция округления.&lt;br /&gt;
&lt;br /&gt;
'''FLOAT(v)''' – возвращает значение типа “число”, приводя вариантное значение v к числовому типу, переводя в число цепочку символов до первого нецифрового символа (либо точки или запятой).&lt;br /&gt;
&lt;br /&gt;
'''STR(v)''' – возвращает значение типа “строка”, приводя вариантное значение v к строковому типу.&lt;br /&gt;
&lt;br /&gt;
'''Date(v)''' – возвращает дату, либо пустую строку, если не удается конвертировать v в дату&lt;br /&gt;
&lt;br /&gt;
'''Time(v)''' – возвращает время, либо пустую строку, если не удается конвертировать v во время. Понимает числовое представление времени.&lt;br /&gt;
&lt;br /&gt;
=== Математические функции ===&lt;br /&gt;
&lt;br /&gt;
'''ROUNDUP(f)''' – округляет число f до ближайшего большего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''ROUNDDN(f)''' – округляет число f до ближайшего меньшего по модулю целого числа.&lt;br /&gt;
&lt;br /&gt;
'''Money(f, CouldBeEmpty, ZeroFill, MakeSpace)''' - Округляет число f, до двух знаков после запятой. CouldBeEmpty - заменить число меньше 0,0001  на пустую строку. ZeroFill  - Следить чтобы после запятой было два знака, если будет один, то добавить ноль. MakeSpace - Разделить разряды пробелом.&lt;br /&gt;
''Подсказка: для простого округления используется функция int()''&lt;br /&gt;
&lt;br /&gt;
'''Abs(f)''' - возвращает модуль числа f.&lt;br /&gt;
&lt;br /&gt;
'''Mod(x, y)''' - возвращает остаток от деления целочисленного числа x на целочисленное число y.&lt;br /&gt;
&lt;br /&gt;
=== Константы ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Null''' – Возвращает пустое значение.&lt;br /&gt;
&lt;br /&gt;
'''Да''', '''True''', '''Нет''', '''False''' – константы, соответствующие булевым значениям.&lt;br /&gt;
&lt;br /&gt;
=== Прочие функции ===&lt;br /&gt;
&lt;br /&gt;
SetPhoneParams(CountryCode, TownCode) – Устанавливает глобальные настройки кода телефонных кодов страны и города соответственно. По-умолчанию код страны – 7, код города – 495.&lt;br /&gt;
&lt;br /&gt;
PhonesCount(s) – Возвращает количество корректных телефонных номеров, найденных в строке s.&lt;br /&gt;
&lt;br /&gt;
GetPhone(s[, n]) – Возвращает n-й корректный телефонный номер, найденный в строке s. Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
GetEmail(s) – Возвращает все корректные адреса email, найденный в строке s, разделенные запятыми (т.е. готовыми к передаче в функцию SendEmail).&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY).&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject[, FileName]) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
GenEan(ID, Code) – Формирует штрих-код EAN 13 Состоящий из идентификатора типа сущности ID и кода сущности Code, Выравнивает до 13-ти символов, первый – «2», последний – контрольная сума.&lt;br /&gt;
&lt;br /&gt;
CheckEan(s) - Проверяет строку s, что она является кодом EAN13.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(FileName,s, encoding [, append])- Создает текстовый файл по пути, указанному в FileName (если по указанному пути существует файл с указанным именем, он удаляется и создается новый) и производит запись строки s в созданный текстовый файл. encoding - название кодировки, по умолчанию сохраняет в кодировке ANSI. Доступные названия кодировок: KOI8-R, ISO-8859-5, UTF-8, URL, BASE64, QUOTED-PRINTABLE, CP866. Если append = true, то производится дописывание данных в файл, а не перезаписывание (не обязательный, по умолчанию выключен).&lt;br /&gt;
&lt;br /&gt;
StrFromFile(FileName) - Читает файл FileName, возвращает в виде строки. При ошибке чтения вызывает ошибку.&lt;br /&gt;
&lt;br /&gt;
DownloadAttachment(code, [savefilepath, tablename='attachment', fieldBlob='file', fieldLDtime='ldtime', fieldUID='uid']) - Функция выкачивает аттачмент из базы, по внутреннему коду - Code, всегда возвращает содержимое файла в виде строки, а также может сохранить файл по указанному пути в параметре savefilepath. По умолчанию, функция настроена на таблицу attachment. Code - внутренний код вложения, tablename - название таблицы, fieldBlob - название поля с содержимым файла, fieldLDtime - название поля с временем последнего изменения строки (для работы кэша). Функция использует кэш и умеет выкачивать файлы зауженные на внешние серверы (http, ftp,sftp, measoft). Для выкачивания с сервера measoft обязательно необходимо указывать параметр fieldUID.&lt;br /&gt;
&lt;br /&gt;
DeleteFile(FileName) - Удаляет файл FileName с диска, возвращает истину, если операция прошла успешно и ложь - в противном случае.&lt;br /&gt;
&lt;br /&gt;
HTTPPOST(host, PostParams, Proxy, ContentType, HTTPUser, HTTPPass, Method, CustomHeader, Reconnects) - Отправляет HTTP запрос по адресу host с данными PostParams. Proxy - объект Proxy, задающий прокси-сервер (по-умолчанию - пусто - не использовать прокси). ContentType - Заголовок ContentType. По-умолчанию - &amp;quot;application/x-www-form-urlencoded; Charset=UTF-8&amp;quot;. HTTPUser и HTTPPass - данные для http-авторизации на сервере. Method - метод отправки запроса, по-умолчанию - &amp;quot;POST&amp;quot;. CustomHeader - Дополнительные заголовки HTTP запроса, передается в виде списка параметров через запятую и всегда образуют пару: 1 параметр - название заголовка, 2 параметр - значение. Если значение содержит запятую то его нужно экранировать в двойные кавычки. Reconnects - Количество попыток подключения (по-умолчанию - 2), если больше 100 - это таймаут единственной попытки подключения в миллисекундах.&lt;br /&gt;
Функция возвращает ответ сервера. &amp;lt;br&amp;gt;&lt;br /&gt;
''Обратите внимание:'' Для имитации отправки данных html-формы методом POST может понадобиться перед передаваемыми параметрами добавить &amp;quot;Data=&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
FTPPUT(host, User, Pass, FileName[, Active]) - Отправляет файл на FTP/SFTP-сервер. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
FTPGET(host, User, Pass, SourceFileName, DestFileName[, Active]) - Загружает файл SourceFileName с FTP/SFTP-сервера, сохраняет его в файл DestFileName. Параметр Host может иметь в себе путь к папке. По-умолчанию работает в пассивном режиме.&lt;br /&gt;
&lt;br /&gt;
GetTempDir - Возвращает путь к временной папке.&lt;br /&gt;
&lt;br /&gt;
ApplicationDir - Возвращает путь к файлу программы.&lt;br /&gt;
&lt;br /&gt;
Interpretate(script) - Интерпретирует скрипт указанный в script. Выполнение происходит в текущем инстансе.&lt;br /&gt;
&lt;br /&gt;
LastHttpError - Выводит последний запрос выполненный с ошибкой в функции HttpPost. Содержит подробную информацию по запросу и ответу.&lt;br /&gt;
&lt;br /&gt;
LastHttpResponse - Выводит последний запрос и ответ от сервера после выполнения Http-запроса в функции HttpPost.&lt;br /&gt;
&lt;br /&gt;
== Объект TExcel ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к данным документов MS Excel. Требует установленного приложения MS Excel. Для работы без установленного MS Excel предусмотрен объект TDirectExcel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ввод данных'''''&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Если Headered истинно (по-умолчанию), таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Если TranslateHeader истинно, то заголовки таблицы будут автоматически переведены.&lt;br /&gt;
 &lt;br /&gt;
 MyDB.Open('select * from kurier');&lt;br /&gt;
 xl.LoadFromDB(MyDB.Self);&lt;br /&gt;
 xl.DoNotDestroy(true);&lt;br /&gt;
 xl.SetVisible(true);&lt;br /&gt;
&lt;br /&gt;
Post2Sheet(DB[, Headered=true][, Col=1][, Row=1][, TranslateHeader=False]) -  Почти полный аналог LoadFromDB. В отличии от LoadFromDB если есть открытый файл, выгрузка данных будет выполнена прямо в него.&lt;br /&gt;
&lt;br /&gt;
OpenFile(aFileName) – Выполняет функции SetFileName и Open. &lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
SetFileName(aFileName) – Задает значение свойства FileName.&lt;br /&gt;
&lt;br /&gt;
Open - Открывает файл с именем, заданным свойством FileName. Если имя файла не задано - создает чистую книгу.&lt;br /&gt;
&lt;br /&gt;
Close – Закрывает текущий файл.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Ячейки'''''&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
Cell(x, y, text) – Возвращает значение ячейки, заданной координатами x, y. Необязательный булевый параметр text, в случае истинности, указывает на необходимость возврата данных с учетом формата ячейки, т.е. то, что пользователь видит на экране. Обратите внимание, что если в ячейке число, и ширина столбца не достаточна для отображения, Excel выводит &amp;quot;#####&amp;quot;, что и будет возвращено программе, если text=ИСТИНА. Поэтому перед таким использованием рекомендуется выполнить функцию AutoFit.&lt;br /&gt;
&lt;br /&gt;
SetCell(x, y, v[, x2, y2]) – Устанавливает значение ячейки, заданной координатами x и y, в значение v. Если заданы параметры x2, y2 - объединяет (merge) диапазон ячеек заданных координатами, устанавливает значение объединенной ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Строки'''''&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
RowAutoFit([y1, y2]) - Устанавливает автоматическую высоту строк. Аргументы y1 и y2 необязательны и если не указаны, то процедура будет выполнена для всей страницы, в ином случае только для строк от y1 до y2.&lt;br /&gt;
&lt;br /&gt;
SetRowHeight(r, h[, cnt]) – Устанавливает высоту cnt строк (по-умолчанию 1) начиная со строки r в h пикселей.&lt;br /&gt;
&lt;br /&gt;
GetRowHeight(r) – Возвращает высоту строки r в пикселях.&lt;br /&gt;
&lt;br /&gt;
RowInsert(i[, count]) - Вставляет count (по-умолчанию - 1) строк НАД строкой с номером i.&lt;br /&gt;
&lt;br /&gt;
RowDelete(i[, count]) - Удаляет count (по-умолчанию - 1) строк начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Столбцы'''''&lt;br /&gt;
&lt;br /&gt;
ColCount - Возвращает количество столбцов в листе.&lt;br /&gt;
&lt;br /&gt;
AutoFit – Устанавливает автоматическую ширину столбцов.&lt;br /&gt;
&lt;br /&gt;
ColumnDelete(i[, count]) - Удаляет count (по-умолчанию - 1) столбцов начиная с номера i.&lt;br /&gt;
&lt;br /&gt;
SetColWidth (c, w) – Устанавливает ширину столбца c в w пикселей.&lt;br /&gt;
&lt;br /&gt;
GetColWidth (c) – Возвращает ширину столбца c в пикселях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Листы'''''&lt;br /&gt;
&lt;br /&gt;
SetSheet(No) – Устанавливает номер текущего листа. Если лист с таким номером не существует - он будет создан (и все листы до него). Нумерация начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetSheetName(Name) - Устанавливает название текущего листа.&lt;br /&gt;
&lt;br /&gt;
SheetsCount – Возвращает количество листов в книге.&lt;br /&gt;
&lt;br /&gt;
CopySheetAfter([SheetFrom[, SheetAfter]]) - Копирует лист SheetFrom (по-умолчанию - текущий), создавая новый лист после листа SheetAfter (по-умолчанию - совпадает с копируемым).&lt;br /&gt;
&lt;br /&gt;
SheetDelete(i) - Удаляет лист с номером i.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Форматирование'''''&lt;br /&gt;
&lt;br /&gt;
Align(x1, y1, x2, y2 [,HAlign, VAlign]) - Устанавливает выравнивание данных в указанном диапазоне. HAlign - горизонтальное выравнивание (0 – прижато влево , 1 – по центру , 2 – прижато вправо), VAlign - Вертикальное выравнивание (0 – прижато к верху , 1 – по центру , 2 – прижато к низу).&lt;br /&gt;
&lt;br /&gt;
WrapText(x1, y1, x2, y2, value) – Устанавливает перенос текста прямоугольника в значение value. Если координаты опущены, или 0 – устанавливает границы всей используемой области. Для Value значение по-умолчанию - true.&lt;br /&gt;
&lt;br /&gt;
NumberFormat(x1, y1, x2, y2, Format) - Устанавливает формат вывода чисел в указанном диапазоне ячеек. Например, если Format='0.00' - числа будут выводиться c обязательными 2 знаками после десятичного разделителя.&lt;br /&gt;
&lt;br /&gt;
SetBorders(x1, y1, x2, y2) – Устанавливает границы прямоугольника. Если координаты опущены, или 0 – устанавливает границы всей используемой области.&lt;br /&gt;
&lt;br /&gt;
SetFont(Font[, x1, y1[, x2, y2]]) - Устанавливает шрифт Font для ячеек диапазона. Можно указать координаты только одной ячейки, можно - вообще не указать, тогда будет использован последний выделенный диапазон. Шрифт задается как обычно: 'Arial, 16, T, T, T', порядок параметров: Имя шрифта, размер, жирное начертание, курсивное начертание, одиночное подчеркивание. Если параметры не заданы, то у текущего шрифта они меняться не будут. Примеры: SetFont('Arial, 10, T, F, F', 1,1) - в ячейке A1 будет установлен шрифт Arial жирным начертанием (не курсив и без подчеркивания). SetFont(', , , T, F', 2,1) - в ячейке B1 будет поменяется только начертание курсив и будет отменено подчеркивание (если оно было). &lt;br /&gt;
&lt;br /&gt;
SaveValuesOnly - убирает формулы на текущей странице и оставляет лишь их результативные статичные значения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Цвета'''''&lt;br /&gt;
&lt;br /&gt;
SetRowFontColor(Row,Color) - Устанавливает цвет шрифта в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetRowColor(Row,Color) - Устанавливает цвет фона в строке Row. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetColumnFontColor(Col,Color) - Устанавливает цвет шрифта в столбце Col. Color -  целое значение (RGB) &lt;br /&gt;
&lt;br /&gt;
SetColumnColor(Col,Color) - Устанавливает цвет фона в столбце Col. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellFontColor(Row,Col,Color) -  Устанавливает цвет шрифта в ячейке с координатами [Row,Col]. Color -  целое значение, равное номеру цвета в палитре (ColorIndex,не RGB)&lt;br /&gt;
&lt;br /&gt;
SetCellColor(Row,Col,Color) -  Устанавливает цвет фона в ячейке с координатами [Row,Col]. Color -  целое значение (RGB)&lt;br /&gt;
&lt;br /&gt;
GetRowFontColor(Row)- Возвращает RGB значение цвета шрифта строки Row&lt;br /&gt;
&lt;br /&gt;
GetRowColor(Row)- Возвращает RGB значение цвета фона строки Row&lt;br /&gt;
&lt;br /&gt;
GetColumnFontColor(Col)- Возвращает RGB значение цвета шрифта столбца Col&lt;br /&gt;
&lt;br /&gt;
GetColumnColor(Col)- Возвращает RGB значение цвета фона столбца Col &lt;br /&gt;
&lt;br /&gt;
GetCellFontColor(Row,Col) - Возвращает номер цвета шрифта в палитре (ColorIndex) в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
GetCellColor(Row,Col) - Возвращает RGB значение цвета фона в ячейке  с координатами [Row,Col]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Копи-паст'''''&lt;br /&gt;
&lt;br /&gt;
Copy(x1, y1, x2, y2) - Копирует в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Cut(x1, y1, x2, y2) - Вырезает в буфер экселя&lt;br /&gt;
&lt;br /&gt;
Paste(x1, y1) - Вставляет из буфера экселя. Команды copy-paste неразрывны, если что нибудь сделать в промежутке между ними, например вставить значение в ячейку, то копирование сброситься. (Последовательность использования: copy - paste, cut - paste)&lt;br /&gt;
&lt;br /&gt;
PasteStyle(x1, x2, y1, y2) - Вставляет только оформление из буфера экселя (Последовательность использования:  Copy - PasteStyle)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Изображения'''''&lt;br /&gt;
&lt;br /&gt;
InsertPicture(TPicture, [x=1, y=1, DispX=0, DispY=0, width=0, height=0]) - Функция вставляет рисунок на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки, width, height (не работает для DirectExcel) - ширина и высота области рисунка в пойнтах-единицах Excel &lt;br /&gt;
&lt;br /&gt;
InsertFirmLogo(FirmCode, [x=1, y=1, DispX=0, DispY=0]) - Функция вставляет логотип фирмы с кодом FirmCode на текущий активный лист. x, y - координаты ячейки, относительно которых размещается рисунок, DispX, DispY - смещение рисунка относительно верхнего левого угла этой ячейки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Вывод'''''&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки. Функция закрывает текущий файл, и не может использоваться для файлов, закрытие которых запрещено.&lt;br /&gt;
&lt;br /&gt;
SheetFitPageWidth - устанавливает режим масштабирования печати, чтобы печатная форма помещалась в ширину на один лист.&lt;br /&gt;
&lt;br /&gt;
SetOrientation(value) - Устанавливает ориентацию страницы. True (по-умолчанию) - альбомная (ландшафтная), Ложь - портретная.&lt;br /&gt;
&lt;br /&gt;
PrintOut([copies]) - Печатает текущий лист на принтере по умолчанию. Параметр copies - количество копий, по умолчанию равен 1.&lt;br /&gt;
&lt;br /&gt;
Save(filename) - Сохраняет в файл filename. Если файл существует, в основной системе он будет перезаписан, в других проектах - вызовет ошибку &amp;quot;Файл уже существует&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SetVisible(b) – Устанавливает видимость приложения Excel для пользователя. По-умолчанию – false (не видимо).&lt;br /&gt;
&lt;br /&gt;
DoNotDestroy(b) – При уничтожении объекта TExcel (а он уничтожается, как и все остальные объекты автоматически при завершении выполнения скрипта), приложение Excel уничтожается вместе с ним. DoNotDestroy(true) отключает уничтожение приложения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования'''''&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'myxl');&lt;br /&gt;
 myxl.OpenFile('c:\asdf.xlsx');&lt;br /&gt;
 set($sum, 0);&lt;br /&gt;
 while (myxl.EOF=0, &lt;br /&gt;
      set($sum, $sum+int(myxl.c));&lt;br /&gt;
      myxl.next );&lt;br /&gt;
 $sum&lt;br /&gt;
 &lt;br /&gt;
 ''Возвращает сумму всех числовых данных столбца C файла 'c:\asdf.xlsx'''&lt;br /&gt;
&lt;br /&gt;
== Объект TDirectExcel ==&lt;br /&gt;
Объект позволяет работать с файлами Excel напрямую, без установленного пакета MsOffice. Применяется в сервисах и при отсутствии экселя. Он максимально совместим с объектом TExcel, однако некоторые методы могут быть не реализованы. &lt;br /&gt;
&lt;br /&gt;
== Объект TCSVFile ==&lt;br /&gt;
Предназначен для доступа к данным документов CSV. Разделителем столбцов является символ точка с запятой ;&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
FileName – Возвращает имя текущего файла.&lt;br /&gt;
&lt;br /&gt;
OpenFile(FileName) – Открывает файл FileName.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB[, Headered=false]) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO.&lt;br /&gt;
&lt;br /&gt;
LoadFromText(s) - Загружает таблицу из строки s.&lt;br /&gt;
&lt;br /&gt;
RecNo – Возвращает номер текущей строки. Нумерация строк начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetRecNo(aRecNo) – Устанавливает значение свойства RecNo.&lt;br /&gt;
&lt;br /&gt;
A..ZZ – Возвращает значение соответствующего поля текущей строки. Может вызываться с целочисленным аргументом, указывающим на сдвиг относительно текущей строки. Например: AC(-1) – вернет значение столбца AC предыдущей строки. Если номер строки окажется вне допустимых значений вернет пустую строку.&lt;br /&gt;
&lt;br /&gt;
First – Делает первую запись листа текущей.&lt;br /&gt;
&lt;br /&gt;
Next – Увеличивает значение свойства RecNo на единицу в случае, если конец файла не достигнут. Иначе – выставляет свойство EOF в истину.&lt;br /&gt;
&lt;br /&gt;
EOF – Возвращает признак достижения конца файла.&lt;br /&gt;
&lt;br /&gt;
RecordCount – Возвращает количество строк в листе.&lt;br /&gt;
&lt;br /&gt;
SendEmail(Server, Port, User, Pass, AddressFrom, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). &lt;br /&gt;
&lt;br /&gt;
SendEmail(EmailFromStr, AddressTo, MsgText, Subject) – Отправляет письмо по e-mail с указанными параметрами. В случае ошибки отправки вызывает ошибку (рекомендуется использовать совместно с TRY). EmailFromStr – строка, содержащая данные для отправки письма – адрес SMTP-сервера, порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
SaveToFile(Filename) - Сохраняет в файл с именем filename.&lt;br /&gt;
&lt;br /&gt;
== Объект TADO ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к базам данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|Connect(ConnectionString)&lt;br /&gt;
|Подключает к источнику данных. ConnectionString – Строка подключения ADO.&lt;br /&gt;
|-&lt;br /&gt;
|ConnectMySQL(DBServer, DBPort, DBUser, DBPass, DBName)&lt;br /&gt;
|Подключает к базе данных MySQL.&lt;br /&gt;
|-&lt;br /&gt;
|Open(Query)&lt;br /&gt;
|Открывает набор данных выполнив запрос Query.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByNo(i)&lt;br /&gt;
|Возвращает значение поля с номером i. Нумерация полей – с нуля.&lt;br /&gt;
|-&lt;br /&gt;
|FieldName(i)&lt;br /&gt;
|Возвращает имя поля с номером i.&lt;br /&gt;
|-&lt;br /&gt;
|FieldCount&lt;br /&gt;
|Возвращает количество  полей.&lt;br /&gt;
|-&lt;br /&gt;
|RecordCount&lt;br /&gt;
|Возвращает количество записей.&lt;br /&gt;
|-&lt;br /&gt;
|RecNo&lt;br /&gt;
|Возвращает номер текущей записи. ''ВНИМАНИЕ! В зависимости от способа подключения к БД нумерация может начинаться как с 0 так и с 1!''&lt;br /&gt;
|-&lt;br /&gt;
|EOF&lt;br /&gt;
|Возвращает признак достижения конца набора данных. Становится истиной когда выполняется команда Next на последней записи.&lt;br /&gt;
|-&lt;br /&gt;
|Next&lt;br /&gt;
|Переход на следующую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|First&lt;br /&gt;
|Переход на первую запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|Last&lt;br /&gt;
|Переход на последнюю запись набора.&lt;br /&gt;
|-&lt;br /&gt;
|FieldByName(FieldName)&lt;br /&gt;
|Возвращает значение поля по имени. Также возможно указание имени поля как свойства объекта.&lt;br /&gt;
|-&lt;br /&gt;
|Field(Table, ID, FieldName)&lt;br /&gt;
|Возвращает значение поля FieldName записи с кодом ID таблицы Table. Набор данных, если он открыт, при этом не закрывается. Первичный ключ таблицы должен называться «code». Гарантированно работает только с MYSQL!!!&lt;br /&gt;
|-&lt;br /&gt;
|GetSQLValue(Query)&lt;br /&gt;
|Выполняет SQL-запрос. Текст запроса должен начинаться с первого символа строки (перед запросом не должно быть пробелов, переносов строк, комментариев и т.д.). Если запрос Insert – возвращает ID вставленной записи. Если запрос – Update, Delete, Replace, Set, Start, Commit, Rollback – возвращает количество измененных записей (RowsAffected), иначе – Select – значение первого поля первой строки результата как текст.&lt;br /&gt;
|-&lt;br /&gt;
|FillText(s)&lt;br /&gt;
|Возвращает строку s с замененными названиями полей между знаками процента на соответствующие значения текущей записи. Так же в строке возможно использование интерпретируемого кода, заключенного между тегами &amp;quot;&amp;lt;?&amp;gt;&amp;quot; и &amp;quot;&amp;gt;&amp;quot;. При интерпретации система сначала производит замену полей с процентами на значения, потом интерпретирует код. ''Внимание! Функция не создает отельный контекст интерпретатора, а использует существующий, в нем доступны все объекты и переменные, вызывающего скрипта.'' Дополнительно автоматически создается объект TSelfADO, подключенный к той же БД, что и контекст, вызвавший функцию, с пустым именем, а так же с именем &amp;quot;dataset&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|Query(Query)&lt;br /&gt;
|Синоним GetSQLValue.&lt;br /&gt;
|-&lt;br /&gt;
|Close&lt;br /&gt;
|Закрывает набор данных.&lt;br /&gt;
|-&lt;br /&gt;
|Self&lt;br /&gt;
|Возвращает указатель на подключение к БД для использования в других объектах.&lt;br /&gt;
|-&lt;br /&gt;
|ParseForIn([FieldName='code']) &lt;br /&gt;
|Возвращает через запятую значения всех строк в указанном столбце. По умолчанию, используется столбец с именем code.&lt;br /&gt;
|-&lt;br /&gt;
|GetSQL&lt;br /&gt;
|Для отладки. Возвращает последний SQL запрос переданный в методы Open, Query, GetSQLValue&lt;br /&gt;
|-&lt;br /&gt;
|ExportExcel&lt;br /&gt;
|Для отладки. Выгружает в эксель содержимое датасета. Можно использовать в незнакомом окружении для понимания передаваемых полей в : шаблонах, печатных формах и т.д. Аналог команды %echo% в шаблонах, на случай если она не сработает.&lt;br /&gt;
|-&lt;br /&gt;
|OnGetText&lt;br /&gt;
|Функция подменяет текстовый вывод значения поля при выгрузке в эксель. Первый параметр это имя поля, которое надо подменить. Второй параметр это то что необходимо вывести. Работает только с текстовыми полями. &lt;br /&gt;
'''''Пример использования'''''  &lt;br /&gt;
  DB.OnGetText('Зона', IF((DB.FieldByName('-Lat') ! 0) * (DB.FieldByName('-Lon') ! 0),&lt;br /&gt;
       	GetPolygonByLatLon(DB.FieldByName('-Lat'), DB.FieldByName('-Lon'), 'TYPE = 1 AND IFNULL(zone, 0) &amp;gt; 0 AND PRICE = ' + DB.FieldByName('-price'), 'zone')&lt;br /&gt;
  ,&lt;br /&gt;
        ''&lt;br /&gt;
  ));&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования – см. TSelfADO&lt;br /&gt;
&lt;br /&gt;
== Объект TSelfADO ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наследник объекта TADO. Служит для подключения к «родной» для программы, в которой выполняется скрипт, базе данных. Обладает всеми свойствами и методами объекта TADO, кроме Connect. Иногда автоматически создается системой для обеспечения простого доступа к базе данных, а также иногда создается системой с уже открытым набором данных для передачи обрабатываемого системой набора данных в скрипт. В этом случае для скрипта недоступны функции Open и Close.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&lt;br /&gt;
 rem('Копируем данные из &amp;quot;родной&amp;quot; базы данных в базу MSSQL.');&lt;br /&gt;
 new('TSelfADO', 'MyDB');&lt;br /&gt;
 new('TADO', 'MSSQL');&lt;br /&gt;
 MSSQL.Connect('Provider=SQLOLEDB.1;Password=myPassword;Persist Security Info=True;User ID=myUsername;Initial Catalog=myDataBase;Data Source=myServerAddress');&lt;br /&gt;
 MyDB.Open('select code, name, passport from kurier where code&amp;gt;'+Int(MSSQL.Query('select max(code) from kurier'))+' order by code');&lt;br /&gt;
 While(MyDB.EOF=0,&lt;br /&gt;
      MSSQL.Query('insert kurier (code, name, passport) VALUES ('+MyDB.Code+', '+QuotedStr(MyDB.Name)+', '+QuotedStr(MyDB.Passport)+')');&lt;br /&gt;
      MyDB.Next;&lt;br /&gt;
      );&lt;br /&gt;
&lt;br /&gt;
== Объект TPrinter ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предназначен для доступа к принтерам.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
BeginDoc – Начинает новый документ.&lt;br /&gt;
&lt;br /&gt;
EndDoc – Закрывает документ&lt;br /&gt;
&lt;br /&gt;
PageHeight – Возвращает высоту страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageWidth – Возвращает ширину страницы в пикселях&lt;br /&gt;
&lt;br /&gt;
PageNumber – Возвращает номер текущей страницы документа&lt;br /&gt;
&lt;br /&gt;
Orientation – Возвращает текущую ориентацию страницы (0 – портретная, 1 – ландшафтная)&lt;br /&gt;
&lt;br /&gt;
Printing – Возвращает истину если документ открыт&lt;br /&gt;
&lt;br /&gt;
SetOrientation(Orientation) – Устанавливает ориентацию страницы. При необходимости начинает новый документ, новую страницу.&lt;br /&gt;
&lt;br /&gt;
ShowDialog – Показывает пользовательский диалог печати. Возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
NewPage – Начинает новую страницу&lt;br /&gt;
&lt;br /&gt;
Canvas – Предоставляет доступ к объекту TCanvas, связанному с принтером.&lt;br /&gt;
&lt;br /&gt;
PrinterNames – Возвращает список принтеров, установленных в системе, разделенный переносами строк&lt;br /&gt;
&lt;br /&gt;
PrintersCount – Возвращает количество установленных в системе принтеров&lt;br /&gt;
&lt;br /&gt;
SetPrinter(Printer) – Устанавливает текущий принтер. Если передана строка – ищет принтер по названию, иначе – по номеру. Нумерация начинается с 0.&lt;br /&gt;
&lt;br /&gt;
PrintTable(Y, Table) – Выводит на печать таблицу Table типа TTable, начиная с координаты Y. При необходимости таблица печатается на нескольких страницах. Возвращает координату Y конца таблицы.&lt;br /&gt;
&lt;br /&gt;
GetDefaultPrinter - Возвращает имя текущего активного принтера.&lt;br /&gt;
&lt;br /&gt;
SetDefaultPrinter(Printer) – Запоминает предыдущий активный принтер и устанавливает новый текущий принтер. Printer - имя принтера. При необходимости нескольких последовательных вызовов SetDefaultPrinter рекомендуется между вызовами использовать RestoreDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
RestoreDefaultPrinter - Устанавливает активным принтер, который был текущим перед последним вызовом SetDefaultPrinter.&lt;br /&gt;
&lt;br /&gt;
== Объект TCanvas ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Предоставляет доступ к холсту объекта для прорисовки изображения.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
DPIX – Возвращает разрешение холста по горизонтали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
DPIY – Возвращает разрешение холста по вертикали в точках на дюйм&lt;br /&gt;
&lt;br /&gt;
TextOut(x, y, s[, x1, y1, x2, y2]) – Выводит строку s начиная с точки с координатами x и y. Если указаны параметры x1, y1, x2, y2 – то выводимый текст ограничивается заданным прямоугольником.&lt;br /&gt;
&lt;br /&gt;
TextOutEx(x1, y1, x2, y2, Alignment, Font, s, Indent) – Выводит строку s в прямоугольнике с координатами x1, y1, x2, y2. По горизонтали строка выравнивается в соответствии с Alignment (0 – прижато влево, 1 – вправо, 2 – по центру), по вертикали выравнивается по центру. Используя шрифт Font (см описание ниже). Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату X фактического окончания текста (правой стороны – если строка прижата влево, и левой – в остальных случаях)&lt;br /&gt;
&lt;br /&gt;
MLTextOut(x1, y1, x2, y2, Alignment, VAlignment, Font, s, Heigth, Indent) – Выводит многострочный текст s в прямоугольнике с координатами x1, y1, x2, y2 с переносом по словам. По горизонтали строки выравниваются в соответствии с Alignment, по вертикали – в соответствии с VAlignment (0 – прижато вверх, 1 – по центру, 2 – прижато вниз). Используя шрифт Font (см описание ниже). Heigth – высота строки. Если опущено или равно нулю – высота определяется автоматически в соответствии с выбранным шрифтом. Indent – отступ по горизонтали, расстояние в пикселях между границей прямоугольника и текстом. Функция возвращает координату Y фактического окончания текста (нижней границы последней строки текста. ''ВНИМАНИЕ! Функция использует координаты прямоугольника для позиционирования текста, однако она не ограничивает его верхней и нижней границами этого прямоугольника!''&lt;br /&gt;
&lt;br /&gt;
DrawPic(x1, y1, x2, y2, Pic, Style, Alignment, Mode) – Прорисовывает изображение Pic (ссылка на изображение TPicture.Self) в прямоугольник заданный координатами x1-y2. Style – стиль масштабирования. 0 – растянуть изображение до границ прямоугольника не сохраняя пропорции, 1 – вписать изображение в прямоугольник сохраняя пропорции – вероятно, останутся поля по вертикали или горизонтали, 2 – вписать сохраняя пропорции, обрезав при необходимости изображение по вертикали или горизонтали. Alignment – выравнивание по горизонтали. Работает только в случае если style=1 и при растягивании изображения получились вертикальные поля. 0 – разместить по центру, 1 – прижать влево, 2 – прижать вправо. Функция возвращает координату X правой стороны изображения кроме случая, когда Style=1 и Alignment=2 – в этом случае возвращается координата левой стороны изображения. Mode - способ наложения изображения. 0 (по-умолчанию) - копирование как есть. 1 - Наложение операцией AND (применяется для получения эффекта прозрачности изображения), 2 - наложение операцией XOR (Применяется для возможности повторной операцией убрать изображение), 3 - Наложение операцией OR.&lt;br /&gt;
&lt;br /&gt;
FillRect(x1, y1, x2, y2) – Рисует прямоугольник '''без границ''' и закрашивает цветом BrashColor&lt;br /&gt;
&lt;br /&gt;
Rect(x1, y1, x2, y2) – Рисует прямоугольник '''c границами''', задаваемыми текущим пером, и закрашивает цветом BrashColor &lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Устанавливает шрифт по-умолчанию.&lt;br /&gt;
&lt;br /&gt;
SetPen(Width, Color) - Устанавливает параметры &amp;quot;ручки&amp;quot; - толщину и цвет. Если любой параметр опустить, соответствующее значение не будет изменено.&lt;br /&gt;
&lt;br /&gt;
SetBrush(Color, Style) - Устанавливает параметры заливки - цвет и стиль. Если любой параметр опустить, соответствующее значение не будет изменено. Стили заливки: 0 - сплошная, 1 - отсутствует (прозрачная), 2-7 - различные виды штриховки (горизонтальные, вертикальные, в клеточку и т.д.).&lt;br /&gt;
&lt;br /&gt;
TextHeight(s) – Возвращает высоту текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
TextWidth(s) – Возвращает ширину текста s в пикселях без учета многострочности, с учетом текущего шрифта.&lt;br /&gt;
&lt;br /&gt;
Использование шрифта (Font): У объекта TCanvas есть «глобальные» установки шрифта. Однако для некоторых функций возможно указание шрифта, отличающегося от глобального. Параметры шрифта – это текстовая строка, состоящая из 6-ти параметров, разделенных запятыми: Название, размер, жирный, курсив, подчеркнутый, цвет. Например:&lt;br /&gt;
&lt;br /&gt;
 'Times New Roman, 8, Y, N, N, 255'&lt;br /&gt;
&lt;br /&gt;
Любой параметр можно опустить, и тогда вместо него будет использовано значение по-умолчанию: шрифт: arial, размер – 10, не жирный, не курсив, не подчеркнутый, цвет – черный. Например: ', 7' – указывает, что по-умолчанию нужно взять все параметры кроме размера шрифта. Также можно вместо всей строки указать тире ('-') или пустую строку, и шрифт будет использоваться «глобальный».&lt;br /&gt;
&lt;br /&gt;
Объект можно создать отдельно, не создавая объект TPrinter. В таком случае объект создастся как ссылка на текущий холст принтера (принтер должен быть запущен и начат новый документ). Такой подход используется в доп. возможности PrintCustomSticker&lt;br /&gt;
&lt;br /&gt;
== Объект TPicture ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с графическими изображениями форматов BMP, GIF, JPEG и PNG, а также для формирования штрих-кодов. Обратите внимание, прозрачность изображений не поддерживается, однако в методе TCanvas.DrawPic есть параметр Mode, призванный создавать эффект прозрачности.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(FileName) – Загружает изображение из файла FileName. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB, Query) – Загружает изображение из базы данных. DB – ссылка на подключение к базе данных TADO.Self, Query – текст запроса. Запрос должен вернуть в первом поле первой строки BLOB-поле с изображением, все остальные данные возвращаемые запросом игнорируются. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
LoadFromStr($s) – Загружает изображение из строки $s. Возвращает истину, если операция прошла успешно, иначе – ложь.&lt;br /&gt;
&lt;br /&gt;
CreateBar(Width, Height, BarCode, Textless, Type) – Формирует штрих-код шириной Width и высотой Height с типом кодирования Type. BarCode – текст штрих-кода. Булево значение Textless указывает, что в штрих-коде не должно быть человеко-читаемых символов если истинно. Type указывает тип кодирования: 0 (по-умолчанию) CODE128, 1 - EAN-13, 2 - Interleaved 2-5, 3-DataMatrix, 4-QRCode.&lt;br /&gt;
Штрихкод должен быть: Для EAN-13 цифровым 12 или 13 символов (13-й, контрольная сумма рассчитывается автоматически), для CODE128 - должен иметь состоять из допустимого для этого кодирования набора символов. Для Interleaved - должен состоять из четного числа цифр, контрольная сумма автоматически не рассчитывается. Если для Interleaved кода указано значение из 14-ти знаков, подпись цифр выводится в формате Почты России.&lt;br /&gt;
Внимание! Для кодов EAN-13 и Interleaved ширина штрих-кода Width не является точным значением получаемого на выходе изображения. Ширина изображения рассчитывается как максимальное кратное минимально возможной ширине, но не меньше минимально возможной. Конечную ширину можно получить в соответствующем свойстве объекта. Для кода CODE128 штрих-код на выходе может оказаться пустым, если указанной ширины штрих-кода не достаточно для его формирования.&lt;br /&gt;
Для кода DataMatrix можно установить режим для печати скрытых символов с кодами 29(GS) и 232(FCN1), которые требуются для формирования Честного Знака. Для этого необходимо в начале строки указать символ &amp;quot;[&amp;quot; и все разделители 01, 21, 91, 92 так же экранировать этими скобками. Должно получиться [01]02900002317701[21]k3LInNbH_oG0Q[91]EE06[92]YXiyKfiHjE4YE8b+YVMC1O5r8VtpplA3AwcCqrcG9Dk= . При формировании кода, включится режим формирования штрих-кода DataMatrix GS1, в начале будет добавлен символ с кодом 232 (FCN1), а потом будут добавлены разделители с кодом 29 (GS)&lt;br /&gt;
Функция возвращает 1 в случае успеха, или текст ошибки, если такая произошла.&lt;br /&gt;
&lt;br /&gt;
SetSize(Width, Height) - Устанавливает размер изображения.&lt;br /&gt;
&lt;br /&gt;
AsString([ImageFormat]) - Возвращает изображение в виде строки с двоичными данными. ImageFormat принимает значения 1 - Bitmap (по-умолчанию), 2 - jpeg, 3 - png, 4 - gif.&lt;br /&gt;
&lt;br /&gt;
Width – Возвращает ширину изображения.&lt;br /&gt;
&lt;br /&gt;
Height – Возвращает высоту изображения.&lt;br /&gt;
&lt;br /&gt;
Rotate(Angle) – Поворачивает изображение по часовой стрелке на угол Angle. Угол указывается в градусах и может принимать любые значения.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с изображением, используется в качестве параметра для функций, работающих с изображениями из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Canvas - ссылка на объект TCanvas холста изображения.&lt;br /&gt;
&lt;br /&gt;
== Объект TTable ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции для работы с таблицами. Удобен для печати таблицы на принтере. Алгоритм таков: Загружаем датасет в таблицу, настраиваем ее (шрифты, штрих-коды и т.д.), потом выводим на принтер функцией TPrinter.PrintTable.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
LoadFromDB(DB) – Загружает таблицу из набора данных, открытого в объекте DB типа TADO. Таблица загружается вместе с заголовками. Если название поля содержит подстроку «_RecNo» - данная подстрока не попадет в заголовок, а все значения поля будут заменены на порядковый номер записи в наборе данных, начиная с «1». В одной таблице допускается не более одного поля с порядковой нумерацией. Поля, названия которых начинаются в символа &amp;quot;-&amp;quot; не выгружаются. Заголовок – это первая строка таблицы.&lt;br /&gt;
&lt;br /&gt;
Cell(С, R) – Возвращает значение ячейки таблицы с координатами (C, R). Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
SetCell(С, R, Value) – Устанавливает значение ячейки таблицы с координатами (C, R) в Value. Нумерация строк и столбцов начинается с 1.&lt;br /&gt;
&lt;br /&gt;
RowCount – Возвращает количество строк в таблице.&lt;br /&gt;
&lt;br /&gt;
ColCount – Возвращает количество столбцов в таблице.&lt;br /&gt;
&lt;br /&gt;
SetTitleFont(Font) – Задает шрифт заголовка таблицы (первой строки).&lt;br /&gt;
&lt;br /&gt;
SetFont(Font) – Задает шрифт всей таблицы кроме заголовка.&lt;br /&gt;
&lt;br /&gt;
SetColFont(C, Font) - Устанавливает шрифт столбца C.&lt;br /&gt;
&lt;br /&gt;
SetIndent(Indent) – Задает отступ от границы ячейки до текста в процентах от ширины страницы. По-умолчанию значение 0.3&lt;br /&gt;
&lt;br /&gt;
SetWidth(С, Width) – Задает значение ширины столбца C в процентах от ширины страницы.&lt;br /&gt;
&lt;br /&gt;
SetMinRowHeght (Heght) – Задает значение минимальной высоты строки в пикселях. &lt;br /&gt;
&lt;br /&gt;
SetBarCode(Col, Type) - Указывает, что данные из столбца Col должны печататься в виде штрих-кода. Тип штрих-кода - Type. Значение '''&amp;quot;1&amp;quot; - EAN13'''. Для кода EAN13 первая строка данных в ячейке должна иметь вид &amp;quot;тип штрих-кода, номер&amp;quot;, например &amp;quot;7, 123&amp;quot; (без кавычек, конечно). В этом случае система сформирует штрих-код: &amp;quot;2700000001233&amp;quot;. Первая цифра - всегда 2, далее - указанный тип штрих-кода, нули, чтобы получилось 13 символов, номер, указанный в таблице, и один символ - контрольная сумма. Значение '''&amp;quot;2&amp;quot; - CODE128''' (с версии 734). Данные из первой строки ячейки таблицы печатаются в штрих-коде &amp;quot;как есть&amp;quot;. Для всех видов штрих-кода (с версии 734) последующие строки печатаются под штрих-кодом в виде текста.&lt;br /&gt;
&lt;br /&gt;
SetMultiHeader(Active) - Включает печать заголовка при переносе таблицы на несколько страниц. По умолчанию отключено.&lt;br /&gt;
&lt;br /&gt;
SetCustomHeader(script) - Включает печать пользовательского заголовка. Script - это код интерпретатора, который должен печатать заголовок на канву. Печать таблицы может происходить на нескольких листах, по этому скрипт будет вызван для каждого листа. При использовании этого метода, автоматически инициализируются переменные: $TablePageNo - номер страницы, нумерация начинается с нуля; $TableY - координата по оси Y, от которой рисуется заголовок. Чтобы таблица была под заголовком необходимо значение переменной $TableY увеличить на высоту заголовка.&lt;br /&gt;
&lt;br /&gt;
Self – Ссылка на объект с таблицей, используется в качестве параметра для функций, работающих с таблицами из данного объекта.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
 &amp;lt;?&amp;gt;&lt;br /&gt;
 NEW('TPrinter', 'Prn');&lt;br /&gt;
 If(prn.ShowDialog,&lt;br /&gt;
  NEW('TTable', 'Tbl'); &lt;br /&gt;
  NEW('TSelfADO', 'MyDB'); &lt;br /&gt;
  MyDB.Open('SELECT concat(&amp;quot;7&amp;quot;, &amp;quot;, &amp;quot;,  a.code, &amp;quot;\r\n&amp;quot;, a.client_id, &amp;quot;\r\n&amp;quot;, a.zakaz, &amp;quot;-&amp;quot;, a.number) as &amp;quot;Штрих-код&amp;quot;, a.target AS &amp;quot;Заказик&amp;quot;, address, phone, vlog, poruch FROM address a order by code desc limit 10');&lt;br /&gt;
  Tbl.LoadFromDB(MyDB.Self); &lt;br /&gt;
  Tbl.SetBarcode(1, 1);&lt;br /&gt;
  Tbl.SetCustomHeader(     &lt;br /&gt;
    if($TablePageNo&amp;gt;0,&lt;br /&gt;
      Prn.Canvas.TextOut(Prn.Canvas.DPIX*0.1, $TableY, 'Продолжение таблицы');&lt;br /&gt;
      set($TableY, $TableY + Prn.Canvas.TextHeight('H'));&lt;br /&gt;
    ,0)&lt;br /&gt;
  );&lt;br /&gt;
  Prn.BeginDoc; &lt;br /&gt;
  Prn.PrintTable(0, Tbl.Self);   &lt;br /&gt;
  Prn.EndDoc&lt;br /&gt;
 , );&lt;br /&gt;
&lt;br /&gt;
== Объект TBaseUtils ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции, базирующиеся на БД системы «MEASOFT». По-умолчанию, при создании подключается к основной базе данных модуля, в котором выполняется скрипт, если такая определена контекстом, однако это можно изменить, см SetConnection.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
'''MakeAddress(s[,town])''' – возвращает значение, полученное путем преобразований адреса s для приведения его к внутреннему формату программы. В процессе преобразования до нескольких раз происходит замена буквосочетаний по таблице замены (ее редактирование доступно по нажатию кнопки «Автозамена» в интерфейсе импорта БД из Excel системы (см. Руководство пользователя)), поиск улиц по базе КЛАДР с точностью до одного знака, и некоторые другие операции, нацеленные на исправление ошибок в написании адреса.&lt;br /&gt;
&lt;br /&gt;
С версии программы 2008.0.0.615, при вызове функции в формулах загрузки реестра, в первую очередь происходит проверка строки s на условия:&lt;br /&gt;
* в строке s записано  число; &lt;br /&gt;
* строка s начинается с &amp;quot;ПВЗ &amp;quot;. &lt;br /&gt;
Если одно из этих условий выполняется, то функция пытается установить пункт самовывоза - т.е она сама в загружаемой карточке корреспонденции укажет: адрес ПВЗ, город ПВЗ и установит галку самовывоз. &amp;lt;br/&amp;gt;Правила поиска ПВЗ:&lt;br /&gt;
* Если s число -  считаем его внутренним кодом филиала;&lt;br /&gt;
* Если s начинается с &amp;quot;ПВЗ &amp;quot; - Например в адресе передана строка &amp;quot;ПВЗ На Ленинском проспекте&amp;quot;, то искать будем филиал с названием &amp;quot;На Ленинском проспекте&amp;quot; который подчиненный, активный, с галкой ПВЗ и в городе town. Если город не указан, то ищем филиал во всех городах, и считаем его найденным если найдем только один филиал. &lt;br /&gt;
* Если филиалы найти не удалось, функция makeaddress работает как обычно и выполняет преобразование адреса.&lt;br /&gt;
&lt;br /&gt;
Если адрес не содержит русских букв, только латиница, и курьерская служба находится в одной из стран Россия, Белоруссия, Казахстан или Украина, и город-получатель (второй параметр, town) находится так же в одной из этих стран, функция автоматически делает транслитерацию адреса на русский язык.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''SetConnection(DB) – Подключает объект к базе данных DB, где DB – ссылка на объект TADO.Self.'' '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
''SetTown(Town) – Устанавливает код текущего города (используется в некоторых функциях объекта) в значение Town. По-умолчанию текущий город – 1.''  '''ВРЕМЕННО НЕ РАБОТАЕТ!'''&lt;br /&gt;
&lt;br /&gt;
'''SetIndexLength(Length)''' – Устанавливает длину почтового индекса. По-умолчанию – 6.&lt;br /&gt;
&lt;br /&gt;
'''GetIndex(Address)''' – Возвращает почтовый индекс из адреса.&lt;br /&gt;
&lt;br /&gt;
'''GetStreet(Address)''' - Возвращает улицу до первой запятой.&lt;br /&gt;
&lt;br /&gt;
'''GetHome(Address)''' - Возвращает номер дома до второй запятой, но не более пяти символов.&lt;br /&gt;
&lt;br /&gt;
'''GetKurierByStation(station, Mass, Cash, Date_Putn)'''&lt;br /&gt;
&lt;br /&gt;
'''TownByIndex(Index[, PriorityName][, PriorityCountry])''' – Возвращает код города по индексу. В случае ошибки поиска – код текущего города. Если нашлось несколько населенных пунктов, и указано приоритетное название - выбирается населенный пункт, название которого начинается с PriorityName (если есть).&lt;br /&gt;
&lt;br /&gt;
'''TownByName(Name[,NotNeedCL=False, City=0])''' – Возвращает код города по имени. В случае ошибки поиска – возвратит код текущего города. Если параметр NotNeedCL (параметр не обязательный) установить в TRUE, тогда функция возвратит 0, если город не удалось найти. Параметр City (код региона) позволяет ограничить поиск одной областью (не обязательный, по умолчанию не используется).&lt;br /&gt;
&lt;br /&gt;
'''FillClientInfo(Excel, client, Sheet, Row, Col)''' – Выводит в эксель информацию о клиенте с кодом client на лист sheet начиная со строки row и столбца col.&lt;br /&gt;
&lt;br /&gt;
'''SavePrintFormToFile(FormType, FormNumber)''' - Сохраняет на диске файл печатной формы и возвращает путь к нему&lt;br /&gt;
&lt;br /&gt;
'''CreateTrans(Address[, Store][, Operator][,Correction])''' - Формирует запись для печати кассового чека для корреспонденции с кодом Address, для выбора кассового аппарата используется код склада Store. Если Store не указано - при исполнении в среде клиентского модуля системы использует склад, указанный пользователем в окне [[Настройка параметров рабочего места|&amp;quot;Настройка&amp;quot; - &amp;quot;Параметры&amp;quot;]], в остальных модулях - код текущего склада из [[Настройка глобальных параметров|переменной]] &amp;quot;CL&amp;quot; (&amp;quot;Текущий филиал&amp;quot;). Поле Operator позволяет указать кассира (передается код справочника сотрудников). Если не указан, в основной системе будет использован код авторизованного пользователя, в других модулях - 1.&lt;br /&gt;
Поле Correction позволяет указать данные для корректировочного чека, используется в системе Штрих-М. По умолчанию пустая строка. Возвращает идентификаторы записей чеков. Может вернуть пустую строку, если чек создавать не понадобилось, один или несколько кодов через запятую, если создано несколько чеков. В случае ошибки вызывает ошибку, поэтому рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CreateReturnTrans(Address)''' - формирует запись для печати чека возврата для корреспонденции с кодом Address. Чек возврата печатается на полную сумму и с теми же атрибутами, что и чек продажи. Возвращает идентификатор записи чека возврата. В случае ошибки вызывает ошибку, поэтому, как и с CreateTrans,  рекомендуется использовать с функцией Try.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownDeliveryDays(Source, Mode, TownTo, TownFrom)''' - возвращает количество дней необходимых на доставку отправления, только для межгорода. Source - код клиента, Mode - режим срочности, TownFrom - код города отправителя, TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcDeliveryDate(Source, Mode, TownTo, TownFrom, Date_Beg, Time_beg)''' - Возвращает планируемую дату доставки с учетом сроков доставки. Работает при городской и междугородней доставке. Для межгорода сроки доставки берутся из зон. Для городской доставки, из дополнительных параметров статуса (17 статус, 1 параметр в доп. информации)  Если рассчитать дату планируемой доставки не удалось, возвращает пустую строку. Параметры: Source - код клиента, Mode - режим срочности, TownTo - город получатель, TownFrom - город отправитель, date_beg - дата заказа (может быть передана строкой в формате DD.MM.YYYY или в числовом), time_beg - время заказа. &lt;br /&gt;
&lt;br /&gt;
'''GenSpecialSMA(DirectExcel, Code)''' - функция для генерации отчета о доставке по акту передачи денег. Первый параметр - указатель на TDirectExcel, второй параметр - код акта передачи денег. АПД выводится на текущий лист объекта TDirectExcel.&lt;br /&gt;
&lt;br /&gt;
'''CreateSpecialSMA(ClientCode, DateTo)''' - Функция создает исходящий акт передачи денег (АПД). Требует ClientCode - код клиента, DateTo - дату акта. Функция возвращает коды созданных актов. Если возвращаемых параметров два, значит функция пыталась создать два АПД: первым, идет код АПД с наличной оплатой, а вторым с безналичной. Примеры возвращаемого результата: '0'- акт не был создан, отсутствуют корреспонденции; '124' - код созданного акта; '0,0' - пытались создать два акта, но отсутствуют данные; '4556,0' - создан только наличный АПД; '0,445' - создан только безнал.; '4556,445' - созданы нал. и безнал.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressForActDelivery(ActCode, [DeliveryDateMode=0, Delivery=True])''' - Функция создает корреспонденцию на доставку акта. ActCode - код акта; DeliveryDateMode: 0 - установить план. дату доставки текущим рабочим днем, 1 - установить план. дату доставки следующим рабочим днем, 2 - установить план. дату доставки равной планируемой дате оплаты АПД; Delivery - создать корр. на доставку АПД или создать корреспонденцию на забор АПД (по умолчанию, доставка АПД). Работа функции может быть изменена системной доп. возможностью OnCreateAddressForActDelivery.&lt;br /&gt;
&lt;br /&gt;
'''CreateAddressTransferAct(ClientCode, Store, DateTo, [AdditionalParam])''' - Функция создает исходящий акт передачи корреспонденции (АПК). Требует  ClientCode - код клиента, Store - код филиала, для которого будет создан акт, DateTo - дату, до которой в акт попадут возвраты, AdditionalParam - дополнительный строковый параметр для передачи в системную доп. возможность ExceptionsForAPK, позволяющий отобрать в акт, например, только полные возвраты.   Возвращает код созданного акта. ВНИМАНИЕ: при создании АПК используется системная функция ExceptionsForAPK. Если в ней используются интерактивные функции (вывод сообщений, диалоговые окна, выполнение скриптов), то акт сформирован не будет, а функция CREATEADDRESSTRANSFERACT вернет ошибку.     &lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByAddress(Address, TownCode, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попал адрес. Если полигон найти не удалось, функция возвратит пустую строку. Address - адрес корреспонденции текстом; TownCode - код города; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByAddress(addressrecord.address, if((addressrecord.number=0)*(addressrecord.strbarcode=&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;), addressrecord.townfrom, addressrecord.townto), '`schema`=1') - пытаемся найти вхождение адреса в полигоны 1 схемы, при выборе города учитывается корр. на забор, у нее нужно использовать город-отправитель (а для обычной корр. нужен город-получатель).&lt;br /&gt;
&lt;br /&gt;
'''GetPolygonByLatLon(Lat, Lon, where[, field='code'])''' - функция возвращает значение связанное с полигоном в который попали GPS координаты. Если полигон найти не удалось, функция возвратит пустую строку. Lat - широта  текстом; Lon - долгота текстом; where - SQL условие; field - необязательный параметр, определяет возвращаемое значение при найденном полигоне, по умолчанию равен &amp;quot;code&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
GetPolygonByLatLon('55.769064','37.590713','zone is not null and price=0') - пытаемся найти вхождение координат в полигоны, где задана зона, для всех клиентских и курьерских зон.&lt;br /&gt;
&lt;br /&gt;
'''GetLatLonByAddress(AddressText, TownCode)''' - возвращает географические координаты вида lat,lon указанного в AddressText адреса. Поиск производится в городе, имеющем код TownCode в таблице Town.&lt;br /&gt;
&lt;br /&gt;
'''GetRouteCode(AddressText, TownCode, LatLon[, Lon])''' - для адреса AddressText в городе с кодом TownCode (из таблицы Town) по географическим координатам lat, lon возвращает код роута (записи, хранящей координаты адреса в городе). Если роут не найден (для адреса в городе не найдено записи с указанными координатами) - создает новый роут и возвращает его код, если роут найден (был создан ранее) - обновляет у роута координаты. Если параметр Lon задан, то параметр LatLon должен содержать одну координату, иначе LatLon должен содержать строку вида 'lat, lon'.&lt;br /&gt;
В случае ошибки возвращает Null.&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode(address, townto, '55.114034, 36.592397'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Троицк, Полковника милиции Курочкина ул., 11', 1, '37.467446, 55.740537'));&amp;lt;br&amp;gt;&lt;br /&gt;
Set($res, GetRouteCode('Обнинск, Маркса пр., 20', TownByName('Обнинск'), 55.114034, 36.592397));&lt;br /&gt;
&lt;br /&gt;
'''CalcAgentPrice(AddressCode, AgentCode, TownFrom, TownTo, Mode, [, Count=1])''' - функция возвращает стоимость доставки рассчитанную по тарифу агента. AddressCode - код адреса, AgenCode - код филиала (агента), TownFrom - код города отправителя, TownTo - код города получателя, Mode - режим срочности, count - тарифная сетку от указанного количества отправлений (по умолчанию 1)&lt;br /&gt;
&lt;br /&gt;
'''SetAddrKol_vo(address, getkol_vo)''' - функция делает прием корреспонденции в текущем ответственном филиале. address - внутренний код адреса, getkol_vo - количество принимаемых мест, может принимать значения: &amp;quot;kol_vo&amp;quot; - принять все места, &amp;quot;getKol_vo+1&amp;quot; - принять еще одно место, &amp;quot;число&amp;quot; - сделать количество принятых мест равным указанному числу.&lt;br /&gt;
&lt;br /&gt;
'''CalcClientCnt(client_code, date, is_intown [, date_put=CurrDate(), skipajust=false])''' - функция расчета количество доставленных корреспонденций у клиента с кодом client_code за предыдущий месяц от даты date (Или за текущий месяц, подробнее смотри переменную UseCurrentMonthCount) среди внутригородских (is_intown = true) либо междугородних (is_intown = false) корреспонденций, date_put - дата доставки (для альтернативного способа подсчета, включаемого переменной UseDatePutForCalcCnt), skipajust - не учитывать принудительно введенные количества (таблица priceclientadjust типы записей 0 и 1).&lt;br /&gt;
&lt;br /&gt;
'''GetBasePrice''' - возвращает базовую стоимость доставки посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов,зоны,типа,срочности,массы, расстояния. В системах с выключенными доп. услугами также считает проценты от суммы и страховки. &lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset._self&amp;quot;.&lt;br /&gt;
  Описание некоторых полей датасета:&lt;br /&gt;
    pmoney - процент от суммы;&lt;br /&gt;
    pmoneycard - процент от суммы при оплате картой;&lt;br /&gt;
    pricecode - код прайса (таблица Price) ;&lt;br /&gt;
    distarea - район метро получателя (актуально при отключённом едином районировании, как правило район от 200 до 299 является признаком области);&lt;br /&gt;
    region - признак области при включенном едином районировании;&lt;br /&gt;
    distareaFrom и regionFrom  - аналог distarea, region только для отправителя;&lt;br /&gt;
    pcncode - код записи таблицы pricecnt &amp;quot;количество от&amp;quot;;&lt;br /&gt;
    Запрос содержит поля таблицы pricelinesnew - начальная стоимость по тарифной сетки, найденные без учета массы,только по типу срочности и режиму.&lt;br /&gt;
    Запрос содержит поля таблицы price.&lt;br /&gt;
&lt;br /&gt;
*addressrecord - ссылка на объектную модель карточки корреспонденции, следует использовать уже созданную addressrecord._self&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*type - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*wait - количество минут ожидания (не учитывается при доп. услугах, есть системная услуга &amp;quot;ожидание&amp;quot;);&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*rur - сумма передаваемых денег (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от суммы&amp;quot;);&lt;br /&gt;
*inshprice - сумма страховки (не учитывается при доп. услугах, есть системная услуга &amp;quot;процент от объявленной стоимости&amp;quot;);&lt;br /&gt;
*distance - расстояние до места доставки, обычно поле заполняется при доставке в область (регион в едино районировании). Дополнительная наценка к стоимости доставки;&lt;br /&gt;
*forward - направление доставки: true - туда; false - обратно;&lt;br /&gt;
*Collection - признак заборной корреспонденции: true - забор, false - доставка (В тарифе есть возможность указать стоимость для забора);&lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
В тарифе есть возможность указать формулу, которая может влиять на базовый расчет. Формула может объявить служебные переменные, которые:&lt;br /&gt;
*$FormulaReplace - если true – возвращаемое значение полностью заменяет базовый расчет;&lt;br /&gt;
*$FormulaKoeff - коэффициент на который будет помножена базовая стоимость.&lt;br /&gt;
Также внутри формулы объявлены следующие объекты dataset, addressrecord и переменные:&lt;br /&gt;
*$ForceIntown - Переменная становится истиной, если междугородний расчет был отменен, т.к. адрес попал в нарисованную зону на карте.&lt;br /&gt;
*а также: $forward, $distance, $Count, $Collection, $Wait, $FormulaKoeff, $PriceCode - описание есть выше.&lt;br /&gt;
&lt;br /&gt;
Для направления &amp;quot;туда&amp;quot;, Функция GetBasePrice вызывается  через доп. услугу &amp;quot;База&amp;quot; (при включенных доп. услугах), для направления &amp;quot;Обратно&amp;quot; всегда вызывается напрямую (т.к. доп. услуги работают только в для направления &amp;quot;туда&amp;quot;).&lt;br /&gt;
На расчет этой функции влияют следующие переменные: &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Расчет стоимости по адресу&amp;quot;, &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Зона клиента по умолчанию&amp;quot;,  &amp;quot;Финансы&amp;quot; -&amp;gt; &amp;quot;Подсчет кол-ва отправлений за месяц&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''CalcTownPrice''' - возвращает базовую стоимость междугородней доставки, посчитанную по тарифной сетке клиента в зависимости от :кол-ва заказов, типа, срочности, массы, расстояния.&lt;br /&gt;
Описание параметров:&lt;br /&gt;
&lt;br /&gt;
*ds  - ссылка на объект датасета с основными параметрами расчета цены. Значение по умолчанию доступно в формулах тарифа и доп. услуг, через вызов &amp;quot;dataset.self&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*count - количество корреспонденций от клиента. (может показывать кол-во корреспонденции в текущем заказе или за прошлый месяц, в зависимости от выбранной схемы подсчета заказов в тарифе)&lt;br /&gt;
*tp - тип корреспонденции;&lt;br /&gt;
*mode - режим доставки;&lt;br /&gt;
*mass - масса отправления; &lt;br /&gt;
*TownFrom - код города отправителя;&lt;br /&gt;
*TownTo - код города получателя.&lt;br /&gt;
&lt;br /&gt;
'''CalcAddressPrice(AddressCode, [,ZakazCount])''' - полностью пересчитывает стоимость доставки корреспонденции по тарифу клиента. AddressCode - внутренний код адреса, ZakazCount - не обязательный параметр, кол-во заказов от клиента.&lt;br /&gt;
&lt;br /&gt;
'''GetStationCode(s [,town])''' – возвращает код станции метро, ассоциированный в системе с адресом s. В случае невозможности идентифицировать станцию метро – возвращает 0. &lt;br /&gt;
Когда включено районирование по карте, необходим второй параметр &amp;quot;town&amp;quot; - код города в котором нужно искать адрес.  Возвращает код района если удалось его найти; код станции меж-города - если адрес удалось геокодировать, но район не нашли; код 0 - когда не удалось геокодировать адрес.&lt;br /&gt;
&lt;br /&gt;
'''RecalcSpecialSMA(ActCode)''' - пересчитать акт передачи денег (АПД). Также, у корреспонденций входящих в АПД будет пересчитана стоимость доставки. Для Входящего АПД сумма акта не пересчитывается. Параметр ActCode - внутренний код акта, коды можно перечислять через запятую.&lt;br /&gt;
&lt;br /&gt;
'''UserCode''' - Возвращает код текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserName''' - Возвращает имя текущего пользователя из таблицы «Пользователи» (users).&lt;br /&gt;
&lt;br /&gt;
'''UserPass''' - Возвращает пароль текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''UserBaseCode''' – Возвращает код текущего пользователя из таблицы «Сотрудники» (kurier).&lt;br /&gt;
&lt;br /&gt;
'''UserEmail''' - Возвращает e-mail текущего пользователя.&lt;br /&gt;
&lt;br /&gt;
'''CurrentTown''' – Возвращает код текущего города (из таблицы town).&lt;br /&gt;
&lt;br /&gt;
'''CurrentCity''' – Возвращает код текущего региона (из таблицы city).&lt;br /&gt;
&lt;br /&gt;
'''CurrentLocation''' – Возвращает код текущего филиала (из таблицы store).&lt;br /&gt;
&lt;br /&gt;
'''FromEmailStr''' - строка, содержащая данные для отправки письма – адрес SMTP-сервера (также к имени сервера можно добавить протокол ssl:// или tls://), порт, логин, пароль и email отправителя, разделенные символом переноса строки.&lt;br /&gt;
&lt;br /&gt;
'''FillExcelDoc'''(Excel, Dataset, FormType, FormNumber,Print,[printer]) - Выполняет указанную печатную форму в объекте excel. Excel объект можно не указывать, тогда функция сама создаст объект экселя и разрушит его, полезно когда книгу &lt;br /&gt;
нужно распечатать или отправить по email (на листе данных в ячейке 1,1 укажите ключевое слово email). Dataset объект с данными для скрипта в печатной форме, может быть null. Dataset передавать можно так db.self, тогда переданный dataset внутри печатной формы будет доступен по имени dataset. Print - печатает книгу на принтере, после печати объект excel разрушается, при использовании параметра не указываете объект excel. Printer - имя принтера, на котором печатать (по умолчанию пустая строка, что означает &amp;quot;печатать на принтере по умолчанию&amp;quot;). Например:&lt;br /&gt;
&lt;br /&gt;
 new('TExcel', 'excel');&lt;br /&gt;
 FillExcelDoc(excel.self, null, 12, 1);&lt;br /&gt;
 excel.DoNotDestroy(true);&lt;br /&gt;
 excel.SetVisible(true);&lt;br /&gt;
 ''Покажет эксель с выполненной печатной формой''&lt;br /&gt;
&lt;br /&gt;
'''ValutaSign''' – Возвращает название валюты для суммы.&lt;br /&gt;
&lt;br /&gt;
'''SendToMeasoft(xml)''' - Отправляет запрос в клиентское API Measoft. Автоматически добавляет начальный &amp;quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''InsertFirmAtt(excel, sheet, firmcode)''' - Вставляем на лист эксель по коду фирмы: печать, подпись, подпись бухгалтера, логотип. Тэги &amp;lt;STAMP&amp;gt;, &amp;lt;DIR&amp;gt;, &amp;lt;BUH&amp;gt;, &amp;lt;LOGO&amp;gt; соответственно. После тега можно указать размеры изображения в символах Microsoft Excel. Формат записи: &amp;lt;STAMP&amp;gt; 16, 16&lt;br /&gt;
&lt;br /&gt;
'''PreCalcSalary(kurier, addressCodes)''' - Рассчитывает предварительную зарплату. Kurier - код курьера, используется для определения тарифа. addressCodes - коды адресов, через запятую для которых необходимо посчитать зарплату. Результаты расчета будут записаны в таблицу kurierpaydetail, так как расчет предварительный то записи не будут прикреплены к конкретному начислению. &lt;br /&gt;
&lt;br /&gt;
  select a.code, kpd.price as &amp;quot;туда&amp;quot;, kpd2.price as &amp;quot;обратно&amp;quot; from address a &lt;br /&gt;
  left join kurierpaydetail kpd on kpd.sourcetable=3 and kpd.sourcecode=a.code and kpd.rectype = 1 &lt;br /&gt;
  left join kurierpaydetail kpd2 on kpd2.sourcetable=3 and kpd2.sourcecode=a.code and kpd2.rectype = 2&lt;br /&gt;
  where a.code in (...)&lt;br /&gt;
&lt;br /&gt;
'''CalcSalary(DateTo, [Filter=0, KurierCode = 0, ManagerCode = 0])''' - Полный расчет зарплаты курьерам. DateTo  - дата до которой создается начисление. Условия отбора курьеров для начисления. Filter - роль сотрудника: 0 - Все, 1 - курьеры, 2 - менеджеры; KurierCode - код курьера, ограничить расчет зарплаты одним курьером;ManagerCode - код курьера, ограничить расчет зарплаты курьерами указанного менеджера. Внимание фильтры Filter, KurierCode и ManagerCode накладываются друг на друга. Результатом функции является SubSQL с информацией по созданным начислениям. &lt;br /&gt;
  поля ответа: код курьера, код менеджера, начислено, бонусы, штрафы, аванс, итого;&lt;br /&gt;
  select kurier, manager, profit, bonus, shtraf, prepay, total  [union select ...]&lt;br /&gt;
&lt;br /&gt;
'''SelDistAddr(s)''' – Возвращает строку для вставки в select запрос, для вывода поля с упрощенным адресом. Принимает один необязательный строковый параметр - алиас таблицы из которой будет упрощаться поле address, по умолчанию &amp;quot;a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''VoiceReadStr(str)''' – Озвучивает фразу str голосовым уведомлением доступными словами из базы. Может содержать тег &amp;quot;{break_off}&amp;quot; для того, чтобы сделать эту фразу не пропускаемой в очереди воспроизведения.&lt;br /&gt;
&lt;br /&gt;
'''CalcStorageCost(ClientCodes, DateFrom, DateTo, NeedReport[, Store])''' – рассчитывает стоимость хранения на складе для выбранных клиентов (ClientCodes - коды клиентов через запятую), в период дат с DateFrom до DateTo, с прикреплением к корреспонденции отчета в зависимости от выставленного параметра NeedReport. Может содержать параметр Store - код филиала, по умолчанию пустой (расчет выполняется для всех филиалов). Возвращает коды созданных корреспонденций через запятую.&lt;br /&gt;
&lt;br /&gt;
'''WriteOut(DocId, ItemId, Date, Cnt[, BC])''' – производит списание товара со склада. DocId - код (docs.code) документа списания, ItemId - код товара (item.code), Date - дата операции, Cnt - количество списываемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер. Если указан BC, то параметр ItemId игнорируется и поиск номенклатуры происходит исключительно по штрих-коду. В случае успеха, функция возвращает строку вида: код номенклатуры, списанное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''IncomePurch(DocId, ItemId, Date, Cnt[, BC, Location = CurrentLocation])''' – производит приход товара на склад. DocId - код (docs.code) приходной накладной, ItemId - код товара (item.code), Date - дата операции, Cnt - количество приходуемого товара, BC- штрих-код товара, для товара с учетом серийных номеров нужно обязательно указывать серийный номер, Location - код склада (store.code).  В случае успеха, функция возвращает строку вида: код номенклатуры, введенное кол-во.&lt;br /&gt;
&lt;br /&gt;
'''CreateLedgerDoc(Date, Client, UserCode, Type[, ExtNumber, Message])''' - создает складской документ и возвращает код этого документа. Date - дата документа. Client - код клиента. UserCode - код пользователя, создавшего документ. Type - тип документа (statetype = 13). ExtNumber - номер у поставщика для документов прихода и расхода. Message - комментарий к документу. Последние два аргумента не обязательные и могут быть пустыми.&lt;br /&gt;
&lt;br /&gt;
== Объект TINIFile ==&lt;br /&gt;
&lt;br /&gt;
Предоставляет функции работы с ini-файлами. В некоторых контекстах создается автоматически для предоставления доступа к настроечному файлу модуля, выполняющего скрипт.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
IniParam(s[,section='common']) – Существует только если имя экземпляра объекта пустое. Возвращает значение параметра s ini-файла секции «common», изменить секцию можно не обязательным параметром section. В случае отсутствия параметра в файле возвращает пустую строку. &lt;br /&gt;
&lt;br /&gt;
Param(s) – Синоним IniParam с тем отличием, что существует только если имя объекта непустое.&lt;br /&gt;
&lt;br /&gt;
SetText(s) - Загружает ini файл из строки s. Если в файле нет секции «common», то принудительно объявляет ее в начале.&lt;br /&gt;
&lt;br /&gt;
== Объект TSMS ==&lt;br /&gt;
&lt;br /&gt;
Предназначен для отправки SMS, а также проверки статуса их доставки.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetProxy(Server, Port, User, Pass) - Устанавливает настройки прокси-сервера.&lt;br /&gt;
&lt;br /&gt;
Connect(Provider, Host, User, Pass, SenderName, SMSPrefix) – Подключает объект к провайдеру provider, используя адрес Host, имя пользователя User и пароль Pass. Значение SMSPrefix предназначено для того, чтобы провайдер мог различить сообщения от разных филиалов, если этими филиалами используется одно подключение. Если необходимости разделять сообщения нет - значение SMSPrefix можно не указывать.&lt;br /&gt;
Для провайдера доступны значения 'mirsms', 'sms16', 'websms', 'epochta', 'zanzara', 'SMSManager', 'f1sms', 'BitCall', 'mirsmsGET', 'AMD' и другие, либо можно указать числовые значения номера протокола, от 1 до &amp;lt;rspoiler text=&amp;quot;20&amp;quot;&amp;gt;Набор провайдеров все время дополняется, количество и номера можно смотреть в Справочники - Переменные - Подключения - SMS&amp;lt;/rspoiler&amp;gt; соответственно. Эти значения соответствуют значениям переменной SMSProtocol таблицы &amp;quot;Value&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SendSMS(Phone, Text, [ID]) – Отправляет SMS с текстом Text на телефон Phone. Для некоторых провайдеров необходим уникальный идентификатор сообщения ID (для провайдера iVoice - идентификатор сценария (кампании)). Возвращает ID провайдера для последующей проверки статуса доставки.&lt;br /&gt;
&lt;br /&gt;
CheckSMS(ProviderID) – Проверяет состояние доставки сообщения с идентификатором ProviderID. Возвращает: 0 – доставляется, 1 – успешно доставлено, 2 – не доставлено.&lt;br /&gt;
&lt;br /&gt;
ReceiveSMS(InboxID, DateFrom, DateTo, NewOnly) - Получает входящие SMS, с ящика InboxID (идентификатор выдаётся провайдером). DateFrom, DateTo - задается временной интервал в котором были приняты сообщения(формат 08.04.2013 18:00:00 'DD.MM.YYYY HH:NN:SS'). Чтобы получать только новые сообщение поле NewOnly должно быть True. Возвращает XML с сообщениями.&lt;br /&gt;
&lt;br /&gt;
ExtraResult([ParamName='']) - Вызывается после CheckSMS, возвращает дополнительную информацию по последнему статусу смс. В настоящее время работает только для провайдеров BitCall и iVoice. Для BitCall по умолчанию возвращает кнопки, нажатые абонентом во время работы с голосовым меню. Если в paramname указать 'IdentifyText' то будет возвращен JSON  с ответами абонента на заданные вопросы(используется в случае звонков с индивидуальным сценарием). Для iVoice по умолчанию подразумевается параметр 'response', при этом будет возвращен JSON  с ответами абонента на заданные вопросы (в зависимости от сценария)&lt;br /&gt;
&lt;br /&gt;
Log - Возвращает последний HTTP запрос и ответ от сервера смс.&lt;br /&gt;
&lt;br /&gt;
== Объект TXML ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга XML-данных.&lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст XML документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию. Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля.&lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
AttribCount – Возвращает количество атрибутов текущего элемента.&lt;br /&gt;
&lt;br /&gt;
AttribName(i) – Возвращает имя атрибута с номером i.&lt;br /&gt;
&lt;br /&gt;
Attrib(V) – Ищет атрибут и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
== Объект TJSON ==&lt;br /&gt;
&lt;br /&gt;
Предназачен для парсинга JSON-данных. &lt;br /&gt;
&lt;br /&gt;
Функции:&lt;br /&gt;
&lt;br /&gt;
SetText(S) – Задает текст JSON документа для парсинга, делает текущим корневой элемент.&lt;br /&gt;
&lt;br /&gt;
NodeValue – Возвращает значение текущего элемента.&lt;br /&gt;
&lt;br /&gt;
NodeName – Возвращает имя текущего элемента.&lt;br /&gt;
&lt;br /&gt;
OpenChild(V) – Ищет дочерний элемент и делает его текущим. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Возвращает значение найденного элемента, или пустую строку, если элемент не найден. Нумерация элементов начинается с нуля. &lt;br /&gt;
&lt;br /&gt;
ChildrenCount – Возвращает количество дочерних элементов.&lt;br /&gt;
&lt;br /&gt;
ChildNodeValue(V) – Ищет дочерний элемент и возвращает его значение. Если V – число – ищет по номеру, если V – текст – ищет по названию (регистрозависимый поиск). Можно проверять наличие элементов, если элемента нет, вернется пустая строка.&lt;br /&gt;
&lt;br /&gt;
OpenParent – Делает текущим родительский элемент. Возвращает значение найденного элемента.&lt;br /&gt;
&lt;br /&gt;
Reset – Делает текущим корневой элемент, возвращает его значение.&lt;br /&gt;
&lt;br /&gt;
isArray - Возвращает true, если текущий элемент является массивом (доступ к дочерним элементам возможен только по индексу, нумерация элементов начинается с нуля)&lt;br /&gt;
&lt;br /&gt;
==Объект TZip==&lt;br /&gt;
Предназначен для работы с Zip архивом. &lt;br /&gt;
&lt;br /&gt;
SetZip(s) - Загружает архив в объект из строки s;&lt;br /&gt;
&lt;br /&gt;
GetZip - Возвращает архив в виде строки;&lt;br /&gt;
&lt;br /&gt;
AddFromFile(SrcPath, ZipPath) - Добавляет файл SrcPath в архив и располагает его по пути ZipPath. ZipPath содержит имя файла в архиве, при необходимости можно указать каталог; &lt;br /&gt;
&lt;br /&gt;
AddFromStr(Data, /*ZipPath*/) - '''параметр ZipPath временно не работает'''. Добавляет файл из строки Data в архив и располагает его по пути ZipPath.  -ZipPath содержит имя файла в архиве, при необходимости можно указать каталог;&lt;br /&gt;
&lt;br /&gt;
LoadFromFile(path) - Загружает архив из файла path;&lt;br /&gt;
&lt;br /&gt;
SaveToFile(path) - Сохраняет архив в файл path;&lt;br /&gt;
&lt;br /&gt;
Count - Возвращает кол-во файлов в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByIndex(index) - Возвращает распакованный файл в виде строки. Index - номер файла в архиве;&lt;br /&gt;
&lt;br /&gt;
DataByName(ZipPath) - Возвращает распакованный файл в виде строки. ZipPath - путь к файлу в архиве, может содержать каталоги;&lt;br /&gt;
&lt;br /&gt;
FileName(index) - По номеру файла, функция возвращает полный путь файла в архиве.&lt;br /&gt;
&lt;br /&gt;
==Объект TBase==&lt;br /&gt;
&lt;br /&gt;
'''Функции общего назначения''':&lt;br /&gt;
&lt;br /&gt;
'''ExecSimpleScript(Caption, Text)''' - Выполняет скрипт &amp;quot;Дополнительных возможностей&amp;quot;. Возвращаемые значения, введенные пользователем устанавливает в переменные $scriptvar1..$scriptvarN, Значения кодов списочных переменных - в переменных $scriptvar1codes..$scriptvarNcodes. Функция возвращает истину, если пользователь нажал &amp;quot;OK&amp;quot; в диалоговом окне.&lt;br /&gt;
&lt;br /&gt;
'''FillAdvPriceReport(Excel, AddressCodes, StartLine, StartCol, [ShowSumPrice,InsertColumns,ShowAll])''' - добавляет отчёт по дополнительным услугам. В AddressCodes - указаны коды адресов через запятую, каждый код это отдельная строка отчета. Адреса будут показаны в порядке перечисления их в AddressCodes. Если в отчет нужно добавить пустую строку, то можно указать код адреса -1000. StartLine, StartCol - верхний левый угол выгружаемой таблицы. ShowSumPrice - добавить столбец итоговый столбец с суммой всех услуг, по умолчанию выключено. InsertColumns - раздвинуть таблицу перед вставкой отчета, позволяет встраивать отчет посередине выгрузки, по умолчанию выключено. ShowAll - показать все дополнительные услуги, по умолчанию false и показывает только услуги с начислениями. Функция возвращает количество использованных столбцов.&lt;br /&gt;
&lt;br /&gt;
'''PrintSticker(Codes, [ToBoxes=False])'''&lt;br /&gt;
&lt;br /&gt;
'''PrintBlanc(Codes, BlancNumber)''' - печатать форму из раздела &amp;quot;Заполнить бланк&amp;quot;. Codes - коды корреспонденций, BlancNumber - номер формы из раздела &amp;quot;Бланки для корреспонденции&amp;quot; (3)&lt;br /&gt;
&lt;br /&gt;
'''GetItemByName(Name)'''&lt;br /&gt;
&lt;br /&gt;
'''GetA4Printer''' - возвращает имя принтера выбранного для печати документов&lt;br /&gt;
&lt;br /&gt;
'''GetStickerPrinter''' - возвращает имя принтера выбранного для печати стикеров&lt;br /&gt;
&lt;br /&gt;
'''GetDuplexPrinter''' - возвращает имя принтера выбранного для двусторонней печати, если принтер не выбран, возвращает пустую строку&lt;br /&gt;
&lt;br /&gt;
'''PrintAttachPDFPage(Code, FileName, Page, Printer)''' - печатает страницу из вложенного файла PDF. Code - код вложения (attachment), Page - номер страницы, Printer - 0 = принтер A4, 1 = принтер этикеток. &lt;br /&gt;
&lt;br /&gt;
'''AttachPDFToText(Code, [TextFileName])''' - преобразует файл PDF из вложений в текст. Code - код вложения (attachment), TextFileName - имя текстового файла, в который записывается результат (если не указан, используется временный файл). Возвращает текст в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''GetActiveForm([SkipFormName])''' - возвращает код активной формы в программе где происходит сканирование. SkipFormName - не обязательны параметр, имя формы которую нужно пропустить при определении интерфейса.&lt;br /&gt;
 '''Список интерфейсов''': &lt;br /&gt;
 0 - неопределенный; &lt;br /&gt;
 1 - прием корреспонденции на склад; &lt;br /&gt;
 2 - АПД; &lt;br /&gt;
 3 - комплектация адресов (ShelfingForm); &lt;br /&gt;
 4 - доска приема; &lt;br /&gt;
 9 - вкладка «Манифесты»; &lt;br /&gt;
 10 - Инвентаризация корреспонденции; &lt;br /&gt;
 11 - АПК; &lt;br /&gt;
 12 - вкладка «Адреса»; &lt;br /&gt;
 13 - вкладка «Выдача»; &lt;br /&gt;
 14 - вкладка «Склад»; &lt;br /&gt;
 15 - Список номенклатуры; &lt;br /&gt;
 16 - Инвентаризация склада; &lt;br /&gt;
 17 - Приходная накладная; &lt;br /&gt;
 18 - Списание товара; &lt;br /&gt;
 19 - Карточка корреспонденции.&lt;br /&gt;
&lt;br /&gt;
'''AddAddressScanLog(Code[, StrBarCode, IsManual, FromInterface, ExtraInfo])''' - добавляет событие сканирование для корреспонденции с кодом Code. Необязательные параметры: StrBarCode - сканируемый ШК корреспонденции (по умолчанию пустой), IsManual - галка ручного сканирования (по умолчанию false), FromInterface - код интерфейса сканирования (StateType=81, по умолчанию 0 - неопределенный), ExtraInfo - текстовый комментарий события.&lt;br /&gt;
&lt;br /&gt;
'''RuleName(alias)''' - Выдает полный путь в дерева прав по псевдониму права.&lt;br /&gt;
&lt;br /&gt;
'''ShowText(Caption:string, Value:string)''' - показывает пользователю окно с заголовком Caption и с многострочным полем со значением Value. Может быть полезен при отображении логов выполненной операции. &lt;br /&gt;
&lt;br /&gt;
'''ShowScanError(msg [, Speek, Color, Abort])''' - выдает пользователю окно с текстом msg блокируя последующие действия сканирования. Если Speek - истинно, то сообщение проговаривается голосовым движком, по умолчанию выключено. Color - целочисленное число цвета, в который будет окрашен фон сообщения (по умолчанию = -1, стандартный). Abort  - прервать выполнение скрипта, не показывая ошибку.&lt;br /&gt;
&lt;br /&gt;
'''CheckRule(alias)''' - функция проверки разрешения у текущего пользователя системы, alias - псевдоним права. Возвращает 1, если право есть и 0, если права нет. &lt;br /&gt;
 Пример: if(CheckRule('RSE'), ShowMessage('У пользователя есть право изменять счета'), ShowMessage('У пользователя нет права изменять счета'));&lt;br /&gt;
&lt;br /&gt;
'''GetKurierMoney(KurierCode, DateEnd, NonCash)''' - возвращает баланс курьера с кодом KurierCode на дату DateEnd. NonCash - булевый флаг, если истинно, то будет рассчитан безнальный баланс; &lt;br /&gt;
&lt;br /&gt;
'''Функции, работающие только в импорте БД из эксель:'''&lt;br /&gt;
&lt;br /&gt;
ReplaceAddress&lt;br /&gt;
&lt;br /&gt;
GetItemByCode - Поиск товара по артикулу. Внимание: в пределах одного клиента может быть несколько товаров с одинаковыми артикулами. В этом случае функция найдет последний заведенный товар.&lt;br /&gt;
&lt;br /&gt;
GetPrice&lt;br /&gt;
&lt;br /&gt;
GetNewNumber - используется при импорте реестра, возвращает номер конверта в загружаемом заказе&lt;br /&gt;
&lt;br /&gt;
GetNewPos - используется при импорте реестра, возвращает порядковый номер вложения&lt;br /&gt;
&lt;br /&gt;
GetNewPackagePos- используется при импорте реестра, возвращает порядковый номер места&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zakaz - возвращает номер заказа куда происходит импорт реестра&lt;br /&gt;
&lt;br /&gt;
addresscode  -  используется при импорте реестра, код созданного адреса&lt;br /&gt;
&lt;br /&gt;
Source  - код заказчика&lt;br /&gt;
&lt;br /&gt;
ClientTown - Узнаем город клиента, через филиал с которым он работает. Сам клиент берется из заказа указанного в окне &amp;quot;Импорт БД из Excel&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Объект TFieldObject ==&lt;br /&gt;
Создается только автоматически. Объект для доступа к записям, используется в картах и дополнительных услугах (addressrecord) и событиях карточки корреспонденции (fieldlist). Методы объекта:&lt;br /&gt;
&lt;br /&gt;
'''_GetTableInfo''' - возвращает данные о полях и примеры данных объекта.&lt;br /&gt;
&lt;br /&gt;
'''_Self''' - возвращает ссылку на объект.&lt;br /&gt;
&lt;br /&gt;
'''_Set(fieldname, fieldvalue [, DoUpdateForm])''' - Если базовый объект строка. Устаналивает для поля fieldname значение fieldvalue. DoUpdateForm по уолчанию false, если указать true то обновление поля будет не только в объекте но и пользовательском интерфейсе. Обновление работает только в карточке корреспнденции для ограниченного набора полей: vlog, mode, type, date_put, time_put, message, kurier, state1.&lt;br /&gt;
&lt;br /&gt;
'''_Set(keyfield, keyvalue, filed, value)''' - Если базовый объект таблица (addressrecord.boxes). Работает перегруженная версия метода _set, cначала происходит поиск строки по ключу, далее меняется значение указанного столбца. keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца.  Пример, отключение услуги база:&lt;br /&gt;
&lt;br /&gt;
 addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
 priceconf - поле где записан код услуги;&lt;br /&gt;
 1 - услуга База;&lt;br /&gt;
 active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
== Объект TMessage ==&lt;br /&gt;
Создается только автоматически. Объект используется для скриптовой обработки письма в [https://wiki.courierexe.ru/index.php/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8#.D0.98.D0.BC.D0.BF.D0.BE.D1.80.D1.82_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85| заданиях импорта данных]. В себе содержит текст письма в очищенном формате и оригинальном формате HTML, отправитель письма, тему письма, дата получения и список прикрепленных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.Text''' - возвращает очищенный от HTML-тегов текст письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.HTMLText''' - возвращает оригинальный текст письма со всеми HTML-тегами.&lt;br /&gt;
&lt;br /&gt;
'''Message.Sender''' - возвращает email-адрес отправителя письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.AttachmentsCount''' - возвращает количество вложенных файлов.&lt;br /&gt;
&lt;br /&gt;
'''Message.DateTime''' - возвращает дату и время получения письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.Subject''' - возвращает тему письма.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentDataString(Number)''' - возвращает вложенный файл под номером Number в виде строки.&lt;br /&gt;
&lt;br /&gt;
'''Message.GetAttachmentName(Number)''' - возвращает имя вложенного файла под номером Number.&lt;br /&gt;
&lt;br /&gt;
== Объект TStringList ==&lt;br /&gt;
Может использоваться для построчной обработки многостраничных файлов либо для организации текстовых данных. Номер строк начинается с 0. &lt;br /&gt;
Имеет следующий функционал:&lt;br /&gt;
&lt;br /&gt;
'''Count''' - возвращает количество строк в списке.&lt;br /&gt;
&lt;br /&gt;
'''Add(Value:string)''' - добавляет значение Value в конец списка.&lt;br /&gt;
&lt;br /&gt;
'''SetText(Value:string)''' - устанавливает значение списка в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Insert(Number:integer, Value:string)''' - добавляет строку Value в позицию Number.&lt;br /&gt;
&lt;br /&gt;
'''Delete(Number:integer)''' - удаляет строку из списка в позиции Number.&lt;br /&gt;
&lt;br /&gt;
'''Clear''' - очищает элементы списка.&lt;br /&gt;
&lt;br /&gt;
'''LoadFromFile(Path:string)''' - загружает текстовый файл по пути Path.&lt;br /&gt;
&lt;br /&gt;
'''Strings(Number:integer)''' - возвращает строку с номером Number.&lt;br /&gt;
&lt;br /&gt;
'''SetString(Number:integer, Value:string)''' - устанавливает значение строки с номером Number в значение Value.&lt;br /&gt;
&lt;br /&gt;
'''Text''' - возвращает полный список строк в виде текста.&lt;br /&gt;
&lt;br /&gt;
'''CommaText([Quoted:boolean])''' - возвращает список значений через запятую. Если Quoted = true, то квотирует элементы списка. По умолчанию равен false.&lt;br /&gt;
&lt;br /&gt;
'''SetCommaText(Value: string)''' - разбивает значение Value на отдельные строки и кладет в список. Разделитель - запятые.&lt;br /&gt;
&lt;br /&gt;
'''IndexOf(Value:string)''' - ищет значение Value среди элементов списка и если находит, то возвращает номер строки. Возвращает -1 если значение не было найдено.&lt;br /&gt;
&lt;br /&gt;
'''Sorted(Value:boolean)''' - устанавливает флаг отсортированности списка в Value. Если Value = true, то сразу же его сортирует. По умолчанию Value = false.&lt;br /&gt;
&lt;br /&gt;
'''Exchange(Pos1:integer, Pos2:integer)''' - меняет элементы списка с позициями Pos1 и Pos2 местами.&lt;br /&gt;
&lt;br /&gt;
'''Duplicates(Value:integer)''' - изменяет параметр управления дубликатами в списке. Если Value = 0 (значение по умолчанию), то список не реагирует на дубликаты. Если Value = 1, то список при добавлении будет игнорировать дубликаты. Если Value = 2, то список будет выдавать исключение, при добавлении дубликата в список.&lt;br /&gt;
&lt;br /&gt;
'''ParamName(Number:integer[, Delimiter:string])''' - возвращает текст до первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает пустоту.&lt;br /&gt;
&lt;br /&gt;
'''ParamValue(Number:integer[, Delimiter:string])''' - возвращает текст после первого знака разделителя Delimiter (по умолчанию &amp;quot;=&amp;quot;) из строки с номером Number. Если разделителя в строке нет, то возвращает всю строку.&lt;br /&gt;
&lt;br /&gt;
== Объект TFunc ==&lt;br /&gt;
Объект реализует создание и использование функций в скриптовом языке. Позволяет определять переиспользуемые блоки кода с параметрами.&lt;br /&gt;
Важно учитывать, что внтури функции создается свой инстанс интерпретатора и от туда не доступны никакие переменные\объекты кроме переданных в функцию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные методы:&lt;br /&gt;
&lt;br /&gt;
'''New'''(FuncName, Param1, Param2, ..., Body) — создание новой функции.Функция возвращает результат выполнения последней команды в теле функции. Аргументы:&lt;br /&gt;
* `FuncName` — имя функции (строка)&lt;br /&gt;
* `Param1, Param2, ...` — имена параметров функции (переменные начинаются с `$`, объекты — без префикса)&lt;br /&gt;
* `Body` — тело функции (скрипт, выполняемый при вызове)&lt;br /&gt;
&lt;br /&gt;
'''FuncName'''(Arg1, Arg2, ...) — вызов созданной функции по имени. Если в объявлении была указана тип переменная, то и подставлять в аргумент надо обязательно переменную. Будет передано значение этой переменной (переменные словарине поддерживаются!). Если был объявлен объект, то указатель на объект должен быть получен через метод '''_self'''. C функциями поддерживают работу следующие классы: TExcel, TDirectExcel, TCSVFile, TADO, TSelfADO, TPrinter, TCanvas, TPicture, TTable, TINIFile, TSMS, TXML, TJSON, TZip, TStringList, TBaseUtils, а также объект addressrecord (TFieldObject). Результатом работы функции может быть число или строка.&lt;br /&gt;
&lt;br /&gt;
Пример 1, обработка результатов функции:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'calc');&lt;br /&gt;
calc.new('Sum', '$a', '$b',&lt;br /&gt;
  $a + $b&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
set($x, 10);&lt;br /&gt;
set($y, 20);&lt;br /&gt;
showmessage(calc.Sum($x, $y));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример 2, передача объекта в функцию:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TFunc', 'utils');&lt;br /&gt;
utils.new('ProcessDB', 'dbConn', '$value',&lt;br /&gt;
  showmessage($value);&lt;br /&gt;
  dbConn.open('SELECT * FROM address limit 3 ');&lt;br /&gt;
  if(dbConn.recordcount &amp;gt; 0,&lt;br /&gt;
    showmessage('Найдено записей: ' + dbConn.recordcount);&lt;br /&gt;
    dbConn.first;&lt;br /&gt;
    while(dbConn.eof = 0,&lt;br /&gt;
      showmessage(dbConn.fieldbyname('code'));&lt;br /&gt;
      dbConn.next&lt;br /&gt;
    )&lt;br /&gt;
  ,0)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
utils.ProcessDB(db._self,'test!');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Применение языка формул ==&lt;br /&gt;
'''в различных контекстах системы «MEASOFT» и сопутствующих проектах'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MEASOFT ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительная информация на чеке ====&lt;br /&gt;
&lt;br /&gt;
В карточке клиента на закладке «Касса» имеется поле для ввода текста, который будет отображаться на кассовых чеках, печатаемых для корреспонденции от данного клиента. В поле может быть введен как просто текст, так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TSelfDB с открытым набором данных со строчкой корреспонденции, заказа и клиента, на которую печатается чек&lt;br /&gt;
&lt;br /&gt;
TBaseSupport&lt;br /&gt;
&lt;br /&gt;
TBaseValue&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Так же система записывает в переменную $CashRegisterID вычисленный код фискального регистратора, на котором предполагается печать чека.&lt;br /&gt;
&lt;br /&gt;
Результат работы скрипта печатается на создаваемом чеке, если скрипт не возвращает значение “-1” (число или текст) – в этом случае система чек не создает. Подразумевается, что либо скриптом было принято решение об отсутствии необходимости формирования чека, либо скрипт взял эту функцию на себя.&lt;br /&gt;
&lt;br /&gt;
==== Заполнение шаблонов печатных форм ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Дополнительные возможности ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Импорт БД из Excel ====&lt;br /&gt;
В окружении интерпретатора создается объект ZakazRecord, он является списком со значениями таблицы zakaz. Именно в этот заказ будут загружены данные. Из этого объекта также доступно :&amp;lt;br&amp;gt;&lt;br /&gt;
*ZakazRecord.userfields - пользовательские поля заказа;&lt;br /&gt;
*ZakazRecord.Clients - данные таблицы clients;&lt;br /&gt;
*ZakazRecord.Clients.userfields - пользовательские поля заказчика.&lt;br /&gt;
&lt;br /&gt;
==== Прайс лист клиента ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в валюте клиента для каждой поездки (туда или обратно) единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Помимо стандартных объектов, система создает объект AddressRecord, в котором, как свойства, доступны все поля текущей записи. Так же она выставляет значение переменной $Forward в 1 (истина), если необходимо произвести расчет для направления &amp;quot;Туда&amp;quot; и 0 (ложь) - если обратно. ВНИМАНИЕ! Как и во всех остальных местах, после формулы нельзя ставить &amp;quot;;&amp;quot;, иначе скрипт вернет 0!&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 if(int(AddressRecord.Time_Put_Max)&amp;gt;19, 100, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Прибавляет 100 рублей в случае, если максимальный срок доставки 20 часов или более''&lt;br /&gt;
&lt;br /&gt;
 if(pos(AddressRecord.Address, 'Аренда')&amp;gt;0, &lt;br /&gt;
           set($FormulaReplace, 1); &lt;br /&gt;
           1500&lt;br /&gt;
 , 0)&lt;br /&gt;
 &lt;br /&gt;
 ''В случае наличия подстроки &amp;quot;Аренда&amp;quot; в адресе заменяет штатное ценообразование на 1500 рублей''&lt;br /&gt;
&lt;br /&gt;
Объект AddressRecord может предоставить доступ к связанным таблицам :&lt;br /&gt;
* addressrecord.boxes&lt;br /&gt;
* addressrecord.packages&lt;br /&gt;
* addressrecord.clients&lt;br /&gt;
* addressrecord.price&lt;br /&gt;
* addressrecord.advprice&lt;br /&gt;
* addressrecord.userfields&lt;br /&gt;
* addressrecord.addressfld&lt;br /&gt;
* addressrecord.clients.userfields&lt;br /&gt;
* addressrecord.price.userfields&lt;br /&gt;
* addressrecord.zakaz&lt;br /&gt;
* addressrecord.zakaz.userfields&lt;br /&gt;
 &lt;br /&gt;
Чтобы получить доступ к полю VarCode из таблицы userfields необходимо записать AddressRecord.Userfields.VarCode. В присоединённой таблице может быть несколько записей чтобы получить к ним доступ предусмотрены функции _First, _EOF, _Next, _RecordCount, _Set.&lt;br /&gt;
&lt;br /&gt;
Пример: &lt;br /&gt;
 set($value1, 0); set($value2, 0);&lt;br /&gt;
 while(AddressRecord.userfields._EOF=0,&lt;br /&gt;
   if(AddressRecord.userfields.varCode=1, &lt;br /&gt;
     set($value1, if(AddressRecord.userFields.VarValue='Праздничная упаковка', 150, 0)), ''''''');&lt;br /&gt;
   if(AddressRecord.userfields.varCode=2, &lt;br /&gt;
     set($value2, AddressRecord.userFields.VarValue), ''''''');&lt;br /&gt;
   AddressRecord.userFields._Next;&lt;br /&gt;
 );&lt;br /&gt;
 int($value1) + int($value2)&lt;br /&gt;
&lt;br /&gt;
Пример делающий тоже самое что и выше но через поиск Locate:&lt;br /&gt;
 set($value1, if(addressrecord.userfields.VarValue('VarCode', 1)='Праздничная упаковка', 150, 0));&lt;br /&gt;
 set($value2, int(addressrecord.userfields.VarValue('VarCode', 2)));&lt;br /&gt;
 $value1 + $value2&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
В скрипте доступны переменные: &lt;br /&gt;
«$FormulaKoeff» - это коэффициент на который умножится конечная цена (по умолчанию равна 1);&lt;br /&gt;
«$PriceCode»  - код прайса;&lt;br /&gt;
«$CurrentPriceConf»  - код услуги;&lt;br /&gt;
«$BasePrice» - стоимость всех услуг с уровнем (pricelevel) меньше текущего.&lt;br /&gt;
&lt;br /&gt;
Для вызова функции CalcBasePrice (Расчёт базовой цены) в скрипте объявленны переменные: $Count,$Collection,$Distance,$Wait.&lt;br /&gt;
&lt;br /&gt;
Существует поиск по ключевому полю (поиск регистронезависимый), например чтобы найти в таблице advprice введённое значение для текущей услуги, нужно сделать такую запись  addressrecord.advprice.value('priceconf', $CurrentPriceConf) - Первый параметр это ключевое поле, второй искомое значение. Если запись найдётся будет возвращено значение поле value, если нет функция вернёт значение 0.&lt;br /&gt;
 &lt;br /&gt;
Пример &lt;br /&gt;
 if(addressrecord.advprice.active('priceconf', 3)='T', addressrecord.advprice.price, 0)&lt;br /&gt;
 &lt;br /&gt;
 ''Смотрим включена ли услуга и если да, возвращаем рассчитанную стоимость&lt;br /&gt;
&lt;br /&gt;
Чтобы изменить значение записанное в объект addressrecord, нужно воспользоваться методом _set(keyfield, keyvalue, filed, value). Параметр keyfield - ключевое поле, keyvalue - искомое значение, filed - имя столбца, value - новое значение столбца. Сначала происходит поиск строки по ключу, далее меняется значение указанного столбца.&lt;br /&gt;
Пример, отключение услуги база:&lt;br /&gt;
  addressrecord.advprice._Set('priceconf', 1, 'active', 'F')&lt;br /&gt;
  priceconf - поле где записан код услуги;&lt;br /&gt;
  1 - услуга База;&lt;br /&gt;
  active - поле показывающее включение услуги.&lt;br /&gt;
&lt;br /&gt;
Также существует упрощенный метод _set, с двумя параметрами filed, value - он используется в шаблонах загрузки или в системных доп. возможностях где доступен объект addressrecord.&lt;br /&gt;
&lt;br /&gt;
==== Зарплата курьеров ====&lt;br /&gt;
&lt;br /&gt;
Формула возвращает сумму в основной валюте для каждой единицы корреспонденции, которая добавляется к штатному ценообразованию. Если формула установила в значение «Истина» переменную «$FormulaReplace», то значение, возвращаемое формулой заменяет штатное ценообразование. Переменные «$FormulaTablKoeff» и «$FormulaMoneyKoeff»  позволяют установить повышающий или понижающий коэффициент на стоимость доставки (по тарифной сетке) и услуги соответственно (процент от суммы, процент от стоимости доставки, ожидание).  Переменная «$UsingZoneName» и «$KurierZone» содержат название и код зоны соответственно, есть возможность поменять название зоны для отчета.&lt;br /&gt;
&lt;br /&gt;
=== Планировщик ===&lt;br /&gt;
&lt;br /&gt;
В поле текста задания может быть введен как текст с командами планировщика (см ниже), так и интерпретируемый скрипт, начинающийся с признака скрипта: «&amp;lt;?&amp;gt;». В контексте выполнения скрипта система создает объекты:&lt;br /&gt;
&lt;br /&gt;
TIniFile, Указывает на настроечный ini-файл планировщика.&lt;br /&gt;
&lt;br /&gt;
Все объекты создаются с пустыми именами.&lt;br /&gt;
&lt;br /&gt;
Для записи в лог планировщика нужно использовать функцию Print&lt;br /&gt;
&lt;br /&gt;
=== Репликатор ===&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
ReplaceAddress(target, address) – Возвращает адрес последней доставки корреспонденции получателю target по адресу address от текущего клиента. При отсутствии такой доставки, возвращает address.&lt;br /&gt;
&lt;br /&gt;
GetPrice –возвращает рассчитанное значение цены, на основе прайс-листа клиента и данных о корреспонденции.&lt;br /&gt;
&lt;br /&gt;
GetKurierByStation(i) – возвращает код курьера, ассоциированного со станцией метро с кодом i.&lt;br /&gt;
&lt;br /&gt;
GetNewNumber – Возвращает не занятый номер единицы корреспонденции в текущем заказе.&lt;br /&gt;
&lt;br /&gt;
==История изменений==&lt;br /&gt;
&lt;br /&gt;
=== Недавние изменения ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.539 Добавлена поддержка отладчика AttachDebugger&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|2025.0.0.534 Добавлена поддержка оператора CASE и класса TFunc&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 2021.0.0.57 от 18.06.2019 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TExcel добавлен метод ColumnDelete.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция InsertFirmAtt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
||В объект TExcel добавлен метод Align.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция CheckEan&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект функцию FillAdvPriceReport добавлены параметры ShowSumPrice,InsertColumns&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TSMS добавлен метод Log.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Добавлена функция Money.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция ValutaSign.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция GetPolygonByLatLon.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TTable добавлена функция SetMultiHeader, SetCustomHeader.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DownloadAttachment&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию SetRowHeight объекта TExcel добавлен параметр cnt.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция AsString.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция SetSize.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TADO добавлена функция ParseForIn.&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|В объект TBaseUtils из TBase перенесена функция FillExcelDoc.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция CalcAddressPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Все функции класса TBaseSupport перенесены в TBaseUtils. Класс TBaseSupport больше не существует.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функции RowInsert и RowDelete объекта TExcel добавлен параметр count.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция SendToMeaSoft&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils функция RecalcSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Новая функция Reverse&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 849 &amp;amp;nbsp; 22.02.2018 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TBaseUtils.TownByIndex добавлен параметр PriorityName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TBase добавлена функция GetNewPackagePos&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объекте TSMS доработан метод ExtraResult, добавлен параметр ParamName&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBase добавлена функция CalcAgentPrice&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateAddressForActDelivery&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функция CalcTownDeliveryDate заменена на CalcDeliveryDate&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TBaseUtils добавлена функция CreateSpecialSMA&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция SignatureUrl&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена функция LoadFromStr.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetPen.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TCanvas добавлена функция SetBrush.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В объект TPicture добавлена поддержка чтения в формате PNG.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|В функцию TCanvas.DrawPic параметр Mode&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Свойство TPicture.Canvas&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция DeleteFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 758 &amp;amp;nbsp; 29.03.2017 ===&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция GetPolygonByAddress&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция ParamsCount&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Объект TZip&lt;br /&gt;
|-&lt;br /&gt;
||'''Изменено:'''&lt;br /&gt;
|Функции CreateEAN и Create128 заменены одной функцией CreateBar, полностью совместимой с Create128, но добавлена поддержка EAN-13 и Interleaved 2-5 (для Почты России). В системе функции оставлены для обратной совместимости, но более не являются документированными и рекомендованными к использованию.&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Параметр text в функцию Cell объекта TExcel&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция UrlEncode &lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция IncDay теперь может принимать параметр count&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функции FtpGet, FtpPut, TTable.SetCell()&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 452 &amp;amp;nbsp; 26.02.2014 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция Time&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция FixedIntToStr&lt;br /&gt;
|-&lt;br /&gt;
||'''Добавлено:'''&lt;br /&gt;
|Функция TimePeriod&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена функция приёма смс -  ReceiveSMS&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция STR2UTF&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция SAVETOFILE&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.SetSheetName&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;FILESTR&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Расширены возможности объекта addressrecord в формулах тарифов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 308 &amp;amp;nbsp; 24.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В функции загрузки таблиц из TADO добавлено условие, что поля, названия которых начинаются с &amp;quot;-&amp;quot; не выгружаются. Таким образом можно скрывать служебные поля из результирующего набора.&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowAutoFit &lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция TExcel.RowInsert &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 300 &amp;amp;nbsp; 01.11.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В объекте TCSVFile добавилась возможность запрашивать значения не только текущей записи через параметр сдвига&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В пользовательские отчеты добавлен тип &amp;quot;UPDOWN&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлен объект TCSVFile&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 266 &amp;amp;nbsp; 14.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|В интерпретатор добавлена поддержка массивов&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Версия 265 &amp;amp;nbsp; 11.09.2012 ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|'''Добавлено:'''&lt;br /&gt;
|Функция CreateTrans в интерпретатор&lt;br /&gt;
|-&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15688</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15688"/>
				<updated>2025-12-02T21:07:48Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Интерфейс отладчика */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Отладчик скриптов=&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик при наличии прав Администратора:&lt;br /&gt;
* '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик''' &lt;br /&gt;
* '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок &lt;br /&gt;
* Отображение скрытых символов&lt;br /&gt;
* Закладки для быстрой навигации &lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений напрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Сохранить в файл'''.&lt;br /&gt;
&lt;br /&gt;
Сохраняет текущий текст скрипта в файл.  &lt;br /&gt;
Если файл был открыт ранее, по умолчанию предлагается исходный путь.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Скрипт''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15687</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15687"/>
				<updated>2025-12-02T21:04:27Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Отладчик скриптов=&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик при наличии прав Администратора:&lt;br /&gt;
* '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик''' &lt;br /&gt;
* '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок при установке курсора&lt;br /&gt;
&lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений няпрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
* Временные метки для каждого сообщения в формате [hh:nn:ss]&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Сохранить в файл'''.&lt;br /&gt;
&lt;br /&gt;
Сохраняет текущий текст скрипта в файл.  &lt;br /&gt;
Если файл был открыт ранее, по умолчанию предлагается исходный путь.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работ, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Скрипт''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту запущенному без отладчика.&lt;br /&gt;
Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' введите скрипт из примера.&lt;br /&gt;
# Запустите скрипт через меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15686</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15686"/>
				<updated>2025-12-02T19:33:26Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Кнопки управления */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Отладчик скриптов=&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик при наличии прав Администратора:&lt;br /&gt;
* '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик''' &lt;br /&gt;
* '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок при установке курсора&lt;br /&gt;
&lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений няпрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
* Временные метки для каждого сообщения в формате [hh:nn:ss]&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки скрипта (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Сохранить в файл'''.&lt;br /&gt;
&lt;br /&gt;
Сохраняет текущий текст скрипта в файл.  &lt;br /&gt;
Если файл был открыт ранее, по умолчанию предлагается исходный путь.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работу, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Скрипт''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту печатной формы, который выполняется из основного приложения.&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# В скрипт печатной формы, первой строкой добавьте команду `AttachDebugger`. &lt;br /&gt;
# Запустите печатную форму.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
&lt;br /&gt;
Если под рукой нет печатной формы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий для скрипта из примера:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# В скрипт печатной формы, первой строкой добавьте команду `AttachDebugger`. &lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' укажите скрипт из примера.&lt;br /&gt;
# Запустите скрипт меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15685</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15685"/>
				<updated>2025-12-02T19:28:22Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Подключение отладчика к работающим скриптам */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Отладчик скриптов=&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик при наличии прав Администратора:&lt;br /&gt;
* '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик''' &lt;br /&gt;
* '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок при установке курсора&lt;br /&gt;
&lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений няпрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
* Временные метки для каждого сообщения в формате [hh:nn:ss]&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки на точке останова (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Сохранить в файл'''.&lt;br /&gt;
&lt;br /&gt;
Сохраняет текущий текст скрипта в файл.  &lt;br /&gt;
Если файл был открыт ранее, по умолчанию предлагается исходный путь.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работу, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
'''Как использовать'''&lt;br /&gt;
&lt;br /&gt;
#'''В отладчике:'''&lt;br /&gt;
## Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
## Включите режим отслеживания: меню '''Скрипт''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
## В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
## Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
#'''В скрипте:'''&lt;br /&gt;
## Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти следующей строкой после тега начала скрипта '''&amp;lt;?&amp;gt;'''&lt;br /&gt;
## Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
#'''Что происходит:'''&lt;br /&gt;
## При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
## Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
## Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
## Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту печатной формы, который выполняется из основного приложения.&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# В скрипт печатной формы, первой строкой добавьте команду `AttachDebugger`. &lt;br /&gt;
# Запустите печатную форму.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
&lt;br /&gt;
Если под рукой нет печатной формы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий для скрипта из примера:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# В скрипт печатной формы, первой строкой добавьте команду `AttachDebugger`. &lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' укажите скрипт из примера.&lt;br /&gt;
# Запустите скрипт меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15684</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15684"/>
				<updated>2025-12-02T19:24:20Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Отладчик скриптов=&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик при наличии прав Администратора:&lt;br /&gt;
* '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик''' &lt;br /&gt;
* '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок при установке курсора&lt;br /&gt;
&lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений няпрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
* Временные метки для каждого сообщения в формате [hh:nn:ss]&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — Запуск скрипта в режиме отладки (F9). При необходимости установите точки останова, cкрипт выполнится до первой точки останова или до ошибки.&lt;br /&gt;
* '''Остановить''' — Прерывание дальнейшего исполнения скрипта. Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
* '''Продолжить''' — Возобновление выполнения после остановки на точке останова (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
Точки останова можно настроить перед запуском скрипта или когда выполнение скрипта приостановлено. Добавление точки останова:&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
Список '''Переменные''' содержит все переменные и объекты доступные в текущем инстансе интерпретатора. Список автоматически отображаются в момент остановки выполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения. Значения обновляются автоматически в момент остановки выполнения скрипта или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Сохранить в файл'''.&lt;br /&gt;
&lt;br /&gt;
Сохраняет текущий текст скрипта в файл.  &lt;br /&gt;
Если файл был открыт ранее, по умолчанию предлагается исходный путь.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работу, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
== Как использовать ==&lt;br /&gt;
&lt;br /&gt;
'''В отладчике:'''&lt;br /&gt;
# Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Включите режим отслеживания: меню '''Скрипт''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
# Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
&lt;br /&gt;
'''В скрипте:'''&lt;br /&gt;
# Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти сразу после тега начала скрипта &amp;lt;?&amp;gt;&lt;br /&gt;
# Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
&lt;br /&gt;
'''Что происходит:'''&lt;br /&gt;
# При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
# Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
# Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
# Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту печатной формы, который выполняется из основного приложения.&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# В скрипт печатной формы, первой строкой добавьте команду `AttachDebugger`. &lt;br /&gt;
# Запустите печатную форму.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
&lt;br /&gt;
Если под рукой нет печатной формы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий для скрипта из примера:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# В скрипт печатной формы, первой строкой добавьте команду `AttachDebugger`. &lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' укажите скрипт из примера.&lt;br /&gt;
# Запустите скрипт меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15683</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15683"/>
				<updated>2025-12-02T19:09:06Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Как использовать */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Отладчик скриптов=&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик при наличии прав Администратора:&lt;br /&gt;
* '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик''' &lt;br /&gt;
* '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок при установке курсора&lt;br /&gt;
&lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений няпрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
* Временные метки для каждого сообщения в формате [hh:nn:ss]&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — запуск скрипта в режиме отладки (F9)&lt;br /&gt;
* '''Остановить''' — аварийная остановка выполняющегося скрипта&lt;br /&gt;
* '''Продолжить''' — возобновление выполнения после остановки на точке останова (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Запуск скрипта ==&lt;br /&gt;
&lt;br /&gt;
# Введите или откройте скрипт в редакторе&lt;br /&gt;
# При необходимости установите точки останова&lt;br /&gt;
# Нажмите кнопку «Запустить» или клавишу F9&lt;br /&gt;
# Скрипт выполнится до первой точки останова или до ошибки&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
'''Важно.''' Точки останова всегда останавливают выполнение на указанной строке, дополнительные условия не поддерживаются.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
При остановке на точке останова все переменные автоматически отображаются в списке '''Переменные'''.  &lt;br /&gt;
Значения обновляются при каждой остановке.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения в текущей строке остановки. Значения обновляются автоматически на каждой сработавшей точке останова или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
Выражение будет добавлено в список и пересчитываться при каждой остановке.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
== Продолжение выполнения ==&lt;br /&gt;
&lt;br /&gt;
После остановки скрипта:&lt;br /&gt;
# Просмотрите значения переменных и выражений наблюдения&lt;br /&gt;
# При необходимости скорректируйте точки останова или выражения наблюдения&lt;br /&gt;
# Нажмите кнопку '''Продолжить (F9)''' — выполнение продолжится до следующей точки останова или завершения скрипта&lt;br /&gt;
&lt;br /&gt;
== Остановка выполнения ==&lt;br /&gt;
&lt;br /&gt;
Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Сохранить в файл'''.&lt;br /&gt;
&lt;br /&gt;
Сохраняет текущий текст скрипта в файл.  &lt;br /&gt;
Если файл был открыт ранее, по умолчанию предлагается исходный путь.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работу, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
== Как использовать ==&lt;br /&gt;
&lt;br /&gt;
'''В отладчике:'''&lt;br /&gt;
# Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Включите режим отслеживания: меню '''Скрипт''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
# Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
&lt;br /&gt;
'''В скрипте:'''&lt;br /&gt;
# Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти сразу после тега начала скрипта &amp;lt;?&amp;gt;&lt;br /&gt;
# Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
&lt;br /&gt;
'''Что происходит:'''&lt;br /&gt;
# При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
# Отладчик автоматически подключается к перехваченному скрипту.&lt;br /&gt;
# Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
# Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту печатной формы, который выполняется из основного приложения.&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# В скрипт печатной формы, первой строкой добавьте команду `AttachDebugger`. &lt;br /&gt;
# Запустите печатную форму.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
&lt;br /&gt;
Если под рукой нет печатной формы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий для скрипта из примера:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# В скрипт печатной формы, первой строкой добавьте команду `AttachDebugger`. &lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' укажите скрипт из примера.&lt;br /&gt;
# Запустите скрипт меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15682</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15682"/>
				<updated>2025-12-02T19:08:36Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Как использовать */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Отладчик скриптов=&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик при наличии прав Администратора:&lt;br /&gt;
* '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик''' &lt;br /&gt;
* '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок при установке курсора&lt;br /&gt;
&lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений няпрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
* Временные метки для каждого сообщения в формате [hh:nn:ss]&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — запуск скрипта в режиме отладки (F9)&lt;br /&gt;
* '''Остановить''' — аварийная остановка выполняющегося скрипта&lt;br /&gt;
* '''Продолжить''' — возобновление выполнения после остановки на точке останова (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Запуск скрипта ==&lt;br /&gt;
&lt;br /&gt;
# Введите или откройте скрипт в редакторе&lt;br /&gt;
# При необходимости установите точки останова&lt;br /&gt;
# Нажмите кнопку «Запустить» или клавишу F9&lt;br /&gt;
# Скрипт выполнится до первой точки останова или до ошибки&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
'''Важно.''' Точки останова всегда останавливают выполнение на указанной строке, дополнительные условия не поддерживаются.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
При остановке на точке останова все переменные автоматически отображаются в списке '''Переменные'''.  &lt;br /&gt;
Значения обновляются при каждой остановке.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения в текущей строке остановки. Значения обновляются автоматически на каждой сработавшей точке останова или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
Выражение будет добавлено в список и пересчитываться при каждой остановке.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
== Продолжение выполнения ==&lt;br /&gt;
&lt;br /&gt;
После остановки скрипта:&lt;br /&gt;
# Просмотрите значения переменных и выражений наблюдения&lt;br /&gt;
# При необходимости скорректируйте точки останова или выражения наблюдения&lt;br /&gt;
# Нажмите кнопку '''Продолжить (F9)''' — выполнение продолжится до следующей точки останова или завершения скрипта&lt;br /&gt;
&lt;br /&gt;
== Остановка выполнения ==&lt;br /&gt;
&lt;br /&gt;
Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Сохранить в файл'''.&lt;br /&gt;
&lt;br /&gt;
Сохраняет текущий текст скрипта в файл.  &lt;br /&gt;
Если файл был открыт ранее, по умолчанию предлагается исходный путь.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работу, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
== Как использовать ==&lt;br /&gt;
&lt;br /&gt;
'''В отладчике:'''&lt;br /&gt;
# Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Включите режим отслеживания: меню '''Скрипт''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
# Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
&lt;br /&gt;
'''В скрипте:'''&lt;br /&gt;
# Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти сразу после тега начала скрипта &amp;lt;?&amp;gt;&lt;br /&gt;
# Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
&lt;br /&gt;
'''Что происходит:'''&lt;br /&gt;
# При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
# Отладчик автоматически подключается к перехваченому скрипту.&lt;br /&gt;
# Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
# Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту печатной формы, который выполняется из основного приложения.&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# В скрипт печатной формы, первой строкой добавьте команду `AttachDebugger`. &lt;br /&gt;
# Запустите печатную форму.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
&lt;br /&gt;
Если под рукой нет печатной формы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий для скрипта из примера:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# В скрипт печатной формы, первой строкой добавьте команду `AttachDebugger`. &lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' укажите скрипт из примера.&lt;br /&gt;
# Запустите скрипт меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15681</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15681"/>
				<updated>2025-12-02T19:07:59Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Подключение отладчика к работающим скриптам */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Отладчик скриптов=&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик при наличии прав Администратора:&lt;br /&gt;
* '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик''' &lt;br /&gt;
* '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок при установке курсора&lt;br /&gt;
&lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений няпрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
* Временные метки для каждого сообщения в формате [hh:nn:ss]&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — запуск скрипта в режиме отладки (F9)&lt;br /&gt;
* '''Остановить''' — аварийная остановка выполняющегося скрипта&lt;br /&gt;
* '''Продолжить''' — возобновление выполнения после остановки на точке останова (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Запуск скрипта ==&lt;br /&gt;
&lt;br /&gt;
# Введите или откройте скрипт в редакторе&lt;br /&gt;
# При необходимости установите точки останова&lt;br /&gt;
# Нажмите кнопку «Запустить» или клавишу F9&lt;br /&gt;
# Скрипт выполнится до первой точки останова или до ошибки&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
'''Важно.''' Точки останова всегда останавливают выполнение на указанной строке, дополнительные условия не поддерживаются.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
При остановке на точке останова все переменные автоматически отображаются в списке '''Переменные'''.  &lt;br /&gt;
Значения обновляются при каждой остановке.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения в текущей строке остановки. Значения обновляются автоматически на каждой сработавшей точке останова или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
Выражение будет добавлено в список и пересчитываться при каждой остановке.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
== Продолжение выполнения ==&lt;br /&gt;
&lt;br /&gt;
После остановки скрипта:&lt;br /&gt;
# Просмотрите значения переменных и выражений наблюдения&lt;br /&gt;
# При необходимости скорректируйте точки останова или выражения наблюдения&lt;br /&gt;
# Нажмите кнопку '''Продолжить (F9)''' — выполнение продолжится до следующей точки останова или завершения скрипта&lt;br /&gt;
&lt;br /&gt;
== Остановка выполнения ==&lt;br /&gt;
&lt;br /&gt;
Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Сохранить в файл'''.&lt;br /&gt;
&lt;br /&gt;
Сохраняет текущий текст скрипта в файл.  &lt;br /&gt;
Если файл был открыт ранее, по умолчанию предлагается исходный путь.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам изначально запущеным без него. Для начала работу, отладчик нужно перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
== Как использовать ==&lt;br /&gt;
&lt;br /&gt;
'''В отладчике:'''&lt;br /&gt;
# Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Включите режим отслеживания: меню '''Скрипт''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
# Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
&lt;br /&gt;
'''В скрипте:'''&lt;br /&gt;
# Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти сразу после тега начала скрипта &amp;lt;?&amp;gt;&lt;br /&gt;
# Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
&lt;br /&gt;
'''Что происходит:'''&lt;br /&gt;
# При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
# Отладчик автоматически подключается к выполняющемуся скрипту.&lt;br /&gt;
# Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
# Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту печатной формы, который выполняется из основного приложения.&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# В скрипт печатной формы, первой строкой добавьте команду `AttachDebugger`. &lt;br /&gt;
# Запустите печатную форму.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
&lt;br /&gt;
Если под рукой нет печатной формы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий для скрипта из примера:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# В скрипт печатной формы, первой строкой добавьте команду `AttachDebugger`. &lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' укажите скрипт из примера.&lt;br /&gt;
# Запустите скрипт меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	<entry>
		<id>https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15680</id>
		<title>Отладчик встроенных скриптов</title>
		<link rel="alternate" type="text/html" href="https://wiki.courierexe.ru/index.php?title=%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA_%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2&amp;diff=15680"/>
				<updated>2025-12-02T19:06:53Z</updated>
		
		<summary type="html">&lt;p&gt;Sammy: /* Основные возможности */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Отладчик скриптов=&lt;br /&gt;
&lt;br /&gt;
[[Файл:ScriptDebugger.png]]&lt;br /&gt;
&lt;br /&gt;
'''Отладчик скриптов''' — рабочий инструмент для разработки и диагностики скриптов встроенного языка.  &lt;br /&gt;
Он позволяет запускать скрипты в режиме отладки, останавливать выполнение на нужных строках, анализировать переменные и подключаться к уже запущенным скриптам.&lt;br /&gt;
Вы можете запустить отладчик при наличии прав Администратора:&lt;br /&gt;
* '''Отчеты &amp;gt; SQL &amp;gt; Выполнить &amp;gt; Запустить отладчик''' &lt;br /&gt;
* '''Отчеты &amp;gt; Дополнительные возможности &amp;gt; Редактировать'''&lt;br /&gt;
&lt;br /&gt;
= Основные возможности =&lt;br /&gt;
&lt;br /&gt;
* '''Запуск в режиме отладки''' — выполнение скрипта с остановкой на заданных строках&lt;br /&gt;
* '''Просмотр переменных''' — автоматическое отображение значений всех переменных при остановке&lt;br /&gt;
* '''Наблюдение за выражениями''' — вычисление произвольных выражений при каждой остановке&lt;br /&gt;
* '''Точки останова''' — остановка выполнения на выбранных строках кода&lt;br /&gt;
* '''Подключение к скриптам''' — подключение к скрипту запущенному без отладчика&lt;br /&gt;
* '''Работа с файлами''' — открытие, сохранение и отслеживание изменений файлов скриптов&lt;br /&gt;
* '''Расширенный редактор''' - подсветка парных скобок, отображение скрытых симолов, закладки.&lt;br /&gt;
&lt;br /&gt;
= Интерфейс отладчика =&lt;br /&gt;
&lt;br /&gt;
== Редактор кода ==&lt;br /&gt;
&lt;br /&gt;
Основная область для написания и редактирования скрипта. Редактор поддерживает:&lt;br /&gt;
* Подсветку синтаксиса&lt;br /&gt;
* Нумерацию строк&lt;br /&gt;
* Визуальное отображение точек останова (красные кружки в левом поле)&lt;br /&gt;
* Подсветку текущей строки выполнения (желтый фон)&lt;br /&gt;
* Подсветку парных скобок при установке курсора&lt;br /&gt;
&lt;br /&gt;
== Лог ==&lt;br /&gt;
&lt;br /&gt;
Отображает:&lt;br /&gt;
* Вывод сообщений няпрямую из скрипта командой '''print'''&lt;br /&gt;
* Сообщения отладчика (остановка на breakpoint, ошибки)&lt;br /&gt;
* Временные метки для каждого сообщения в формате [hh:nn:ss]&lt;br /&gt;
&lt;br /&gt;
== Кнопки управления ==&lt;br /&gt;
&lt;br /&gt;
* '''Запустить''' — запуск скрипта в режиме отладки (F9)&lt;br /&gt;
* '''Остановить''' — аварийная остановка выполняющегося скрипта&lt;br /&gt;
* '''Продолжить''' — возобновление выполнения после остановки на точке останова (F9)&lt;br /&gt;
&lt;br /&gt;
= Работа с отладчиком =&lt;br /&gt;
&lt;br /&gt;
== Запуск скрипта ==&lt;br /&gt;
&lt;br /&gt;
# Введите или откройте скрипт в редакторе&lt;br /&gt;
# При необходимости установите точки останова&lt;br /&gt;
# Нажмите кнопку «Запустить» или клавишу F9&lt;br /&gt;
# Скрипт выполнится до первой точки останова или до ошибки&lt;br /&gt;
&lt;br /&gt;
== Установка точек останова ==&lt;br /&gt;
&lt;br /&gt;
'''Способ 1.''' Щёлкните левой кнопкой мыши в левой части нужной строки (область номеров строк). На строке появится красный кружок — точка останова установлена. Повторный щелчок удалит её.&lt;br /&gt;
&lt;br /&gt;
'''Способ 2.''' Установите курсор на строку и используйте пункт меню '''Скрипт''' &amp;gt; '''Добавить точку останова (F5)'''.&lt;br /&gt;
&lt;br /&gt;
'''Важно.''' Точки останова всегда останавливают выполнение на указанной строке, дополнительные условия не поддерживаются.&lt;br /&gt;
&lt;br /&gt;
== Просмотр переменных ==&lt;br /&gt;
&lt;br /&gt;
При остановке на точке останова все переменные автоматически отображаются в списке '''Переменные'''.  &lt;br /&gt;
Значения обновляются при каждой остановке.&lt;br /&gt;
&lt;br /&gt;
== Наблюдение за выражениями ==&lt;br /&gt;
Список '''Наблюдения''' показывает все добавленные пользователям выражения и их рассчитанные значения в текущей строке остановки. Значения обновляются автоматически на каждой сработавшей точке останова или после редактирования выражения. Для добавления наблюдения:&lt;br /&gt;
# Выделите текст в редакторе (например, имя переменной или выражение)&lt;br /&gt;
# Выберите в контекстном меню редактора пункт '''Добавить в наблюдение'''&lt;br /&gt;
# Либо используйте меню '''Скрипт''' &amp;gt; '''Добавить наблюдение (Сtrl+F5)''' и введите выражение вручную.&lt;br /&gt;
&lt;br /&gt;
Выражение будет добавлено в список и пересчитываться при каждой остановке.&lt;br /&gt;
&lt;br /&gt;
'''Примеры выражений:'''&lt;br /&gt;
* $a + $b — сумма переменных&lt;br /&gt;
* db.RecordCount — количество записей в наборе данных&lt;br /&gt;
* $i &amp;gt; 0 — логическое условие&lt;br /&gt;
&lt;br /&gt;
== Продолжение выполнения ==&lt;br /&gt;
&lt;br /&gt;
После остановки скрипта:&lt;br /&gt;
# Просмотрите значения переменных и выражений наблюдения&lt;br /&gt;
# При необходимости скорректируйте точки останова или выражения наблюдения&lt;br /&gt;
# Нажмите кнопку '''Продолжить (F9)''' — выполнение продолжится до следующей точки останова или завершения скрипта&lt;br /&gt;
&lt;br /&gt;
== Остановка выполнения ==&lt;br /&gt;
&lt;br /&gt;
Во время выполнения скрипта можно нажать и удерживать клавишу '''ESC''' для аварийной остановки.&lt;br /&gt;
&lt;br /&gt;
= Работа с файлами =&lt;br /&gt;
&lt;br /&gt;
== Открытие файла с отслеживанием ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Открыть и отслеживать'''.&lt;br /&gt;
&lt;br /&gt;
Открывает файл скрипта и включает автоматическое отслеживание изменений на диске.  &lt;br /&gt;
При изменении файла во внешнем редакторе текст автоматически обновляется в отладчике.&lt;br /&gt;
&lt;br /&gt;
== Сохранение в файл ==&lt;br /&gt;
&lt;br /&gt;
Меню '''Файл''' &amp;gt; '''Сохранить в файл'''.&lt;br /&gt;
&lt;br /&gt;
Сохраняет текущий текст скрипта в файл.  &lt;br /&gt;
Если файл был открыт ранее, по умолчанию предлагается исходный путь.&lt;br /&gt;
&lt;br /&gt;
= Сохранение =&lt;br /&gt;
&lt;br /&gt;
Если отладчик открыт как редактор скрипта, доступны функции по сохранению напрямую в базу данных:&lt;br /&gt;
* Меню '''Файл''' &amp;gt; '''Сохранить''' — сохранить скрипт в базу данных&lt;br /&gt;
* Кнопка  '''Сохранить и закрыть''' — сохранить скрипт и закрыть окно отладчика&lt;br /&gt;
&lt;br /&gt;
= Подключение отладчика к работающим скриптам =&lt;br /&gt;
Данная возможность позволяет подключить отладчик к скриптам запущеным без него. Сначала нужно отладчик перевести в режим '''ожидания запросов отладки'''. Далее необходимо запустить скрипт стандартным способом. Если в скрипте будет команда AttachDebugger - отладчик это увидит и начнется процесс отладки этого скрипта. Это удобно для отладки скриптов, которые работают в своем контексте:&lt;br /&gt;
* Скриптов из печатных форм&lt;br /&gt;
* Скриптов из системных событий&lt;br /&gt;
* Скриптов из дополнительных услуг&lt;br /&gt;
&lt;br /&gt;
== Как использовать ==&lt;br /&gt;
&lt;br /&gt;
'''В отладчике:'''&lt;br /&gt;
# Откройте отладчик скриптов, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Включите режим отслеживания: меню '''Скрипт''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# В строке состояния отладчика появится сообщение '''Ожидание команды AttachDebugger...'''.&lt;br /&gt;
# Свернуть отладчик, если его закрыть то наблюдение остановится.&lt;br /&gt;
&lt;br /&gt;
'''В скрипте:'''&lt;br /&gt;
# Скрипт нужно подготовить. В скрипте нужно прописать команду '''AttachDebugger''' она должна быть '''первой командой''' или идти сразу после тега начала скрипта &amp;lt;?&amp;gt;&lt;br /&gt;
# Запустить скрипт стандартным образом: Сформировать печатную форму, рассчитать стоимость доставки, выполнить действие для вызова события.&lt;br /&gt;
&lt;br /&gt;
'''Что происходит:'''&lt;br /&gt;
# При выполнении команды AttachDebugger - скрипт останавливается.&lt;br /&gt;
# Отладчик автоматически подключается к выполняющемуся скрипту.&lt;br /&gt;
# Текст скрипта загружается в редактор отладчика.&lt;br /&gt;
# Можно ставить точки останова, просматривать переменные и продолжать отладку.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта с запросом подключения к отладчику:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($sum, $a + $b);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Важно:'''&lt;br /&gt;
* Отладчик должен быть в режиме отслеживания до того, как скрипт дойдёт до команды AttachDebugger.&lt;br /&gt;
* Команда `AttachDebugger` должна быть первой командой в скрипте.&lt;br /&gt;
* Если режим отслеживания не включён, команда AttachDebugger в скрипте игнорируется и ничего не делает.&lt;br /&gt;
* В режиме отслеживания может работать только один отладчик.&lt;br /&gt;
* Если скрипт исполняется в шедулере или в другом вспомогательном потоке, то подключится к нему не получится. Отладка работает только в текущем потоке приложения.&lt;br /&gt;
&lt;br /&gt;
= Горячие клавиши =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Клавиша !! Действие&lt;br /&gt;
|-&lt;br /&gt;
| '''F9''' || Запустить скрипт в режиме отладки или продолжить исполнение&lt;br /&gt;
|-&lt;br /&gt;
| '''ESC''' || Аварийная остановка скрипта (удерживать)&lt;br /&gt;
|-&lt;br /&gt;
| '''F5''' || Добавить или удалить точку останова&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+F5''' || Добавить наблюдение&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+S''' || Сохранение изменений в базу данных, если скрипт был открыт для редактирования в отладчике&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+1..9''' || Перейти в закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|-&lt;br /&gt;
| '''Ctrl+Shift+1..9''' || Добавить закладку 1 .. 9 в редакторе кода&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Настройки редактора =&lt;br /&gt;
&lt;br /&gt;
== Перенос строк ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Перенос строк'''.&lt;br /&gt;
&lt;br /&gt;
Включает или выключает автоматический перенос длинных строк.  &lt;br /&gt;
Настройка сохраняется и восстанавливается при следующем запуске отладчика.&lt;br /&gt;
&lt;br /&gt;
== Отображение специальных символов ==&lt;br /&gt;
&lt;br /&gt;
Контекстное меню редактора &amp;gt; '''Показать специальные символы'''.&lt;br /&gt;
&lt;br /&gt;
Показывает пробелы и табуляции в виде специальных символов.  &lt;br /&gt;
Удобно для поиска лишних пробелов и контроля форматирования кода.&lt;br /&gt;
&lt;br /&gt;
= Примеры использования =&lt;br /&gt;
&lt;br /&gt;
== Пример 1: Отладка скрипта с точками останова ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность простого цикла суммирования. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($i, 10);&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
while($i &amp;gt; 0, &lt;br /&gt;
  set($sum, $sum + $i); &lt;br /&gt;
  set($i, $i - 1)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик, главное меню '''Отчеты''' &amp;gt; '''SQL''' &amp;gt; '''Выполнить''' &amp;gt; '''Запустить отладчик (F9)'''.&lt;br /&gt;
# Введите скрипт&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# '''Запустите скрипт (F9)'''.&lt;br /&gt;
# При остановке просмотрите значения $i и $sum в списке переменных.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i.&lt;br /&gt;
# Нажимайте '''Продолжить''', наблюдая, как меняются значения до завершения цикла.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, как накапливается сумма на каждом шаге.&lt;br /&gt;
* Можно быстро обнаружить ошибки в логике цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 2: Отладка скрипта с условиями ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить, корректно ли выбирается максимум из двух значений. Пример скрипта: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
if($a &amp;gt; $b, &lt;br /&gt;
  set($result, $a), &lt;br /&gt;
  set($result, $b)&lt;br /&gt;
);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if($a &amp;gt; $b.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значения $a и $b.&lt;br /&gt;
# Добавьте выражение наблюдения $a &amp;gt; $b.&lt;br /&gt;
# Продолжите выполнение и посмотрите, какое значение попало в $result.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Понятно, при каких значениях срабатывает та или иная ветка условия.&lt;br /&gt;
* Удобно тестировать разные комбинации входных данных.&lt;br /&gt;
&lt;br /&gt;
== Пример 3: Отладка скрипта с работой с базой данных ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить правильность выборки и обработки данных из базы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT code FROM city  WHERE name Like &amp;quot;%Москва%&amp;quot;');&lt;br /&gt;
if(db.RecordCount &amp;gt; 0,&lt;br /&gt;
  set($code, int(db.FieldByName('code'))),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
showmessage($code);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке if(db.RecordCount &amp;gt; 0.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# При остановке просмотрите значение db.RecordCount.&lt;br /&gt;
# Добавьте выражение наблюдения db.FieldByName('code').&lt;br /&gt;
# Продолжите выполнение и убедитесь, что в $code попало ожидаемое значение.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Видно, сколько записей вернул запрос.&lt;br /&gt;
* Можно проверить конкретные значения полей перед дальнейшей обработкой.&lt;br /&gt;
&lt;br /&gt;
== Пример 4: Отладка скрипта через AttachDebugger ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Подключиться к скрипту печатной формы, который выполняется из основного приложения.&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# В скрипт печатной формы, первой строкой добавьте команду `AttachDebugger`. &lt;br /&gt;
# Запустите печатную форму.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
&lt;br /&gt;
Если под рукой нет печатной формы. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
AttachDebugger;&lt;br /&gt;
new('TSelfADO', 'db');&lt;br /&gt;
db.Open('SELECT COUNT(*) as cnt FROM address WHERE date_put IS NULL');&lt;br /&gt;
set($count, int(db.FieldByName('cnt')));&lt;br /&gt;
if($count &amp;gt; 100,&lt;br /&gt;
  showmessage('Внимание! Много недоставленных адресов!'),&lt;br /&gt;
  0&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий для скрипта из примера:&lt;br /&gt;
# Откройте отладчик скриптов.&lt;br /&gt;
# Включите режим отслеживания меню '''Файл''' &amp;gt; '''Ожидать команды AttachDebugger'''.&lt;br /&gt;
# В скрипт печатной формы, первой строкой добавьте команду `AttachDebugger`. &lt;br /&gt;
# Откройте '''Отчеты''' &amp;gt; '''SQL''' укажите скрипт из примера.&lt;br /&gt;
# Запустите скрипт меню '''Выполнить''' &amp;gt; '''Выполнить как скрипт (F7)'''.&lt;br /&gt;
# Когда выполнение дойдёт до AttachDebugger, отладчик автоматически подключится.&lt;br /&gt;
# Установите точку останова на строке if($count &amp;gt; 100.&lt;br /&gt;
# Продолжите выполнение и проанализируйте значение $count.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Можно разбирать сценарии, которые запускаются не из отладчика, а из печтаных форм, дополнительных услуг и т.д.&lt;br /&gt;
* Скрипт становится доступен для анализа так же, как и обычный скрипт, запущенный из отладчика.&lt;br /&gt;
&lt;br /&gt;
== Пример 5: Отладка скрипта с циклом FOR ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Проверить корректность вычислений в цикле FOR. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($sum, 0);&lt;br /&gt;
for($i, 1, 10, &lt;br /&gt;
 set($sum, $sum + $i)&lt;br /&gt;
);&lt;br /&gt;
showmessage($sum);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($sum, $sum + $i);.&lt;br /&gt;
# Запустите скрипт (F9) и просматривайте значения $i и $sum при остановках.&lt;br /&gt;
# Добавьте выражение наблюдения $sum + $i для контроля вычислений.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Пошагово видно, как формируется итоговая сумма.&lt;br /&gt;
* Удобно находить ошибки в граничных условиях цикла.&lt;br /&gt;
&lt;br /&gt;
== Пример 6: Использование выражений наблюдения ==&lt;br /&gt;
&lt;br /&gt;
'''Задача.''' Одновременно контролировать несколько взаимосвязанных значений. Пример скрипта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?&amp;gt;&lt;br /&gt;
set($a, 10);&lt;br /&gt;
set($b, 20);&lt;br /&gt;
set($c, 30);&lt;br /&gt;
set($result, $a + $b + $c);&lt;br /&gt;
showmessage($result);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
План действий:&lt;br /&gt;
# Откройте отладчик.&lt;br /&gt;
# Введите скрипт.&lt;br /&gt;
# Установите точку останова на строке set($result, $a + $b + $c);.&lt;br /&gt;
# Запустите скрипт (F9).&lt;br /&gt;
# Добавьте выражения наблюдения:&lt;br /&gt;
#* $a + $b&lt;br /&gt;
#* $b + $c&lt;br /&gt;
#* $a + $b + $c&lt;br /&gt;
# При остановке сравните значения выражений и итоговый результат.&lt;br /&gt;
&lt;br /&gt;
'''Что даёт отладчик:'''&lt;br /&gt;
* Одновременно видно несколько ключевых показателей.&lt;br /&gt;
* Легче находить расхождения между промежуточными и итоговыми значениями.&lt;/div&gt;</summary>
		<author><name>Sammy</name></author>	</entry>

	</feed>