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