Построение собственного справочника в Афине. Этап 4.

Итак, программируем поведение справочника при вводе информации.

Установите маркер в окне проекта так, чтобы подсвечен был наш новый справочник.
Нажмите
F4 или из контекстного меню выберете пункт "Настройка". Вы опять попадаете в приложение, в котором продолжим работу по настройке справочника.

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

 

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

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

  Нажмите "OK" и наименование функции вставиться в строку (менять его там нельзя, но это и не существенно).

 

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

 Теперь перейдем непосредственно к функции.
Откройте редактор, нажав на закладку "Программы".

Там вы увидите заготовку функции, которая называется "ПриВходе". Введите текст, который должен выглядеть так:

Теперь разберем каждую сущность в тексте функции.

В теле функции присутствует секция "переменные" (до служебного слова начало). Там объявляются переменные, которые могут использоваться только внутри самой функции.

В нашем случае там описана только одна переменная типа "справочник".

Чтобы не писать длинные имена справочников установите курсор в то место текста откуда должно начинаться описание справочника и нажмите Alt+F2.

Появится окно, в котором перечислены все имена-идентификаторы нашего проекта.
Установите в этом окне маркер на строку с именем нашего справочника и нажмите
Enter.

Наименование справочника и слово "справочник" вставится в текст так:
справочник(
[Расчет электроэнергии])

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

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

В нашем случае код функции выполняется только при входе в новую запись.

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

Таким образом, в переменной с именем "иРЭ" должна оказаться ссылка на запись, которую мы ввели последней (в предыдущем месяце).
Это позволит взять из записи значение поля "ТекПок", т.е. текущее показание счетчика последней записи, а именно это нам и надо - иметь значение показания счетчика за предыдущий месяц.

Это значение мы и присваиваем полю "ПредПок" - для новой записи это предыдущее показание счетчика.

Ну, а дальше думается понятно - пустые поля заполняем значениями из глобальных констант.

На этом функция заканчивает работу (это мы с вами находясь в настройке, представляем что будет происходить во время выполнения) и перед пользователем появляется форма ввода с заполненными значениями некоторых полей.

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

Вернемся к форме ввода (закладка "Форма ввода") и отметим там поле "ТекПок".
Таблица в окне "Свойства" поменяется, отображая свойства отмеченного поля.

Нажмите кнопку (+) в строке "Функция" окна "Свойства" этого объекта.

В появившемся диалоге нажмите "OK"

В строке "Функция" появиться строка:

 

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

Заполните тело функции "ИзменилосьПоле_ТекПок" как показано на рисунке.

В этой функции и происходит весь расчет.

Функция при вводе значений пользователем будет запускаться при таких условиях:

- значение поля "ТекПок" изменилось (допустим, с 0 на 250);
- после изменения пользователь ушел с этого поля (нажал на
Enter, Tab или стрелками сдвинулся на другое поле).

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

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

Встроенная функция "ДатаВСтроку" позволяет конвертировать значения типа дата в строчное представление, отображающее дату в различных форматах (здесь, если посмотреть на структуру справочника, нужда в конвертировании даты в том, что поле "ЗаМес" имеет тип строка).

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

Сейчас самое время посмотреть что же получилось.
Вставьте в таблице справочника первую запись. Так как это первая запись, то поле "ПредПок" не заполнится (нет предыдущей записи откуда можно взять значение), а будут заполнены только поля "Льгота", "Тариф" и "Субсидия", если конечно  значения соответствующих констант отличны от нуля.

Введите текущее показание и нажмите "Верно". В таблице справочника появится первая запись.

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

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

 

<<<предыдущий этап        последний урок>>>
На главную