Как реализовать нефиксированное число измерений и ресурсов для объектов в 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет
← На главную

Мы сталкиваемся с распространенной задачей в разработке на платформе 1С: необходимо хранить и обрабатывать данные, структура которых не является строго фиксированной. Часто это проявляется в требовании добавлять или удалять "ресурсы" (фактически, дополнительные поля или атрибуты) для различных объектов системы, причем их количество и состав могут отличаться для каждого экземпляра основного объекта. Например, для одного "Измерения 1" могут быть Ресурс 1, Ресурс 2, Ресурс 3, а для "Измерения 2" — Ресурс 1, Ресурс 2, Ресурс 3, Ресурс 4, Ресурс 5. Как нам реализовать такую гибкую структуру данных, обеспечивая при этом удобство работы пользователя и возможность формирования отчетов?

Рассмотрим несколько основных подходов, которые предлагает платформа 1С для решения этой задачи.

Подход 1: Использование механизма "Дополнительные реквизиты и сведения" (План видов характеристик + Регистр сведений)

Этот подход является стандартным и наиболее гибким для решения задачи с нефиксированным набором атрибутов. Он основан на использовании двух ключевых объектов платформы: ПланВидовХарактеристик и РегистрСведений. Мы будем использовать этот механизм для хранения произвольных свойств (ресурсов) для наших "измерений".

Давайте разберем его по шагам.

  1. Создание Плана видов характеристик (ПВХ):

    Начнем с создания ПланаВидовХарактеристик, например, назовем его ВидыДополнительныхРеквизитов. Этот объект будет хранить определения наших "ресурсов". Каждый элемент этого справочника будет представлять собой один из возможных дополнительных реквизитов, который пользователь сможет добавить. Для каждого такого реквизита мы указываем его наименование и тип значения. Тип значения может быть любым: Строка, Число, Дата, Булево, ссылка на другой справочник и т.д. Если наши ресурсы могут иметь разные типы, мы можем использовать составной тип для реквизита "ТипЗначения" или даже тип Характеристика, который позволяет хранить ссылки на элементы этого же ПВХ (это более продвинутый сценарий).

    Обычно в ПВХ мы создаем один или несколько предопределенных элементов, которые будут служить для классификации наших характеристик (например, "Измерения" и "Ресурсы").

  2. Создание Регистр сведений для хранения значений:

    Далее мы создаем РегистрСведений, например, ЗначенияДополнительныхРеквизитов. Этот регистр будет хранить фактические значения наших динамических ресурсов.

    Структура регистра будет следующей:

    • Измерение: Объект (тип - Характеристика, ссылающийся на наш основной справочник, который является "Измерением" в терминологии заказчика). Если Измерение однотипное, то это может быть просто ссылка на соответствующий справочник, например, СсылкаНаИзмерение (тип: СправочникСсылка.МойСправочникИзмерений).

    • Измерение: Свойство (тип - ПланВидовХарактеристикСсылка.ВидыДополнительныхРеквизитов). Это измерение будет хранить ссылку на элемент нашего ПВХ, который определяет, какой именно ресурс мы храним (например, "Ресурс 1", "Ресурс 2" и т.д.).

    • Ресурс: Значение (тип - Характеристика, ссылающийся на наш ПВХ.ВидыДополнительныхРеквизитов). Этот ресурс будет хранить фактическое значение нашего дополнительного реквизита. Использование типа Характеристика здесь критически важно, так как оно позволяет хранить значения разных типов (числа, строки, даты, ссылки) в одном ресурсе регистра, платформа автоматически "разруливает" это на уровне базы данных.

    Пример структуры регистра:

    
    РегистрСведений.ЗначенияДополнительныхРеквизитов
    Измерения:
        Объект           (Тип: СправочникСсылка.МоиИзмерения)
        Свойство         (Тип: ПланВидовХарактеристикСсылка.ВидыДополнительныхРеквизитов)
    Ресурсы:
        Значение         (Тип: Характеристика.ВидыДополнительныхРеквизитов)
    

    Таким образом, для каждого элемента справочника "МоиИзмерения" (например, "Измерение 1") и для каждого его дополнительного ресурса (например, "Ресурс 1") будет отдельная запись в РегистреСведений.ЗначенияДополнительныхРеквизитов, связывающая объект, вид свойства и его значение.

  3. Реализация в пользовательском интерфейсе:

    Для добавления и удаления ресурсов мы можем создать на форме элемента справочника "МоиИзмерения" табличную часть, которая будет отображать записи из нашего регистра. Пользователь сможет добавлять новые строки в эту табличную часть, выбирать из ПВХ нужный вид ресурса и вводить его значение. Важно настроить форму так, чтобы поле значения автоматически меняло свой тип в зависимости от выбранного вида ресурса.

    Например, при выборе ВидРеквизита с типом "Число", поле ЗначениеРеквизита на форме должно стать полем ввода числа.

  4. Отчетность:

    Основное преимущество этого подхода в том, что платформа 1С предоставляет мощные средства для работы с такими "характеристиками" в отчетах, особенно через СистемуКомпоновкиДанных (СКД). Мы можем легко выводить эти дополнительные реквизиты в отчетах как отдельные колонки. Для этого нам потребуется в запросе к регистру сведений развернуть характеристики. Это делается путем соединения нашего основного запроса с регистром характеристик и использования специальной функции или обхода записей. В СКД это часто можно настроить типовыми средствами, используя набор данных "Объект с характеристиками" или вручную в конструкторе запросов СКД.

    Пример запроса для получения значений характеристик:

    
    ВЫБРАТЬ
        МоиИзмерения.Ссылка,
        ЗначенияДополнительныхРеквизитов.Свойство,
        ЗначенияДополнительныхРеквизитов.Значение
    ИЗ
        Справочник.МоиИзмерения КАК МоиИзмерения
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияДополнительныхРеквизитов КАК ЗначенияДополнительныхРеквизитов
            ПО МоиИзмерения.Ссылка = ЗначенияДополнительныхРеквизитов.Объект
    

    Этот запрос извлекает все свойства для каждого измерения. Для вывода каждого свойства в отдельной колонке в отчете СКД, вам нужно будет использовать конструктор запросов или вручную задать виртуальную таблицу "Характеристики" в СКД.

Преимущества данного подхода:

Недостатки:

Подход 2: Использование Табличной части справочника

Если количество "измерений" (основных объектов, для которых нужны ресурсы) невелико, или если ресурсы всегда тесно связаны с конкретным "измерением" и не требуют глобального переиспользования как характеристики, можно рассмотреть вариант использования ТабличнойЧасти (ТЧ) самого справочника, который хранит наши "измерения".

Разберем, как это можно реализовать.

  1. Структура справочника:

    Создаем справочник, который будет хранить наши "измерения", например, Справочник.МоиИзмерения. В нем создаем табличную часть, например, РесурсыИзмерения.

    Эта табличная часть будет иметь следующую структуру:

    • Реквизит ТЧ: ВидРесурса (тип - Строка или СправочникСсылка.ВидыРесурсов). Если виды ресурсов могут быть предопределены или выбираться из списка, лучше создать отдельный вспомогательный справочник Справочник.ВидыРесурсов и ссылаться на него. Если же пользователь вводит наименование ресурса "от руки", то тип будет Строка.

    • Реквизит ТЧ: ЗначениеРесурса (тип - Характеристика). Аналогично подходу с регистром сведений, использование типа Характеристика здесь позволяет хранить значения различных типов (числа, строки, даты и т.п.) в одной колонке табличной части.

    Пример структуры:

    
    Справочник.МоиИзмерения
    Реквизиты:
        ... (стандартные реквизиты измерения)
    ТабличныеЧасти:
        РесурсыИзмерения
            Реквизиты:
                ВидРесурса         (Тип: Строка или СправочникСсылка.ВидыРесурсов)
                ЗначениеРесурса    (Тип: Характеристика.ВидыДополнительныхРеквизитов - если используем ПВХ для видов, или просто "Характеристика" если ПВХ для этого справочника)
    

    В этом случае, все ресурсы для конкретного "измерения" будут храниться непосредственно в табличной части этого элемента справочника.

  2. Реализация в пользовательском интерфейсе:

    На форме элемента справочника МоиИзмерения мы размещаем табличную часть РесурсыИзмерения. Пользователь сможет добавлять новые строки в эту табличную часть, заполняя ВидРесурса и ЗначениеРесурса. Для поля ЗначениеРесурса также можно настроить динамическое изменение типа в зависимости от выбранного ВидаРесурса, если мы используем вспомогательный справочник для видов ресурсов, или ПВХ.

    Заказчик также упомянул возможность представления в виде дерева. Это можно реализовать, если добавить в табличную часть реквизит Родитель (ссылка на текущую ТЧ) и настроить динамический список на форме элемента справочника с соответствующим видом дерева.

  3. Отчетность:

    Для построения отчетов по данным из табличной части справочника мы можем использовать запросы к табличной части. В запросах СКД табличная часть доступна как виртуальная таблица Справочник.МоиИзмерения.РесурсыИзмерения.

    Пример запроса:

    
    ВЫБРАТЬ
        МоиИзмерения.Ссылка КАК Измерение,
        МоиИзмеренияРесурсыИзмерения.ВидРесурса,
        МоиИзмеренияРесурсыИзмерения.ЗначениеРесурса
    ИЗ
        Справочник.МоиИзмерения.РесурсыИзмерения КАК МоиИзмеренияРесурсыИзмерения
            ЛЕВОЕ СОЕДИНЕНИЕ Справочник.МоиИзмерения КАК МоиИзмерения
            ПО МоиИзмеренияРесурсыИзмерения.Ссылка = МоиИзмерения.Ссылка
    

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

Преимущества данного подхода:

Недостатки:

Когда какой подход выбрать?

Выбор подхода сильно зависит от конкретных требований и масштаба задачи.

  1. "Дополнительные реквизиты и сведения" (ПВХ + Регистр сведений):

    • Рекомендуется, когда:

      • Необходима максимальная гибкость, позволяющая пользователям самостоятельно управлять набором ресурсов без участия разработчика.
      • Ожидается, что ресурсы будут применяться к различным типам объектов (справочникам, документам).
      • Важна унификация хранения характеристик по всей системе.
      • Требуются сложные отчеты с динамическим выводом характеристик в колонки.
    • Этот подход является наиболее универсальным и рекомендуемым для большинства случаев, где требуется динамическое изменение структуры данных.

  2. Табличная часть справочника:

    • Может быть использован, когда:

      • Задача локальна, и ресурсы привязаны только к одному конкретному справочнику.
      • Количество ресурсов для каждого элемента справочника не превышает разумных пределов (например, упомянутые 15 штук).
      • Требуется простое и интуитивно понятное редактирование всех ресурсов элемента на одной форме.
      • Нет планов по расширению функционала на другие объекты или требованию сложной отчетности по агрегированным характеристикам.
    • Этот подход проще в реализации для небольших и изолированных задач.

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

В вашем случае, с требованием "до 15 штук могут добавить. Но для каждого измерения 1,2,3 могут быть разное количество ресурсов" и необходимостью строить отчеты, механизм "Дополнительные реквизиты и сведения" с ПВХ и РегистромСведений является наиболее предпочтительным решением, так как он обеспечивает необходимую гибкость и хорошо поддерживается платформой для формирования отчетности. Табличная часть может быть использована как более простая альтернатива, но с оговорками по масштабируемости и сложности отчетности.

← На главную