Прототип Справочники
У всех справочников есть стандартные реквизиты: Код и Наименование. Справочник обновляется в момент обращения или изменения со стороны пользователя, при изменении другим пользователем или программным изменением автоматического обновления нет, данные кэшируются, поэтому нужно вручную обновить справочник.
Предопределенные элементы. ПКМ на справочнике -> Открыть предопределенные данные. Для запрета удаления предопределённых элементов нужно выключить во всех ролях следующие права (по умолчанию выключены):
- «ИнтерактивноеУдалениеПредопределённыхДанных»
- «ИнтерактивнаяПометкаУдаленияПредопределённыхДанных»
- «ИнтерактивноеСнятиеПометкиУдаленияПредопределённыхДанных»
- «ИнтерактивноеУдалениеПомеченныхПредопределённыхДанных».
Подчиненные справочники. В свойствах справочника -> Владелец добавить справочник-владелец. Может быть несколько справочников-владельцев, но владелец конкретного элемента подчиненного справочника может быть один элемент одного из справочников-владельцев. Множественное владение не поддерживается. Детали удаления элемента родительского справочника
Табличные части. Используется для отражения информации, связанной с данным элементом, но не имеющей связанной объектной сущности. Например, для справочника "Товары" может быть создана табличная часть "ЕдиницыИзмерения".
Выбор между подчиненным справочником и табличной частью.
Это близкие элементы, поэтому нужно хорошо подумать перед выбором.
- При использовании табличной части нельзя ссылаться на строки табличной части, т.е. нельзя будет создать реквизит, соответствующий понятию «строка табличной части».
- Если в перспективе может возникнуть потребность ссылаться на подчиненные объекты, например, создавать ссылающиеся на них реквизиты документов или других справочников, то лучше сразу завести подчиненный справочник. Если же ссылка на такие сведения не имеет смысла и никогда не может быть типом какого-либо реквизита, тогда можно завести табличную часть.
Пример ситуаций и выбор между подчиненным справочником и табличной частью.
Ситуация 1 В базе данных необходимо хранить список расчетных счетов каждого контрагента. Почти наверняка в платежных документах будет необходимо, кроме контрагента, указывать его расчетный счет. Такая информация имеет объектную связь и может быть идентифицирована как "расчетный счет". Возможное решение: Справочник "Контрагенты" и подчиненный ему справочник "РасчетныеСчета" с полями "Банк", "Номер", "КоррСчет".
Ситуация 2 Для справочника "Номенклатура" нужно хранить список единиц измерения для каждого товара с указанием коэффициента пересчета в основную единицу измерения. Эти сведения подбираются из справочника "ЕдиницыИзмерения", который хранит все существующие в природе единицы измерений. Каждая строка такого подчиненного списка не имеет собственной объектной сущности, а нужна только для пересчета из одной единицы измерения в основную. Возможное решение: Справочник "Номенклатура" и табличная часть "ЕдиницыИзмерения" с полями "ЕдиницаИзмерения" и "КоэффициентПересчета".
Ситуация 3 Допустим, встроенной системы задания прав пользователей не хватает для некоторых специальных приложений. Например, часто требуется разработать механизм утверждения документов разными пользователями. Тогда для сотрудника нужно хранить список документов, которые он может утверждать, и с этим отлично справится табличная часть "УтверждаемыеДокументы" справочника "Сотрудники". Такая информация не имеет объектной связи, а просто связывает документ и сотрудника, поэтому вряд ли понадобится когда-либо в будущем создавать ссылки на нее. Возможное решение: Справочник "Сотрудники" и табличная часть "УтверждаемыеДокументы" с полем "Документ" и флажком "Утверждается". Заметим, что эту задачу также можно решить с использование регистров сведений.
Ситуация 4 Для справочника "Сотрудники" требуется хранить сведения о составе семьи сотрудника, т.е. вносить информацию о членах семьи и их родственных отношениях к сотруднику (муж, жена, сын, дочь и т.д.). Обычно эта списковая информация полностью подчинена элементу справочника "Сотрудники", и возникает мысль о том, чтобы завести табличную часть. Но если подумать, то такая информация имеет четкую объектную природу и может быть идентифицирована как "член семьи". Для некоторых приложений может потребоваться создавать ссылки на членов семьи сотрудника. Аналогичная ситуация наблюдается со сведениям об образовании и о предыдущих местах работы сотрудника. Возможное решение: Выбор между подчиненным справочником и табличной частью зависит от назначения конфигурации. Если в будущем может возникнуть потребность создавать ссылки на такие сведения, то лучше завести подчиненные справочники "СоставСемьи", "Образование" и "ТрудоваяДеятельность".
Важное замечание. Необходимо помнить, что при обращении к элементу справочника он весь, вместе со всеми табличными частями, считывается из базы данных в память. Если табличная часть содержит достаточно большое количество строк это может заметно сказаться на производительности системы.
Таким образом, табличную часть стоит использовать, если не надо хранить ссылки на элементы, и количество элементов ограничено.
Программная работа с элементами справочника
Обработка события удаления элементов
Справочник Менеджеры подчинен справочнику Прайс-лист. В модуле объекта справочника Прайс-лист обработка удаления элемента.
Процедура ПередУдалением(Отказ)
НайтиПодчиненныеЭлементы(ЭтотОбъект.Ссылка, Отказ);
КонецПроцедуры
&НаСервере
Процедура НайтиПодчиненныеЭлементы(СсылкаНаОбъект, Отказ)
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Менеджеры.Ссылка.Наименование как ИмяМенеджера
|ИЗ
| Справочник." + Метаданные.Справочники["Менеджеры"].Имя + " КАК Менеджеры
|ГДЕ
| Менеджеры.Владелец = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Отказ = Ложь;
Иначе
Сообщить("Нельзя удалить элемент, так как он владелец элементов.");
ВыборкаДетальныеЗаписи = Результат.Выбрать();
СписокЗависимостей = "";
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
СписокЗависимостей = СписокЗависимостей + " " + ВыборкаДетальныеЗаписи.ИмяМенеджера;
КонецЦикла;
Сообщить(СписокЗависимостей);
Отказ = Истина;
КонецЕсли;
КонецПроцедуры