Разработка прикладных решений для платформы 1С:Предприятие 8.1

Разработка справочной системы, отладка

Показывать лекцию целиком

Цель лекции: научиться снабжать прикладные решения справочной системой, освоить методы отладки.

2.1. Справочная система

В предыдущей лекции мы разрабатывали документ, которым реализуется начисление заработной платы. Несложно было заметить, что если предложить заполнить этот документ пользователю, которому незнакома наша конфигурация, у него, скорее всего, возникнут вопросы. Среди них, например, могут быть следующие:

  • Как правильно заполнять поле "Исходные данные" для различных видов расчета"?
  • Все ли виды расчета требуют заполнения полей "Дата начала" и "Дата окончания"?
  • Каким образом формируются движения документа?
  • Как правило, такая же ситуация характерна и для реально применяющихся конфигураций. Не всегда интуитивно понятно, как именно следует заполнять то или иное поле, как пользоваться теми или иными документами. Для того чтобы помочь пользователю освоить конфигурацию, научиться эффективно и правильно ей пользоваться, существует возможность включения в состав конфигурации справочной системы. По умолчанию справочные материалы, которые можно найти, запустив конфигурацию в режиме 1С:Предприятие, содержат некоторые стандартные разделы, описывающие общие особенности всех конфигураций, пользовательского интерфейса, общие приемы работы. А сведения о созданных разработчиком объектах может добавить в систему лишь он сам.

    Для того, чтобы добавить в справочную систему конфигурации главу, посвященную какому-либо объекту, например, в нашем случае это документ , и установить галочку Включать в содержимое справки - это позволит включить создаваемый справочный раздел в общую систему справки, которая доступна в режиме 1С:Предприятие по команде главного меню Справка>Справка.

    (рис 2.1) Включение справочной информации в справку программы

    Далее следует создать главу справки, посвященную документу. Для того чтобы перейти к окну редактирования справочной информации, нужно нажать на кнопку Справочная информация, которая расположена на той же вкладке Прочее.

    При нажатии на эту кнопку будет открыто окно HTML-редактора, рис 2.2, которое содержит три вкладки.

    (рис 2.2) HTML-редактор при редактировании справки
  • На вкладке Редактирование производится визуальное редактирование текста. Здесь текст можно вводить, форматировать (с помощью панелей инструментов Форматирование и Редактирование ), в этом же режиме в документ можно добавлять таблицы, рисунки (команда главного меню Элементы ), ссылки.
  • На вкладке Текст можно просмотреть и отредактировать HTML-код документа.
  • Вкладка Просмотр предназначена для просмотра готового документа.
  • Документ автоматически сохраняется при закрытии.

    Мы ввели в документ руководство по использованию документа, теперь посмотрим, как получить доступ к справке по документу из режима 1С:Предприятие.

    Как уже было сказано, при установке флажка .

    (рис 2.3) Новая глава справочной системы

    А именно, здесь, в дополнение к уже существующему стандартному разделу 1С:Предприятие, появляется раздел Конфигурация, который содержит нашу справку.

    Получить доступ к этой информации можно и из окна документа .

    (рис 2.4) Вызов справки из окна списка документов

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

    (рис 2.5) Окно справочной информации

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

    (рис 2.6) Результаты поиска по справке

    2.2. Автоматизация заполнения регистра сведений

    Регистр сведений, данные которого используются при расчете оклада, можно заполнять вручную. Но гораздо удобнее реализовать автоматическое заполнение этого регистра. Сейчас мы напишем обработку, которая реализует эту функцию.

    В обработке мы будем создавать записи регистра сведений РабочиеДниПоГрафику, заполняя данные по заданному графику за заданный период. В качестве периода мы будем указывать диапазон месяцев, за который хотим заполнить график. Так же мы будем указывать график, по которому хотим заполнить регистр.

    Напомним, что в справочнике ГрафикиРаботы есть реквизит Примечание. Этот реквизит, для правильной работы нашей обработки, должен будет содержать номера дней в неделе, которые мы хотим, в соответствии с выбранным графиком, установить как выходные. Так, для графика, предназначенного для шестидневной рабочей недели, мы должны будем указать в реквизите Примечание номер выходного дня. Это - воскресенье, то есть - день №7. Для пятидневного графика это будут суббота и воскресенье, то есть - дни 6 и 7.

    Создадим новую обработку, назовем ее ЗаполнениеГрафиков.

    На вкладке Данные добавим следующие реквизиты:

    НачалоПериода - тип Дата, состав даты - Дата ;
    КонецПериода - тип Дата, состав даты - Дата ;
    График - тип СправочникСсылка.ГрафикиРаботы ;

    Создадим форму обработки, укажем, что реквизитам формы должны соответствовать поля ввода, рис 2.7.

    (рис 2.7) Форма обработки заполнения графиков

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

    Процедура КнопкаВыполнитьНажатие(Кнопка)
      ТекущаяДата = НачалоПериода;
      ДлинаСутокВСекундах = 60*60*24;
      Пока ТекущаяДата<=КонецПериода Цикл	
    ЗаписьРегистра = РегистрыСведений.РабочиеДниПоГрафику.СоздатьМенеджерЗаписи();
        ЗаписьРегистра.Дата = ТекущаяДата;
        ЗаписьРегистра.График = График;
    ЗаписьРегистра.РабочийДень = ?(Найти(График.Примечание, ДеньНедели(ТекущаяДата))>0,0,1);
    ЗаписьРегистра.Записать();
    ТекущаяДата = ТекущаяДата+ДлинаСутокВСекундах;
          КонецЦикла;
    КонецПроцедуры

    Рассмотрим особенности этого кода.

    Переменная ТекущаяДата будет использована в цикле при заполнении реквизита Дата записи регистра.

    Переменная ДлинаСутокВСекундах применяется для хранения количества секунд в сутках. На это значение будет увеличиваться переменная ТекущаяДата в цикле.

    С помощью переменной ЗаписьРегистра мы будем создавать записи в регистре. В каждой итерации цикла создается новая запись.

    Заполнение реквизитов Дата и График записи регистра вряд ли вызовет дополнительные вопросы. А вот заполнение реквизита РабочийДень потребует некоторых объяснений.

    ?(Найти(График.Примечание, ДеньНедели(ТекущаяДата))>0,0,1)

    Здесь мы используем сокращенную форму записи оператора Если. Его можно расшифровать следующим образом: ЕСЛИ(УСЛОВИЕ, ТОГДА, ИНАЧЕ).

    Если условие выполняется, вместо оператора подставляется то, что указано в разделе Тогда, если не выполняется - то, что указано в разделе Иначе.

    Команда Найти(График.Примечание, ДеньНедели(ТекущаяДата))>0 позволяет проверить, есть ли в реквизите Примечание графика, по которому идет заполнение регистра, номер дня недели текущей даты, который мы получаем с помощью функции ДеньНедели. Эта функция возвращает номер дня недели - 1 - для понедельника, 2 - для вторника, и так - до 7 - для воскресенья.

    В итоге, если в нашей конструкции будет проверен день, который является по графику выходным, в реквизит РабочийДень записи регистра будет записан 0, если нет - 1.

    Команда Записать() записывает сформированную запись.

    Команда ТекущаяДата = ТекущаяДата+ДлинаСутокВСекундах позволяет перейти к следующему дню и цикл повторяется.

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

    (рис 2.8) Результаты работы обработки Заполнение графиков

    2.3. Методы отладки

    В процессе разработки прикладных решений нередко возникает необходимость "заглянуть" внутрь выполняющейся программы. Такое обычно случается, когда в программе возникают ошибки. Ошибки могут быть самыми разными. От полного отказа программы на каком-то этапе, до странных результатов, которые выдает вроде бы работающий код.

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

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

    (рис 2.9) Кнопка запуска конфигурации в режиме отладки

    Внешне работа конфигурации в режиме отладки ничем не отличается от обычной работы. Единственно, на не слишком быстрых ПК запуск конфигурации проходит дольше, система может работать медленнее.

    Рассмотрим некоторые методы отладки.

    Ошибки в программе

    Если в программе происходит ошибка, которая делает дальнейшее исполнение программы невозможным, система выдает сообщение об ошибке. Смоделируем эту ситуацию. Откроем модуль объекта для недавно разработанного документа НачислениеЗарплаты и добавим в его начало такой код, рис 2.10:

    //Начало ошибочного кода
    НоваяПеременная=1/0;
    //Окончание ошибочного кода
    (рис 2.10) Строка, приводящая к ошибке

    Теперь запустим конфигурацию (в данный момент неважно, в каком режиме) и, откроем существующий (или создадим новый) документ НачислениеЗарплаты и попытаемся его провести. Ошибочный код находится в процедуре, которая выполняется при проведении документа.

    Различные ошибки вызывают различные сообщения, в нашем случае можно наблюдать следующее сообщение, рис 2.11.

    (рис 2.11) Окно с сообщением об ошибке

    Нажав на кнопку .

    (рис 2.12) Подробное описание ошибки

    Нажатие на кнопку Закрыть позволяет проигнорировать ошибку, кнопка Конфигуратор открывает Конфигуратор, а кнопка Завершить работу завершает работу программы.

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

    Если ошибочным окажется код, который исполняется в обычном режиме работы 1С:Предприятие, произойдет то же самое.

    Удалим "ошибочный" код из текста модуля.

    Мы смоделировали простую и понятную ошибку, исправить ее довольно просто. При реальной работе с конфигурациями, ошибки могут быть далеко не такими однозначными. Некоторые из них, например, неверный расчет какого-то показателя, можно обнаружить, лишь проанализировав состояние программы в том месте, где, предположительно, такая ошибка возникает. Сообщения об ошибках, подобные рассмотренному выше, а так же - появление неожиданных результатов работы программы - это сигнал для отладки конфигурации, и, в частности, для использования точек останова.

    Точки останова

    Для того чтобы остановить выполнение программы в определенной строке, используют точки останова. Когда исполнение программы доходит до точки останова, управление передается отладчику. Точку останова устанавливают на той строке программы, которая следует за кодом, нуждающимся в тщательной проверке. Строка, на которой установлена точка останова, не выполняется.

    Для того, чтобы установить точку останова, можно воспользоваться различными методами. Самый простой - сделать двойной щелчок мышью напротив нужной строки в левой части редактора кода, рис 2.13.

    (рис 2.13) Точка останова в редакторе кода

    На месте щелчка появится большая красная точка - это и есть точка останова. Аналогичного эффекта можно добиться, если установить курсор в нужную строку кода и нажать на клавишу F9, воспользоваться соответствующей командой контекстного меню строки или командой главного меню Отладка > Точка останова.

    Для того чтобы убрать точку останова, можно сделать по ней двойной щелчок, а можно воспользоваться соответствующей командой меню.

    На обычной точке останова программа останавливается в любом случае, управление переходит к отладчику. Помимо обычных, существуют точки останова с условием, команду для установки таких точек останова, можно найти около соответствующих команд для обычных. При установке точки останова с условием появляется окно, рис 2.14, в котором нужно ввести условие, при выполнении которого программа будет остановлена.

    (рис 2.14) Условие останова

    Точку останова можно временно отключить. Для этого можно воспользоваться командой вы можете видеть отключенную точку останова.

    (рис 2.15) Отключенная точка останова

    В модуле можно устанавливать столько точек останова, сколько нужно. Для того, чтобы отключить все установленные точки останова, можно воспользоваться командой Отладка > Отключить все точки останова. Причем, эта команда действует на все модули конфигурации. Для того, чтобы включить все точки останова, нужно воспользоваться командой Отладка > Включить все точки останова.

    Удобным средством для управления точками останова является окно . Его можно вызвать командой Отладка > Список точек останова.

    (рис 2.16) Список точек останова

    Инструменты окна позволяют включать, отключать и удалять точки останова, задавать и редактировать условия на их срабатывание, переходить к строкам кода, на которых установлены точки останова.

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

    Когда код модуля открыт в отладчике после срабатывания точки останова, можно править этот код. Однако следует помнить о том, что при продолжении отладки код не компилируется автоматически. То есть в отладке находится конфигурация базы данных. Для того, чтобы отлаживать программу, в которую внесены изменения, нужно прекратить текущий сеанс отладки ( Отладка > Завершить ), и запустить отладку снова, согласившись с предложением системы обновить конфигурацию базы данных.

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

    Исполнение программы после остановки

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

    (рис 2.17) Просмотр значения переменной Движение.ИсходныеДанные

    В подобном режиме можно просмотреть значения далеко не всех переменных, к этой возможности мы вернемся ниже.

    После того, как программа остановлена, программист может проанализировать ее и продолжить дальнейшее исполнение. А вот здесь существует несколько альтернатив. Они доступны из меню .

    (рис 2.18) Режимы исполнения модуля после остановки
    Продолжить отладку - выбор этой команды (или нажатие на F5 ) позволяет продолжить отладку после остановки либо, если отладка еще не начата (в таком случае команда называется Начать отладку, но для ее запуска можно использовать ту же горячую клавишу - F5 ), запустить ее.
    Перезапустить - эта команда нужна для перезапуска отладки. В частности, она полезна в том случае, если в код во время отладки были внесены изменения, и вы хотите продолжать отладку с учетом этих изменений.
    Завершить - завершает отладку, закрывает 1С:Предприятие (но не Конфигуратор )
    Остановить - "ручной" аналог срабатывания точки останова
    Остановка по ошибке - открывает окно, рис 2.19, которое позволяет задавать параметры остановки при возникновении ошибок, а так же - указывать тексты отдельных ошибок, при возникновении которых следует остановить отладку. Если в этом окне установлен флаг Останавливаться по ошибке, при возникновении ошибки управление будет передано в отладчик. Этой возможностью полезно пользоваться на начальном этапе отладки решения, когда еще точно неизвестно, где именно могут возникать ошибки.
    (рис 2.19) Настройка остановки при возникновении ошибок
    Подключение - позволяет подключиться к так называемому предмету отладки. В качестве предмета отладки выступает, например, запущенная в режиме 1С:Предприятие конфигурация, конфигурация, запущенная на удаленном компьютере.

    На рис 2.20 вы можете видеть часть меню Отладка, отвечающая за различные режимы пошагового (построчного) исполнения модуля после остановки. Обратите внимание на то, что при остановке выполнения модуля строка, которая будет исполнена следующей, обозначена желтой стрелочкой, которая находится там же, где расположены маркеры точек останова.

    (рис 2.20) Режимы пошагового исполнения модуля после остановки
    Шагнуть в - имеет смысл в том случае, если при построчном исполнении кода вы встретились с вызовом внешней процедуры (например, объявленной в общем модуле). Эта команда позволяет перейти к построчному исполнению вызываемой процедуры. Если выполнить ее для строки, в которой нет вызова внешней процедуры, код строки будет исполнен и маркер текущей строки (желтая стрелочка) переместится на следующую строку.
    Шагнуть через - в противоположность предыдущей команде, при встрече с вызовом внешней процедуры в отлаживаемом модуле, позволяет выполнить эту процедуру в обычном режиме и возвратиться к пошаговому выполнению отлаживаемого модуля. При выполнении строк модуля, не содержащих вызовов внешних процедур, аналогична предыдущей.
    Шагнуть из - если вы, отлаживая модуль, выполнили команду Шагнуть в и попали во внешнюю процедуру, но решили на каком-то этапе отладки, выйти из нее и вернуться к исходному модулю, воспользуйтесь этой командой.
    Идти до курсора - если сработала точка останова и вы хотите, чтобы были исполнены несколько строк кода до определенной строки программы, в эту строку нужно установить курсор и выполнить эту команду. Например, на рис 2.21 после срабатывания точки останова курсор был установлен в строку, до которой нужно было выполнить программу, и выполнена эта команда.
    (рис 2.21) Результат выполнения команды Идти до курсора
    Текущая строка - эта команда показывает текущую строку выполнения отлаживаемого модуля - то есть ту, которая отмечена желтой стрелкой. На экране отображается окно модуля, при необходимости текст модуля прокручивается до нужной строки.

    Как мы уже говорили выше, во время прерывания работы программы на точке останова или при пошаговом ее исполнении, мы можем просматривать значения переменных. Собственно говоря, это - способ "заглянуть" в программу с целью ее анализа и поиска ошибок.

    2.4. Исследование программы в отладчике

    При пошаговом выполнении программы можно воспользоваться некоторыми полезными инструментами для контроля значений переменных. В частности, речь идет об окне Выражение ( Отладка > Вычислить выражение ).

    Мы разместили точку останова в модуле документа .

    (рис 2.22) Точка останова в модуле

    Вызвав окно .

    (рис 2.23) Просмотр переменной в окне Выражение

    Мы видим, что команда ДанныеБазы=Движение.ПолучитьБазу(Ресурсы, Измерения) записала в переменную ДанныеБазы некую таблицу значений. В окне Выражение можно просмотреть внутреннюю структуру этой таблицы, разворачивая свернутые группировки.

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

    (рис 2.24) Просмотр переменной в окне Выражение

    Здесь мы видим содержимое таблицы. Она содержит одну строку с индексом 0, поле Результат этой строки содержит значение 10000. В нашей программе эта строка содержит данные базы для расчета премии.

    В окне Выражение можно выполнять команды встроенного языка. Например, выполним такую команду: ТипЗнч(Ресурсы). В окне мы увидим тип значения переменной Ресурсы, а именно - это массив.

    Если мы хотим контролировать некоторый набор переменных (или свойств объектов), которые мы просматривали в окне Выражение, мы можем воспользоваться кнопкой этого окна Включить в табло. Табло - это отдельный инструмент отладчика, который выводит сведения о переменных, включенных в него. Причем, их можно включать в табло напрямую, минуя окно Выражение. Делается это вводом имени переменной в пустую строку Табло.

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

    (рис 2.25) Заполнение документа Начисление зарплаты

    Вспомним, что точка останова размещена в участке кода, который отвечает за расчет премии. Здесь мы ввели Оклад для двух сотрудников, и, для них же, размеры премий.

    Включим в табло следующие показатели (рис 2.26):

    ДанныеБазы[0].Результат
    Движение.ВидРасчета
    Движение.ИсходныеДанные

    Ввести эти данные в табло можно как заранее, так и при первом срабатывании точки останова (она сработает при попытке проведения документа).

    (рис 2.26) Значения переменных в табло, первая итерация

    Здесь мы видим, что на текущей итерации расчета в качестве данных базы используется 10000 (оклад первого сотрудника), в качестве исходных данных для расчета премии - 10% (опять же, данные по исходному сотруднику). Эти данные нас устраивают, поэтому переходим к анализу следующей итерации цикла, выполнив команду .

    (рис 2.27) Значения переменных в табло, вторая итерация

    Результаты нас так же устроили - они соответствуют ожидаемым. Если бы программа функционировала неверно - здесь могли бы быть другие данные, второй итерации цикла могло бы вообще не быть, возможны и многие другие ошибочные ситуации.

    Еще один полезный инструмент, которым можно пользоваться при отладке, можно вызвать по команде здесь можно видеть лишь одну информационную строку.

    (рис 2.28) Стек вызовов

    Щелкнув мышью по строке с именем процедуры в окне Стек вызовов, можно перейти к строке в этой процедуре.

    Еще одна полезная возможность отладчика заключается в замере производительности разрабатываемого решения.

    2.5. Замер производительности

    Для того, чтобы оценить "узкие места" в разрабатываемой конфигурации, можно воспользоваться инструментом .

    (рис 2.29) Отчет о производительности

    В частности, нас интересует время, которое заняло выполнение операций. Сделав щелчок по строке отчета, можно перейти в модуль, в котором было выполнено действие, описанное в данной строке, рис 2.30. Здесь можно видеть информацию о времени выполнения каждой из строк.

    (рис 2.30) Просмотр модуля после замера производительности

    Если какие-либо команды занимают слишком много времени - можно задуматься об их оптимизации, о поиске альтернативных, более быстрых способов решения тех же задач.

    2.6. Выводы

    В этой лекции мы ознакомились с приемами создания справочной системы, которая должна сопровождать прикладное решение. Справочные материалы привязаны к объектам конфигурации, их можно включать в общую справку программы. Мы рассмотрели пример программного заполнения регистра сведений - подобные приемы позволяют экономить время при выполнении рутинных операций. Так же в данной лекции был рассмотрен вопрос отладки прикладных решений с использованием режима отладки, установки точек останова и других методов отладки. Методика замера производительности, рассмотренная в конце лекции, позволяет оптимизировать прикладные решения, находя участки кода, которые могут повлиять на скорость работы программы.

    2.7. Видеоурок

    Для данной лекции подготовлен видеоурок.

    Вернуться к учебному плану