mirror of
https://github.com/netology-code/1c-homeworks.git
synced 2024-11-24 08:02:20 +02:00
Create abstract-4-1.md
This commit is contained in:
parent
35452ed40c
commit
8549dc8932
154
abstract-4-1.md
Normal file
154
abstract-4-1.md
Normal file
@ -0,0 +1,154 @@
|
||||
# Конспект лекции "Справочники"
|
||||
|
||||
## Что такое "Справочник"?
|
||||
|
||||
Справочник - это объект метаданных, предназначенный для хранения сведений об однородных сущностях предметной области.
|
||||
Типичные примеры - это контрагенты, сотрудники, банки, валюты и т.д.
|
||||
Каждый элемент соответствует отдельной сущности.
|
||||
|
||||
Критерий "однородности" не всегда очевиден:
|
||||
* контрагенты делятся по видам на юридических и физических лиц, продавцов и покупателей;
|
||||
* сотрудники - на работающих по трудовому договору и по договору гражданско-правового характера.
|
||||
|
||||
Помочь с выбором могут ответы на вопросы:
|
||||
|
||||
* Может ли сущность принадлежать сразу к двум видам?
|
||||
* Контрагент может быть и продавцом, и покупателем.
|
||||
* А вот юридическим и физическим лицом быть одновременно нельзя.
|
||||
|
||||
* Может ли сущность изменить вид?
|
||||
* Сотрудник по ГПХ может заключить с нами трудовой договор, с т.з. управленческого учета оставшись той же самой сущностью.
|
||||
* Индивидуальный предприниматель может создать юрлицо, но в гражданско-правовых отношениях никакой преемственности не будет.
|
||||
|
||||
* Насколько различен состав реквизитов?
|
||||
* Юрлица и физлица имеют ИНН и ОГРН, но даже у них различается длина.
|
||||
* Отчасти совпадает контактная информация - но, например, юридического адреса у физлиц нет.
|
||||
|
||||
* Как сделано в других решениях?
|
||||
* Если у всех Контрагенты, а у вас ЮридическиеЛица и ФизическиеЛица, это вызывает удивление и затрудняет интеграцию.
|
||||
|
||||
## Код
|
||||
|
||||
По умолчанию у справочников есть наименование и код.
|
||||
Код нужен, чтобы различить элементы с совпадающими наименованиями и иногда заимствуется из предметной области, где решает ту же задачу (артикул, инвентарный номер, табельный номер, БИК и т.д.).
|
||||
Это техногенное решение, и в современных программах коды чаще скрывают от обычных пользователей, показывая им другие данные.
|
||||
Например, сотрудников можно отличить по дате рождения, должности или подразделению.
|
||||
Код бывает числовым или строковым.
|
||||
Платформа может сама назначать коды, обеспечивая их уникальность в одной ИБ.
|
||||
Но при загрузке данных из других программ или из других узлов той же распределенной базы уникальность можно обеспечить, лишь добавляя префикс, соответствующий месту создания.
|
||||
Поэтому лучше использовать строковые коды.
|
||||
|
||||
Префиксы можно назначать, переопределив обработчик события ПриУстановкеНовогоКода:
|
||||
|
||||
Процедура ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс)
|
||||
СтандартнаяОбработка = Ложь;
|
||||
Префикс = НумерацияПовтИсп.Префикс();
|
||||
КонецПроцедуры
|
||||
|
||||
В реальных программах требуется назначать префиксы почти всем справочникам.
|
||||
Лучше сделать это через подписку.
|
||||
Для этого в общем серверном модуле создается процедура:
|
||||
|
||||
Процедура СправочникиПриУстановкеНовогоКода(Источник, СтандартнаяОбработка, Префикс) Экспорт
|
||||
СтандартнаяОбработка = Ложь;
|
||||
Префикс = НумерацияПовтИсп.Префикс();
|
||||
КонецПроцедуры
|
||||
|
||||
А в подветке "Подписки на события" ветки "Общие" создается подписка на событие ПриУстановкеНовогоКода с этим обработчиком.
|
||||
|
||||
Чтобы отказаться от кода совсем, установите его длину в 0 и исключите из полей ввода по строке.
|
||||
|
||||
## Наименование и представление
|
||||
|
||||
Наименование - это строка длиной до 150 знаков, которая служит представлением элемента для пользователя по умолчанию.
|
||||
Некоторые служебные справочники могут не иметь наименования вовсе.
|
||||
В этом случае установите длину в 0 и исключите из полей ввода по строке.
|
||||
Часто наименования недостаточно для различения, и нужны дополнительные сведения.
|
||||
Например, контрагентов с одинаковым наименованием можно различить по ИНН.
|
||||
В этом случае переопределяются обработчики событий модуля менеджера.
|
||||
|
||||
// Определим поля, необходимые для получения представления.
|
||||
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
|
||||
СтандартнаяОбработка = Ложь;
|
||||
Поля.Добавить("Наименование");
|
||||
Поля.Добавить("ИНН");
|
||||
КонецПроцедуры
|
||||
|
||||
// Соберем представление по полям.
|
||||
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
|
||||
СтандартнаяОбработка = Ложь;
|
||||
Представление = СтрШаблон("%1 (ИНН: %2)",
|
||||
Данные.Наименование,
|
||||
Данные.ИНН);
|
||||
КонецПроцедуры
|
||||
|
||||
## Ввод по строке
|
||||
|
||||
Платформа может автоматически искать элементы справочников при подборе в полях ввода.
|
||||
Состав полей и способ этого поиска определяются на закладке "Поле ввода":
|
||||
|
||||
Чтобы обеспечить более интересное поведение, переопределяют обработчик события ОбработкаПолученияДанныхВыбора.
|
||||
В нем можно:
|
||||
* Вообще отказаться от стандартной обработки, заполнив параметр ДанныеВыбора самостоятельно.
|
||||
* Уточнить ПараметрыВыбора, например, наложив дополнительный отбор:
|
||||
|
||||
// Исключим недействительных сотрудников.
|
||||
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
|
||||
Параметры.Отбор.Вставить("Недействителен", Ложь);
|
||||
КонецПроцедуры
|
||||
|
||||
## Реквизиты
|
||||
|
||||
В режиме Конфигуратора можно добавлять в справочник реквизиты типов, которые могут быть сохранены в ИБ.
|
||||
Есть нюансы:
|
||||
* Имя реквизита не должно пересекаться с именем стандартного реквизита, т.е. нельзя добавить свой Код или Наименование.
|
||||
* Нежелательно смешивать в одном реквизите примитивные и ссылочные типы, это замедляет работу.
|
||||
* Строки неограниченной длины следует использовать с осторожностью: это может вдвое увеличить обмен с диском.
|
||||
* Вместо типа ЛюбаяСсылка лучше использовать определяемый тип, чтобы избежать реструктуризации при удалении объектов метаданных.
|
||||
|
||||
## Табличные части
|
||||
|
||||
Зачастую сущности предметной области характеризуются набором однородных атрибутов.
|
||||
Например, у сотрудника может быть несколько образований, у контрагента - множество адресов и телефонов.
|
||||
В таких случаях создают табличные части.
|
||||
Это просто таблица с именем и одним или несколькими собственными реквизитами:
|
||||
Реквизиты не могут называться Ссылка (это сам элемент-владелец ТЧ) и НомерСтроки.
|
||||
В остальном рекомендации такие же, как и для обычных реквизитов.
|
||||
|
||||
## Индексация
|
||||
|
||||
Проектируя справочник, стоит сразу подумать, по каким реквизитам пользователи и программный код будут выполнять поиск и отбор.
|
||||
Например, контрагентов, вероятно, станут искать по ИНН, расчетные счета - по номеру и т.д.
|
||||
Чтобы ускорить поиск, реквизиту ставят признак "Индексировать".
|
||||
Это заставляет СУБД поддерживать дополнительную структуру данных, индекс, ускоряющую поиск.
|
||||
Ее приходится обновлять при записи данных, поэтому не включайте индексирование без необходимости.
|
||||
Код и наименование проиндексированы и так.
|
||||
|
||||
## Удаление
|
||||
|
||||
Справочники, как и другие ссылочные объекты, можно удалять непосредственно.
|
||||
Эта возможность регулируется правом "Интерактивное удаление".
|
||||
Но обычно делают по-другому:
|
||||
1. Ненужные элементы помечаются на удаление.
|
||||
Для программиста это выглядит как установка в Истина стандартного булевского реквизита ПометкаУдаления.
|
||||
2. Время от времени вызывается стандартная функция "Удаление помеченных объектов".
|
||||
Она проверяет, есть ли ссылки на помеченные элементы в других данных.
|
||||
Если ссылок нет - удаляет.
|
||||
Это позволяет поддерживать т.н. ссылочную целостность, когда любая ссылка в ИБ ведет к существующему в ней объекту.
|
||||
Право "Интерактивное удаление" обычно отнимают даже у пользователей с полными правами.
|
||||
|
||||
## Предопределенные элементы
|
||||
|
||||
Среди элементов справочника бывают особенные, выделенные, к которым нужно обращаться в коде.
|
||||
Например, среди произвольных видов контактной информации может быть юридический адрес, который программа будет выводить в счета-фактуры, и email, который она подставит автоматически при создании письма контрагенту.
|
||||
Такие элементы можно сразу создать в Конфигураторе в списке предопределенных:
|
||||
|
||||
Если включено автоматическое обновление предопределенных данных, платформа сама создаст эти элементы при обновлении конфигурации БД. Обратите внимание, что в режиме Конфигуратора можно задать только коды и наименования предопределенных элементов. Остальные реквизиты придется заполнить пользователю - или, что лучше, программе при обновлении на версию, в которой они появились.
|
||||
|
||||
К предопределенным элементам можно обращаться в коде просто по имени.
|
||||
На сервере - через менеджер:
|
||||
Если КИ.Вид = Справочники.ВидыКонтактнойИнформации.EMail Тогда
|
||||
На клиенте - через функцию:
|
||||
Если КИ.Вид = ПредопределенноеЗначение("Справочник.ВидыКонтактнойИнформации.EMail")
|
||||
|
||||
Предопределенные элементы отличаются от обычных значениями стандартных реквизитов Предопределенный (Истина) и ИмяПредопределенныхДанных (заполнено).
|
Loading…
Reference in New Issue
Block a user