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

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

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


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

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

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

Вот пример

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Попытка

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

    Исключение

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

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

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

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

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

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

    Попытка

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

    Исключение

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

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

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

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

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

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

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

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

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

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

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

34 Comments

  1. w22u

    Сразу вспомнилось #ЗагрузитьИзФайла TEXT.TXT в 1С 7.7

    Reply
  2. boggonzikov

    (1) w22u,

    Аналогично, можно делать через «Выполнить(ТекстКода)».

    Но плюс этого способа, в отладке можешь пошагово анализировать код.

    Reply
  3. mtv:)

    (0) Спасибо за идею, понравилась.

    Reply
  4. bol

    интересно

    Reply
  5. bulpi

    Уважаемый автор! Представьте, что Вы- это не Вы , такой умный, а простой читатель Инфостарта. Такая вот актерская разминка. Внимательно почитайте эту публикацию. Как я . Один раз, второй, третий…. Вы хоть что-нибудь поняли ?

    Впрочем, судя по плюсам, это я такой глупый…

    Reply
  6. AndreyNit

    Полностью согласен с автором, спасибо. Возьму на вооружение.

    Reply
  7. i132

    В вызов внешней процедуры стоит добавить проверку существования файла внешней обработки:

    ФайлОбработки = Новый Файл(«ПУТЬ К ОБРАБОТКЕ»);

    Если ФайлОбработки.Существует() Тогда

    ; Отладка=ВнешниеОбработки.Создать(ФайлОбработки.ПолноеИмя);

    ; Отладка.ИМЯ_ПРОЦЕДУРЫ(Параметр1, Параметр2, Параметр3);

    ; Возврат;

    КонецЕсли;

    Если вдруг забудите удалить этот вызов из рабочей базы — у пользователей файл не найдется и процедура выполнится в обычном режиме.

    Reply
  8. Sergey___

    Полезно. Спасибо. Автору плюс.

    Reply
  9. sergb1979

    а В планах обмена при конвертации можно это использовать?

    Reply
  10. boggonzikov

    (9) sergb1979,

    Не понятно что ты имеешь ввиду.

    Reply
  11. sergb1979

    (10) Сории что не изучил до конца, вопрос. Это интерактивная отладка. Иногда требуется отладка в конвертации данных

    Reply
  12. i132

    (9) конечно! в правилах конвертации добавляешь подключаемые обработки, например БиблиотекаВыгрузки

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

    ФайлОбработки = Новый Файл(«U:ConvDataExtFormsБиблиотекаВыгрузки.epf»);

    Если ФайлОбработки.Существует() Тогда

    ; ДопОбработки.БиблиотекаВыгрузки=ВнешниеОбработки.Создать(ФайлОбработки.ПолноеИмя);

    КонецЕсли;

    В правилах конвертации прописать вызывы функциий из обработоки.

    после отладки-изменний обработки -не забыть загрузить изменненную обработку.

    Reply
  13. sergb1979

    (12) i132, Вот это я и хотел понять, просто не четко выразился.

    Reply
  14. Арчибальд

    Я противник такого подхода. Свою позицию изложил в 49-м комменте к http://infostart.ru/public/121283/

    Reply
  15. boggonzikov

    (14) Арчибальд,

    В твоих словах есть разумное зерно. Согласен, что многие сейчас пишут снизу в вверх, не задумываясь про структуру логику, только лепя запладки. Но для разных случаев есть свои инструменты.

    Пример: тебе дают сложный написанный не тобой код, ну так на 3 экрана )). По твоему способу я должен медитировать над кодом, чтобы понять как он работает, и прозрев исправить или дописать 2-е свои строчки.

    Reply
  16. fromon

    Полезная фишка, беру на вооружение!

    Reply
  17. larisab

    (15)

    По твоему способу я должен медитировать над кодом, чтобы понять как он работает, и прозрев исправить или дописать 2-е свои строчки

    Да, должен. Этому учат на курсах по конфигурированию в типовых решениях.

    По большому счету спец должен понимать код без всяких отладчиков, хотя он ускоряет понимание, да 🙂

    Reply
  18. Boroda

    (17) Иногда некогда понимать, кужно сделать, и сделать быстро. Грубо говоря, выдать быстро «на гора» продукцию. Вот здесь-то и пригодится этот приём. Да и понимается через отладчик лучше, тоже поможет при изучении.

    А насчёт того, чтобы стремиться «понимать код, как открытую книгу»… никто же и не спорит….

    Reply
  19. fixin

    Гуру знают, а новичкам полезно….

    Reply
  20. daho

    (18) Boroda, Это точно… всегда на позавчера… незнаю ктобы бы мог сходу за 5 минут наварганить что-нибудь более-менее полезное на незнакомой да еще и доморощенной конфигурации, про которую пользователи не могут внятно что-либо сказать… максимум — поставили — работает…

    Reply
  21. aimerlive

    Считаю Публикацию весьма полезной. Потому что я считаю без отладчика весьма сложно в чем то разобраться особенно новичку. а через 50 лет то наверно да… буду намного меньше им пользоваться.

    Reply
  22. students

    Статья интересная. Но на мисте более подробно было написано про отладку.

    Reply
  23. ivm032

    интересная идея. Надо попробовать.

    Reply
  24. awk

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

    (0) Вся статья — это идея что не перезагружая 1С отлаживать быстрее? Если так, то статью надо переписывать, а то за деревьями леса не видно.

    Reply
  25. Арчибальд

    (25)

    просто он иногда незаменим

    Зачет!

    (23) Вот именно.

    Reply
  26. materiy_boec

    Подходит

    Reply
  27. Psylocibine

    А есть какие нибудь удобные способы отладки обработок обслуживания торгового оборудования?

    Reply
  28. Yury1001

    Зачётно, помнится на 7-ке так некоторые алгоритмы выносил чтобы править без выгона пользователей.

    Reply
  29. electronik

    Идея класная

    Reply
  30. AlexO

    Я не уловил всеобщего восхищения.

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

    Если автор ответит внятно — поставлю плюс за просто улучшенный и автоматизированный код запуска внешней обработки «из кода».

    Он нужен, но не в данной ситуации.

    Reply
  31. boggonzikov

    (32) AlexO,

    Рекомендую внимательно прочитать публикацию, подумать, потом снова подумать, если не воскликнули алилуя снова подумать, не думая выполнить приведённый пример… и воскликнуть «алилуя». Поставить плюс или же минус.

    Reply
  32. dymkis

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

    Reply
  33. papami

    Отличная идея. Берем на вооружение!

    Reply
  34. i132

    Еще одна хитрость при отладке обрабток данных — создать отчет который отслеживает измененние данных.

    Пример: http://infostart.ru/public/98910/ — Достаточно при создании объекта подключить обработчик ЛогИзменений.РегистрироватьИзменения(Док), момент/место когда объект записывают отчет найдет сам.

    Когда обработка завершена вызвать отчет изменений.

    Reply

Leave a Comment

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