Динамический состав реквизитов

14.12.12

Разработка - Механизмы платформы 1С

Решим не стандартную задачу. Нам необходимо добавить к документам некие реквизиты, которые появляются у объектов в зависимости от настроек (значений реквизитов документа).

Скачать файлы

Наименование Файл Версия Размер
Демонстрационная конфигурация
.cf 75,93Kb
40
.cf 40 Скачать бесплатно

Постановка задачи

Решим не стандартную задачу. Нам необходимо добавить к документам некие реквизиты, которые появляются у объектов в зависимости от настроек (значений реквизитов документа). 

Есть несколько способов решения:

  1. Добавить в каждый документ реквизит и управлять его видимостью и проверкой заполнения на форме.
  2. Создать общий реквизит для документов и также управлять видимостью и проверкой заполнения.
  3. Использовать динамический состав реквизитов объектов.

 

Рассмотрим последний вариант решения, поскольку он самый гибкий по возможностям, вплоть до того, что пользователи в режиме предприятия могут сами изменять состав реквизитов для документов. 

Используемые объекты

Нам понадобится несколько справочников, которые мы будем использовать в качестве типов для динамического состава реквизитов. Мной были созданы несколько справочников без какого-либо дополнительного функционала. Достаточно стандартных реквизитов. 

Далее создаем план видов характеристик (ПВХ), я назвал его "СоставРеквизитов". В свойствах объекта устанавливаем в тип значения характеристик составной тип, включающий все созданные нами справочники. Чтобы можно было настраивать порядок отображения реквизитов на форме, можно добавить в ПВХ реквизит "Порядок" с типом "Число".

 

 

Состав отображаемых реквизитов будет зависеть от двух параметров: "ВидДокумента" и "ТипДокумента" с типами соответственно "ПеречислениеСсылка.ВидДокумента" и "ПеречислениеСсылка.ТипДокумента". В документе эти параметры должны сохраняться, например, в реквизитах. 

Состав реквизитов настраивается в регистре сведений. В примере регистр называется "СоставРеквизитовДокументов" и состоит из трех измерений: "Вид", "Тип", "Реквизит". Тип измерения "Реквизит" - "ПланВидовХарактеристикСсылка.СоставРеквизитов". Структура регистра не позволит к одному документу привязать один реквизит несколько раз. Пример настройки состава реквизитов документа приведен ниже.

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

Измерения "Документ" и "Реквизит" позволяют привязать запись регистра к документу по определенному реквизиту. В ресурсе хранится значение для указанного в измерении реквизита. Тип значения, хранящийся в ресурсе - это характеристика ПВХ "Состав реквизитов". 

Для демонстрации примера создадим документ "ДокументПример" с реквизитами, хранящими вид и тип документа (о типе реквизитов см. выше). На форме документа добавим группу "ДинамическиеРеквизиты" с входящими в него группами формы "Лево" и "Право". Последнее необходимо, чтобы реквизиты на форме отображались в две колонки. 

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

Алгоритмы

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

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

Общий принцип работы заключается в получении состава реквизитов для текущего документа в зависимости от значений его реквизитов "ВидДокумента" и "ТипДокумента" из регистра сведений "СоставРеквизитовДокументов". Далее из регистра "ЗначенияРеквизитовДокументов" получаем значения для состава реквизитов, если они имеются. 

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

В события формы "ПриЗаписиНаСервере" запускается процедура общего модуля "ЗаписатьЗначенияДинамическихРеквизитов", где производится запись в регистр сведений "ЗначенияРеквизитовДокументов" по данным таблицы значений добавленных реквизитов и значений в созданных реквизитах формы. 

При создании формы документа вызывается процедура общего модуля "ИнициализироватьДинамическиеРеквизитыНаФорме", которая создает реквизиты и элементы формы, а также производит их заполнение сохраненными значениями. 

Что это нам дает?

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

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

 

Выводы

Использование такого механизма удобно в случаях, когда нужно для объекта хранить данные в гибком виде, когда вид и размер данных зависит от настроек программы и значения реквизитов объекта. 

Но есть и обратная сторона. Производительность работы с таким механизмом будет ниже, нежели мы использовали непосредственно реквизиты документа для хранения логически привязанных к нему данных. Связано это с тем, что состав и значения реквизитов хранятся в отдельных таблицах, обращение к которым будет происходить при открытии документа и при его записи. 

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

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

Минус описанной схемы в том, что к документу можно будет создавать ограниченное количество реквизитов - максимум от количества ресурсов в регистре сведений и количества хранимых реквизитов в ключе аналитики. 

С помощью механизма, описанного выше, можно создавать динамический состав реквизитов практически для любого объекта (справочники, планы видов характеристик, перечисления (!) и др.).

devel1c.blogspot.ru

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4509    dsdred    53    

71

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5287    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6408    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18471    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12087    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8818    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15983    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. AlX0id 14.12.12 20:45 Сейчас в теме
Ну задача нестандартна настолько, что даже в библиотеке стандартных подсистем есть..
http://its.1c.ru/db/bspdoc#content:104:1
2. пользователь 14.12.12 22:01
(1) AlX0id, знаком с БСП.

Для меня эта задача была нестандартной, поскольку надо было уменьшить количество записей в таблице SQL-базы. На этом я не заострил внимание, а лишь в общем описал в конце статьи.

К БСП всегда относился с осторожностью, уж очень много лишнего там. Если нужно задействовать какой-либо функционал подсистемы, приходится очень много лишнего тащить в конфигурацию. В моем случае все только самое необходимое.
3. Yashazz 4709 18.12.12 19:32 Сейчас в теме
(0) А вы в курсе, что во всех типовых конфигурациях подобные возможности (в том или ином виде и урезанности) давным-давно есть?
После беглого просмотра я не понял, чем ваш подход принципиально отличается от классического. Поясните, плиз, может я правда чего упустил.

Насчёт БСП - это да, но механика доп.свойств заново делается в течение 1 рабочего дня.
4. пользователь 19.12.12 05:18
(3) Yashazz, в типовых практически тоже самое, за исключением написанного в конце статьи. Если не ошибаюсь, в тип. конфигурациях хранение значений свойств работает в рег. сведений "ДополнительныеСведения" таким образом, что если, например, у объекта 5 свойств, то и в регистре будет 5 записей.

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

Подход не применим для типовых, так как теряется универсальность (реквизитов/свойств может быть ограниченное количество в зависимости от кол-ва ресурсов рег. сведений и реквизитов справочника состава реквизитов). См. скриншот в конце статьи.
6. Yashazz 4709 19.12.12 18:17 Сейчас в теме
(4) Понял. Тогда это фрагмент той же концепции, что раньше предлагал я: http://infostart.ru/public/127853/
Хотя у меня количество записей, если считать строки таб.части, полюбому равно количеству разных значений, но зато динамичнее. :)
7. пользователь 19.12.12 18:26
(6) Yashazz, жаль, что эта статья мне раньше на глаза не попалась)

Почти всегда приходиться выбирать между универсальностью и быстродействием.

Решать, конечно, в зависимости от конкретной задачи.
5. zfilin 2337 19.12.12 14:01 Сейчас в теме
Хотя в целом подход известный, с составом реквизитов получилось любопытно.
Оставьте свое сообщение