Работа с отладчиком в процессе изучения встроенного языка «1С:Предприятие 8» (составил А.Л. Гуревич (Москва)) Отладчик – это удобный инструмент, помогающий облегчить разработку программных модулей системы «1С:Предприятие 8». В настоящей заметке мы обратим особое внимание на использовании отладчика для изучения встроенного языка. При изучении работы отладчика мы будем использовать материалы учебного курса «Основы конфигурирования в системе "1С:Предприятие 8.0"», разработанного Интернетуниверситетом информационных технологий (http://www.intuit.ru/department/office/intro1c/5/intro1c_5.html). Как мы отмечали в наших заметках «Учебные комментарии к программам на встроенном языке «1С:Предприятие 8»» (см. http://buhgalteria2006.narod.ru/files/Radchenko_Programmy.zip), особую сложность, на наш взгляд, имеют элементы второго типа - объектно-ориентированные, и, в частности, данные агрегатного типа1. Для исследования и анализа этих переменных можно использовать возможности отладчика. Постараемся рассмотреть деятельность отладчика более подробно. Важное предварительное замечание. Настоящие заметки предназначены для начинающих программистов в системе «1С:Предприятие 8» и являются своего рода дневником в процессе изучения программирования. Поэтому мы просим не судить их слишком строго и сообщить нам о наличии ошибок и неточностей по электронному адресу <al_gurevich@mail.ru>. В то же время мы надеемся, что наши заметки принесут некоторую пользу другим изучающим платформу «1С:Предприятие 8». Поэтому мы рискнули поместить данный текст в интернете, в открытом доступе. Отладчик предоставляет программисту большие дополнительные возможности. Нас же, в первую очередь, будут интересовать а) пошаговое выполнение модуля; б) расстановка точек останова; в) просмотр динамики свойств объектов и значений переменных агрегатного типа в процессе отладки и др. Для того, чтобы использовать отладчик необходимо, чтобы одновременно с конфигуратором была запущена отлаживаемая конфигурация в режиме "1С:Предприятие". Меню отладчика «Отладка» в конфигураторе имеет следующие опции: 1) Начать отладку (F5). 2) Останавливаться по ошибке. 3) Подключиться. 4) Отключиться. 5) Точка останова (F9). 6) Точка останова с условием... 7) Отключить точку останова (Ctrl + Shift + F9). 8) Убрать все точки останова. 9) Отключить все точки останова. 10) Список точек останова (Alt + F9). 11) Замер производительности. Для использования отладчика необходимо выполнить следующие действия: 1. Запускаем конфигуратор. Подробнее о данных агрегатного типа см., например: Бартеньев О. В. 1С:Предприятие: программирование для всех. Базовые объекты и расчеты на одной дискете. - М.: Диалог-МИФИ, 2005; Михайлов С.Е. Программирование как дважды два. – СПб.: Тритон, 2005 и др. 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). 2 Здесь и далее тексты программ выделены цветом, а примечания (им предшествует знак //) – курсивом. 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» начинающему программисту будет чрезвычайно полезно рассмотреть динамику свойств объектов и значений переменных агрегатного типа в процессе отладки еще в нескольких учебных процедурах (например, содержащих запросы, вывод различных печатных форм и др.).