В этой лекции мы продолжим работу над справочниками нашей конфигурации, попутно рассмотрим некоторые программные механизмы работы с ними.
В частности, в предыдущей лекции мы создавали обычные справочники – такие справочники содержат простые списки элементов. Однако, справочники в 1С:Предприятие 8 могут иметь более сложную структуру.
Многие справочники, используемые на практике, являются иерархическими. Это означает, что каждому из элементов справочника может быть сопоставлен другой элемент, который называется родителем.
Возможна иерархия различных видов, в частности, при иерархии групп и элементов в справочник, помимо обычных элементов можно включать группы, которые, в свою очередь, могут включать в себя другие группы и элементы.
Примером такого справочника является справочник, хранящий списки товаров, материалов, услуг. Обычно такой справочник носит название Номенклатура. Как правило, подобный справочник имеет множество групп – например – Товары – для хранения записей о товарно-материальных ценностях, и Услуги – для хранения списков услуг.
Второй вид иерархии – это иерархия элементов. Хорошим примером справочника, для которого естественна иерархия элементов, является справочник для хранения сведений о подразделениях организаций. Такой справочник обычно так и называется – Подразделения. Логика иерархии элементов заключается в том, что отдельные элементы справочника, описывающие отдельные подразделения организации, могут являться родителями для других элементов – так же подразделений. Например, подразделение Администрация вполне может включать в себя подразделения Бухгалтерия, Отдел кадров и так далее.
Справочники, в сущности, являются хранилищами аналитических признаков учета. Например, в случае со справочником Номенклатура можно организовать учет таким образом, чтобы иметь сведения об остатках каких-либо номенклатурных позиций на складе, об их стоимости. В случае со справочником, поддерживающим иерархию элементов, любой элемент справочника можно использовать как аналитический "разделитель" учета (то есть, например, выбирать данные элементы при заполнении табличных частей других объектов, например, документов). А вот при иерархии групп и элементов использовать в качестве аналитического разделителя группу не получится.
Если родительские отношения существуют внутри справочника, такие справочники называются иерархическими. Существует еще один вид взаимоотношений между справочниками, который называется подчинением. Предположим, у нас имеется справочник Контрагенты, содержащий список организаций, с которыми наша организация имеет какие-то взаимоотношения. Каждый из контрагентов, описанных в этом справочнике, имеет некоторое количество контактных лиц – представителей контрагента. Можно сказать, что каждый представитель контрагента "принадлежит" определенному контрагенту. Такие взаимоотношения между справочниками реализуются при помощи механизма указания владельцев справочника и настройки подчинения.
Рассмотрим работу с
Создадим новый справочник Единицы измерения, зададим следующие его параметры:
Имя: ЕдиницыИзмерения
Длина наименования: 100 символов
Подсистемы: БухгалтерскийУчет, ОперативныйУчетМатериалов
Это будет очень простой справочник, стандартный
Теперь создадим очередной справочник – Номенклатура. Зададим следующие параметры:
Имя: Номенклатура
Подсистемы: БухгалтерскийУчет, ОперативныйУчетМатериалов
На вкладке окна редактирования объекта ., установим следующие параметры:
(рис 4.1) Настройка иерархического справочника
Иерархический справочник: Установлено
Вид иерархии: Иерархия групп и элементов.
Этот параметр может принимать значение Иерархия элементов. В нашем случае справочник сможет содержать отдельные элементы, собранные, в зависимости от их вида, в группы. Эту структуру можно сравнить с папками и файлами в файловой системе компьютера. Группы – это папки, отдельные элементы – это файлы.
На вкладке ., добавим следующие реквизиты:
ЕдиницаИзмерения: Тип СправочникСсылка.ЕдиницыИзмерения.
Услуга: Тип Булево, Использование: Для группы и элемента. Эта установка позволит задавать данный
Заполнять из данных заполнения: Истина
Отдельные группы нашего справочника планируется использовать для хранения исключительно услуг, и подобная установка (в частности, истинность параметра Заполнять из данных заполнения) позволит нам реализовать автоматический механизм заполнения данного реквизита для элементов, входящих в группы.
Длина наименования: 100
(рис 4.2) Состав реквизитов справочника Номенклатура
Таким образом, при создании элемента справочника мы будем задавать название элемента в стандартном
Реализуем функцию автоматического заполнения реквизита Услуга для элементов, входящих в группы. Нам нужно, чтобы элемент, создаваемый в группе с установленным флагом Услуга, при его создании, автоматически бы получал установленный флаг Услуга, соответственно, если данный флаг у группы не установлен, у элемента он так же не должен быть установлен. При этом нам нужно предусмотреть ситуацию, когда элемент создается вне группы – на верхнем уровне справочника Номенклатура. Для решения этой задачи мы можем воспользоваться обработчиком события ОбработкаЗаполнения, его процедура располагается в модуле объекта.
Перейдем в модуль объекта (кнопка .
(рис 4.3) Процедура обработки заполнения справочника
Процедура будет исполняться на стороне сервера, причем, вызываться она будет при различных способах создания элемента справочника – например, при интерактивном создании пользователем, при копировании, при программном создании. Параметр процедуры СтандартнаяОбработка позволяет включать или отключать стандартную обработку процесса заполнения реквизитов, параметр ДанныеЗаполнения содержит данные, которые система использует для заполнения элемента.
В режиме 1С:Предприятие откроем справочник .
(рис 4.4) Две группы в справочнике Номенклатура
Исследуем процедуру обработки заполнения, прежде чем продолжать работу над ней. Для этого вставим в нее какую-нибудь команду, например: .
(рис 4.5) Точка останова в процедуре
Запустим конфигурацию в режиме отладки (кнопка .
(рис 4.6) Структура ДанныеЗаполнения
Структура – это таблица, которая содержит пары вида Ключ – Значение.
В нашем случае, если процедура ОбработкаЗаполнения отработает – она заполнит лишь поле Родитель для создаваемого элемента. А нам хотелось бы установить и флаг Услуга в соответствии с данными родителя.
Рассмотрим некоторые составляющие данных, к которым мы можем получить доступ посредством структуры.
Родитель – здесь хранится родитель элемента – в нашем случае – группа Услуги типа СправочникСсылка.Номенклатура. То есть, при заполнения поля Родитель создаваемого элемента, окажется, что он будет хранить ссылку на другой элемент (в нашем случае – группу), входящий в справочник Номенклатура.
Владелец – данное поле у нашей группы, находящейся в справочнике, имеет значение Неопределено. Такое значение присваивается тем свойствам, которые, в принципе, могут быть установлены, но в данном случае значения не имеют.
ЕдиницаИзмерения имеет значение Null. При настройке состава реквизитов справочника Номенклатура, мы указали, что ЕдиницаИзмерения может задаваться только для элемента. Но в структуре справочника в
Свойство Услуга установлено в значение Истина – этот флаг мы устанавливали при создании группы Услуги.
Свойство ЭтоГруппа так же истинно – оно устанавливается в истинность для групп.
Для того чтобы установить свойство Услуга у создаваемого элемента, мы могли бы напрямую обратиться к свойству элемента Услуга и установить его в значение флага Услуга у его родителя. Выглядеть это может, например, так:
Услуга = ДанныеЗаполнения.Родитель.Услуга.
Однако процедура ОбработкаЗаполнения предусматривает автоматический механизм заполнения реквизитов на основе переданной структуры. Так как стандартный механизм нас вполне устраивает, мы можем поступить по-другому. А именно, для установки свойства Услуга нам нужно лишь дополнить структуру необходимой записью. Сделать это можно с помощью стандартных операций по работе со структурой. А именно, следующим образом:
ДанныеЗаполнения.Вставить("Услуга", ДанныеЗаполнения.Родитель.Услуга);
В итоге у нас получается такой код, .
(рис 4.7) Заполнение реквизита Услуга на основании параметров элемента родителя
Здесь мы установили точку останова для того, чтобы посмотреть, как изменится структура при выполнении данной процедуры. Опробуем решение в пользовательском режиме, можно заметить, что, во-первых, структура .
(рис 4.8) Результат заполнения реквизита Услуга на основании параметров элемента родителя
Подойдет ли
(рис 4.9) Ошибка при попытке создать элемент, у которого нет родителя
Нажав на кнопку .
(рис 4.10) Более подробное описание ошибки
Нажав на кнопку Конфигуратор, мы попадаем в
Если ДанныеЗаполнения.Свойство("Родитель") Тогда
ДанныеЗаполнения.Вставить("Услуга", ДанныеЗаполнения.Родитель.Услуга);
КонецЕсли;
Как кажется, все должно работать правильно – если в структуре обнаружилось поле Родитель – мы можем обращаться к свойству Услуга. Но попытка выполнить эту процедуру снова приводит к ошибке
Эта ошибка возникает при проверке условия на наличие в структуре свойства Родитель. Здесь у нас возникает вопрос о том, чем является передаваемый параметр .
(рис 4.11) Параметр ДанныеЗаполнения при создании элемента или группы на верхнем уровне справочника
Тип Неопределено говорит нам о том, что перед нами лишь переменная, тип которой программе не известен. Мы не можем обращаться к ней как к структуре, поэтому, прежде чем проверять, есть ли в структуре ДанныеЗаполнения свойство Родитель, нам нужно проверить, является ли передаваемый параметр ДанныеЗаполнения структурой. Мы знаем, что этот параметр, когда он заполнен данными, имеет тип Структура, следовательно, нам нужно исключить вариант, когда его тип равняется Неопределено.
Вышеприведенные рассуждения приводят нас к следующему коду:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ДанныеЗаполнения<>Неопределено Тогда
Если ДанныеЗаполнения.Свойство("Родитель") Тогда
ДанныеЗаполнения.Вставить("Услуга", ДанныеЗаполнения.Родитель.Услуга);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В данной редакции обработчика события ОбработкаЗаполнения все работает верно.
Чисто теоретически (предположим, при изменении кем-либо нашего кода) возможна ситуация, когда ДанныеЗаполнения будут являться структурой и в этой структуре, в то же время, не будет свойства Родитель. Поэтому наряду с проверкой на неопределенность значения мы оставляем и проверку на наличие свойства Родитель.
Мы обсудили и проиллюстрировали родительские отношения в справочнике, рассмотрим теперь пример работы с
Создадим новый справочник, назовем его Контрагенты.
Добавим его в подсистемы БухгалтерскийУчет и ОперативныйУчетМатериалов.
Справочник будет иерархическим, с иерархией групп и элементов.
В состав реквизитов справочника добавим следующие (.):
Имя: ПолноеНаименование, тип – Строка, длина 100.
Имя: КонтактныеСведения, тип – Строка, длина 100
(рис 4.12) Справочник Контрагенты
Создадим еще один справочник. Назовем его ПредставителиКонтрагентов. Главная черта этого справочника – то, что он подчинен справочнику Контрагенты. Для настройки подчинения используется вкладка окна настройки объекта конфигурации Владельцы. Здесь мы должны добавить в Список владельцев справочника справочники-владельцы, в нашем случае – справочник Контрагенты. После того, как владелец добавлен в этот список, мы можем настроить для него параметр Использование подчинения. Здесь возможны три варианта:
Элементам – элементы
Группам – подчинение группам справочника-владельца. Нас это не устроит – так как группы справочника будут содержать контрагентов, сгруппированных по достаточно общим показателям (Покупатели, Заказчики и т.д.), и сопоставление одного контактного лица нескольким разным, например, покупателям, смысла не имеет. В другой ситуации эта установка могла бы быть вполне оправданной.
Группам и элементам – подчинение как группам, так и элементам справочника-владельца.
Мы укажем в параметре .
(рис 4.13) Настройка подчинения
Добавим справочник в состав подсистем БухгалтерскийУчет и ОперативныйУчетМатериалов.
В состав реквизитов справочника добавим следующие:
Имя: ФИО, тип – Строка, длина 100
Имя: КонтактныеСведения, тип – Строка, длина 100.
Имя: ПредставительРаботает, тип – Булево.
Посмотрим теперь, как выглядит работа с созданными справочниками в режиме .
(рис 4.14) Форма элемента справочника Контрагенты
При переходе в этот справочник мы будем видеть в открывшемся окне лишь тех представителей, которые относятся к контрагенту, с которым мы в данный момент работаем. При создании новой записи о представителе он автоматически будет "привязываться" к тому контрагенту (поле владелец будет заполнено должным образом), из формы элемента которого мы перешли в справочник .
(рис 4.15) Формы списка и элемента справочника ПредставителиКонтрагентов
Мы можем создавать элементы справочника .
(рис 4.16) Просмотр формы списка справочника ПредставителиКонтрагентов
Перейдем в окно редактирования объекта конфигурации справочника .
(рис 4.17) Конструктор формы справочника Контрагенты
Вот как будет выглядеть форма списка справочника в режиме 1С:Предприятие, 4.18.
(рис 4.18) Форма справочника со списком и деревом элементов
Расширим справочник .
(рис 4.19) Попытка заполнения реквизита Основное контактное лицо
Видно, что при попытке подбора элемента в данное поле нам показывают не только те элементы справочника ПредставителиКонтрагентов, владельцем которых является редактируемый элемент, но и все остальные. Так работать неудобно – это значит, что нам нужно настроить фильтрацию выводимых элементов. Для того, чтобы это сделать, удобнее всего будет воспользоваться свойством Связи параметров выбора реквизита ОсновноеКонтактноеЛицо. Для открытия палитры свойств реквизита мы можем сделать двойной щелчок по реквизиту в окне редактирования объекта конфигурации, в
В открывшейся палитре свойств найдем свойство .
(рис 4.20) Окно Связи параметров выбора
В левой части окна можно видеть доступные реквизиты (это реквизиты открытого элемента справочника .
(рис 4.21) Окно Связи параметров выбора с настроенным параметром
В данном случае в строке области .
(рис 4.22) Настройки в окне Связи параметров выбора
После того, как эта настройка выполнена, мы можем нажать ОК в окне Связи параметров выбора и проверить функциональность решения – при заполнении поля ОсновноеКонтактноеЛицо список выбора ограничивается подчиненными элементами.
Добавим в справочник Контрагенты еще один
После добавления реквизита в справочник Контрагенты, запустим режим 1С:Предприятие и откроем форму одного из элементов этого справочника. Если присмотреться к этой форме на данном этапе работы, окажется, что реквизита ТелефонКонтактногоЛица на ней не наблюдается. Все дело в том, что, создав собственную форму элемента для справочника, мы отказываемся от автоматического механизма создания форм, который, если бы не наша, самостоятельно созданная ранее форма, автоматически построил бы форму с новым реквизитом.
Добавим элемент управления для реквизита .
(рис 4.23) Реквизит ТелефонКонтактногоЛица нужно переместить со вкладки Реквизиты на вкладку Элементы
В справочнике ПредставителиКонтрагентов есть
Для этого нам понадобится
Из контекстного меню элемента формы ОсновноеКонтактноеЛицо выберем событие ПриИзменении, откроется
Все это реализовано с помощью нижеприведенного кода:
НаКлиенте
Процедура ОсновноеКонтактноеЛицоПриИзменении(Элемент)
Если НЕ ПроверитьЗаполнениеРеквизита() Тогда
Сообщить("Выбранное контактное лицо, "+Объект.ОсновноеКонтактноеЛицо+", не работает у контрагента.");
КонецЕсли;
КонецПроцедуры
НаСервере
Функция ПроверитьЗаполнениеРеквизита()
Возврат (Объект.ОсновноеКонтактноеЛицо.ПредставительРаботает);
КонецФункции
Кроме того, зададим автоматический механизм переноса в
Подготовим серверную процедуру, которая будет работать с реквизитами объекта, она будет иметь следующий вид:
НаСервере Процедура УстановитьНомерПредставителя() Объект.ТелефонКонтактногоЛица=Объект.ОсновноеКонтактноеЛицо.КонтактныеСведения; КонецПроцедуры
Вызовем эту процедуру в уже существующем обработчике .
Кроме того, в окне его свойств отредактируем свойство Вид – выберем его значение Поле надписи. Пользователь не будет ничего в это поле вводить самостоятельно, поэтому поле надписи нас вполне устроит.
(рис 4.24) Код модуля формы элемента справочника Контрагенты
При выборе "неподходящего" представителя окно элемента справочника Контрагенты примет следующий вид, .
(рис 4.25) Сообщение о выборе неподходящего контактного лица
Предположим, нам нужно, чтобы полное наименование организации было бы не короче 5-ти символов.
В предыдущей лекции, работая с формами, мы рассматривали проверку заполнения реквизитов справочника на стороне клиента. Такой подход возможен, но если говорить о производительности решения, предполагая работу конфигурации на сравнительно маломощном клиенте, лучше выполнять подобные проверки на стороне сервера. Как мы уже говорили, для проверки заполненности реквизита можно использовать стандартное свойство Проверка заполнения. Но если вам нужны более сложные проверки, если их достаточно много (например, при проверке производится манипулирование с табличными частями, получение каких-то дополнительных данных из базы, при этом алгоритмы достаточно сложны), лучше всего для проверки заполнения реквизитов воспользоваться процедурой ОбработкаПроверкиЗаполнения (), которая объявляется на уровне модуля объекта.
Объявим эту процедуру, открыв модуль объекта (закладка Прочее окна редактирования свойств объекта, кнопка Модуль объекта) выбором из списка Процедуры и функции панели инструментов модуль процедуры ОбработкаПроверкиЗаполнения().
Эта процедура работает на сервере, мы можем напрямую обращаться к реквизитам объекта.
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если СтрДлина(ПолноеНаименование) < 5 И НЕ ЭтотОбъект.ЭтоГруппа Тогда
Отказ=Истина;
Сообщить("Полное наименование организации должно быть не короче 5-ти символов");
КонецЕсли;
КонецПроцедуры
Передаваемый в процедуру параметр Отказ можно установить в значение Истина для того, чтобы показать, что проверка не пройдена. ПроверяемыеРеквизиты – это массив, он содержит реквизиты для автоматической проверки, в частности, там находятся те реквизиты, для которых включена автоматическая проверка заполнения. По умолчанию это –
В данной лекции мы познакомились с иерархическими и
Для данной лекции подготовлен видеоурок.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.