Предположим, в табличной части документа есть реквизит, который допускает наличие нескольких значений одновременно. К примеру, в учебном плане вуза есть реквизит Компетенция, привязанный к реквизиту Дисциплина. Для компетенций в этом реквизите должно храниться несколько значений из справочника Компетенции. Один из способов реализации этого механизма состоит в том, чтобы определить составной тип данных для реквизита Компетенции (Строка, СправочникСсылка. Компетенции). В случае единственного значения в реквизите будет храниться элемент справочника Компетенции. В случае множественного значения – строка, содержащая представление списка компетенций. Для редактирования реквизита Компетенции можно использовать событие «Начало выбора», в котором открыть соответствующую форму выбора и сформировать представление списка компетенций. Кроме того, потребуется определить еще одну табличную часть Компетенции, в которой для строки с указанным ключом нужно создать строки для каждой компетенции. Далее при редактировании реквизита Компетенции нужно соответственно корректировать табличную часть Компетенции. Фактически мы вручную создаем реляционную модель данных и должны вручную выполнять операции выборки, соединения и модификации данных. Существенным минусом такого способа представления компетенций является неактуальность представления компетенций при изменении названия компетенции или удалении ее из справочника компетенций. |
||
В 1С помимо реляционной модели данных реализована реляционно-иерархическая модель данных, то есть модель, допускающая вид связи «один-ко-многим». Примером объекта, реализующего такую модель, является справочник с табличной частью. Можно создать справочник КомпетенцииДисциплин, подчиненный справочнику Дисциплины. Для справочника КомпетенцииДисциплин нужно еще определить реквизит Специальность, так как набор компетенций определяется специальностью и дисциплиной. При открытии формы элемента справочника нужно еще делать отбор в табличной части справочника по специальности, выбранной в учебном плане. Наименование справочника КомпетенцииДисциплин должно формироваться в событии «перед записью» из списка компетенций в табличной части. Изменение представления компетенций по дисциплине можно выполнить, например, с помощью подписки на события «при изменении компетенции». При этом нужно только изменить наименование элементов справочника, у которых в табличной части имеется данная компетенция. Для этого можно использовать соответствующий критерий отбора. В первом способе привести представления компетенций к актуальному виду сложнее, так как нужно анализировать все документы, в которых содержатся измененные компетенции, а их может быть очень много.
|
||
Итак, создадим справочники Дисциплины, Компетенции и КомпетенцииДисциплин, подчиненный справочнику Дисциплины. В справочнике КомпетенцииДисциплин добавим табличную часть Компетенции с единственным реквизитом Компетенция (СправочникСсылка.Компетенции). Для простоты специальность рассматривать не будем. Создадим также документ АУП с табличной частью Дисциплины. В табличной части добавим реквизиты Дисциплина и Компетенция. В связях параметров выбора для реквизита Компетенция укажем Отбор.Владелец(Дисциплины.Дисциплина). | ||
В форме элемента справочника КомпетенцииДисциплин можно определить событие «перед записью»:
|
||
&НаСервере
Процедура КомпетенцииПриИзмененииНаСервере() Представление = ""; Первая = Истина; Для Каждого ТекСтр Из Объект.Компетенции Цикл Если Не Первая Тогда Представление = Представление + ";" + ТекСтр.Компетенция; Иначе Представление = ТекСтр.Компетенция.Наименование; Первая = Ложь; КонецЕсли; КонецЦикла; Объект.Наименование = Представление; КонецПроцедуры
|
||
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) КомпетенцииПриИзмененииНаСервере();
КонецПроцедуры
|
||
В форме элемента справочника Компетенции определим событие «после записи на сервере» | ||
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | КомпетенцииДисциплинКомпетенции.Ссылка КАК Ссылка |ИЗ | Справочник.КомпетенцииДисциплин.Компетенции КАК КомпетенцииДисциплинКомпетенции |ГДЕ | КомпетенцииДисциплинКомпетенции.Компетенция = &Компетенция"; Запрос.УстановитьПараметр("Компетенция", ТекущийОбъект.Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ВыборкаОбъект = Выборка.Ссылка.ПолучитьОбъект(); Представление = ""; Первая = Истина; Для Каждого ТекСтр Из ВыборкаОбъект.Компетенции Цикл Если Не Первая Тогда Представление = Представление + ";" + ТекСтр.Компетенция; Иначе Представление = ТекСтр.Компетенция.Наименование; Первая = Ложь; КонецЕсли; КонецЦикла; ВыборкаОбъект.Наименование = Представление; ВыборкаОбъект.Записать(); КонецЦикла; КонецПроцедуры
|
||
Теперь наименование компетенций будет актуально как при изменении наименования самой компетенции, так и при изменении состава компетенций для дисциплины. А механизмы реализации стали проще и надежнее. Если есть вопросы по материалу - обращайтесь! |
||
Сергей Семенов,
|