Лабораторная работа 6. Справочник и Регистр сведений

9.1. Регистр сведений "ДанныеОС"
6.2. Форма элемента справочника "ОсновныеСредства"
    6.2.1. Разработка диалога
    6.2.2. Обработка событий от элементов формы
    6.2.3. Самостоятельная работа
    6.2.4. Обработка событий от табличного поля
    6.2.5. Обработка событий от формы в целом
    6.2.6. Изменение привязок элементов
    6.2.7. Отображение картинки
6.3. Самостоятельная работа
6.4. Метод СрезПоследних(…) менеджера регистра сведений
6.5. Соединение в языке запросов
6.6. Что мы узнали

Приведем фрагмент постановки задачи:

7.2. Балансовая стоимость - выражена в рублях и может изменяться с течением времени. Желательно чтобы изменения были бы оформлены документами.

7.3. Рыночная стоимость – выражена в УЕ. Замечания сделанные для балансовой стоимости справедливы и для рыночной стоимости.

7.4. Подразделение – может изменяться с течением времени, т.е. возможна передача ОС из одного подразделения в другое.

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

В тех случаях, когда возникает подобная задача, необходимо создавать два объекта – справочник и соответствующий ему периодический регистр сведений.

 

 

6.1. Регистр сведений "ДанныеОС"

Поскольку Вы уже имеете опыт создания регистра сведений, постарайтесь выполнить следующее упражнение самостоятельно:

Упражнение №6.1.

Добавьте в Конфигурацию новый регистр сведений со следующими свойствами:

Свойство

Значение

Имя:

ДанныеОС

Синоним:

Данные ОС

Комментарий:

 -

Какое значения Вы выберите для свойств "Периодичность" и "Режим записи"?

Нажмите на кнопку "Далее>".

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

Упражнение №6.2.

Добавляем в регистр сведений новое измерение:

Свойство

Значение

Группа свойств "Основные:"

Имя:

ОС

Синоним:

ОС

Комментарий:

Основное средство

Ведущее:

Запрет незаполненных
значений:

Группа свойств "Тип:"

Тип:

СправочникСсылкасновныеСредства

Дадим небольшое пояснение.

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

Установка запрета незаполненных значений вполне логична. Ведь если в записи регистра не указано ОС, то данные о нем "повиснут в воздухе", чего не должно быть.

На этом измерения у нас закончатся.

В соответствии с постановкой задачи добавьте в регистр три ресурса:

Упражнение №6.2 (продолжение).

Добавляем в регистр сведений новый ресурс:

Свойство

Значение

Группа свойств "Основные:"

Имя:

БалансоваяСтоимость

Синоним:

Балансовая стоимость

Комментарий:

Балансовая стоимость ОС

Группа свойств "Тип:"

Тип:

Число

Длина:

14

Точность:

2

Новые объекты в конфигурации можно создавать копированием, поэтому создайте новый ресурс путем копирования. Используйте комбинации клавиш Ctrl+C (скопировать объект) и Ctrl+V (добавить объект).

Свойство

Значение

Имя:

РыночнаяСтоимость

Синоним:

Рыночная стоимость

Комментарий:

Стоимость ОС в У.Е.

И добавьте последний ресурс:

Свойство

Значение

Группа свойств "Основные:"

Имя:

Подразделение

Синоним:

Подразделение

Комментарий:

 -

Группа свойств "Тип:"

Тип:

СправочникСсылкаодразделения

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

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

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

Упражнение №6.3.

Перейдите на закладку "Формы" и создайте основную форму списка регистра сведений.

Какие реквизиты Вы вставили в форму?

Измените, если хотите, геометрические размеры колонок табличного поля.

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

Так как наши данные связаны с конкретным объектом ОС, то такой формой будет – форма элемента из справочника "ОсновныеСредства".

 

 

 

6.2. Форма элемента справочника "ОсновныеСредства"

6.2.1. Разработка диалога
6.2.2. Обработка событий от элементов формы
6.2.3. Самостоятельная работа
6.2.4. Обработка событий от табличного поля
6.2.5. Обработка событий от формы в целом
6.2.6. Изменение привязок элементов
6.2.7. Отображение картинки

В этом разделе мы углубим наши знания по работе с формой.

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

 

 

6.2.1. Разработка диалога

Начнем с создания новой формы и размещения в ней элементов диалога:

Упражнение №6.4.

Вызовите конструктор формы и создайте для справочника "ОсновныеСредства" форму, предварительно установив переключатель "Редактировать" в положение "В диалоге":

Свойство

Значение

Выберете тип формы:

Форма элемента справочника

Назначить форму основной:

Имя:

ОсновнаяФормаЭлемента

Синоним:

Основная форма элемента

Комментарий:

 -

Командная панель формы сверху:

Командная панель формы снизу:

Нажмите на кнопку "Далее" и сбросьте все флаги (см. рис. 6.1).

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


Рис. 6.1. Не вставлять в форму реквизиты!

Если Вы все сделали правильно, то форма будет выглядеть так, как это изображено на рисунке 6.2.


Рис. 6.2. Форма элемента перед размещением реквизитов.

Перед началом работы с формой увеличим ее размер:

Упражнение №6.5.

Установите следующие свойства формы:

Свойство

Значение

Ширина:

480

Высота:

360

Самостоятельно, используя пункт меню "Форма – Размещение данных…" вставьте реквизиты "Фирма" и "Родитель" в соответствии с рисунком 6.3.

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


Рис. 6.3. Форма элемента после вставки реквизита "Родитель".

Упражнение №6.5 (продолжение).

Вставьте реквизиты "Код" и "Наименование" (см. рис. 6.4).


Рис. 6.4. Реквизиты Код и Наименование.

У нас в этой форме будет два табличных поля:

*       одно поле будет содержать записи из регистра сведений;

*       другое поле - записи из табличной части справочника.

Поэтому мы сначала разместим в форме панель (не путать с командной панелью!):

Упражнение №6.5 (продолжение).

Вставьте в форму новую панель.

Установите для текущей страницы следующие свойства:

Свойство

Значение

Имя:

ДанныеОС

Заголовок страницы:

Данные ОС

Если Вы все сделали правильно, то форма будет выглядеть так, как это изображено на рисунке 6.5.


Рис. 6.5. Панель для размещения табличных полей.

Упражнение №6.5 (продолжение).

Вставьте в форму новый элемент типа "Табличное поле", указав ему следующие свойства:

Свойство

Значение

Имя:

НаборДанныеОС

Тип значения:

РегистрСведенийНаборЗаписейанныеОС

Вставить командную панель:

И разместите элементы в панели, расположенной внизу формы.

Удалите колонку "ОС" и измените ширину столбцов (см. рис. 6.6), для того чтобы удобнее было настраивать форму.

Что изменилось в списке реквизитов формы?


Рис. 6.6. Форма после вставки табличного поля.

Колонку "ОС" мы удалили потому, что этот реквизит будем заполнять программным путем.

Упражнение №6.5 (продолжение).

Самостоятельно вставьте в форму реквизиты "ГруппаОС", "ЕстьДетали", "ДатаВвода" и "ДатаСписания".

Для реквизита "ЕстьДетали" установите свойство:

Свойство

Значение

Положение заголовка

Текст слева

После вставки реквизитов измените их геометрические размеры и расположение таким образом, чтобы в форме не осталось "пустого" места (см. рис. 6.7).


Рис. 6.7. Форма элемента после вставки всех реквизитов справочника.

Упражнение №6.5 (продолжение).

Для того чтобы вставить табличную часть "СписокДеталей", добавьте в панели к странице "Данные ОС" еще одну страницу:

Свойство

Значение

Имя:

СписокДеталей

Синоним:

Список деталей

Вставьте на эту страницу все реквизиты из табличной части "СписокДеталей".

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

Свойство

Значение

Имя:

КоманднаяПанель3

Заполнять автоматически:

Источник действий:

СписокДеталей

Вспомогательная:

На этом мы закончили упражнение.

На этом мы завершили размещение элементов формы (см. рис. 6.8).


Рис. 6.8. Окончательный вид диалога.

 

 

 

6.2.2. Обработка событий от элементов формы

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

Начнем с элемента "Фирма".

Если выделить этот элемент и открыть группу его свойств "События:", то среди всех событий для таких элементов наиболее часто применяется обработка события "При изменении". Поэтому:

Упражнение №6.6.

Установите для элемента формы "Фирма" следующие свойства:

Свойство

Значение

Быстрый выбор:

При изменении:

ПриИзмененииФирмы

Переключитесь на закладку "Модуль". Что произошло?

Сейчас наш модуль содержит заготовку:

Процедура ПриИзмененииФирмы(Элемент)
    // Вставить содержимое обработчика.
КонецПроцедуры

Достаточно часто у начинающих программирование в этой системе возникает вопрос: А что я могу использовать в этой точке программы?

Этот вопрос сводится к другому вопросу – а что входит в локальный контекст этого модуля?

Для того чтобы понять это в "1Средприятии 8.0", нужно приложить минимум усилий:

Упражнение №6.7.

Удалите текст комментария и нажмите Ctrl+пробел.

Что произошло?

Как мы видим на рисунке 6.9, в текущий контекст попали как реквизиты нашего объекта (Фирма), так и методы справочника (УстановитьНовыйКод).


Рис. 6.9. Получение контекста в любой точки программы.

Поэтому логично предположить, что текст обработчика может быть следующим:

Процедура ПриИзмененииФирмы(Элемент)
   УстановитьНовыйКод(Фирма.Префикс+"-");
КонецПроцедуры

Отметим, что вызов метода УстановитьНовыйКод() вызовет изменение реквизита Код, т.е. одно из полей записи изменится.

Но что нам делать, если где-либо в конфигурации нужно написать:

НовыйЭлемент=Справочники.ОсновныеСредства.СоздатьЭлемент();
……………………………………………………………

НовыйЭлемент.Фирма = Фирма;
……………………………………………………………

Тогда вызов:

НовыйЭлемент.УстановитьНовыйКод(Фирма.Префикс+"-");

придется писать еще раз … и много раз.

С методической точки зрения правильнее будет поместить эту обработку в Модуль объекта, т.к. она предназначена для изменения поля этого объекта.

Поэтому:

 

 

 

 

 

Упражнение №6.7 (продолжение).

Наберите в Модуле Объекта:

// Модуль справочника "ОсновныеСредства"
//УстановитьКод() - устанавливает новый код
//для записи в справочнике

Процедура УстановитьКод() Экспорт
   Если
ЭтоГруппа Тогда
   Иначе
// это элемент справочника
      УстановитьНовыйКод(Фирма.Префикс+"-");
   КонецЕсли;
КонецПроцедуры

Затем исправьте модуль формы:

Процедура ПриИзмененииФирмы(Элемент)
   УстановитьКод();
КонецПроцедуры

Обратите внимание на добавочное ключевое слово Экспорт у процедуры УстановитьКод(). Оно привело к тому, что объект типа СправочникОбъект.ОсновныеСредства получил новый метод.

Аналогичную методику можно применить и для регистра сведений:

Упражнение №6.8.

Выделите поле ввода "БалансоваяСтоимость" из табличного поля "НаборДанныеОС" (см. рис. 6.10) и установите для этого элемента формы следующие свойства:

Свойство

Значение

При изменении:

ПриИзмененииБалансовойСтоимости

Переключитесь на закладку "Модуль".

Попробуйте самостоятельно написать процедуру:

//ПриИзмененииБалансовойСтоимости() - рассчитывает для записи
//ее рыночную стоимость
//ТекЗапись – запись, для которой производится расчет

Процедура ПриИзмененииБалансовойСтоимости(Элемент)
КонецПроцедуры


Рис. 6.10. Особенность выделения поля ввода в табличном поле формы.

В табличном поле есть поле ввода "Подразделение", которое имеет тип СправочникСсылкаодразделения, а справочник "Подразделения" подчинен справочнику "Фирмы", поэтому:

Упражнение №6.9.

Установите у поля ввода "Подразделение" свойство "Связь по владельцу".

В постановке задачи сказано, что "Для тех ОС из группы "Машины и оборудование", что состоят из отдельных деталей…".

Таким образом, если в реквизите "ГруппаОС" выбрано значение "Машины и оборудование", то тогда пользователь должен иметь возможность обращаться к реквизитам формы "ЕстьДетали" и "СписокДеталей", т.е. реквизиты должны быть видимы, а в противном случае нет.

Упражнение №6.10.

Выделите поле ввода "ГруппаОС" и установите для этого элемента формы следующие свойства:

Свойство

Значение

При изменении

ПриИзмененииГруппыОС

Переключитесь на закладку "Модуль" и наберите следующий текст:

//ПриИзмененииГруппыОС - управляет видимостью
// реквизита "ЕстьДетали" и страницы "СписокДеталей"

Процедура ПриИзмененииГруппыОС(Элемент) Экспорт
   _Видимость = (ГруппаОС =Перечисления.ГруппыОС.МашиныИОборудование);
   ЭлементыФормы.ЕстьДетали.Видимость =_Видимость;
   ЭлементыФормы.Панель1.Страницы.СписокДеталей.Видимость = _Видимость;
КонецПроцедуры

Сделаем следующие пояснения.

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

Форма = Справочники.ОсновныеСредства.ПолучитьФормуНовогоЭлемента();
Форма. ………………………………………………………………………………
Форма.ПриИзмененииГруппыОС(Неопределено);

2.     В этой процедуре мы обошлись без оператора "Если".

Следующее упражнение сделайте самостоятельно:

Упражнение №6.11.

Выделите поле ввода "ЕстьДетали" и установите для этого элемента формы следующие свойства:

Свойство

Значение

При изменении:

ПриИзмененииФлага

Реализуйте самостоятельно текст этой процедуры.

После чего исправьте текст процедуры ПриИзмененииГруппыОС(…):

Процедура ПриИзмененииГруппыОС(Элемент) Экспорт
   _Видимость = (ГруппаОС =Перечисления.ГруппыОС.МашиныИОборудование);
   ЭлементыФормы.ЕстьДетали.Видимость =_Видимость;
   ЭлементыФормы.Панель1.Страницы.СписокДеталей.Видимость =_Видимость;
   ПриИзмененииФлага(Элемент);
КонецПроцедуры

 

 

 

 

 

 

6.2.3. Самостоятельная работа

Выполните следующие упражнения самостоятельно.

Упражнение №6.12.

Сделайте так, чтобы при выборе детали в поле ввода "Деталь" цена из справочника "Детали" помещалась в реквизит "ЦенаУЕ" табличной части справочника "ОсновныеСредства".

 

 

 

 

 

 

 

 

 

 

  В каком модуле Вы расположили текст процедуры-обработчика?

Упражнение №6.13.

Сделайте так, чтобы при изменении в форме реквизитов "Количество", "ЦенаУЕ" и "СуммаУЕ" производился как прямой расчет суммы, так и обратный расчет цены.

За выполнение расчета должна отвечать одна процедура ПересчетСтроки(Элемент), которая должна являться обработчиком для трех полей ввода.

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

ИмяКолонки = ЭлементыФормы.СписокДеталей.ТекущаяКолонка.Имя;

Нужно ли изменить текст обработчика поля ввода "Деталь"?

 

 

6.2.4. Обработка событий от табличного поля

В нашей форме вставлены два табличных поля "НаборДанныеОС" и "СписокДеталей", каждое из которых в составе своих свойств имеет группу "События" (см. рис. 6.11).


Рис. 6.11. Список событий табличного поля как элемента формы.

В этом подразделе мы рассмотрим только некоторые из них.

"Разбор полетов" будем делать на примере поля "НаборДанныеОС", тип значения которого – "РегистрСведенийНаборЗаписей". А раз так, то все записи из регистра сведений будут считываться за "один раз". Но все записи нам не нужны, поэтому:

Упражнение №6.14.

Установите для поля "НаборДанныеОС":

Свойство

Значение

Обновлять при изменении отбора

Начнем размышлять. Пользователь начнет заполнять табличное поле путем ввода новых строк, а раз так, то нужно в реквизит "ОС" записать ссылку на основной реквизит формы (тип – "СправочникОбъектсновныеСредства").

Но такую ссылку мы сможем записать только в том случае, если элемент справочника уже записан. Поэтому:

Упражнение №6.15.

Используя кнопку установите для реквизита "НаборДанныеОС" события:

Свойство

Значение

Перед началом добавления:

НаборДанныеОСПередНачаломДобавления

При начале редактирования:

НаборДанныеОСПриНачалеРедактирования

Имена процедур в этом случае будут сгенерированы автоматически.

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

Наберите в модуле следующий текст процедуры:

//НаборДанныеОСПередНачаломДобавления – проверяет
// возможность добавления новой строки

Процедура НаборДанныеОСПередНачаломДобавления(Элемент, Отказ, Копирование)
   Если
ЭтоНовый() Тогда
      // откажем в добавлении строки:
      Отказ = Истина;
      Предупреждение("Прежде чем добавлять запись необходимо записать элемент       справочника!");
   КонецЕсли;
КонецПроцедуры

А вот вторую процедуру мы можем использовать для заполнения ее реквизитов значениями по умолчанию:

Наберите в модуле следующий текст процедуры:

//НаборДанныеОСПриНачалеРедактирования - заполняет реквизит
// ОС ссылкой на текущий элемент справочника

Процедура НаборДанныеОСПриНачалеРедактирования(Элемент, НоваяСтрока)
   Если
НоваяСтрока Тогда
      ТекСтрока = ЭлементыФормы.НаборДанныеОС.ТекущаяСтрока;
      ТекСтрока.ОС = Ссылка;
   КонецЕсли;
КонецПроцедуры

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

Упражнение №6.16.

Нажмите на кнопку открытия и установите для реквизита "СписокДеталей" событие:

Свойство

Значение

Перед окончанием редактирования

СписокДеталейПередОкончаниемРедактирования

И наберите следующий текст:

//СписокДеталейПередОкончаниемРедактирования - проверяет
// правильность заполнения строки

Процедура СписокДеталейПередОкончаниемРедактирования(Элемент,
   НоваяСтрока, ОтменаРедактирования,Отказ)
   // Если пользователь отказался от ввода новой строки
   Если НоваяСтрока И ОтменаРедактирования Тогда
      // то нам все равно
      Возврат;
   КонецЕсли;

   // Если пользователь подтерждает ввод строки
   Если Не ОтменаРедактирования Тогда
      ТекСтрока = ЭлементыФормы.СписокДеталей.ТекущаяСтрока;
         Если
ТекСтрока.Деталь.Ссылка.Пустая() Тогда
            Предупреждение("Не выбрана деталь!");
            Отказ = Истина;
         Возврат;
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры

Нужно иметь в виду, что эта процедура будет получать управление в двух случаях:

*       Когда пользователь отменил редактирование, нажав Esc;

*       Когда пользователь закончил редактирование, нажав Enter;

Именно поэтому в процедуре проверяется соответствующая комбинация входных параметров НоваяСтрока и ОтменаРедактирования.

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

 

 

6.2.5. Обработка событий от формы в целом

Напомним список основных событий, которые есть в форме:

*       Перед открытием;

*       При открытии;

*       Обновление отображения;

*       Перед закрытием;

*       При закрытии;

*       При изменении данных;

*       Перед записью;

*       При записи;

*       После записи;

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

Давайте разберемся по порядку.

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

А раз так, то нужно до открытия формы установить отбор в поле "НаборДанныеОС":

Упражнение №6.17.

Включите для формы обработку события "Перед открытием".

//ПередОткрытием - установим отбор в наборе записей регистра
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
   НаборДанныеОС.Отбор.ОС.Установить(Ссылка);
КонецПроцедуры

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

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

*       заполнение реквизитов формы начальными значениями;

*       установка свойств формы и ее элементов в начальные значения.

Когда мы можем заполнить реквизиты начальными значениями? Тогда и только тогда, когда мы открываем форму нового объекта (записи) в ИБ.

Для справочников, точнее у объекта типа "СправочникОбъект", есть метод ЭтоНовый(), который возвращает истину, если объект был только что создан, но еще не записан.

Упражнение №6.18.

Нажмите на кнопку для события "При открытии" в свойствах формы и наберите в модуле формы следующий текст:

Процедура ПриОткрытии()
   Если
ЭтоНовый() Тогда
      // Заполним реквизиты нового объекта начальными значениями
      Фирма = Константы.ОсновнаяФирма.Получить();
      УстановитьКод();
   КонецЕсли;
   
// Установим свойство видимость у элементов диалога перед его открытием
   ПриИзмененииГруппыОС(Неопределено);
КонецПроцедуры

Поскольку начальное значение реквизита Фирма мы будем сохранять в константе ОсновнаяФирма, то добавьте ее в конфигурацию:

Свойство

Значение

Имя:

ОсновнаяФирма

Синоним:

Основная фирма

Комментарий:

Значение по умолчанию

Тип:

СправочникСсылкаирмы

Откройте основную форму констант и установите ее высоту равной 200 пикселям.

Выберите пункт меню "Форма – Размещение данных…", в котором установите флажки в соответствии с рисунком 6.12. После чего разместите в форме надпись и поле ввода под уже имеющимися элементами.


Рис. 6.12. Выбор данных и элемента формы.

Если Вы все сделали правильно, то основная форма констант будет выглядеть так, как это изображено на рисунке 6.13.


Рис. 6.13. Основная форма констант после доработки

Теперь мы можем поработать с формой элемента из режима "1Средприятие".

Упражнение №6.19.

В режиме "1Средприятие", используя пункт меню "Прочие – Константы" выберите в качестве значения константы "Основная фирма" фирму "АО "Альтернатива"" и сохраните сделанные изменения в ИБ.

Используя пункт меню "Операции – Справочник...", откройте форму списка справочника "Основные средства" и добавьте в него новый элемент, заполнив его реквизиты следующими значениями:

Реквизит

Значение

Фирма:

АО "Альтернатива"

Родитель:

 -

Код:

АЛ-00001

Наименование:

Головной офис

Группа ОС:

Здания

Дата ввода:

02.02.2002

Попробуйте добавить на закладке "Данные ОС" новую строку.

Нажмите на кнопку "ОК" для сохранения элемента и записи его в ИБ.

Как мы видим, наши процедуры-обработчики успешно отработали и выполнили все возложенные на них функции.

Но вернемся к рассмотрению событий формы.

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

Если пользователь изменил объект ИБ, ему будет предложено сохранить введенные данные. В случае положительного ответа на вопрос системы, будут последовательно возникать события:

*       Перед записью;

*       При записи;

*       После записи;

При этом нужно помнить, что в модуле объекта Вы также можете обрабатывать события:

*       Перед записью;

*       При записи;

При этом обработчики событий в форме получают управление раньше одноименных обработчиков событий в модуле объекта.

Задача обработчика ПередЗаписью(…) проверить возможность записи объекта в ИБ, и, если есть необходимость, отказать в этом.

Поэтому мы в модуле объекта реализуем функцию ЕстьОшибка(), которая будет возвращать Имя реквизита, содержащего с точки зрения программиста неверные данные.

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

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

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

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

Упражнение №6.20.

Наберите в модуле объекта следующий текст:

//ЕстьОшибка() - возвращает имя реквизита с ошибкой
//Е
сли ошибок нет, то: ""

Функция
ЕстьОшибка() Экспорт
   // Группу записываем всегда!
   Если ЭтоГруппа Тогда
      Возврат
"";
   КонецЕсли;

   //Ошибкой будем считать пустые реквизиты
   //"Фирма" и "ГруппаОС"
   Если Фирма.Ссылка.Пустая() Тогда
      Возврат
"Фирма";
   КонецЕсли;
   Если
ГруппаОС.Пустая() Тогда
      Возврат
"ГруппаОС";
   КонецЕсли;

   // ошибок нет
   Возврат "";
КонецФункции

Теперь в том же модуле можно и обработчик добавить.

Наберите в модуле объекта следующий текст:

// Проверяет правильность заполнения элемента справочника
Процедура ПередЗаписью(Отказ)
   Имя = ЕстьОшибка();
   Если
Имя = "" Тогда
      Возврат;
//ошибок нет
   КонецЕсли;

   Сообщить("Реквизит"+Имя+" не содержит данных!",
   СтатусСообщения.Важное);
   Сообщить("Запись "+ ЭтотОбъект+" справочника не записана!",
   СтатусСообщения.ОченьВажное);
   Отказ = Истина;
КонецПроцедуры

Обработчик в форме будет получать управление до обработчика из модуля объекта, поэтому в случае отказа в этом обработчике "дело не дойдет" до модуля объекта:

Включите в модуле формы обработку события "Перед записью" и наберите следующий текст:

//ПередЗаписью - проверяет правильность заполнения элемента справочника
Процедура ПередЗаписью(Отказ)
   Имя = ЕстьОшибка();
   Если
Имя = "" Тогда
      Возврат;
// т.к. нет ошибок
   КонецЕсли;

   Предупреждение("Реквизит"+Имя+" не содержит данных!");
   // установим курсор в нужное поле;
   ТекущийЭлемент = ЭлементыФормы[Имя];
   Отказ = Истина;
КонецПроцедуры

Наша форма содержит два реквизита: "НаборДанныеОС" и "СправочникОбъект", причем последний из них является основным реквизитом. Именно его система будет записывать по команде "Записать".

Поэтому только событие "При записи" может быть использовано для записи "НаборДанныеОС".

Упражнение №6.21.

Включите в модуле формы обработку события "При записи" и наберите следующий текст:

//ПриЗаписи - записывает набор записей регистра сведений
Процедура ПриЗаписи(Отказ)
   Попытка
      
НаборДанныеОС.Записать();
   Исключение
      
Предупреждение("Не удалось сохранить""Данные ОС""!");
      
Отказ = Истина
   КонецПопытки;
КонецПроцедуры

Процедура ПослеЗаписи() получает управление только тогда, когда запись успешно завершена (транзакция закрыта).

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

Упражнение №6.22.

Включите в модуле формы обработку события "После записи" и наберите следующий текст:

//ПослеЗаписи() - переустанавливает отбор после записи
Процедура ПослеЗаписи()
   НаборДанныеОС.Отбор.ОС.Установить(Ссылка);
КонецПроцедуры

 

 

6.2.6. Изменение привязок элементов

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

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

Упражнение №6.23.

Запустите основную форму элемента на проверку в режиме "Конфигуратор".

Что Вы видите (см. рис. 6.14)? Какие элементы формы требуют доработки?


Рис. 6.14. Окно проверки основной формы элемента.

Будем действовать последовательно.

Для элемента формы "Фирма" в его свойствах для свойства "Привязка границ" откройте диалог "Привязка границ…", нажав на ссылку "Установить правила" и установите на закладке "Сложная" установите свойства согласно рисунку 6.15.

Проверьте работу формы. Что изменилось?


Рис. 6.15. Привязки элемента "Фирма".

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

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


Рис. 6.16. Работа привязок элементов формы.

 

 

6.2.7. Отображение картинки

Непосредственно вставить в форму реквизит "Изображение" мы не можем, т.к. его тип "ХранилищеЗначения", в котором может быть сохранено все что угодно.

Но мы можем вставить в форму элемент формы типа "Поле картинки", в которое можно будет отобразить изображение.

Упражнение №6.24.

Добавьте в панель, расположенную в форме, новую закладку:

Свойство

Значение

Имя:

Картинка

Заголовок страницы:

Картинка

После чего вставьте на эту страницу элемент управления типа "Поле картинки" со следующими свойствами:

Свойство

Значение

Имя:

ПолеКартинки

Рамка:

Выпуклая

Картинка:

 -

Размер картинки:

Пропорционально

Гиперссылка:

И расположите ее на свободном пространстве (см. рис. 6.17).

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

Установите привязки у поля картинки согласно рисунку 6.18.

Теперь нам нужно решить две проблемы:

1.     Как прочитать новую картинку из файла в элемент формы и сохранить ее в хранилище значений;

2.     Как извлечь картинку из хранилища и отобразить ее.


Рис. 6.17. Поле картинки в форме.


Рис. 6.18. Привязки поля картинки.

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

Упражнение №6.25.

Установите для элемента формы "ПолеКартинки" событие:

Свойство

Значение

Нажатие

ПолеКартинкиНажатие

И наберите следующий текст:

//ПолеКартинкиНажатие - читает картинку в поле картинки
Процедура ПолеКартинкиНажатие(Элемент)
   // Открем диалог выбора файла
   Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   Диалог.Заголовок = "Выберите файл картинки";
   Диалог.ПредварительныйПросмотр = Истина;
   Диалог.Фильтр = "Точечный рисунок(*.bmp)|*.bmp";
   // Если пользователь сделал выбор тогда
   Если Диалог.Выбрать() Тогда
      // Прочитаем картинку в ОП
      НоваяКартинка = Новый Картинка(Диалог.ПолноеИмяФайла);
      // и оборазим в форме:
      ЭлементыФормы.ПолеКартинки.Картинка =НоваяКартинка;
      Изображение = Новый ХранилищеЗначения(НоваяКартинка);
   КонецЕсли;
КонецПроцедуры

Запустите режим "1Средприятие" и проверьте работу алгоритма.

На закладке "Картинка" добавьте фотографию головного офиса (файл расположен здесь)

При записи объекта реквизит Изображение будет сохранен в ИБ.

А вот когда мы будем открывать форму, то нужно отобразить реквизит "Изображение" в картинку, если объект не новый. Если объект новый, то тогда следует в картинку отобразить пустую картинку.

Упражнение №6.26.

 Исправьте текст процедуры ПриОткрытии():

// ПриОткрытии - действия в момент открытия формы
Процедура ПриОткрытии()
   Если
ЭтоНовый() Тогда
      // Заполним реквизиты нового объекта начальными значениями
      Фирма = Константы.ОсновнаяФирма.Получить();
      УстановитьКод();
      // запишем пустую картинку
      Изображение = Новый ХранилищеЗначения(Новый Картинка());
   КонецЕсли;

   // Установим свойство видимость у элементов диалога перед его открытием
   ПриИзмененииГруппыОС(Неопределено);
   // отобразим картинку
   ЭлементыФормы.ПолеКартинки.Картинка = Изображение.Получить();
КонецПроцедуры

Запустите режим "1Средприятие" и проверьте работу алгоритма.

 

 

6.3. Самостоятельная работа

Следующие упражнения предназначены для закрепления материала, изложенного выше.

Упражнение №6.27.

Самостоятельно создайте для справочника "ОсновныеСредства" основную форму группы (см. рис. 6.19).

Какие события Вы будете обрабатывать в этой форме?

От каких ее элементов?

Сделайте так чтобы коды групп в справочнике "ОсновныеСредства" нумеровались бы в системе в следующем порядке: "00000001", "00000002", и т.д. до "00099999".

Чтобы проверить работу формы введите в справочник новую группу с наименованием "Здания и сооружения".

Нужно ли что-то изменить в модуле формы или в модуле объекта?


Рис. 6.19. Форма группы.

Упражнение №6.28.

Самостоятельно создайте для справочника "ОсновныеСредства" основную форму списка (см. рис. 6.20).

Кнопка "Печать" нам понадобится позже.

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

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

*       Код;

*       Наименование;

*       Фирма;

*       ГруппаОС;

*       ДатаВвода;

*       ДатаСписания;

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

Вставьте открытие этой формы в основной интерфейс конфигурации.

Проверьте работу кнопки в режиме "1Средприятие".


Рис. 6.20. Форма списка справочника "ОсновныеСредства".

Чтобы проверить работу наших алгоритмов, обеспечьте наличие в справочнике следующих записей:

Упражнение №6.29.

Для элемента "Головной офис" измените его родителя:

Реквизит

Значение

Родитель:

Здания и сооружения

На закладке "Данные ОС" наберите:

Период

Балансовая стоимость

Рыночная стоимость

Подразделение

31.12.2002

10 000 000,00

357 781,75

 -

Нажмите на кнопку "ОК". Что изменилось в ИБ?

Проверим установку префикса для другой "Фирмы":

Реквизит

Значение

Фирма:

ЗАО "Бухгалтер"

Родитель:

Здания и сооружения

Код:

БХ-00001

Наименование:

Крытый павильон

Группа ОС

Сооружения

Дата ввода:

14.01.2002

Дата списания:

 -

И на закладке "Данные ОС" наберите:

Период

Балансовая стоимость

Рыночная стоимость

Подразделение

14.01.2003

200 000,00

6 292,40

 -

 

28.12.2003

250 000,00

8 236,36

Администрация

 

Нажмите на кнопку "ОК". Что изменилось в ИБ?

Давайте введем элемент с деталями:

Реквизит

Значение

Фирма:

АО "Альтернатива"

Родитель:

Компьютеры и оргтехника

Код:

АЛ-00002

Наименование:

Компьютер

Группа ОС

Машины и оборудование

Дата ввода:

10.12.2002

Дата списания:

 -

Есть детали:

Переходим на закладку "Список деталей"

N

Деталь

Количество

Цена УЕ

Сумма УЕ

1

Материнская плата

1

115,00

115,00

2

Процессор 3ГГц

2

103,00

206,00

3

ОП DIMM/DDR 256 Мб

2

88,00

176,00

4

Винчестер 40Гб

1

100,00

100,00

5

CD-ROM 52х

1

32,00

32,00

6

FDD 3.5

1

10,00

10,00

Сохраните элемент в ИБ.

 

 

6.4. Метод СрезПоследних(…) менеджера регистра сведений-

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


Рис. 6.21. Результат работы кнопки "Печать".

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

Считывать данные по одной записи, используя метод ПолучитьПоследнее() не очень эффективное решение, поэтому мы воспользуемся другим методом - СрезПоследних().

Этот метод возвращает объект типа "Таблица значений". Он может содержать переменное число строк и столбцов.

Упражнение №6.30.

Измените настройку ячеек в столбцах "Фирма", "Группа ОС", "Дата ввода" и "Дата списания", чтобы улучшить представленные в них данные.

Добавьте три столбца "Балансовая стоимость", "Рыночная стоимость" и "Подразделение" (см. рис. 6.22).


Рис. 6.22. Макет печатной формы после доработки.

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

// Получение среза
ТаблицаСреза = РегистрыСведений.ДанныеОС.СрезПоследних(РабочаяДата);

Фрагмент процедуры, который выводит реквизиты элемента справочника, будет выглядеть следующим образом:

Секция = Макет.ПолучитьОбласть("Элемент");
Секция.Параметры.Код = Объект.Код;
Секция.Параметры.Наименование = Объект.Наименование;
Секция.Параметры.Фирма = Объект.Фирма;
Секция.Параметры.ГруппаОС = Объект.ГруппаОС;
Секция.Параметры.ДатаВвода = Объект.ДатаВвода;
Секция.Параметры.ДатаСписания = Объект.ДатаСписания;
// Найдем строку содержащую ОС в таблице значений
СтрокаСреза = ТаблицаСреза.Найти(Объект.Ссылка, "ОС");
Если
СтрокаСреза<>Неопределено Тогда
    Секция.Параметры.БалансоваяСтоимость = СтрокаСреза.БалансоваяСтоимость;
    Секция.Параметры.РыночнаяСтоимость = СтрокаСреза.РыночнаяСтоимость;
    Секция.Параметры.Подразделение = СтрокаСреза.Подразделение;
КонецЕсли;

ТабДок.Вывести(Секция);

Упражнение №6.30 (продолжение).

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

 

 

 

6.5. Соединение в языке запросов

В предыдущем подразделе при выводе информации в табличный документ мы соединили в одном отчете данные из разных таблиц ИБ.

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

Сначала выполните подготовительные действия:

Упражнение №6.31.

Добавьте в форму списка справочника "ОсновныеСредства" новую кнопку:

Свойство

Значение

Имя

ПечатьЗапросом

Заголовок

Печать запросом

Нажатие

ПечатьЗапросомНажатие

И расположите ее около кнопки "Печать" (см. рис. 6.24).


Рис. 6.24. Кнопка "Печать запросом".

Упражнение №6.31 (продолжение).

Переключитесь на закладку модуль и наберите "заготовку" для написания текста запроса:

//ПечатьЗапросомНажатие - выполняет теже действия, что и
//процедура Печать(...), но с использованием объекта запрос

Процедура ПечатьЗапросомНажатие(Элемент)
   
ТабДок = Новый ТабличныйДокумент;
   
Макет = Справочники.ОсновныеСредства.ПолучитьМакет("Печать");
   
// Заголовок
   
Секция = Макет.ПолучитьОбласть("Заголовок");
   
ТабДок.Вывести(Секция);
   
// Шапка
   
Секция = Макет.ПолучитьОбласть("Шапка");
   
ТабДок.Вывести(Секция);
   
Запрос = Новый Запрос();
   
Запрос.Текст =
    "";
   
// Выполняем запрос
   
Результат = Запрос.Выполнить();
   
ТабДок.ОтображатьСетку = Ложь;
   
ТабДок.Защита = Ложь;
   
ТабДок.ТолькоПросмотр = Истина;
   
ТабДок.ОтображатьЗаголовки = Ложь;
   
ТабДок.Показать();
КонецПроцедуры

Давайте размышлять дальше.

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

"ВЫБРАТЬ
| ОсновныеСредствасылка КАК Ссылка,
| ОсновныеСредства.Код КАК Код,
| ОсновныеСредства.Наименование КАК Наименование,
| ОсновныеСредства.Фирма КАК Фирма,
| ОсновныеСредства.ГруппаОС КАК ГруппаОС,
| ОсновныеСредства.ДатаВвода КАК ДатаВвода,
| ОсновныеСредства.ДатаСписания КАК ДатаСписания
|
|ИЗ
| Справочник.ОсновныеСредства КАК ОсновныеСредства

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

"ВЫБРАТЬ
| ДанныеОСалансоваяСтоимость КАК БалансоваяСтоимость,
| ДанныеОС.РыночнаяСтоимость КАК РыночнаяСтоимость,
| ДанныеОС.Подразделение КАК Подразделение
|ИЗ
| РегистрСведений.ДанныеОС.СрезПоследних(&Период) КАК ДанныеОС

Тут следует обратить внимание на то, что запись РегистрСведенийанныеОС.СрезПоследних(&Период) представляет собой виртуальную таблицу, а &Период – это параметр ее создания.

При создании текста с помощью Конструктора не забывайте нажимать на кнопку "Параметры виртуальной таблицы" (см. рис. 6.25).

Если соединить два текста в один запрос, то в результате получится "каша" из записей справочника и виртуальной таблицы.

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


Рис. 6.25. Кнопка настройки виртуальной таблицы.

В тексте запроса это будет выглядеть так:

"ВЫБРАТЬ
| ОсновныеСредствасылка КАК Ссылка,
| ОсновныеСредства.Код КАК Код,
| ОсновныеСредства.Наименование КАК Наименование,
| ОсновныеСредства.Фирма КАК Фирма,
| ОсновныеСредства.ГруппаОС КАК ГруппаОС,
| ОсновныеСредства.ДатаВвода КАК ДатаВвода,
| ОсновныеСредства.ДатаСписания КАК ДатаСписания,
| ДанныеОС.БалансоваяСтоимость КАК БалансоваяСтоимость,
| ДанныеОС.РыночнаяСтоимость КАК РыночнаяСтоимость,
| ДанныеОС.Подразделение КАК Подразделение
|ИЗ
| Справочник.ОсновныеСредства КАК ОсновныеСредства
| ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрСведений.ДанныеОС.СрезПоследних(&Период) КАК ДанныеОС
| ПО ОсновныеСредства.Ссылка = ДанныеОС.ОС

Слово ЛЕВОЕ означает, что все записи из справочника попадут в результат. Они будут соединены в отношении "1 ко многим" с записями из виртуальной таблицы.

Условие такого соединения: "ОсновныеСредствасылка = ДанныеОС.ОС".

Для нашего случая виртуальная таблица РегистрСведений.ДанныеОС.СрезПоследних будет для каждого ОС содержать максимально одну запись.

Упражнение №6.31 (продолжение).

Внесите изменения в тест запроса и добавьте в его конце оператор упорядочивания результатов выборки:

|
|УПОРЯДОЧИТЬ ПО
| Ссылка ИЕРАРХИЯ";

Теперь текст вызова запроса и цикл выборки будет выглядеть следующим образом:

// Выполняем запрос
Запрос.УстановитьПараметр("Период",РабочаяДата);
Результат = Запрос.Выполнить();
//Откроем выборку
Выборка = Результат.Выбрать();
Пока
Выборка.Следующий() Цикл
    Если
Выборка.Ссылка.ЭтоГруппа Тогда
    Секция = Макет.ПолучитьОбласть("Группа");
    Секция.Параметры.Заполнить(Выборка);
    ТабДок.Вывести(Секция);
Иначе

    Секция = Макет.ПолучитьОбласть("Элемент");
    Секция.Параметры.Заполнить(Выборка);
    ТабДок.Вывести(Секция);
КонецЕсли;
КонецЦикла;

Следует обратить внимание на метод .Заполнить(), который позволяет заполнить параметры области макета табличного документа, сократив объем фрагмента их заполнения до одной строки!

Упражнение №6.31 (продолжение).

Закончите формирование текста процедуры. Проверьте ее работу и сравните результаты печатной формы с предыдущим алгоритмом.

По окончании выполнения упражнения измените версию конфигурации на значение – "1.0.0.9".

 

6.6. Что мы узнали

В этой лабораторной работе мы рассмотрели совместное применение в конфигурации справочников и регистров сведений.

В качестве примера мы добавили в конфигурацию периодический регистр сведений "ДанныеОС", в котором разместили реквизиты, имеющие отношение к основному средству. Этот регистр имеет два измерения – "Период" и "ОС".

В этой главе мы закончили проектирование справочника "ОсновныеСредства" рассмотрев более подробно разработку формы элемента, где уделили внимание обработке событий, как от элементов формы, так и от самой формы в целом.

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

В этой же главе мы рассмотрели особенности применения метода СрезПоследних() регистра сведений.

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