- •Глава 3. Основные объекты конфигурации
- •3.1. Константы
- •Обращение к константам из программы
- •3.2. Перечисления
- •Системные перечисления и наборы значений
- •3. 3. Справочники
- •Структура справочника
- •Предопределенные элементы
- •Подчиненные справочники
- •Табличные части
- •Иерархические справочники
- •Экранные формы
- •Приемы программирования
- •Обращение к менеджеру справочника
- •Выборка элементов справочника
- •Создание элементов и групп справочника
- •Поиск в справочнике
- •Удаление элемента или группы справочника
- •Открытие форм справочника
- •Работа с табличным частями
- •Модуль объекта
Открытие форм справочника
Часто требуется программно открыть какую-либо форму справочника, например, при нажатии на клавишу Подбор в документах для заполнения табличной части.
Рассмотрим возможные варианты открытия различных форм справочника:
//обращение к форме по имени
Форма = Справочники.Сотрудники.Получитьформу("ФормаДляМенеджера");
Форма.Открыть();
//открыть основную форму списка
Справочники.Сотрудники.ПолучитьФормуСписка().Открыть();
//открыть подбор товара из документа,
//текущая форма будет владельцем открываемой формы
Форма = Справочники.Номенклатура.ПолучитьФормуВыбора(, ЭтаФорма);
Если НЕ Форма.Открыта() Тогда //если она еще не открыта
Форма.ИмяСохраненияПоложенияОкна = "НоменклатураПодбор";
КонецЕсли;
//установить свойства формы до ее открытия
Форма.РежимВыбора = Истина;
Форма.ЗакрыватьПриВыборе = Ложь;
Форма.РазрешитьСостояниеПрикрепленное = Истина;
//открыть форму или активизировать уже открытую форму
Форма.Открыть();
Работа с табличным частями
Обращение к табличным частям справочника производится через их имена. Для обхода строк табличной части рекомендуется применять конструкцию
«Для Каждого...».
Ниже показан пример обработки табличной части УтверждаемыеДокументы для справочника Сотрудники:
Сообщить("Выбранный сотрудник утверждает следующие документы:");
Для Каждого УтвДок Из ВыбСотр.УтверждаемыеДокументы Цикл
Сообщить(УтвДок.Документ);
КонецЦикла;
Модуль объекта
В версии 8 введено такое понятие как модуль объекта, который отличается от модуля формы элемента справочника. В новой версии экранные формы отделены от самих объектов конфигурации, поэтому необходимо понимать предназначение модуля объекта. Дело в том, что именно в нем располагаются обработчики событий, связанных с элементом справочника.
В версии 8 существуют следующие события, обработчики которых располагаются в модуле справочника:
ПриКопировании
Событие возникает при создании элемента справочника копированием. В обработчике события ПриКопировании можно вмешаться в этот процесс и более интеллектуально заполнить некоторые реквизиты элемента справочника.
ПередЗаписью
Процедура-обработчик вызывается после начала транзакции, но до начала записи элемента справочника. В данном обработчике можно отказаться от записи элемента.
ПриЗаписи
Событие возникает после записи элемента справочника в базу данных, но до окончания транзакции* записи. В данном обработчике также можно отказаться от записи элемента.
ПередУдалением
Событие возникает перед непосредственным удалением элемента или группы справочника из базы данных. В обработчике события это действие можно отменить.
ПриУстановкеНовогоКода
Событие возникает в момент, когда выполняется установка нового кода элемента справочника.
ОбработкаЗаполнения
Событие возникает при вводе элемента справочника на основании, а также при выполнении метода Заполнить. В процедуре-обработчике этого события должен быть описан алгоритм заполнения реквизитов элемента справочника на основании переданного значения.
Обработчики этих событий должны располагаться в модуле объекта и только там, независимо от наличия у справочника различных форм. Обработчики событий будут вызываться всегда при наступлении указанных событий, даже если событие инициировано программными вызовами, например методами Записать и Удалить. Это важное отличие в обработке событий по сравнению с версией 7.7, в которой такие события вызывались только при интерактивных действиях пользователя.
Приведем пример использования обработчика события. Допустим, в конфигурации категорически не допускается ввод позиции номенклатуры без указания основной единицы измерения. Тогда в модуле объекта справочника Номенклатура необходимо предусмотреть обработку события ПередЗаписью:
Процедура ПередЗаписью(Отказ)
Если ЭтоГруппа = Ложь И ЕдиницаИзмерения.Пустая() Тогда
Сообщить("Не указана основная ед. измерения!");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Обратите внимание, что реквизит ЕдиницаИзмерения определен только для элементов справочника Номенклатура, поэтому сначала проверяется, что записывается именно элемент, а не группа (условие «ЭтоГруппа = Ложь»).
Также заметьте, что вторая часть условия в операторе Если не выполняется, если первое условие не выполнено. Это происходит, потому, что, как уже говорилось в главе «Встроенный язык», в 1С:Предприятии 8 применяется сокращенное вычисление условий. Если после вычисления части составного условия уже можно определить результат всего условия, то остальная часть условия не вычисляется. Если бы в нашем примере для группы вычислялась вторая часть условия, то выдавалась бы ошибка, поскольку реквизит ЕдиницаИзмерения для групп не определен.ssssss
