Работа с отладчиком в процессе изучения встроенного языка «1С:Предприятие 8» (составил (Москва))
Отладчик – это удобный инструмент, помогающий облегчить разработку программных модулей системы «1С:Предприятие 8». В настоящей заметке мы обратим особое внимание на использовании отладчика для изучения встроенного языка.
При изучении работы отладчика мы будем использовать материалы учебного курса «Основы конфигурирования в системе "1С:Предприятие 8.0"», разработанного Интернет-университетом информационных технологий (http://www. *****/department/office/intro1c/5/intro1c_5.html).
Как мы отмечали в наших заметках «Учебные комментарии к программам на встроенном языке «1С:Предприятие 8»» (см. http://*****/files/Radchenko_Programmy. zip), особую сложность, на наш взгляд, имеют элементы второго типа - объектно-ориентированные, и, в частности, данные агрегатного типа[1]. Для исследования и анализа этих переменных можно использовать возможности отладчика.
Постараемся рассмотреть деятельность отладчика более подробно.
Важное предварительное замечание. Настоящие заметки предназначены для начинающих программистов в системе «1С:Предприятие 8» и являются своего рода дневником в процессе изучения программирования. Поэтому мы просим не судить их слишком строго и сообщить нам о наличии ошибок и неточностей по электронному адресу <*****@***ru>. В то же время мы надеемся, что наши заметки принесут некоторую пользу другим изучающим платформу «1С:Предприятие 8». Поэтому мы рискнули поместить данный текст в интернете, в открытом доступе.
Отладчик предоставляет программисту большие дополнительные возможности. Нас же, в первую очередь, будут интересовать а) пошаговое выполнение модуля; б) расстановка точек останова; в) просмотр динамики свойств объектов и значений переменных агрегатного типа в процессе отладки и др.
Для того, чтобы использовать отладчик необходимо, чтобы одновременно с конфигуратором была запущена отлаживаемая конфигурация в режиме "1С:Предприятие".
Меню отладчика «Отладка» в конфигураторе имеет следующие опции:
1) Начать отладку (F5).
2) Останавливаться по ошибке.
3) Подключиться.
4) Отключиться.
5) Точка останова (F9).
6) Точка останова с условием...
7) Отключить точку останова (Ctrl + Shift + F9).
8) Убрать все точки останова.
9) Отключить все точки останова.
10) Список точек останова (Alt + F9).
11) Замер производительности.
Для использования отладчика необходимо выполнить следующие действия:
1. Запускаем конфигуратор.
2. Открываем модуль, предназначенный для отладки.
В качестве примера мы разберем следующую процедуру в форме документа «ОказаниеУслуги» из книги «1С:Предприятие 8.0: Практическое пособие разработчика: Примеры и типовые приемы» (М.: 1С-Паблишинг, 2006. С. 126-128). Эта процедура активизируется при изменении параметра «Номенклатура» табличной части «ПереченьНоменклатуры» указанного документа.
Процедура ПереченьНоменклатурыНоменклатураПриИзменении(Элемент)[2]
//получить текущую строку табличной части
СтрокаТабличнойЧасти = ЭлементыФормы. ПереченьНоменклатуры. ТекущиеДанные;
//установить цену
СтрокаТабличнойЧасти. Цена = РозничнаяЦена(Дата, Элемент. Значение);
//пересчитать сумму строки
РассчитатьСумму(СтрокаТабличнойЧасти);
//установить вид номенклатуры
СтрокаТабличнойЧасти. ВидНоменклатуры = Элемент. Значение. ВидНоменклатуры;
КонецПроцедуры
3. Расставляем точку останова.
Для этого подведем курсор к первому оператору процедуры:
СтрокаТабличнойЧасти = ЭлементыФормы. ПереченьНоменклатуры. ТекущиеДанные;
и выберем опцию Отладка - Точка останова (F9).
Слева от оператора появился значок (большая красная точка).
4. Запускаем режим «1С:Предприятие» для выбранной конфигурации, а если режим уже был запущен, то выполним команду "Отладка - Подключиться".
5. Выполним действия, которые вызовут исполнение отлаживаемого модуля (в данном случае, откроем один из документов «Оказание услуги» (Операции – Документы - Оказание услуги) и изменим одно из значений параметра «Номенклатура» в табличной части документа).
Откроется конфигуратор, и в значке первой точки останова появится желтая стрелочка.
При этом количество опций в меню «Отладка» увеличится:
1) Продолжить отладку (F5).
2) Перезапустить (Ctrl + Shift + F5).
3) Прекратить (Shift + F5).
4) Остановить.
5) Останавливаться по ошибке.
6) Подключиться.
7) Отключиться.
8) Шагнуть в (F11).
9) Шагнуть через (F10).
10) Шагнуть из (Shift + F11).
11) Идти до курсора (Shift + F10).
12) Текущая строка.
13) Точка останова (F9).
14) Точка останова с условием...
15) Отключить точку останова (Ctrl + Shift + F9).
16) Убрать все точки останова.
17) Отключить все точки останова.
18) Список точек останова (Alt + F9).
19) Вычислить выражение (Shift + F9).
20) Табло (Ctrl + Alt + W).
21) Стек вызовов (Ctrl + Alt + C).
22) Замер производительности.
6. Проведем пошаговое выполнение модуля.
Для этого выберем опцию «Отладка - Шагнуть через» или F10. Желтая стрелочка переместилась на следующую строку.
Действие пошаговой отладки можно повторять.
Теперь попробуем рассмотреть текущие свойства используемых объектов и параметры переменных. Это поможет нам лучше понять их структуру и логику.
Вначале рассмотрим свойства наиболее сложного из объектов (в данном случае) – объекта «Элемент», передаваемого процедуре.
Для этого подведем курсор в модуле формы документа к имени этого объекта в выражении:
Процедура ПереченьНоменклатурыНоменклатураПриИзменении(Элемент)
и нажмем на правую кнопку мыши.
Выберем опцию «Вычислить выражение» (вместо этого можно нажать клавиши Shift + F9).
Появится окно «Выражение» для объекта «Элемент».
Нажмем на кнопку «Включить в табло» в правой части окна.
В нижней части экрана откроется табло с колонками «Выражение», «Значение» и «Тип».
Раскроем свойства объекта «Элемент» нажатием на знак «+» слева от слова «Элемент» в колонке «Выражение».
Отладчик позволяет выделение необходимой части табло клавишами Shift + Стрелочка и его копирования стандартным сочетанием клавишам Ctrl + C и Ctrl + V.
Выражение | Значение | Тип |
Элемент | ПолеВвода | ПолеВвода |
АвтоВыборНезаполненного | ложь | Булево |
АвтоОтметкаНезаполненного | ложь | Булево |
АвтоПереносСтрок | истина | Булево |
БыстрыйВыбор | ложь | Булево |
ВертикальнаяПолосаПрокрутки | Не использовать | ИспользованиеПоло- |
ВертикальноеПоложение | Прижать вверх | ВертикальноеПоложение |
ВыбиратьТип | истина | Булево |
ВыборГруппИЭлементов | Группы и элементы | ИспользованиеГрупп- |
ВыборНезаполненного | ложь | Булево |
ВыборПоВладельцу | Неопределено | |
ВыделенныйТекст | "Ремонт отечественного телевизора" | Строка |
ВыделятьОтрицательные | ложь | Булево |
ВысотаСпискаВыбора | 0 | Число |
ГоризонтальнаяПолосаПрокрутки | Не использовать | ИспользованиеПолосыПро- |
ГоризонтальноеПоложение | Автоматически | ГоризонтальноеПоложе- |
Доступность | истина | Булево |
Значение | Ремонт отечественного телевизора | СправочникСсылка. Но- |
ВидНоменклатуры | Услуга | ПеречислениеСсыл- |
Владелец | Неопределено | |
Код | 10 | Число |
Наименование | "Ремонт отечественного телевизора" | Строка |
ПометкаУдаления | ложь | Булево |
Предопределенный | ложь | Булево |
Родитель | Телевизоры | СправочникСсылка. Но- |
Ссылка | Ремонт отечественного телевизора | СправочникСсылка. Но- |
ЭтоГруппа | ложь | Булево |
Картинка | Картинка | Картинка |
Вид | Пустая | ВидКартинки |
КартинкаКнопкиВыбора | Картинка | Картинка |
Вид | Пустая | ВидКартинки |
КнопкаВыбора | истина | Булево |
КнопкаОткрытия | ложь | Булево |
КнопкаОчистки | истина | Булево |
КнопкаРегулирования | ложь | Булево |
КнопкаСпискаВыбора | ложь | Булево |
ОграничениеТипа | ОписаниеТипов | |
КвалификаторыДаты | КвалификаторыДаты | КвалификаторыДаты |
КвалификаторыСтроки | КвалификаторыСтроки | КвалификаторыСтроки |
КвалификаторыЧисла | КвалификаторыЧисла | КвалификаторыЧисла |
ОтметкаНезаполненного | ложь | Булево |
Подсказка | "" | Строка |
ПрозрачныйФон | ложь | Булево |
Рамка | Рамка | Рамка |
Вид | Абсолютная | ВидРамки |
ТипРамки | Неопределено | |
Толщина | 0 | Число |
РедактированиеТекста | истина | Булево |
РежимВыбораИзСписка | ложь | Булево |
РежимВыбораНезаполненного | При нажатии Enter | РежимВыбораНезапол- |
СочетаниеКлавиш | СочетаниеКлавиш | СочетаниеКлавиш |
Alt | ложь | Булево |
Ctrl | ложь | Булево |
Shift | ложь | Булево |
Клавиша | Нет | Клавиша |
СписокВыбора | СписокЗначений | |
ТипЗначения | Справочник ссылка: Номенклатура | ОписаниеТипов |
КвалификаторыДаты | КвалификаторыДаты | КвалификаторыДаты |
КвалификаторыСтроки | КвалификаторыСтроки | КвалификаторыСтроки |
КвалификаторыЧисла | КвалификаторыЧисла | КвалификаторыЧисла |
ТолькоПросмотр | ложь | Булево |
Формат | "" | Строка |
ЦветРамки | стиль: Рамка | Цвет |
ЦветТекста | Авто | Цвет |
ЦветТекстаКнопки | стиль: Текст кнопки | Цвет |
ЦветТекстаПоля | Авто | Цвет |
ЦветФона | 255, 255, 255 | Цвет |
ЦветФонаКнопки | стиль: Фон кнопки | Цвет |
ЦветФонаПоля | Авто | Цвет |
ШиринаСпискаВыбора | 0 | Число |
Шрифт | Авто | Шрифт |
ЭлементСвязиПоТипу | 1 | Число |
Свойства объекта «Элемент» в табло упорядочены по алфавиту.
В числе ключевых свойств можно упомянуть следующие:
Выражение | Значение | Тип |
Элемент | ПолеВвода | ПолеВвода |
Значение | Ремонт отечественного телевизора | СправочникСсылка. Но- |
ВидНоменклатуры | Услуга | ПеречислениеСсыл- |
Код | 10 | Число |
Нетрудно видеть, что в процессе пошагового выполнения процедуры значения свойств объекта «Элемент» не изменяются.
В процессе отладки объект «Элемент» можно удалить из табло клавишей «Delete».
Соответственно ключевые параметры свойства «ЭлементыФормы», используемого для доступа к элементам управления, расположенным на форме, следующие:
Выражение | Значение | Тип |
ЭлементыФормы | ЭлементыФормы | ЭлементыФормы |
Дата | ПолеВвода | ПолеВвода |
Значение | 15.06.2007 8:02:10 | Дата |
Клиент | ПолеВвода | ПолеВвода |
Значение | СправочникСсылка. Клиенты | |
Код | 1 | Число |
Ссылка | СправочникСсылка. Клиенты | |
Мастер | ПолеВвода | ПолеВвода |
Значение | СправочникСсылка. Сотрудники | |
Код | 2 | Число |
Ссылка | СправочникСсылка. Сотрудники | |
Номер | ПолеВвода | ПолеВвода |
Значение | 4 | Число |
ПереченьНоменкла- | ТабличноеПоле | ТабличноеПоле |
Значение | ДокументТаблич- | ДокументТабличнаяЧасть. Оказа- |
ТекущиеДанные | ДокументТаблич- | ДокументТабличнаяЧастьСтро- |
ВидНоменклатуры | Услуга | ПеречислениеСсылка. Ви- |
Количество | 1 | Число |
Номенклатура | Ремонт отечественного телевизора | СправочникСсылка. Номен- |
НомерСтроки | 3 | Число |
Стоимость | 600 | Число |
Сумма | 800 | Число |
Цена | 800 | Число |
Склад | ПолеВвода | ПолеВвода |
Значение | Основной | СправочникСсылка. Склады |
Код | 1 | Число |
Ссылка | Основной | СправочникСсылка. Склады |
Параметры «ЭлементыФормы. ПереченьНоменклатуры. ТекущиеДанные. Сумма» и «ЭлементыФормы. ПереченьНоменклатуры. ТекущиеДанные. Цена» (а, в общем случае, «ЭлементыФормы. ПереченьНоменклатуры. ТекущиеДанные. ВидНоменклатуры») изменяются в процессе выполнения процедуры.
Рассмотрим изменения значения переменной «СтрокаТабличнойЧасти» при изменении номенклатуры «Ремонт импортного телевизора» на «Ремонт отечественного телевизора».
Поместим эту переменную в табло аналогичным образом (подведем курсор в модуле формы документа к имени этой переменной в первом операторе процедуры, нажмем на правую кнопку мыши, выберем опцию «Вычислить выражение» (или нажмем на клавиши Shift + F9) и нажмем на кнопку «Включить в табло» в правой части появившегося окна).
После останова на первом операторе в табло появится следующая таблица:
Выражение | Значение | Тип |
СтрокаТабличнойЧасти | Неопределено |
Это правильно, так как к этому моменту переменная «СтрокаТабличнойЧасти» еще не определена и, соответственно, никакого значения у нее еще нет.
При нажатии на клавишу F10 и переходе к следующему оператору:
СтрокаТабличнойЧасти. Цена = РозничнаяЦена(Дата, Элемент. Значение);
Выполнился оператор получения текущей строки табличной части:
СтрокаТабличнойЧасти = ЭлементыФормы. ПереченьНоменклатуры. ТекущиеДанные;
Таблица в табло меняется:
Выражение | Значение | Тип |
СтрокаТабличнойЧасти | ДокументТабличнаяЧастьСтро- | ДокументТабличнаяЧастьСтро- |
ВидНоменклатуры | Услуга | ПеречислениеСсылка. ВидыНо- |
Количество | 1 | Число |
Номенклатура | Ремонт отечественного телевизора | СправочникСсылка. Номенкла- |
ВидНоменклатуры | Услуга | ПеречислениеСсылка. Ви- |
Владелец | Неопределено | |
Код | 10 | Число |
Наименование | "Ремонт отечественного телевизора" | Строка |
ПометкаУдаления | ложь | Булево |
Предопределенный | ложь | Булево |
Родитель | Телевизоры | СправочникСсылка. Номен- |
Ссылка | Ремонт отечественного телевизора | СправочникСсылка. Номен- |
ВидНоменклатуры | Услуга | ПеречислениеСсылка. Ви- |
Владелец | Неопределено | |
Код | 10 | Число |
Наименование | "Ремонт отечественного телевизора" | Строка |
ПометкаУдаления | ложь | Булево |
Предопределенный | ложь | Булево |
Родитель | Телевизоры | СправочникСсылка. Номен- |
Ссылка | Ремонт отечественного телевизора | СправочникСсылка. Номен- |
ЭтоГруппа | ложь | Булево |
ЭтоГруппа | ложь | Булево |
НомерСтроки | 3 | Число |
Стоимость | 600 | Число |
Сумма | 800 | Число |
Цена | 800 | Число |
Снова нажали F10 и перешли на строчку:
РассчитатьСумму(СтрокаТабличнойЧасти);
Выполнился оператор установления цены:
СтрокаТабличнойЧасти. Цена = РозничнаяЦена(Дата, Элемент. Значение);
В результате цена изменилась с 800 руб. до 600 руб. (напоминаем, что производится изменения номенклатуры «Ремонт импортного телевизора» на «Ремонт отечественного телевизора»):
Выражение | Значение | Тип |
СтрокаТабличнойЧасти | ДокументТабличнаяЧастьСтро- | ДокументТабличнаяЧастьСтро- |
(...) | (...) | (...) |
Стоимость | 600 | Число |
Сумма | 800 | Число |
Цена | 600 | Число |
Еще раз нажали F10 и перешли на строчку:
СтрокаТабличнойЧасти. ВидНоменклатуры = Элемент. Значение. ВидНоменклатуры;
Выполнился оператор пересчета суммы строки:
РассчитатьСумму(СтрокаТабличнойЧасти);
В результате сумма изменилась с 800 руб. до 600 руб.
Выражение | Значение | Тип |
СтрокаТабличнойЧасти | ДокументТабличнаяЧастьСтро- | ДокументТабличнаяЧастьСтро- |
(...) | (...) | (...) |
Стоимость | 600 | Число |
Сумма | 600 | Число |
Цена | 600 | Число |
Еще раз нажали F10 и перешли на строчку:
КонецПроцедуры
Выполнился оператор установления вида номенклатуры:
СтрокаТабличнойЧасти. ВидНоменклатуры = Элемент. Значение. ВидНоменклатуры;
В данном случае вид номенклатуры не изменился, так как и «Ремонт отечественного телевизора», и «Ремонт импортного телевизора» имеют значения вида номенклатуры «Услуга».
В заключение необходимо отметить, что, по нашему мнению, для закрепления понимания структуры объектов и переменных в системе «1С:Предприятие 8» начинающему программисту будет чрезвычайно полезно рассмотреть динамику свойств объектов и значений переменных агрегатного типа в процессе отладки еще в нескольких учебных процедурах (например, содержащих запросы, вывод различных печатных форм и др.).
[1] Подробнее о данных агрегатного типа см., например: 1С:Предприятие: программирование для всех. Базовые объекты и расчеты на одной дискете. - М.: Диалог-МИФИ, 2005; Михайлов как дважды два. – СПб.: Тритон, 2005 и др.
[2] Здесь и далее тексты программ выделены цветом, а примечания (им предшествует знак //) – курсивом.


