Книга знаний

1С:Предприятие / v8 / Общие вопросы / Архитектура

v8: Интерфейсное решение для дополнительных реквизитов объектов в регистре сведений

Интерфейсное решение для регистра сведений, который хранит дополнительные реквизиты одного или нескольких объектов (справочников).Автор статьи: Гений 1С
Последняя редакция №1 от 30.01.07
URL: http://kb.mista.ru/article.php?id=460

Ключевые слова: регистр сведений, реквизит, интерфейс


Иногда дополнительные реквизиты справочника хочется хранить не в справочнике, а в регистре сведений.
Например, если регистр сведений хранит общие реквизиты не одного вида справочников, а нескольких.
К примеру, можно организовать регистр сведений для хранения телефонов людей, подразделений, организаций и т.п.

В таком случае регистр обычно строится по схеме:
Измерения:
Объект - объект, к которому хранится значение реквизита. У измерения устанавливается признак "Ведущее", чтобы при удалении объекта удалялась и запись о нем в регистре сведений.
Реквизит - если хранится более одного реквизита объекта, здесь может храниться обозначение конкретного реквизита. Для быстродействия лучше использовать перечисление, чем строку.

Ресурс один - "Значение", в нем хранится значение реквизита объекта.

Обычно такие реквизиты редактируются в форме объекта (призываю кого-нибудь расписать как), к которому они принадлежат, но можно сделать и форму списка этих реквизитов.

Форму списка регистра сведений можно существенно изменить.
Например, сделать по одной закладке на каждый вид справочника, который может быть использован в измерении "Объект".
На каждой закладке разместить форму списка данного вида справочника, с типом "СправочникСписок.XXX".
Можно выводить эту форму в виде дерева или списка , в зависимости от того, справочник иерархический или нет.

В форму списка можно добавить несколько колонок, по одной на каждый реквизит и заполнять эти колонки в событии "ПриПолученииДанных" табличного поля.
    Запрос=Новый Запрос();;
    ЗапросТекст="";
    Список=Новый СписокЗначений();
    //Получаем список позиций, которые надо обновить
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        ТекущаяСтрока=ОформлениеСтроки.ДанныеСтроки;
        Если ТекущаяСтрока=Неопределено Тогда
            Продолжить;
        КонецЕсли;
        ТекЗн=ТекущаяСтрока.Ссылка;
        Список.Добавить(ТекЗн);
    КонецЦикла;
    
    //Если есть строки для вывода
    Если Список.Количество()=0 Тогда
        Возврат;
    КонецЕсли;
    
    //Выполняем запрос по остаткам
    Запрос.Текст="ВЫБРАТЬ
                 |    Объект,
                 |    Телефон,
                 |    Размещение,
                 |    ДопКонтакт,
                 |    ДопКонтактТелефон
                 |ИЗ
                 |    РегистрСведений.XXX КАК Контакты ГДЕ Объект В (&Список)";
    Запрос.УстановитьПараметр("Список", Список);
    Выборка=Запрос.Выполнить().Выбрать();
        
    Поиск=Новый Структура();
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        ТекущаяСтрока=ОформлениеСтроки.ДанныеСтроки;
        Если ТекущаяСтрока=Неопределено Тогда
            Продолжить;
        КонецЕсли;
        ТекЗн=ТекущаяСтрока.Ссылка;
        Выборка.Сбросить();
        Поиск.Вставить("Объект",ТекЗн);
        Если Выборка.НайтиСледующий(Поиск) Тогда
            ОформлениеСтроки.Ячейки.Телефон.Текст=Выборка.Телефон;
            ОформлениеСтроки.Ячейки.Телефон.ОтображатьТекст=истина;
            ОформлениеСтроки.Ячейки.Размещение.Текст=Выборка.Размещение;
            ОформлениеСтроки.Ячейки.Размещение.ОтображатьТекст=истина;
            ОформлениеСтроки.Ячейки.ДопКонтакт.Текст=Выборка.ДопКонтакт;
            ОформлениеСтроки.Ячейки.ДопКонтакт.ОтображатьТекст=истина;
            ОформлениеСтроки.Ячейки.ДопКонтактТелефон.Текст=Выборка.ДопКонтактТелефон;
            ОформлениеСтроки.Ячейки.ДопКонтактТелефон.ОтображатьТекст=истина;
        КонецЕсли;
    КонецЦикла;



При нажатии на кнопку редактирования (событие "ПередНачаломИзменения" табличного поля) должна открываться не форма справочника, а форма редактирования записи регистра сведений:
    МЗ=РегистрыСведений.XXX.СоздатьМенеджерЗаписи();
    ТекXXX=Элемент.ТекущаяСтрока;
    МЗ.Объект=ТекXXX;
    МЗ.Прочитать();
    Если ЗначениеНеЗаполнено(МЗ.Объект) Тогда
        МЗ.Подразделение=ТекXXX
    КонецЕсли;
    Ф=МЗ.ПолучитьФорму(,ЭтаФорма);
    Ф.Открыть();
    Отказ=истина;


Вот таким образом можно реализовать форму списка этого регистра сведений.

В форму записи желательно включить недоступный для изменения реквизит "Объект", а также небольшой код для обновления формы списка при закрытии формы записи:

Процедура ПриЗакрытии()
    // Вставить содержимое обработчика.
    Если ВладелецФормы<>Неопределено Тогда
        ВладелецФормы.Обновить();
    КонецЕсли;
КонецПроцедуры



Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика