Введение
Описание в дополнение к ранее опубликованной статье Пример создания документа с движениями в ERP 2.5.7. Пример создавал на базе ERP 2.5.7, но не затрагивая какие-либо объекты ERP, в этот раз пример без использования расширения.
В данном примере дано описание, как добавить произвольный справочник к подсистемам:
- Версионирование
- Запрет редактирования реквизитов
- Дополнительные реквизиты и сведения
- Присоединенные файлы
- Подключаемые отчеты и обработки
Всё, что я написал, описано в документации к БСП, но тут живой пример, без лишней информации.
Встраивание справочника в подсистемы
Добавляем условный справочник с именем "Статья_НовыйСправочник".
Состав реквизитов простой, например поля Организация, Дата и Номер.
В соответствии с ранее указанной статьей, можно этот справочник включить в подсистему префиксации, а также не забудьте добавлять роли с RLS, если у вас в реквизитах присутствуют поля, по которым настраиваются ограничения в текущей системе.
Подсистема "Версионирование"
Включаем СправочникСсылка.Статья_НовыйСправочник в определяемый тип "ВерсионируемыеДанные" и СправочникОбъект.Статья_НовыйСправочник в определяемый тип "ВерсионируемыеДанныеОбъект"
В модуле менеджера определяем процедуру
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт
КонецПроцедуры
В форме объекта и форме списка в событии "ПриСозданииНаСервере" добавляем вызов
ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект);
Подсистема "Запрет редактирования реквизитов"
Ищем в конфигурации форму "РазблокированиеРеквизитов" и копируем её в новый справочник.
В модуль менеджера справочника вносим функцию, в которой описываются реквизиты для блокирования
Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт
Результат = Новый Массив;
Результат.Добавить("Дата");
Результат.Добавить("Номер");
Результат.Добавить("Код");
Результат.Добавить("Организация");
Результат.Добавить("Наименование");
Возврат Результат;
КонецФункции
В общий модуль "ЗапретРедактированияРеквизитовОбъектовПереопределяемый" в процедуру "ПриОпределенииОбъектовСЗаблокированнымиРеквизитами" вносим наш справочник
Объекты.Вставить(Метаданные.Справочники.Статья_НовыйСправочник.ПолноеИмя(), "ПолучитьБлокируемыеРеквизитыОбъекта");
Добавляем реквизит формы "ДоступностьРеквизитов" с типом Булево.
В форму справочника в событие "ПриСозданииНаСервере" вносим вызов
ЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты(ЭтаФорма);
А также в событие "ПослеЗаписиНаСервере"
ЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты(ЭтаФорма);
Подсистема "Дополнительные реквизиты и сведения"
Скопируем в наш справочник табличную часть "ДополнительныеРеквизиты" с любого другого объекта.
Для того, чтобы со справочником и его доп. реквизитами корректно работали отчеты и динамические списки, пропишем в характеристиках справочника необходимые данные:
Виды характеристик | Значения характеристик | |||||
---|---|---|---|---|---|---|
Поле ключа | Поле отбора видов | Значение отбора видов | Поле пути к данным | Поле объекта | Поле вида | Поле значения |
Справочник.НаборыДополнительныхРеквизитовИСведений.ТабличнаяЧасть.ДополнительныеРеквизиты | Справочник.Статья_НовыйСправочник.ТабличнаяЧасть.ДополнительныеРеквизиты | |||||
Свойство | Ссылка | Справочник_Статья_НовыйСправочник | Ссылка | Свойство | Значение | |
Справочник.НаборыДополнительныхРеквизитовИСведений.ТабличнаяЧасть.ДополнительныеРеквизиты | РегистрСведений.ДополнительныеСведения | |||||
Свойство | Ссылка | Справочник_Статья_НовыйСправочник | Объект | Свойство | Значение |
Для подсистемы нужны две подписки на события ОбработкаПроверкиЗаполнения и ПередУдалением. В типовых конфигурациях они уже существуют (ДополнительныеРеквизитыОбработкаПроверкиЗаполнения и СвойстваПередУдалениемСсылочногоОбъекта соответственно), где определен СправочникОбъект. Поэтому необходимости создавать новые нет.
Расширим тип определяемого типа "ВладелецДополнительныхСведений" нашим справочником (СправочникСсылка.Статья_НовыйСправочник).
Необходимо в справочник "НаборыДополнительныхРеквизитовИСведений" добавить новый предопределенный элемент
Имя | Справочник_Статья_НовыйСправочник |
Наименование | Справочник "Новый справочник для статьи" |
и любым способом вызвать служебные процедуры для обновления и заполнения справочника (например через обработку, или повысить версию конфигурации или запустить с ключем "/c ЗапуститьОбновлениеИнформационнойБазы").
УправлениеСвойствамиСлужебный.СоздатьПредопределенныеНаборыСвойств();
УправлениеСвойствамиСлужебный.УстановитьЗначениеПризнакаИспользуется();
Остается только в форму справочника добавить вызовы функционала подсистемы
В событие "ПриСозданииНаСервере"
УправлениеСвойствами.ПриСозданииНаСервере(ЭтаФорма);
В событие "ПриЧтенииНаСервере"
УправлениеСвойствами.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
В событие "ПередЗаписьюНаСервере"
УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтаФорма, ТекущийОбъект);
В событие "ПриОткрытии"
УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
В событие "ОбработкаОповещения"
Если УправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтотОбъект, ИмяСобытия, Параметр) Тогда
ОбновитьЭлементыДополнительныхРеквизитов();
УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
И добавить служебные процедуры
&НаКлиенте
Процедура ОбновитьЗависимостиДополнительныхРеквизитов()
УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент)
УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()
УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтаФорма);
КонецПроцедуры
Не забываем в форме списка в список полей добавлять Ссылку, со снятой галкой пользовательской видимости. Тогда можно будет через изменение формы выводить в список как реквизиты справочника, так и добавленные дополнительные реквизиты.
Подсистема "Присоединенные файлы"
Для работы этой системы нам в первую очередь нужно создать новый справочник "Статья_НовыйСправочникПрисоединенныеФайлы". Функционал подсистемы будет искать справочник с именем "Имя справочника владельца" + "ПрисоединенныеФайлы".
В качестве шаблона для справочника скопируйте любой из существующих с постфиксом "ПрисоединенныеФайлы" и измените тип реквизита ВладелецФайла на свой справочник. В моем случае это будет "СправочникСсылка.Статья_НовыйСправочник".
Если вы создаете свой справочник, то как правило префикс будет совпадать и никаких сложностей нет. Но если вы хотите подключить присоединенные файлы к уже существующему типовому объекту и при этом для нового справочника необходимо ввести префикс, то необходимо дополнительно скорректировать в общем модуле процедуру РаботаСФайламиПереопределяемый.ПриОпределенииСправочниковХраненияФайлов
Например, мы добавляем присоединенные файлы к типовому документу "ЧекККМ", а префикс для добавляемых объектов у нас "Статья_", тогда в этом случае нам нужно прописать следующий код:
Если ТипВладелецФайла = Тип("ДокументСсылка.ЧекККМ") Тогда
ИменаСправочников.Вставить("Статья_ЧекККМПрисоединенныеФайлы", Истина);
КонецЕсли;
Далее необходимо в определяемые типы "ВладелецПрисоединенныхФайлов", "ПрисоединенныйФайл" добавить тип СправочникСсылка на справочник "Статья_НовыйСправочник" и в определяемый тип "ПрисоединенныйФайлОбъект" добавить тип СправочникОбъект.Статья_НовыйСправочник.
Для контроля удаления справочника и подчиненных файлом создадим подписку или отредактируем существующую (УстановитьПометкуУдаленияПрисоединенныхФайлов)
Имя | Статья_УстановитьПометкуУдаленияПрисоединенныхФайлов |
Источник | СправочникОбъект.Статья_НовыйСправочник |
Событие | ПередЗаписью |
Обработчик | РаботаСФайлами.УстановитьПометкуУдаленияПрисоединенныхФайлов |
И остается только доработать форму справочника.
1. Добавить реквизит формы "ПараметрыРаботыСФайлами" с типом Произвольный.
2. Добавить вызовы функционала подсистемы из событий формы.
В событие "ПриСозданииНаСервере"
ПараметрыГиперссылки = РаботаСФайлами.ГиперссылкаФайлов();
ПараметрыГиперссылки.Размещение = "КоманднаяПанель";
РаботаСФайлами.ПриСозданииНаСервере(ЭтотОбъект, ПараметрыГиперссылки);
В событие "ПриОткрытии"
РаботаСФайламиКлиент.ПриОткрытии(ЭтотОбъект, Отказ);
В событие "ОбработкаОповещения"
РаботаСФайламиКлиент.ОбработкаОповещения(ЭтотОбъект, ИмяСобытия);
А также служебные команды
&НаКлиенте
Процедура Подключаемый_КомандаПанелиПрисоединенныхФайлов(Команда)
РаботаСФайламиКлиент.КомандаУправленияПрисоединеннымиФайлами(ЭтотОбъект, Команда);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
РаботаСФайламиКлиент.ПолеПредпросмотраПроверкаПеретаскивания(ЭтотОбъект, Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
РаботаСФайламиКлиент.ПолеПредпросмотраПеретаскивание(ЭтотОбъект, Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраНажатие(Элемент, СтандартнаяОбработка)
РаботаСФайламиКлиент.ПолеПредпросмотраНажатие(ЭтотОбъект, Элемент, СтандартнаяОбработка);
КонецПроцедуры
Подсистема "Подключаемые отчеты и обработки" (Подключаемые команды)
Для работы этой подсистемы, необходимо прописать функционал подключаемых команд.
В форме объекта добавляем реквизит формы "ПараметрыПодключаемыхКоманд" с типом Произвольный, а так же вызовы:
В событие "ПриСозданииНаСервере"
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
В событие "ПриЧтенииНаСервере"
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
В событие "ПриОткрытии"
ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
В событие "ПослеЗаписи"
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
МодульПодключаемыеКомандыКлиент.ПослеЗаписи(ЭтотОбъект, Объект, ПараметрыЗаписи);
КонецЕсли;
И служебные команды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) Экспорт
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Объект, Результат);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
Заключение
Эта статья - компиляция документации БСП (на самом деле, просто для примера реализовал данный пример в ERP 2.5.7, предварительно снятой с поддержки).
Т.к. меняются определяемые типы и предопределенные элементы, то это потребует внимательности при последующих обновлениях конфигурации.