v8: Интерфейсное решение для дополнительных реквизитов объектов в регистре сведенийИнтерфейсное решение для регистра сведений, который хранит дополнительные реквизиты одного или нескольких объектов (справочников). | | Автор статьи: Гений 1С Последняя редакция №1 от 30.01.07 URL: http://kb.mista.ru/article.php?id=460 | |
Ключевые слова: регистр сведений, реквизит, интерфейс
Иногда дополнительные реквизиты справочника хочется хранить не в справочнике, а в регистре сведений.
Например, если регистр сведений хранит общие реквизиты не одного вида справочников, а нескольких.
К примеру, можно организовать регистр сведений для хранения телефонов людей, подразделений, организаций и т.п.
В таком случае регистр обычно строится по схеме:
Измерения:
Объект - объект, к которому хранится значение реквизита. У измерения устанавливается признак "Ведущее", чтобы при удалении объекта удалялась и запись о нем в регистре сведений.
Реквизит - если хранится более одного реквизита объекта, здесь может храниться обозначение конкретного реквизита. Для быстродействия лучше использовать перечисление, чем строку.
Ресурс один - "Значение", в нем хранится значение реквизита объекта.
Обычно такие реквизиты редактируются в форме объекта (призываю кого-нибудь расписать как), к которому они принадлежат, но можно сделать и форму списка этих реквизитов.
Форму списка регистра сведений можно существенно изменить.
Например, сделать по одной закладке на каждый вид справочника, который может быть использован в измерении "Объект".
На каждой закладке разместить форму списка данного вида справочника, с типом "СправочникСписок.XXX".
Можно выводить эту форму в виде дерева или списка , в зависимости от того, справочник иерархический или нет.
В форму списка можно добавить несколько колонок, по одной на каждый реквизит и заполнять эти колонки в событии "ПриПолученииДанных" табличного поля.
Запрос=Новый Запрос();;
ЗапросТекст="";
Список=Новый СписокЗначений();
//Получаем список позиций, которые надо обновить
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
ТекущаяСтрока=ОформлениеСтроки.ДанныеСтроки;
Если ТекущаяСтрока=Неопределено Тогда
Продолжить;
КонецЕсли;
ТекЗн=ТекущаяСтрока.Ссылка;
Список.Добавить(ТекЗн);
КонецЦикла;
//Если есть строки для вывода
Если Список.Количество()=0 Тогда
Возврат;
КонецЕсли;
//Выполняем запрос по остаткам
Запрос.Текст="ВЫБРАТЬ
| Объект,
| Телефон,
| Размещение,
| ДопКонтакт,
| ДопКонтактТелефон
|ИЗ
| РегистрСведений.XXX КАК Контакты ГДЕ Объект В (&Список)";
Запрос.УстановитьПараметр("Список", Список);
Выборка=Запрос.Выполнить().Выбрать();
Поиск=Новый Структура();
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
ТекущаяСтрока=ОформлениеСтроки.ДанныеСтроки;
Если ТекущаяСтрока=Неопределено Тогда
Продолжить;
КонецЕсли;
ТекЗн=ТекущаяСтрока.Ссылка;
Выборка.Сбросить();
Поиск.Вставить("Объект",ТекЗн);
Если Выборка.НайтиСледующий(Поиск) Тогда
ОформлениеСтроки.Ячейки.Телефон.Текст=Выборка.Телефон;
ОформлениеСтроки.Ячейки.Телефон.ОтображатьТекст=истина;
ОформлениеСтроки.Ячейки.Размещение.Текст=Выборка.Размещение;
ОформлениеСтроки.Ячейки.Размещение.ОтображатьТекст=истина;
ОформлениеСтроки.Ячейки.ДопКонтакт.Текст=Выборка.ДопКонтакт;
ОформлениеСтроки.Ячейки.ДопКонтакт.ОтображатьТекст=истина;
ОформлениеСтроки.Ячейки.ДопКонтактТелефон.Текст=Выборка.ДопКонтактТелефон;
ОформлениеСтроки.Ячейки.ДопКонтактТелефон.ОтображатьТекст=истина;
КонецЕсли;
КонецЦикла;
При нажатии на кнопку редактирования (событие "ПередНачаломИзменения" табличного поля) должна открываться не форма справочника, а форма редактирования записи регистра сведений:
МЗ=РегистрыСведений.XXX.СоздатьМенеджерЗаписи();
ТекXXX=Элемент.ТекущаяСтрока;
МЗ.Объект=ТекXXX;
МЗ.Прочитать();
Если ЗначениеНеЗаполнено(МЗ.Объект) Тогда
МЗ.Подразделение=ТекXXX
КонецЕсли;
Ф=МЗ.ПолучитьФорму(,ЭтаФорма);
Ф.Открыть();
Отказ=истина;
Вот таким образом можно реализовать форму списка этого регистра сведений.
В форму записи желательно включить недоступный для изменения реквизит "Объект", а также небольшой код для обновления формы списка при закрытии формы записи:
Процедура ПриЗакрытии()
// Вставить содержимое обработчика.
Если ВладелецФормы<>Неопределено Тогда
ВладелецФормы.Обновить();
КонецЕсли;
КонецПроцедуры
|