gifts2017

Хитрости отладки кода 1С II

Опубликовал Андрей Куришко (boggonzikov) в раздел Программирование - Практика программирования

Прием отладки кода во внешней обработке, что позволит ускорить скорость кодирования/отладки.

 Лучше пол часа потерять, а потом за 5 минут долететь.


При кодировании и отладке часто нужно проверять код на реальных данных и просмотр результата что получилось. Получается

  1. Пишем код.
  2. Запускаем 1С в режиме отладке (F5) после правки кода.
  3. Воспроизводим случай отладки/тестирования. (например: открываем документы, жмякаем на кнопку печать и т.д. ).
  4. Проверяем код. 

При этом очень часто открытие данных для анализа (пункт 3), может занимать продолжительное время. Можно исключить пункт 2 и 3 используя вынос кода процедуры во внешнюю обработку.

Вот пример

Отладка = ВнешниеОбработки.Создать("ПУТЬ К ОБРАБОТКЕ");
Отладка.ИМЯ_ПРОЦЕДУРЫ(Параметр1, Параметр2, Параметр3);

Я  используя обёртку. Код процедуры ниже.

ОтладитьКодВВнешняяОбработка("ПУТЬ К ОБРАБОТКЕ").
        
ИМЯ_ПРОЦЕДУРЫ(Параметр1, Параметр2, Параметр3);

 

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

Вот простой пример использования.

Есть процедура печати в модуля формы документа:

// Формирует печатную форму "Макет"
//
// Возвращаемое значение:
//  сформированный табличный документ:
//
Функция ПечатьМакет() Экспорт

   
Макет = ПолучитьМакет("Макет");

   
Запрос = Новый запрос;
   
Запрос.Текст ="ВЫБРАТЬ
                  | Дата,
                  | Номер
                  |ИЗ
                  | Документ.Документ  КАК Документ
                  |ГДЕ
                  | Ссылка = &Ссылка"
;

   
Запрос.УстановитьПараметр("Документ", Ссылка);

   
ТабДок = Новый ТабличныйДокумент;

   
Шапка = Запрос.Выполнить().Выбрать();
   
Шапка.Следующий();

   
ТабДок.Вывести(Шапка);


    Возврат
ТабДок;

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

Копируем код процедура из модуля документа в модуль обработки отладки.

В модуле документа меняем код процедуры

 

// Формирует печатную форму "Макет"
//
// Возвращаемое значение:
//  сформированный табличный документ:
//
Функция ПечатьМакет() Экспорт


    Возврат
ОтладитьКодВВнешняяОбработка("ПУТЬ К ОБРАБОТКЕ", ЭтотОбъект).
        
ПечатьМакет();

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

В модуле отладки обработки меняем только строку

    Запрос.УстановитьПараметр("Документ", _ЭтотОбъект.Ссылка);

Теперь отлаживаем код быстро и легко, исправляем код, сохраняем обработку, кнопка печать. 

Перенос кода происходит тоже быстро Ctrl + Н ( Замена) удаляем все вхождения «_ ЭтотОбъект .»

 

Вот пример моего модуля (из файлов ОтладкаКода.epf). Процедуру ОтладитьКодВВнешняяОбработка необходимов вынести в общий модуль.

///////////////////////////////////////////////////////////////////////////////
// ОТЛАДКА КОДА
// Эта обработка предназначена для отладки кода
// Created by Куришко Андрей, http://infostart.ru/profile/21352/

////////////////////////////////////////////////////////////////////////////////
// ПЕРЕМЕННЫЕ МОДУЛЯ

Перем _ЭтотОбъект Экспорт; // переменная объекта отладки.
Перем _ФормаОбъекта Экспорт; //переменная основной формы отладки.

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ОТЛАДКА КОДА

// Функция предназначена для создания обработки отладки
//
// Параметры
//  ИмяФайлаОтладки  - Строка> - путь к текущему файлу
//
//  ОбъектОтладки  - ОбъектОтладки - Объект отладки
//
//  ОсновнаяФорма  - ОсновнаяФорма - Основная форма отладки
//
//  КэшироватьОбработкуОтладки  - Булево - признак кэширования внешней обработки отладки
//                  для ускорения работы при многократном использовании
// Возвращаемое значение:
//
Функция _ОтладитьКодВВнешняяОбработка(ИмяФайлаОтладки, ОбъектОтладки = Неопределено, ОсновнаяФорма = Неопределено, КэшироватьОбработкуОтладки = Ложь) Экспорт

   
ВнешняяОбработкаОтладки =  Неопределено;

    Если
КэшироватьОбработкуОтладки Тогда
       
//для кэширования ищем ВнешняяОбработкаОтладки в ДополнительныеСвойства
       
ВнешняяОбработкаОтладки НайтиОбработкаОтладкиВПеременнойОбъекте(ОбъектОтладки);
    КонецЕсли;

    Если
ВнешняяОбработкаОтладки = Неопределено Тогда //создаем предмет отладки
       
ВнешняяОбработкаОтладки = ВнешниеОбработки.Создать(ИмяФайлаОтладки);

        Если
КэшироватьОбработкуОтладки Тогда
           
//попытка поместить ВнешняяОбработкаОтладким в ДополнительныеСвойства, для кэширования
           
Выполнено = ПоместитьОбработкаОтладкиВПеременнуюОбъект(ОбъектОтладки, ВнешняяОбработкаОтладки);
        КонецЕсли;
    КонецЕсли;

   
ВнешняяОбработкаОтладки._ЭтотОбъект = ОбъектОтладки;
   
ВнешняяОбработкаОтладки._ФормаОбъекта = ОсновнаяФорма;

    Возврат
ВнешняяОбработкаОтладки;

КонецФункции
// ОтладитьКод

//
//
Функция НайтиОбработкаОтладкиВПеременнойОбъекте(ПеременнаяОбъект)

    Если
ПеременнаяОбъект = Неопределено Тогда
        Возврат Неопределено;
    КонецЕсли;

    Попытка

       
ДополнительныеСвойства ПеременнаяОбъект.ДополнительныеСвойства;
        Если
ДополнительныеСвойства.Свойство("Отладка") Тогда
            Возврат
ДополнительныеСвойства.Отладка;
        КонецЕсли;

    Исключение

        Возврат Неопределено;

    КонецПопытки;

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

//
//
Функция ПоместитьОбработкаОтладкиВПеременнуюОбъект(ПеременнаяОбъект, ОбработкаОтладки)

   
Выполнено  = Ложь;

    Если
ПеременнаяОбъект = Неопределено Тогда
        Возврат
Выполнено;
    КонецЕсли;

    Попытка

       
ДополнительныеСвойства ПеременнаяОбъект.ДополнительныеСвойства;
       
ДополнительныеСвойства.Вставить("Отладка", ОбработкаОтладки);
       
Выполнено  = Истина;

    Исключение

        Возврат
Выполнено;

    КонецПопытки;

    Возврат
Выполнено;

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

////////////////////////////////////////////////////////////////////////////////
// ПРИМЕРЫ СОЗДАНИЯ ОБРАБОТКИ ОТЛАДКИ КОДА

//////////////////////////////////////////////////////////////////////////////
//ОтладитьКодВВнешняяОбработка("ПУТЬ К ОБРАБОТКЕ").
//       ИМЯ_ПРОЦЕДУРЫ();

/////////////////////////////////////////////////////////////////////////////////
//Отладка = ВнешниеОбработки.Создать("ПУТЬ К ОБРАБОТКЕ");
//Отладка.ИМЯ_ПРОЦЕДУРЫ();


////////////////////////////////////////////////////////////////////////////////
// ОТЛАЖИВАЕМЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ ОТЛАДКА КОДА

//
//
Процедура ИМЯ_ПРОЦЕДУРЫ() Экспорт



КонецПроцедуры
// ИМЯ_ПРОЦЕДУРЫ()

// ОТЛАЖИВАЕМЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ ОТЛАДКА КОДА
////////////////////////////////////////////////////////////////////////////////



Скачать файлы

Наименование Файл Версия Размер
ОтладкаКода 107
.epf 5,10Kb
20.03.12
107
.epf 5,10Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Павел Хорев (w22u) 20.03.12 23:19
Сразу вспомнилось #ЗагрузитьИзФайла TEXT.TXT в 1С 7.7
2. Андрей Куришко (boggonzikov) 20.03.12 23:28
(1) w22u,
Аналогично, можно делать через "Выполнить(ТекстКода)".
Но плюс этого способа, в отладке можешь пошагово анализировать код.
Рамзес; +1 Ответить
3. Ю М (mtv:)) 21.03.12 05:32
(0) Спасибо за идею, понравилась.
4. Наталья Болотнова (bol) 21.03.12 06:32
5. bulpi bulpi (bulpi) 21.03.12 10:10
Уважаемый автор! Представьте, что Вы- это не Вы , такой умный, а простой читатель Инфостарта. Такая вот актерская разминка. Внимательно почитайте эту публикацию. Как я . Один раз, второй, третий.... Вы хоть что-нибудь поняли ?
Впрочем, судя по плюсам, это я такой глупый...
6. Андрей Гердт (AndreyNit) 21.03.12 11:07
Полностью согласен с автором, спасибо. Возьму на вооружение.
7. Илья (i132) 21.03.12 11:28
В вызов внешней процедуры стоит добавить проверку существования файла внешней обработки:

ФайлОбработки = Новый Файл("ПУТЬ К ОБРАБОТКЕ");
Если ФайлОбработки.Существует() Тогда
; Отладка=ВнешниеОбработки.Создать(ФайлОбработки.ПолноеИмя);
; Отладка.ИМЯ_ПРОЦЕДУРЫ(Параметр1, Параметр2, Параметр3);
; Возврат;
КонецЕсли;

Если вдруг забудите удалить этот вызов из рабочей базы - у пользователей файл не найдется и процедура выполнится в обычном режиме.
boggonzikov; +1 Ответить
8. Sergey Sergey (Sergey___) 21.03.12 11:57
Полезно. Спасибо. Автору плюс.
9. Sergey Ivanov (sergb1979) 21.03.12 12:12
а В планах обмена при конвертации можно это использовать?
10. Андрей Куришко (boggonzikov) 21.03.12 12:31
(9) sergb1979,
Не понятно что ты имеешь ввиду.
11. Sergey Ivanov (sergb1979) 21.03.12 12:42
(10) boggonzikov, Сории что не изучил до конца, вопрос. Это интерактивная отладка. Иногда требуется отладка в конвертации данных
12. Илья (i132) 21.03.12 13:29
(9) конечно! в правилах конвертации добавляешь подключаемые обработки, например БиблиотекаВыгрузки

а в обработчке перед выгрузкой данных пишешь:

ФайлОбработки = Новый Файл("U:\ConvData\ExtForms\БиблиотекаВыгрузки.epf");
Если ФайлОбработки.Существует() Тогда
; ДопОбработки.БиблиотекаВыгрузки=ВнешниеОбработки.Создать(ФайлОбработки.ПолноеИмя);
КонецЕсли;

В правилах конвертации прописать вызывы функциий из обработоки.
после отладки-изменний обработки -не забыть загрузить изменненную обработку.
13. Sergey Ivanov (sergb1979) 21.03.12 13:33
(12) i132, Вот это я и хотел понять, просто не четко выразился.
14. Александр Рытов (Арчибальд) 21.03.12 14:24
Я противник такого подхода. Свою позицию изложил в 49-м комменте к http://infostart.ru/public/121283/
15. Андрей Куришко (boggonzikov) 21.03.12 14:57
(14) Арчибальд,
В твоих словах есть разумное зерно. Согласен, что многие сейчас пишут снизу в вверх, не задумываясь про структуру логику, только лепя запладки. Но для разных случаев есть свои инструменты.
Пример: тебе дают сложный написанный не тобой код, ну так на 3 экрана )). По твоему способу я должен медитировать над кодом, чтобы понять как он работает, и прозрев исправить или дописать 2-е свои строчки.
16. Александр Ф (fromon) 21.03.12 16:05
Полезная фишка, беру на вооружение!
17. larissa builova (larisab) 21.03.12 16:14
(15)
По твоему способу я должен медитировать над кодом, чтобы понять как он работает, и прозрев исправить или дописать 2-е свои строчки

Да, должен. Этому учат на курсах по конфигурированию в типовых решениях.
По большому счету спец должен понимать код без всяких отладчиков, хотя он ускоряет понимание, да :)
МимохожийОднако; +1 Ответить 1
18. Vladimir (Boroda) 21.03.12 18:57
(17) Иногда некогда понимать, кужно сделать, и сделать быстро. Грубо говоря, выдать быстро "на гора" продукцию. Вот здесь-то и пригодится этот приём. Да и понимается через отладчик лучше, тоже поможет при изучении.
А насчёт того, чтобы стремиться "понимать код, как открытую книгу"... никто же и не спорит....
Bassgood; daho; +2 Ответить 1
19. Осипов Сергей (fixin) 21.03.12 21:12
Гуру знают, а новичкам полезно....
20. Dmitriy (daho) 22.03.12 07:25
(18) Boroda, Это точно... всегда на позавчера... незнаю ктобы бы мог сходу за 5 минут наварганить что-нибудь более-менее полезное на незнакомой да еще и доморощенной конфигурации, про которую пользователи не могут внятно что-либо сказать... максимум - поставили - работает...
21. Анна Денисова (aimerlive) 22.03.12 08:43
Считаю Публикацию весьма полезной. Потому что я считаю без отладчика весьма сложно в чем то разобраться особенно новичку. а через 50 лет то наверно да... буду намного меньше им пользоваться.
22. Алексей Сергеев (students) 22.03.12 11:26
Статья интересная. Но на мисте более подробно было написано про отладку.
23. Модератор раздела Артур Аюханов (artbear) 22.03.12 15:38
Профессионалы как раз редко пользуются отладчиком, только в исключительных случаях.
Сабжевый метод давно известен и удобен для простой доработки кода, а не только для отладки. Отладка здесь вторична.
24. Игорь М (ivm032) 23.03.12 10:55
интересная идея. Надо попробовать.
25. Василий Казьмин (awk) 23.03.12 11:15
(14) Арчибальд, Программирование - это процесс внесения ошибок, тестирование - процесс нахождения , а отладка - процесс их исправления. Тут не важны инструменты, тут важен процесс. Используешь ты отладчик или строишь в уме поведение программы - ты все равно занимаешься отладкой. А если бы я не встречал в 1С недокументированное поведение (1С 7.7 функция Окр(Число, Точность, Способ) какой способ не ставил, округляло одинаково), то наверное согласился бы, что ум лучше (просто он иногда незаменим).

(0) Вся статья - это идея что не перезагружая 1С отлаживать быстрее? Если так, то статью надо переписывать, а то за деревьями леса не видно.
CratosX; boggonzikov; Арчибальд; +3 Ответить 1
26. Александр Рытов (Арчибальд) 23.03.12 11:54
(25)
просто он иногда незаменим
Зачет!
(23) Вот именно.
27. Антон Антонов (materiy_boec) 23.03.12 17:51
28. Дмитрий Леонов (Psylocibine) 24.03.12 08:11
А есть какие нибудь удобные способы отладки обработок обслуживания торгового оборудования?
30. Юрий Зайцев (Yury1001) 26.03.12 15:20
Зачётно, помнится на 7-ке так некоторые алгоритмы выносил чтобы править без выгона пользователей.
31. Andrey Dyak (electronik) 26.03.12 17:18
32. Алекс Ю (AlexO) 29.03.12 14:20
Я не уловил всеобщего восхищения.
Если вся суть статьи - избавится от перегрузок 1с при отладке, то, например, для меня это не актуально - я сохраняю, переключаюсь в Предприятие, нахожу и открываю обработку в Предприятии - столько же времени, сколько идет запуск 1с:Предприятия из отладчика.
Если автор ответит внятно - поставлю плюс за просто улучшенный и автоматизированный код запуска внешней обработки "из кода".
Он нужен, но не в данной ситуации.
33. Андрей Куришко (boggonzikov) 29.03.12 22:48
(32) AlexO,
Рекомендую внимательно прочитать публикацию, подумать, потом снова подумать, если не воскликнули алилуя снова подумать, не думая выполнить приведённый пример... и воскликнуть "алилуя". Поставить плюс или же минус.
34. Дмитрий Харатьянов (dymkis) 07.04.12 00:25
Автор молодец хотя бы потому, что акцентировал внимание на возможности сэкономить время, которого и так катастрофически не хватает.
35. Артем Трущ (papami) 10.04.12 09:19
Отличная идея. Берем на вооружение!
36. Илья (i132) 28.04.12 19:48
Еще одна хитрость при отладке обрабток данных -- создать отчет который отслеживает измененние данных.
Пример: http://infostart.ru/public/98910/ -- Достаточно при создании объекта подключить обработчик ЛогИзменений.РегистрироватьИзменения(Док), момент/место когда объект записывают отчет найдет сам.
Когда обработка завершена вызвать отчет изменений.
boggonzikov; +1 Ответить
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа