1
0
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:
Stanislav Wilf 2020-05-11 13:26:09 +03:00 committed by GitHub
parent 35452ed40c
commit 8549dc8932
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

154
abstract-4-1.md Normal file
View File

@ -0,0 +1,154 @@
# Конспект лекции "Справочники"
## Что такое "Справочник"?
Справочник - это объект метаданных, предназначенный для хранения сведений об однородных сущностях предметной области.
Типичные примеры - это контрагенты, сотрудники, банки, валюты и т.д.
Каждый элемент соответствует отдельной сущности.
Критерий "однородности" не всегда очевиден:
* контрагенты делятся по видам на юридических и физических лиц, продавцов и покупателей;
* сотрудники - на работающих по трудовому договору и по договору гражданско-правового характера.
Помочь с выбором могут ответы на вопросы:
* Может ли сущность принадлежать сразу к двум видам?
* Контрагент может быть и продавцом, и покупателем.
* А вот юридическим и физическим лицом быть одновременно нельзя.
* Может ли сущность изменить вид?
* Сотрудник по ГПХ может заключить с нами трудовой договор, с т.з. управленческого учета оставшись той же самой сущностью.
* Индивидуальный предприниматель может создать юрлицо, но в гражданско-правовых отношениях никакой преемственности не будет.
* Насколько различен состав реквизитов?
* Юрлица и физлица имеют ИНН и ОГРН, но даже у них различается длина.
* Отчасти совпадает контактная информация - но, например, юридического адреса у физлиц нет.
* Как сделано в других решениях?
* Если у всех Контрагенты, а у вас ЮридическиеЛица и ФизическиеЛица, это вызывает удивление и затрудняет интеграцию.
## Код
По умолчанию у справочников есть наименование и код.
Код нужен, чтобы различить элементы с совпадающими наименованиями и иногда заимствуется из предметной области, где решает ту же задачу (артикул, инвентарный номер, табельный номер, БИК и т.д.).
Это техногенное решение, и в современных программах коды чаще скрывают от обычных пользователей, показывая им другие данные.
Например, сотрудников можно отличить по дате рождения, должности или подразделению.
Код бывает числовым или строковым.
Платформа может сама назначать коды, обеспечивая их уникальность в одной ИБ.
Но при загрузке данных из других программ или из других узлов той же распределенной базы уникальность можно обеспечить, лишь добавляя префикс, соответствующий месту создания.
Поэтому лучше использовать строковые коды.
Префиксы можно назначать, переопределив обработчик события ПриУстановкеНовогоКода:
Процедура ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс)
СтандартнаяОбработка = Ложь;
Префикс = НумерацияПовтИсп.Префикс();
КонецПроцедуры
В реальных программах требуется назначать префиксы почти всем справочникам.
Лучше сделать это через подписку.
Для этого в общем серверном модуле создается процедура:
Процедура СправочникиПриУстановкеНовогоКода(Источник, СтандартнаяОбработка, Префикс) Экспорт
СтандартнаяОбработка = Ложь;
Префикс = НумерацияПовтИсп.Префикс();
КонецПроцедуры
А в подветке "Подписки на события" ветки "Общие" создается подписка на событие ПриУстановкеНовогоКода с этим обработчиком.
Чтобы отказаться от кода совсем, установите его длину в 0 и исключите из полей ввода по строке.
## Наименование и представление
Наименование - это строка длиной до 150 знаков, которая служит представлением элемента для пользователя по умолчанию.
Некоторые служебные справочники могут не иметь наименования вовсе.
В этом случае установите длину в 0 и исключите из полей ввода по строке.
Часто наименования недостаточно для различения, и нужны дополнительные сведения.
Например, контрагентов с одинаковым наименованием можно различить по ИНН.
В этом случае переопределяются обработчики событий модуля менеджера.
// Определим поля, необходимые для получения представления.
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Поля.Добавить("Наименование");
Поля.Добавить("ИНН");
КонецПроцедуры
// Соберем представление по полям.
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Представление = СтрШаблон("%1 (ИНН: %2)",
Данные.Наименование,
Данные.ИНН);
КонецПроцедуры
## Ввод по строке
Платформа может автоматически искать элементы справочников при подборе в полях ввода.
Состав полей и способ этого поиска определяются на закладке "Поле ввода":
Чтобы обеспечить более интересное поведение, переопределяют обработчик события ОбработкаПолученияДанныхВыбора.
В нем можно:
* Вообще отказаться от стандартной обработки, заполнив параметр ДанныеВыбора самостоятельно.
* Уточнить ПараметрыВыбора, например, наложив дополнительный отбор:
// Исключим недействительных сотрудников.
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
Параметры.Отбор.Вставить("Недействителен", Ложь);
КонецПроцедуры
## Реквизиты
В режиме Конфигуратора можно добавлять в справочник реквизиты типов, которые могут быть сохранены в ИБ.
Есть нюансы:
* Имя реквизита не должно пересекаться с именем стандартного реквизита, т.е. нельзя добавить свой Код или Наименование.
* Нежелательно смешивать в одном реквизите примитивные и ссылочные типы, это замедляет работу.
* Строки неограниченной длины следует использовать с осторожностью: это может вдвое увеличить обмен с диском.
* Вместо типа ЛюбаяСсылка лучше использовать определяемый тип, чтобы избежать реструктуризации при удалении объектов метаданных.
## Табличные части
Зачастую сущности предметной области характеризуются набором однородных атрибутов.
Например, у сотрудника может быть несколько образований, у контрагента - множество адресов и телефонов.
В таких случаях создают табличные части.
Это просто таблица с именем и одним или несколькими собственными реквизитами:
Реквизиты не могут называться Ссылка (это сам элемент-владелец ТЧ) и НомерСтроки.
В остальном рекомендации такие же, как и для обычных реквизитов.
## Индексация
Проектируя справочник, стоит сразу подумать, по каким реквизитам пользователи и программный код будут выполнять поиск и отбор.
Например, контрагентов, вероятно, станут искать по ИНН, расчетные счета - по номеру и т.д.
Чтобы ускорить поиск, реквизиту ставят признак "Индексировать".
Это заставляет СУБД поддерживать дополнительную структуру данных, индекс, ускоряющую поиск.
Ее приходится обновлять при записи данных, поэтому не включайте индексирование без необходимости.
Код и наименование проиндексированы и так.
## Удаление
Справочники, как и другие ссылочные объекты, можно удалять непосредственно.
Эта возможность регулируется правом "Интерактивное удаление".
Но обычно делают по-другому:
1. Ненужные элементы помечаются на удаление.
Для программиста это выглядит как установка в Истина стандартного булевского реквизита ПометкаУдаления.
2. Время от времени вызывается стандартная функция "Удаление помеченных объектов".
Она проверяет, есть ли ссылки на помеченные элементы в других данных.
Если ссылок нет - удаляет.
Это позволяет поддерживать т.н. ссылочную целостность, когда любая ссылка в ИБ ведет к существующему в ней объекту.
Право "Интерактивное удаление" обычно отнимают даже у пользователей с полными правами.
## Предопределенные элементы
Среди элементов справочника бывают особенные, выделенные, к которым нужно обращаться в коде.
Например, среди произвольных видов контактной информации может быть юридический адрес, который программа будет выводить в счета-фактуры, и email, который она подставит автоматически при создании письма контрагенту.
Такие элементы можно сразу создать в Конфигураторе в списке предопределенных:
Если включено автоматическое обновление предопределенных данных, платформа сама создаст эти элементы при обновлении конфигурации БД. Обратите внимание, что в режиме Конфигуратора можно задать только коды и наименования предопределенных элементов. Остальные реквизиты придется заполнить пользователю - или, что лучше, программе при обновлении на версию, в которой они появились.
К предопределенным элементам можно обращаться в коде просто по имени.
На сервере - через менеджер:
Если КИ.Вид = Справочники.ВидыКонтактнойИнформации.EMail Тогда
На клиенте - через функцию:
Если КИ.Вид = ПредопределенноеЗначение("Справочник.ВидыКонтактнойИнформации.EMail")
Предопределенные элементы отличаются от обычных значениями стандартных реквизитов Предопределенный (Истина) и ИмяПредопределенныхДанных (заполнено).