Лабораторная работа 6. Справочник и Регистр сведений |
9.1. Регистр сведений "ДанныеОС" Приведем фрагмент постановки задачи: 7.2. Балансовая стоимость - выражена в рублях и может
изменяться с течением времени. Желательно чтобы изменения были бы оформлены
документами. 7.3. Рыночная стоимость – выражена в УЕ. Замечания
сделанные для балансовой стоимости справедливы и для рыночной стоимости. 7.4. Подразделение – может изменяться с течением времени,
т.е. возможна передача ОС из одного подразделения в другое. К сожалению, мы не может создать такие реквизиты в справочнике,
т.к. не сможем обеспечить хранение истории их изменения в этом объекте. В тех случаях, когда возникает подобная задача, необходимо
создавать два объекта – справочник и соответствующий ему периодический регистр сведений. |
6.1. Регистр сведений
"ДанныеОС" |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Поскольку Вы уже имеете опыт создания регистра сведений,
постарайтесь выполнить следующее упражнение самостоятельно:
Как мы помним, на втором этапе нужно определиться с измерениями,
ресурсами и Реквизитами. Поскольку такое понятие как "Балансовая стоимость"
относится к конкретному основному средству, то необходимо в регистре создать
соответствующее измерение, для того чтобы установить логическую связь между
этим двумя понятиями.
Дадим небольшое пояснение. Свойство
"Ведущее" будучи установленным, приводит к тому, что при удалении
записи из справочника (т.е. из ведущего объекта) запись регистра, содержащая
ссылку на этот элемент, также будет удалена автоматически. Установка запрета незаполненных значений вполне логична. Ведь
если в записи регистра не указано ОС, то данные
о нем "повиснут в воздухе", чего не должно быть. На этом измерения у нас закончатся. В соответствии с постановкой задачи добавьте в регистр три ресурса:
Обратите внимание, что в последнем случае мы, добавив ресурс
"Подразделение", привели пример использования в качестве ресурса
нечислового типа данных. Реквизитов в регистре не будет, т.к. они используются при
проведении документов, а их у нас пока нет. Следующее упражнение предназначено для самостоятельного
закрепления рассмотренного в предыдущих главах материала.
Эту форму
мы создали для того, чтобы пользователь
мог видеть весь регистр или какую-то часть записей "как есть". Не
смотря на то, что в этой форме
он может редактировать записи, лучше всего ему для этого предоставить
соответствующую форму. Так как наши данные
связаны с конкретным объектом ОС, то такой формой будет – форма элемента из
справочника "ОсновныеСредства". |
6.2. Форма элемента справочника "ОсновныеСредства" |
6.2.1. Разработка
диалога В этом разделе мы углубим наши знания по работе с формой. Сначала мы создадим сам диалог,
а затем используем необходимые модули
для обработки событий. |
6.2.1. Разработка диалога |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Начнем с создания новой формы
и размещения в ней элементов диалога:
Перед началом работы с формой увеличим ее размер:
Мы вставили эти реквизиты сверху потому, что пользователь
должен сначала решить к какой фирме относится новый элемент, в какую группу
его следует записать, а потом уже вводить другие данные.
У нас в этой форме будет два табличных поля:
Поэтому мы сначала разместим в форме панель (не путать с командной
панелью!):
Колонку "ОС" мы удалили потому, что этот реквизит
будем заполнять программным путем.
На этом мы завершили размещение элементов формы (см. рис. 6.8).
|
6.2.2. Обработка событий от элементов формы |
|||||||||||||||||||||||||||||||||
На следующем этапе создания формы мы напишем обработчики событий
от элементов формы. Начнем с элемента "Фирма". Если выделить этот элемент и открыть группу его свойств
"События:", то среди всех событий для
таких элементов наиболее часто применяется обработка события "При
изменении". Поэтому:
Сейчас наш модуль содержит заготовку: Процедура ПриИзмененииФирмы(Элемент) Достаточно часто у начинающих программирование
в этой системе возникает вопрос: А что я могу использовать в этой точке
программы? Этот вопрос сводится к другому вопросу – а что входит в локальный
контекст этого модуля? Для того чтобы понять это в "1С:Предприятии
8.0", нужно приложить минимум усилий: Как мы видим на рисунке 6.9, в текущий контекст попали как реквизиты
нашего объекта
(Фирма), так и методы справочника (УстановитьНовыйКод).
Поэтому логично предположить, что текст обработчика может быть
следующим: Процедура ПриИзмененииФирмы(Элемент) Отметим, что вызов метода УстановитьНовыйКод() вызовет изменение реквизита Код, т.е. одно
из полей записи изменится. Но что нам делать, если где-либо в конфигурации нужно написать: НовыйЭлемент=Справочники.ОсновныеСредства.СоздатьЭлемент(); Тогда вызов: НовыйЭлемент.УстановитьНовыйКод(Фирма.Префикс+"-"); придется писать еще раз … и много раз. С методической точки зрения правильнее будет поместить эту
обработку в Модуль объекта, т.к. она предназначена для изменения поля этого
объекта. Поэтому:
Обратите внимание на добавочное ключевое
слово Экспорт у процедуры УстановитьКод(). Оно привело к тому, что объект типа СправочникОбъект.ОсновныеСредства получил новый метод. Аналогичную методику можно применить и для регистра сведений:
В табличном поле есть поле ввода "Подразделение",
которое имеет тип СправочникСсылка.Подразделения, а
справочник "Подразделения" подчинен справочнику "Фирмы",
поэтому: В постановке задачи сказано, что "Для тех ОС из группы
"Машины и оборудование", что состоят из отдельных деталей…". Таким образом, если в реквизите "ГруппаОС" выбрано
значение "Машины и оборудование", то тогда пользователь
должен иметь возможность обращаться к реквизитам
формы "ЕстьДетали" и "СписокДеталей", т.е. реквизиты
должны быть видимы, а в противном случае нет.
Сделаем следующие пояснения. 1.
Ключевое
слово Экспорт мы применили для того, чтобы можно было
делать вызов этого алгоритма
из внешней процедуры:
Форма = Справочники.ОсновныеСредства.ПолучитьФормуНовогоЭлемента(); 2.
В
этой процедуре мы обошлись без оператора
"Если". Следующее упражнение сделайте самостоятельно:
|
6.2.3. Самостоятельная работа |
||||||
Выполните следующие упражнения самостоятельно.
В
каком модуле Вы расположили текст процедуры-обработчика?
|
6.2.4. Обработка событий от табличного поля |
|||||||||||||||||||||||
В нашей форме
вставлены два табличных поля "НаборДанныеОС" и
"СписокДеталей", каждое из которых в составе своих свойств
имеет группу "События" (см. рис. 6.11).
В этом подразделе мы рассмотрим только некоторые из них. "Разбор полетов" будем делать на примере поля
"НаборДанныеОС", тип значения которого –
"РегистрСведенийНаборЗаписей". А раз так, то все записи из регистра
сведений будут считываться за "один раз". Но все записи нам не нужны,
поэтому:
Начнем размышлять. Пользователь
начнет заполнять табличное поле путем ввода новых строк, а раз так, то нужно
в реквизит "ОС" записать ссылку на основной реквизит формы (тип –
"СправочникОбъект.ОсновныеСредства"). Но такую ссылку мы сможем записать только в том случае, если
элемент справочника уже записан. Поэтому:
Для табличного поля "НаборДанныеОС" больше не
требуется обрабатывать каких-либо событий. А вот для поля "СписокДеталей"
необходимо обеспечить, чтобы поле
ввода "Деталь" всегда содержало бы какое либо значение. Поэтому выполним
следующее упражнение:
Нужно иметь в виду, что эта процедура
будет получать управление в двух случаях:
Именно поэтому в процедуре проверяется соответствующая
комбинация входных параметров НоваяСтрока и ОтменаРедактирования. На этом мы закончим рассматривать обработку событий табличного
поля и перейдем к рассмотрению событий самой формы в целом. |
6.2.5. Обработка событий от формы в целом |
||||||||||||||||||||||||||||||||||||||||||
Напомним список основных событий, которые есть в форме:
Здесь мы перечислили наиболее часто встречающиеся события,
которые возникают практически во всех формах. Давайте разберемся по порядку. Перед открытием. Возникает до того, как диалог будет отображен на экране. Обычно
используется для того, чтобы отказаться от открытия формы. А раз так, то нужно до открытия формы установить отбор в поле
"НаборДанныеОС":
При открытии. Возникает также до открытия диалога, но после события
"Перед открытием", если мы не отказались от открытия диалога.
Обычно это событие используется для подготовительных действий перед открытием
формы. Такими действиям могут быть:
Когда мы можем заполнить реквизиты начальными значениями? Тогда
и только тогда, когда мы открываем форму нового объекта
(записи) в ИБ. Для справочников, точнее у объекта типа
"СправочникОбъект", есть метод
ЭтоНовый(), который
возвращает истину, если объект был только что создан, но еще не
записан.
Если Вы все сделали правильно, то основная форма констант будет
выглядеть так, как это изображено на рисунке 6.13.
Теперь мы можем поработать с формой элемента из режима "1С:Предприятие".
Как мы видим, наши процедуры-обработчики успешно отработали и
выполнили все возложенные на них функции. Но вернемся к рассмотрению событий формы. После того как форма открыта, пользователь
работает с формой, в результате чего возникают события как относящиеся к
форме в целом, так и порождаемые элементами формы. Если пользователь изменил объект
ИБ, ему будет предложено сохранить введенные данные.
В случае положительного ответа на вопрос системы, будут последовательно
возникать события:
При этом нужно помнить, что в модуле объекта Вы также можете
обрабатывать события:
При этом обработчики событий в форме получают управление раньше
одноименных обработчиков событий в модуле объекта. Задача обработчика ПередЗаписью(…) проверить возможность записи объекта в ИБ, и, если есть
необходимость, отказать в этом. Поэтому мы в модуле объекта реализуем функцию ЕстьОшибка(), которая будет
возвращать Имя реквизита, содержащего с точки зрения программиста неверные
данные. Тогда при обработке события "Перед записью" как в
форме, так и в модуле объекта ее можно вызвать, чтобы определить – есть ли
ошибки в объекте или нет. На первый взгляд кажется, что оба обработчика выполняют одни и
те же функции, но это не так. Обработчик ПередЗаписью(Отказ) из модуля формы в случае обнаружения ошибки сможет
активизировать соответствующий реквизит
формы, установив туда курсор, и выдать при этом предупреждение
пользователю. Обработчик ПередЗаписью(Отказ) из модуля объекта в случае обнаружения ошибки сможет лишь только
сообщить об этом в окне
сообщений. Предпринимать какие-либо интерактивные действия в этом обработчике
нельзя, т.к. он может циклически вызываться из какой-либо обработки верхнего
уровня.
Наша форма содержит два реквизита: "НаборДанныеОС" и
"СправочникОбъект", причем последний из них является основным
реквизитом. Именно его система будет записывать по команде
"Записать". Поэтому только событие "При записи" может быть
использовано для записи "НаборДанныеОС".
Процедура ПослеЗаписи() получает управление только тогда, когда запись успешно завершена
(транзакция закрыта). В нашем случае это событие можно и нужно применить для того,
чтобы переустановить отбор в наборе записей как минимум в случае, если
записали новый объект.
|
6.2.6. Изменение привязок элементов |
|||
Когда Вы заполняли форму элемента в режиме "1С:Предприятие", то наверное обратили внимание на то,
что пропорции некоторых элементов и их расположение не соответствуют тому,
что есть в режиме "1С:Предприятие". Это объясняется тем, что привязка
установленная Конфигуратором по умолчанию не соответствует вашему ожидаемому
поведению формы при изменении ее размеров.
|
6.2.7. Отображение картинки |
|||||||||||||||||||||||||||||||
Непосредственно вставить в форму
реквизит "Изображение" мы не можем, т.к. его тип
"ХранилищеЗначения", в котором может быть сохранено все что угодно. Но мы можем вставить в форму элемент формы типа "Поле
картинки", в которое можно будет отобразить изображение.
Теперь нам нужно решить две проблемы: 1.
Как
прочитать новую картинку из файла
в элемент формы и сохранить ее в хранилище значений; 2.
Как
извлечь картинку из хранилища и отобразить ее.
Для того чтобы прочитать картинку с файла, давайте обработаем нажатие
на картинку в форме.
При записи объекта реквизит Изображение будет сохранен в ИБ. А вот когда мы будем открывать форму,
то нужно отобразить реквизит "Изображение" в картинку,
если объект не новый. Если объект новый, то тогда следует в картинку
отобразить пустую картинку.
|
6.3. Самостоятельная работа |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Следующие упражнения предназначены для закрепления материала,
изложенного выше.
Чтобы проверить работу наших алгоритмов, обеспечьте наличие в
справочнике следующих записей:
|
6.4. Метод СрезПоследних(…) менеджера
регистра сведений- |
||||||
В модуле
формы списка мы поместили кнопку
"Печать", работа которой приводит к формированию табличного
документа (см. рис. 6.21). Однако в этой печатной форме нет информации о
балансовой и рыночной стоимости, которая хранится в регистре сведений.
Поэтому можно доработать отчет, поместив в него сведения из
регистра "ДанныеОС". Так как этот регистр периодический, то
извлекать данные
можно только на какую-то дату. Для упрощения задачи мы будем строить отчет
на Рабочую дату. Считывать данные
по одной записи, используя метод
ПолучитьПоследнее(…) не очень
эффективное решение, поэтому мы воспользуемся другим методом - СрезПоследних(…). Этот метод
возвращает объект типа "Таблица значений". Он может содержать
переменное число строк и столбцов.
Для того чтобы получить срез последних записей, нам необходимо
вставить в процедуру
"Печать" до начала выборки записей из справочника следующую строку
текста: // Получение среза Фрагмент процедуры, который выводит реквизиты
элемента справочника, будет выглядеть следующим образом: Секция = Макет.ПолучитьОбласть("Элемент");
|
6.5. Соединение в языке запросов |
||||||||||||||||||||
В предыдущем подразделе при выводе информации в табличный
документ мы соединили в одном отчете
данные
из разных таблиц ИБ. Аналогичные действия можно делать и в языке запросов. Поэтому в
этом подразделе мы построим точно такой же отчет, но путем формирования
запроса к ИБ. Сначала выполните подготовительные действия:
Давайте размышлять дальше. Для того чтобы выбрать данные (причем состав колонок в запросе
должен совпадать с составом колонок в макете)
из справочника, мы должны написать следующий текст: "ВЫБРАТЬ Для того чтобы получить срез последних записей из
регистра сведений мы должны написать: "ВЫБРАТЬ Тут следует обратить внимание на то, что запись РегистрСведений.ДанныеОС.СрезПоследних(&Период) представляет собой
виртуальную таблицу, а &Период – это параметр ее создания. При создании текста с помощью Конструктора
не забывайте нажимать на кнопку
"Параметры виртуальной таблицы" (см. рис. 6.25). Если соединить два текста в один запрос, то в результате
получится "каша" из записей справочника и виртуальной таблицы. Для того чтобы какой-либо записи из справочника соответствовала
бы какая-нибудь (если есть) запись, полученная из регистра сведений,
необходимо установить соединение между этими исходными таблицами.
В тексте запроса это будет выглядеть так: "ВЫБРАТЬ Слово ЛЕВОЕ означает, что все записи из справочника
попадут в результат. Они будут соединены в отношении "1 ко многим"
с записями из виртуальной таблицы. Условие такого соединения: "ОсновныеСредства.Ссылка = ДанныеОС.ОС". Для нашего случая виртуальная таблица РегистрСведений.ДанныеОС.СрезПоследних
будет для каждого ОС содержать максимально одну запись.
Теперь текст вызова запроса и цикл
выборки будет выглядеть следующим образом: // Выполняем запрос Следует обратить внимание на метод .Заполнить(…), который позволяет заполнить параметры области макета
табличного документа, сократив объем фрагмента их заполнения до одной строки!
|
6.6. Что мы узнали |
В этой лабораторной работе мы рассмотрели совместное применение
в конфигурации справочников и регистров сведений. В качестве примера мы добавили в конфигурацию периодический регистр сведений "ДанныеОС", в котором разместили
реквизиты, имеющие отношение к основному средству. Этот регистр имеет два
измерения – "Период" и "ОС". В этой главе мы закончили проектирование справочника
"ОсновныеСредства" рассмотрев более подробно разработку формы
элемента, где уделили внимание обработке событий, как от элементов формы, так
и от самой формы в целом. Здесь же мы рассмотрели особенности применения добавочного
ключевого слова Экспорт при расположении процедуры (или функции) в модуле
объекта. Использование такой процедуры позволяет применить ее в качестве
метода объекта определяемого пользователем. В этой же главе мы рассмотрели особенности применения метода СрезПоследних(…) регистра сведений. В заключение этой главы мы рассмотрели применение в языке
запросов виртуальной таблицы "СрезПоследних", а также особенности
соединения двух таблиц для получения необходимых данных. |