From 5b103c2cf71c94c9280b6d0b5925f63ec9e6ca89 Mon Sep 17 00:00:00 2001 From: Stanislav Wilf <55529555+staswilf@users.noreply.github.com> Date: Mon, 11 May 2020 13:27:39 +0300 Subject: [PATCH] Delete abstract-4-1.md --- abstract-4-1.md | 154 ------------------------------------------------ 1 file changed, 154 deletions(-) delete mode 100644 abstract-4-1.md diff --git a/abstract-4-1.md b/abstract-4-1.md deleted file mode 100644 index bc63d72..0000000 --- a/abstract-4-1.md +++ /dev/null @@ -1,154 +0,0 @@ -# Конспект лекции "Справочники" - -## Что такое "Справочник"? - -Справочник - это объект метаданных, предназначенный для хранения сведений об однородных сущностях предметной области. -Типичные примеры - это контрагенты, сотрудники, банки, валюты и т.д. -Каждый элемент соответствует отдельной сущности. - -Критерий "однородности" не всегда очевиден: -* контрагенты делятся по видам на юридических и физических лиц, продавцов и покупателей; -* сотрудники - на работающих по трудовому договору и по договору гражданско-правового характера. - -Помочь с выбором могут ответы на вопросы: - -* Может ли сущность принадлежать сразу к двум видам? - * Контрагент может быть и продавцом, и покупателем. - * А вот юридическим и физическим лицом быть одновременно нельзя. - -* Может ли сущность изменить вид? - * Сотрудник по ГПХ может заключить с нами трудовой договор, с т.з. управленческого учета оставшись той же самой сущностью. - * Индивидуальный предприниматель может создать юрлицо, но в гражданско-правовых отношениях никакой преемственности не будет. - -* Насколько различен состав реквизитов? - * Юрлица и физлица имеют ИНН и ОГРН, но даже у них различается длина. - * Отчасти совпадает контактная информация - но, например, юридического адреса у физлиц нет. - -* Как сделано в других решениях? - * Если у всех Контрагенты, а у вас ЮридическиеЛица и ФизическиеЛица, это вызывает удивление и затрудняет интеграцию. - -## Код - -По умолчанию у справочников есть наименование и код. -Код нужен, чтобы различить элементы с совпадающими наименованиями и иногда заимствуется из предметной области, где решает ту же задачу (артикул, инвентарный номер, табельный номер, БИК и т.д.). -Это техногенное решение, и в современных программах коды чаще скрывают от обычных пользователей, показывая им другие данные. -Например, сотрудников можно отличить по дате рождения, должности или подразделению. -Код бывает числовым или строковым. -Платформа может сама назначать коды, обеспечивая их уникальность в одной ИБ. -Но при загрузке данных из других программ или из других узлов той же распределенной базы уникальность можно обеспечить, лишь добавляя префикс, соответствующий месту создания. -Поэтому лучше использовать строковые коды. - -Префиксы можно назначать, переопределив обработчик события ПриУстановкеНовогоКода: - -Процедура ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс) - СтандартнаяОбработка = Ложь; - Префикс = НумерацияПовтИсп.Префикс(); -КонецПроцедуры - -В реальных программах требуется назначать префиксы почти всем справочникам. -Лучше сделать это через подписку. -Для этого в общем серверном модуле создается процедура: - -Процедура СправочникиПриУстановкеНовогоКода(Источник, СтандартнаяОбработка, Префикс) Экспорт - СтандартнаяОбработка = Ложь; - Префикс = НумерацияПовтИсп.Префикс(); -КонецПроцедуры - -А в подветке "Подписки на события" ветки "Общие" создается подписка на событие ПриУстановкеНовогоКода с этим обработчиком. - -Чтобы отказаться от кода совсем, установите его длину в 0 и исключите из полей ввода по строке. - -## Наименование и представление - -Наименование - это строка длиной до 150 знаков, которая служит представлением элемента для пользователя по умолчанию. -Некоторые служебные справочники могут не иметь наименования вовсе. -В этом случае установите длину в 0 и исключите из полей ввода по строке. -Часто наименования недостаточно для различения, и нужны дополнительные сведения. -Например, контрагентов с одинаковым наименованием можно различить по ИНН. -В этом случае переопределяются обработчики событий модуля менеджера. - -// Определим поля, необходимые для получения представления. -Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка) - СтандартнаяОбработка = Ложь; - Поля.Добавить("Наименование"); - Поля.Добавить("ИНН"); -КонецПроцедуры - -// Соберем представление по полям. -Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) - СтандартнаяОбработка = Ложь; - Представление = СтрШаблон("%1 (ИНН: %2)", - Данные.Наименование, - Данные.ИНН); -КонецПроцедуры - -## Ввод по строке - -Платформа может автоматически искать элементы справочников при подборе в полях ввода. -Состав полей и способ этого поиска определяются на закладке "Поле ввода": - -Чтобы обеспечить более интересное поведение, переопределяют обработчик события ОбработкаПолученияДанныхВыбора. -В нем можно: -* Вообще отказаться от стандартной обработки, заполнив параметр ДанныеВыбора самостоятельно. -* Уточнить ПараметрыВыбора, например, наложив дополнительный отбор: - -// Исключим недействительных сотрудников. -Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка) - Параметры.Отбор.Вставить("Недействителен", Ложь); -КонецПроцедуры - -## Реквизиты - -В режиме Конфигуратора можно добавлять в справочник реквизиты типов, которые могут быть сохранены в ИБ. -Есть нюансы: -* Имя реквизита не должно пересекаться с именем стандартного реквизита, т.е. нельзя добавить свой Код или Наименование. -* Нежелательно смешивать в одном реквизите примитивные и ссылочные типы, это замедляет работу. -* Строки неограниченной длины следует использовать с осторожностью: это может вдвое увеличить обмен с диском. -* Вместо типа ЛюбаяСсылка лучше использовать определяемый тип, чтобы избежать реструктуризации при удалении объектов метаданных. - -## Табличные части - -Зачастую сущности предметной области характеризуются набором однородных атрибутов. -Например, у сотрудника может быть несколько образований, у контрагента - множество адресов и телефонов. -В таких случаях создают табличные части. -Это просто таблица с именем и одним или несколькими собственными реквизитами: -Реквизиты не могут называться Ссылка (это сам элемент-владелец ТЧ) и НомерСтроки. -В остальном рекомендации такие же, как и для обычных реквизитов. - -## Индексация - -Проектируя справочник, стоит сразу подумать, по каким реквизитам пользователи и программный код будут выполнять поиск и отбор. -Например, контрагентов, вероятно, станут искать по ИНН, расчетные счета - по номеру и т.д. -Чтобы ускорить поиск, реквизиту ставят признак "Индексировать". -Это заставляет СУБД поддерживать дополнительную структуру данных, индекс, ускоряющую поиск. -Ее приходится обновлять при записи данных, поэтому не включайте индексирование без необходимости. -Код и наименование проиндексированы и так. - -## Удаление - -Справочники, как и другие ссылочные объекты, можно удалять непосредственно. -Эта возможность регулируется правом "Интерактивное удаление". -Но обычно делают по-другому: -1. Ненужные элементы помечаются на удаление. -Для программиста это выглядит как установка в Истина стандартного булевского реквизита ПометкаУдаления. -2. Время от времени вызывается стандартная функция "Удаление помеченных объектов". -Она проверяет, есть ли ссылки на помеченные элементы в других данных. -Если ссылок нет - удаляет. -Это позволяет поддерживать т.н. ссылочную целостность, когда любая ссылка в ИБ ведет к существующему в ней объекту. -Право "Интерактивное удаление" обычно отнимают даже у пользователей с полными правами. - -## Предопределенные элементы - -Среди элементов справочника бывают особенные, выделенные, к которым нужно обращаться в коде. -Например, среди произвольных видов контактной информации может быть юридический адрес, который программа будет выводить в счета-фактуры, и email, который она подставит автоматически при создании письма контрагенту. -Такие элементы можно сразу создать в Конфигураторе в списке предопределенных: - -Если включено автоматическое обновление предопределенных данных, платформа сама создаст эти элементы при обновлении конфигурации БД. Обратите внимание, что в режиме Конфигуратора можно задать только коды и наименования предопределенных элементов. Остальные реквизиты придется заполнить пользователю - или, что лучше, программе при обновлении на версию, в которой они появились. - -К предопределенным элементам можно обращаться в коде просто по имени. -На сервере - через менеджер: -Если КИ.Вид = Справочники.ВидыКонтактнойИнформации.EMail Тогда -На клиенте - через функцию: -Если КИ.Вид = ПредопределенноеЗначение("Справочник.ВидыКонтактнойИнформации.EMail") - -Предопределенные элементы отличаются от обычных значениями стандартных реквизитов Предопределенный (Истина) и ИмяПредопределенныхДанных (заполнено).