Хитрости отладки кода 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/

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

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

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

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

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

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

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

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

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

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

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

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

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

    Попытка

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

    Исключение

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

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

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

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

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

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

    Попытка

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

    Исключение

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

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

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

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

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

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

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


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

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



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

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



Файлы

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

См. также

Лучшие комментарии

25. awk 23.03.2012 11:15
(14) Арчибальд, Программирование - это процесс внесения ошибок, тестирование - процесс нахождения , а отладка - процесс их исправления. Тут не важны инструменты, тут важен процесс. Используешь ты отладчик или строишь в уме поведение программы - ты все равно занимаешься отладкой. А если бы я не встречал в 1С недокументированное поведение (1С 7.7 функция Окр(Число, Точность, Способ) какой способ не ставил, округляло одинаково), то наверное согласился бы, что ум лучше (просто он иногда незаменим).

(0) Вся статья - это идея что не перезагружая 1С отлаживать быстрее? Если так, то статью надо переписывать, а то за деревьями леса не видно.
Ответили: (26)
# Ответить
18. Boroda 21.03.2012 18:57
(17) Иногда некогда понимать, кужно сделать, и сделать быстро. Грубо говоря, выдать быстро "на гора" продукцию. Вот здесь-то и пригодится этот приём. Да и понимается через отладчик лучше, тоже поможет при изучении.
А насчёт того, чтобы стремиться "понимать код, как открытую книгу"... никто же и не спорит....
Ответили: (20)
+ 2 [ Bassgood; daho; ]
# Ответить
2. boggonzikov 20.03.2012 23:28
(1) w22u,
Аналогично, можно делать через "Выполнить(ТекстКода)".
Но плюс этого способа, в отладке можешь пошагово анализировать код.
+ 1 [ Рамзес; ]
# Ответить

Комментарии

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

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

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

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

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

В правилах конвертации прописать вызывы функциий из обработоки.
после отладки-изменний обработки -не забыть загрузить изменненную обработку.
Ответили: (13)
+ 1 [ sergb1979; ]
# Ответить
13. sergb1979 21.03.2012 13:33
(12) i132, Вот это я и хотел понять, просто не четко выразился.
# Ответить
14. Арчибальд 21.03.2012 14:24
Я противник такого подхода. Свою позицию изложил в 49-м комменте к http://infostart.ru/public/121283/
Ответили: (15) (25)
# Ответить
15. boggonzikov 21.03.2012 14:57
(14) Арчибальд,
В твоих словах есть разумное зерно. Согласен, что многие сейчас пишут снизу в вверх, не задумываясь про структуру логику, только лепя запладки. Но для разных случаев есть свои инструменты.
Пример: тебе дают сложный написанный не тобой код, ну так на 3 экрана )). По твоему способу я должен медитировать над кодом, чтобы понять как он работает, и прозрев исправить или дописать 2-е свои строчки.
Ответили: (17)
# Ответить
16. fromon 21.03.2012 16:05
Полезная фишка, беру на вооружение!
# Ответить
17. larisab 21.03.2012 16:14
(15)
По твоему способу я должен медитировать над кодом, чтобы понять как он работает, и прозрев исправить или дописать 2-е свои строчки

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

(0) Вся статья - это идея что не перезагружая 1С отлаживать быстрее? Если так, то статью надо переписывать, а то за деревьями леса не видно.
Ответили: (26)
# Ответить
26. Арчибальд 23.03.2012 11:54
(25)
просто он иногда незаменим
Зачет!
(23) Вот именно.
# Ответить
27. materiy_boec 23.03.2012 17:51
Подходит
# Ответить
28. Psylocibine 24.03.2012 08:11
А есть какие нибудь удобные способы отладки обработок обслуживания торгового оборудования?
# Ответить
30. Yury1001 26.03.2012 15:20
Зачётно, помнится на 7-ке так некоторые алгоритмы выносил чтобы править без выгона пользователей.
# Ответить
31. electronik 26.03.2012 17:18
Идея класная
# Ответить
32. AlexO 29.03.2012 14:20
Я не уловил всеобщего восхищения.
Если вся суть статьи - избавится от перегрузок 1с при отладке, то, например, для меня это не актуально - я сохраняю, переключаюсь в Предприятие, нахожу и открываю обработку в Предприятии - столько же времени, сколько идет запуск 1с:Предприятия из отладчика.
Если автор ответит внятно - поставлю плюс за просто улучшенный и автоматизированный код запуска внешней обработки "из кода".
Он нужен, но не в данной ситуации.
Ответили: (33)
# Ответить
33. boggonzikov 29.03.2012 22:48
(32) AlexO,
Рекомендую внимательно прочитать публикацию, подумать, потом снова подумать, если не воскликнули алилуя снова подумать, не думая выполнить приведённый пример... и воскликнуть "алилуя". Поставить плюс или же минус.
# Ответить
34. dymkis 07.04.2012 00:25
Автор молодец хотя бы потому, что акцентировал внимание на возможности сэкономить время, которого и так катастрофически не хватает.
# Ответить
35. papami 10.04.2012 09:19
Отличная идея. Берем на вооружение!
# Ответить
36. i132 28.04.2012 19:48
Еще одна хитрость при отладке обрабток данных -- создать отчет который отслеживает измененние данных.
Пример: http://infostart.ru/public/98910/ -- Достаточно при создании объекта подключить обработчик ЛогИзменений.РегистрироватьИзменения(Док), момент/место когда объект записывают отчет найдет сам.
Когда обработка завершена вызвать отчет изменений.
+ 1 [ boggonzikov; ]
# Ответить
Внимание! За постинг в данном форуме $m не начисляются.
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл