Использованіе YAML в отладкѣ

Всѣ мы для отладки (да и не только) используем вывод нѣкоторой иногда полезной информации. Как правило, используется старое доброе «Сообщить». Обычно это выглядит примѣрно так:

[code lang=»odines»]
СписокВидовДокументов = Новый Массив;
СписокВидовДокументов.Добавить(«ПоступлениеТоваровУслуг»);
СписокВидовДокументов.Добавить(«РеализацияТоваровУслуг»);
СписокВидовДокументов.Добавить(«ПеремещениеТоваров»);

Для Каждого мВидДокумента Из СписокВидовДокументов Цикл

Сообщить(«Обрабатывается » + мВидДокумента);

Выборка = ПолучитьНекоторуюВыборку(мВидДокумента);
Пока Выборка.Следующий() Цикл

Сообщить(«Обрабатывается документ: » + Выборка.Ссылка);

КонецЦикла;

КонецЦикла;

[/code]

Результат:

Обрабатывается ПоступлениеТоваровУслуг
Обрабатывается документ: Поступление товаров и услуг 00000000016 от 29.10.2012 12:00:04
Обрабатывается документ: Поступление товаров и услуг 00000000017 от 27.11.2012 18:11:02
Обрабатывается документ: Поступление товаров и услуг 00000000018 от 27.11.2012 18:11:03
Обрабатывается документ: Поступление товаров и услуг 00000000019 от 27.11.2012 18:11:04
....
Обрабатывается РеализацияТоваровУслуг
Обрабатывается документ: Реализация товаров и услуг 00000000001 от 29.11.2012 17:18:12
....
Обрабатывается ПеремещениеТоваров
Обрабатывается документ: Перемещение товаров 00000000024 от 06.12.2012 17:51:27
Обрабатывается документ: Перемещение товаров 00000000033 от 12.12.2012 17:22:06
....

И всё хорошо, всѣ рады, всё видно — можно кинуть сообщенія начальнику, чтоб знал, какіе документы были обработаны. Но можно сдѣлать эту информацію чуточку удобнѣе:

[code lang=»odines»]
СписокВидовДокументов = Новый Массив;
СписокВидовДокументов.Добавить(«ПоступлениеТоваровУслуг»);
СписокВидовДокументов.Добавить(«РеализацияТоваровУслуг»);
СписокВидовДокументов.Добавить(«ПеремещениеТоваров»);

Для Каждого мВидДокумента Из СписокВидовДокументов Цикл

Сообщить(«- Обрабатывается » + мВидДокумента);

Выборка = ПолучитьНекоторуюВыборку(мВидДокумента);
Пока Выборка.Следующий() Цикл

Сообщить(» — » + Выборка.Ссылка);

КонецЦикла;

КонецЦикла;

[/code]

В результатѣ чѣго получим слѣдующій вывод:

 

- Обрабатывается ПоступлениеТоваровУслуг
  - Поступление товаров и услуг 00000000016 от 29.10.2012 12:00:04
  - Поступление товаров и услуг 00000000017 от 27.11.2012 18:11:02
  - Поступление товаров и услуг 00000000018 от 27.11.2012 18:11:03
  - Поступление товаров и услуг 00000000019 от 27.11.2012 18:11:04
  .....
- Обрабатывается РеализацияТоваровУслуг
  - Реализация товаров и услуг 00000000001 от 29.11.2012 17:18:12
  .....
- Обрабатывается ПеремещениеТоваров
  - Перемещение товаров 00000000024 от 06.12.2012 17:51:27
  - Перемещение товаров 00000000033 от 12.12.2012 17:22:06
  - Перемещение товаров 00000000036 от 18.12.2012 16:46:44
  .....

 

Копипастим сіе дѣло в Notepad++ (искренне надеюсь, что нечто подобное стоит у многих), включаем синтаксис YAML и видим:

npp_yaml_output

 

Основное преимущество YAML в том, что это по сути просто текст, но с минимально необходимой размѣткой. Что дѣлает его удобным для отладочного вывода? То, что в нём нѣт закрывающих тэгов: т.е., всё, что вы уже подали на вывод, является вѣрно размѣченным текстом. Это особенно важно, когда процесс прерывается по Ctrl+Break или по исключенію.

Бѣзусловно, реализація всѣго стандарта цѣликом — дѣло довольно муторное, но я думаю, редкій человѣк будет заниматься в 1С использованіем YAML вмѣсто XML в боевых цѣлях. Маленькое несоотвѣтствіе стандарту как-раз можно увидѣть на картинкѣ: минуты и секунды подкрашены чёрным цвѣтом, а текст ДО них — синим. Всё дѣло в том, что первое двоеточіе заставляет парсер воспринимать строку, как элемент Ключ: Значеніе. Дѣло исправляется обёрткой вывода в кавычки, но опять же — в цѣлях быстраго отладочнаго вывода это совершенно не критично.

Итак, мы бѣз лишних библіотек, обработок, компонент и прочих велосипедов, парочкой дополнительных пробѣлов и чёрточек можем существенно облегчить себѣ воспріятіе выводимой информаціи.

Кстати, для любителей библіотек могу привести набросанный на скорую руку код:

[code lang=»odines»]Перем мУровень;

Функция Уровень() Экспорт
Возврат мУровень;
КонецФункции

Функция Отступ(Дельта = 0)

Р = «»;

Для Инд = 1 По мУровень + Дельта Цикл
Р = Р + » «;
КонецЦикла;

Возврат Р;

КонецФункции

Процедура ОткрытьРаздел(ИмяРаздела) Экспорт

Сообщить(«» + Отступ() + «- » + ИмяРаздела);
мУровень = мУровень + 1;

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

Процедура СообщитьСОтступом(Сообщение, Дельта = 0)
Сообщить(«» + Отступ(Дельта) + Сообщение);
КонецПроцедуры

Процедура Вывести(Значение) Экспорт

Если ТипЗнч(Значение) = Тип(«Массив») Тогда

ОткрытьРаздел(«»);

Для Каждого мЗначение Из Значение Цикл
СообщитьСОтступом(«- » + мЗначение, 1);
КонецЦикла;

ЗакрытьРаздел();

ИначеЕсли ТипЗнч(Значение) = Тип(«Структура») Тогда

ОткрытьРаздел(«»);

Для Каждого мКлючЗначение Из Значение Цикл
СообщитьСОтступом(«- » + мКлючЗначение.Ключ + «: » + мКлючЗначение.Значение, 1);
КонецЦикла;

ЗакрытьРаздел();

Иначе
СообщитьСОтступом(«- » + Значение);
КонецЕсли;

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

Процедура ЗакрытьРаздел() Экспорт

Если мУровень > 0 Тогда
мУровень = мУровень — 1;
КонецЕсли;

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

мУровень = 0;
[/code]

И примѣр использованія:

[code lang=»odines»]Перем МаксимальныйУровеньВложенности;

Функция ОпределитьНекотороеЗначение()
Г = Новый ГенераторСлучайныхЧисел;
Ч = Г.СлучайноеЧисло(0, 3);

Если Ч = 0 Тогда

М = Новый Массив;
КоличествоЭлементов = Г.СлучайноеЧисло(1, 5);

Для Инд = 1 По КоличествоЭлементов Цикл
М.Добавить(Г.СлучайноеЧисло(0, 20) — 10);
КонецЦикла;

Возврат М;

ИначеЕсли Ч = 1 Тогда

Возврат Новый Структура(«СлучайноеЧисло,ТекущаяДата», Г.СлучайноеЧисло(0, 10), ТекущаяДата());

ИначеЕсли Ч = 2 Тогда

Возврат Г.СлучайноеЧисло(0, 20) — 10;

ИначеЕсли Ч = 3 Тогда

Возврат «СтрокаСтрокаСтрока»;

КонецЕсли;

КонецФункции

Процедура Протестировать(Уровень, СлучайныйПараметр = Неопределено) Экспорт

мТекущееЗначениеОтладки = ОпределитьНекотороеЗначение();
ОткрытьРаздел(«Вызов «);

ОткрытьРаздел(«Параметры вызова»);
Вывести(«Уровень: » + Уровень);
Вывести(«Параметр1: » + СлучайныйПараметр);
ЗакрытьРаздел();

Вывести(мТекущееЗначениеОтладки);

Если Уровень < МаксимальныйУровеньВложенности Тогда

Г = Новый ГенераторСлучайныхЧисел;
Ч = Г.СлучайноеЧисло(0, 10);

Для Инд = 1 По Ч Цикл
ОбработкаПрерыванияПользователя();
Протестировать(Уровень + 1, Г.СлучайноеЧисло(0, 10));
КонецЦикла;

КонецЕсли;

ЗакрытьРаздел();

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

Процедура КнопкаВыполнитьНажатие(Кнопка)

МаксимальныйУровеньВложенности = 5;
Протестировать(1);

КонецПроцедуры[/code]

Вот примѣр возможнаго результата работы:

npp_yaml-lib_example_output

 

В заключеніе и нѣмного продолжая тему YAML:

Если вмѣсто Сообщить использовать вывод в файл, то полученную информацію можно будет использовать даже послѣ аварійного завершенія программы. Для многих языков программированія существуют парсеры YAML (для 1С: http://infostart.ru/public/173076/), что даёт возможность автоматически обрабатывать полученный файл отладочной информаціи: понять, что было продѣлано и на каком мѣстѣ, собственно, рухнуло.

Обработка с выводом в файл в приложеніи YML-file.epf. Хотя, разница там только в том, что вмѣсто Сообщить используется ЗаписьТекста.ЗаписатьСтроку. Запускаем обработку, обрубаем процесс через диспетчер задач, открываем файл в Notepad++ и видим, что он бѣз проблем парсится.

На этом всё. Благодарю за вниманіе.

Файлы: yml.epf yml-file.epf


Добавить комментарий