Лучше пол часа потерять, а потом за 5 минут долететь.
При кодировании и отладке часто нужно проверять код на реальных данных и просмотр результата что получилось. Получается
- Пишем код.
- Запускаем 1С в режиме отладке (F5) после правки кода.
- Воспроизводим случай отладки/тестирования. (например: открываем документы, жмякаем на кнопку печать и т.д. ).
- Проверяем код.
При этом очень часто открытие данных для анализа (пункт 3), может занимать продолжительное время. Можно исключить пункт 2 и 3 используя вынос кода процедуры во внешнюю обработку.
Вот пример
Отладка = ВнешниеОбработки.Создать(«ПУТЬ К ОБРАБОТКЕ»);
Отладка.ИМЯ_ПРОЦЕДУРЫ(Параметр1, Параметр2, Параметр3);
Я используя обёртку. Код процедуры ниже.
ОтладитьКодВВнешняяОбработка(«ПУТЬ К ОБРАБОТКЕ»).
ИМЯ_ПРОЦЕДУРЫ(Параметр1, Параметр2, Параметр3);
Часто у меня получается: отлаживаешь код, думаешь сейчас быстренько поправлю, не буду выносить, и каждый раз поправил не много кода, запускаешь предприятие опять долго воспроизводишь и опять правишь, запускаешь… , и наконец выносишь, скорость правки существенно увеличивается.
Вот простой пример использования.
Есть процедура печати в модуля формы документа:
// Формирует печатную форму «Макет»
//
// Возвращаемое значение:
// сформированный табличный документ:
//
Функция ПечатьМакет() Экспорт
Макет = ПолучитьМакет(«Макет»);
Запрос = Новый запрос;
Запрос.Текст =«ВЫБРАТЬ
| Дата,
| Номер
|ИЗ
| Документ.Документ КАК Документ
|ГДЕ
| Ссылка = &Ссылка»;
Запрос.УстановитьПараметр(«Документ», Ссылка);
ТабДок = Новый ТабличныйДокумент;
Шапка = Запрос.Выполнить().Выбрать();
Шапка.Следующий();
ТабДок.Вывести(Шапка);
Возврат ТабДок;
КонецФункции
Копируем код процедура из модуля документа в модуль обработки отладки.
В модуле документа меняем код процедуры
// Формирует печатную форму «Макет»
//
// Возвращаемое значение:
// сформированный табличный документ:
//
Функция ПечатьМакет() Экспорт
Возврат ОтладитьКодВВнешняяОбработка(«ПУТЬ К ОБРАБОТКЕ», ЭтотОбъект).
ПечатьМакет();
КонецФункции
В модуле отладки обработки меняем только строку
Запрос.УстановитьПараметр(«Документ», _ЭтотОбъект.Ссылка);
Теперь отлаживаем код быстро и легко, исправляем код, сохраняем обработку, кнопка печать.
Перенос кода происходит тоже быстро Ctrl + Н ( Замена) удаляем все вхождения «_ ЭтотОбъект .»
Вот пример моего модуля (из файлов ОтладкаКода.epf). Процедуру ОтладитьКодВВнешняяОбработка необходимов вынести в общий модуль.
///////////////////////////////////////////////////////////////////////////////
// ОТЛАДКА КОДА
// Эта обработка предназначена для отладки кода
// Created by Куришко Андрей, //infostart.ru/profile/21352/
////////////////////////////////////////////////////////////////////////////////
// ПЕРЕМЕННЫЕ МОДУЛЯ
Перем _ЭтотОбъект Экспорт; // переменная объекта отладки.
Перем _ФормаОбъекта Экспорт; //переменная основной формы отладки.
////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ОТЛАДКА КОДА
// Функция предназначена для создания обработки отладки
//
// Параметры
// ИмяФайлаОтладки — Строка> — путь к текущему файлу
//
// ОбъектОтладки — ОбъектОтладки — Объект отладки
//
// ОсновнаяФорма — ОсновнаяФорма — Основная форма отладки
//
// КэшироватьОбработкуОтладки — Булево — признак кэширования внешней обработки отладки
// для ускорения работы при многократном использовании
// Возвращаемое значение:
//
Функция _ОтладитьКодВВнешняяОбработка(ИмяФайлаОтладки, ОбъектОтладки = Неопределено, ОсновнаяФорма = Неопределено, КэшироватьОбработкуОтладки = Ложь) Экспорт
ВнешняяОбработкаОтладки = Неопределено;
Если КэшироватьОбработкуОтладки Тогда
//для кэширования ищем ВнешняяОбработкаОтладки в ДополнительныеСвойства
ВнешняяОбработкаОтладки = НайтиОбработкаОтладкиВПеременнойОбъекте(ОбъектОтладки);
КонецЕсли;
Если ВнешняяОбработкаОтладки = Неопределено Тогда //создаем предмет отладки
ВнешняяОбработкаОтладки = ВнешниеОбработки.Создать(ИмяФайлаОтладки);
Если КэшироватьОбработкуОтладки Тогда
//попытка поместить ВнешняяОбработкаОтладким в ДополнительныеСвойства, для кэширования
Выполнено = ПоместитьОбработкаОтладкиВПеременнуюОбъект(ОбъектОтладки, ВнешняяОбработкаОтладки);
КонецЕсли;
КонецЕсли;
ВнешняяОбработкаОтладки._ЭтотОбъект = ОбъектОтладки;
ВнешняяОбработкаОтладки._ФормаОбъекта = ОсновнаяФорма;
Возврат ВнешняяОбработкаОтладки;
КонецФункции // ОтладитьКод
//
//
Функция НайтиОбработкаОтладкиВПеременнойОбъекте(ПеременнаяОбъект)
Если ПеременнаяОбъект = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Попытка
ДополнительныеСвойства = ПеременнаяОбъект.ДополнительныеСвойства;
Если ДополнительныеСвойства.Свойство(«Отладка») Тогда
Возврат ДополнительныеСвойства.Отладка;
КонецЕсли;
Исключение
Возврат Неопределено;
КонецПопытки;
КонецФункции
//
//
Функция ПоместитьОбработкаОтладкиВПеременнуюОбъект(ПеременнаяОбъект, ОбработкаОтладки)
Выполнено = Ложь;
Если ПеременнаяОбъект = Неопределено Тогда
Возврат Выполнено;
КонецЕсли;
Попытка
ДополнительныеСвойства = ПеременнаяОбъект.ДополнительныеСвойства;
ДополнительныеСвойства.Вставить(«Отладка», ОбработкаОтладки);
Выполнено = Истина;
Исключение
Возврат Выполнено;
КонецПопытки;
Возврат Выполнено;
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// ПРИМЕРЫ СОЗДАНИЯ ОБРАБОТКИ ОТЛАДКИ КОДА
//////////////////////////////////////////////////////////////////////////////
//ОтладитьКодВВнешняяОбработка(«ПУТЬ К ОБРАБОТКЕ»).
// ИМЯ_ПРОЦЕДУРЫ();
/////////////////////////////////////////////////////////////////////////////////
//Отладка = ВнешниеОбработки.Создать(«ПУТЬ К ОБРАБОТКЕ»);
//Отладка.ИМЯ_ПРОЦЕДУРЫ();
////////////////////////////////////////////////////////////////////////////////
// ОТЛАЖИВАЕМЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ ОТЛАДКА КОДА
//
//
Процедура ИМЯ_ПРОЦЕДУРЫ() Экспорт
КонецПроцедуры // ИМЯ_ПРОЦЕДУРЫ()
// ОТЛАЖИВАЕМЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ ОТЛАДКА КОДА
////////////////////////////////////////////////////////////////////////////////




Сразу вспомнилось #ЗагрузитьИзФайла TEXT.TXT в 1С 7.7
(1) w22u,
Аналогично, можно делать через «Выполнить(ТекстКода)».
Но плюс этого способа, в отладке можешь пошагово анализировать код.
(0) Спасибо за идею, понравилась.
интересно
Уважаемый автор! Представьте, что Вы- это не Вы , такой умный, а простой читатель Инфостарта. Такая вот актерская разминка. Внимательно почитайте эту публикацию. Как я . Один раз, второй, третий…. Вы хоть что-нибудь поняли ?
Впрочем, судя по плюсам, это я такой глупый…
Полностью согласен с автором, спасибо. Возьму на вооружение.
В вызов внешней процедуры стоит добавить проверку существования файла внешней обработки:
ФайлОбработки = Новый Файл(«ПУТЬ К ОБРАБОТКЕ»);
Если ФайлОбработки.Существует() Тогда
; Отладка=ВнешниеОбработки.Создать(ФайлОбработки.ПолноеИмя);
; Отладка.ИМЯ_ПРОЦЕДУРЫ(Параметр1, Параметр2, Параметр3);
; Возврат;
КонецЕсли;
Если вдруг забудите удалить этот вызов из рабочей базы — у пользователей файл не найдется и процедура выполнится в обычном режиме.
Полезно. Спасибо. Автору плюс.
а В планах обмена при конвертации можно это использовать?
(9) sergb1979,
Не понятно что ты имеешь ввиду.
(10) Сории что не изучил до конца, вопрос. Это интерактивная отладка. Иногда требуется отладка в конвертации данных
(9) конечно! в правилах конвертации добавляешь подключаемые обработки, например БиблиотекаВыгрузки
а в обработчке перед выгрузкой данных пишешь:
ФайлОбработки = Новый Файл(«U:ConvDataExtFormsБиблиотекаВыгрузки.epf»);
Если ФайлОбработки.Существует() Тогда
; ДопОбработки.БиблиотекаВыгрузки=ВнешниеОбработки.Создать(ФайлОбработки.ПолноеИмя);
КонецЕсли;
В правилах конвертации прописать вызывы функциий из обработоки.
после отладки-изменний обработки -не забыть загрузить изменненную обработку.
(12) i132, Вот это я и хотел понять, просто не четко выразился.
Я противник такого подхода. Свою позицию изложил в 49-м комменте к
(14) Арчибальд,
В твоих словах есть разумное зерно. Согласен, что многие сейчас пишут снизу в вверх, не задумываясь про структуру логику, только лепя запладки. Но для разных случаев есть свои инструменты.
Пример: тебе дают сложный написанный не тобой код, ну так на 3 экрана )). По твоему способу я должен медитировать над кодом, чтобы понять как он работает, и прозрев исправить или дописать 2-е свои строчки.
Полезная фишка, беру на вооружение!
(15)
Да, должен. Этому учат на курсах по конфигурированию в типовых решениях.
По большому счету спец должен понимать код без всяких отладчиков, хотя он ускоряет понимание, да 🙂
(17) Иногда некогда понимать, кужно сделать, и сделать быстро. Грубо говоря, выдать быстро «на гора» продукцию. Вот здесь-то и пригодится этот приём. Да и понимается через отладчик лучше, тоже поможет при изучении.
А насчёт того, чтобы стремиться «понимать код, как открытую книгу»… никто же и не спорит….
Гуру знают, а новичкам полезно….
(18) Boroda, Это точно… всегда на позавчера… незнаю ктобы бы мог сходу за 5 минут наварганить что-нибудь более-менее полезное на незнакомой да еще и доморощенной конфигурации, про которую пользователи не могут внятно что-либо сказать… максимум — поставили — работает…
Считаю Публикацию весьма полезной. Потому что я считаю без отладчика весьма сложно в чем то разобраться особенно новичку. а через 50 лет то наверно да… буду намного меньше им пользоваться.
Статья интересная. Но на мисте более подробно было написано про отладку.
интересная идея. Надо попробовать.
(14) Арчибальд, Программирование — это процесс внесения ошибок, тестирование — процесс нахождения , а отладка — процесс их исправления. Тут не важны инструменты, тут важен процесс. Используешь ты отладчик или строишь в уме поведение программы — ты все равно занимаешься отладкой. А если бы я не встречал в 1С недокументированное поведение (1С 7.7 функция Окр(Число, Точность, Способ) какой способ не ставил, округляло одинаково), то наверное согласился бы, что ум лучше (просто он иногда незаменим).
(0) Вся статья — это идея что не перезагружая 1С отлаживать быстрее? Если так, то статью надо переписывать, а то за деревьями леса не видно.
(25)
Зачет!
(23) Вот именно.
Подходит
А есть какие нибудь удобные способы отладки обработок обслуживания торгового оборудования?
Зачётно, помнится на 7-ке так некоторые алгоритмы выносил чтобы править без выгона пользователей.
Идея класная
Я не уловил всеобщего восхищения.
Если вся суть статьи — избавится от перегрузок 1с при отладке, то, например, для меня это не актуально — я сохраняю, переключаюсь в Предприятие, нахожу и открываю обработку в Предприятии — столько же времени, сколько идет запуск 1с:Предприятия из отладчика.
Если автор ответит внятно — поставлю плюс за просто улучшенный и автоматизированный код запуска внешней обработки «из кода».
Он нужен, но не в данной ситуации.
(32) AlexO,
Рекомендую внимательно прочитать публикацию, подумать, потом снова подумать, если не воскликнули алилуя снова подумать, не думая выполнить приведённый пример… и воскликнуть «алилуя». Поставить плюс или же минус.
Автор молодец хотя бы потому, что акцентировал внимание на возможности сэкономить время, которого и так катастрофически не хватает.
Отличная идея. Берем на вооружение!
Еще одна хитрость при отладке обрабток данных — создать отчет который отслеживает измененние данных.
Пример: — Достаточно при создании объекта подключить обработчик ЛогИзменений.РегистрироватьИзменения(Док), момент/место когда объект записывают отчет найдет сам.
Когда обработка завершена вызвать отчет изменений.