Итак, наченм:
1. Для чего это.
Мы столкнулись с тем, что предприятие имеет множество филиалов по всей стране и каждый филиал работал в своей базе данных, начиная от Excel и заканчивая 1С8 или MS Access. Соответственно нам пришлось (как правильно выразился один из разработчиков) "автоматизировать облако". Поэтому было решено ссоздать механизм, который позволял бы наделять некоторые объекты конфигурации произвольными свойствами, которые при необходимости можно было бы создавать или удалять, не затрагивая саму конфигурацию, так как работа была в РИБ.
2. Подробнее о реализации.
Какие объекты были созданы в конфигурации:
2.1 План видов характеристик (ПВХ) "Периодические характеристики"
В нем содержались следующие реквизиты:
- Имя - имя периодического реквизита, для обращения к нему (без пробелов и спец. символов), чтобы при необходимости можно было использовать его в конфигураторе.
- Назначение (Реквизит группы) - пустая ссылка на объект, для которого будут использоваться реквизиты из данной группы
Были также другие реквизиты, но на них не стоит заострять внимание.
2.2 Периодический регистр сведений "Значения периодических реквизитов"
Здесь вроде все стандартно, два измерения:
- Объект - объект, для которого назначется дополнительное свойство
- Реквизит - ссылка на элемент ПВХ
Ресурсы:
- Значение - характеристика ПВХ
При необходимости можно добавить что-то типа вида периодичности, чтобы определить, как часто в периоде может изменятсья ваш реквизит: раз в год, раз в месяц или вообще никогда. Ну и другие вспомогательные реквизиты типа комментарий, периоды действия и т.д.
Таким образом мы получаем необходимую структуру для хранения периодических реквизитов объектов. Далее рассмотрим особенности использования данной конструкции в системе.
Практическое применение рассмотрим на примере справочника "ДоговорыКонтрагентов".
Для использования данной конструкции в отчетах системы достаточно добавить в отчет на СКД несложный код:
{ХАРАКТЕРИСТИКИ
ТИП(Справочник.ДоговорыКонтрагентов)
ВИДЫХАРАКТЕРИСТИК (ВЫБРАТЬ
ПериодическиеХарактеристики.Ссылка,
ПериодическиеХарактеристики.Наименование,
ПериодическиеХарактеристики.ТипЗначения
ИЗ
ПланВидовХарактеристик.ПериодическиеХарактеристики КАК ПериодическиеХарактеристики
ГДЕ
НЕ СвойстваОбъектов.ПометкаУдаления
И НЕ ПериодическиеХарактеристики.ЭтоГруппа
И СвойстваОбъектов.Ссылка В ИЕРАРХИИ
(ВЫБРАТЬ
ПериодическиеХарактеристики.Ссылка
ИЗ
ПланВидовХарактеристик.ПериодическиеХарактеристики КАК ПериодическиеХарактеристики
ГДЕ
НЕ ПериодическиеХарактеристики.ПометкаУдаления
ПериодическиеХарактеристики.ЭтоГруппа
И ПериодическиеХарактеристики.Назначение = Значение(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)))
ПОЛЕКЛЮЧА Ссылка
ПОЛЕИМЕНИ Наименование
ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения
ЗНАЧЕНИЯХАРАКТЕРИСТИК (ВЫБРАТЬ
ЗначенияПериодическихРеквизитовСрезПоследних.Объект,
ЗначенияПериодическихРеквизитовСрезПоследних.Реквизит,
ЗначенияПериодическихРеквизитовСрезПоследних.Значение
ИЗ
РегистрСведений.ЗначенияПериодическихРеквизитов.СрезПоследних КАК ЗначенияПериодическихРеквизитовСрезПоследних)
ПОЛЕОБЪЕКТА Объект
ПОЛЕВИДА Реквизит
ПОЛЕЗНАЧЕНИЯ Значение }
После добавления данного кода в отчеты системы пользователь получит возможность работать с отчетами использую дополнительные периодические характеристики.
В отчетах системы после выполнения макета СКД текст запроса будет выглядеть следующим образом:
ВЫБРАТЬ
ДоговорыКонтрагентов.Ссылка КАК ДоговорКонтрагента,
ДоговорыКонтрагентов.Представление КАК ДоговорКонтрагентаПредставление,
ВложенныйЗапрос.Значение КАК Значение,
ПРЕДСТАВЛЕНИЕССЫЛКИ(ВложенныйЗапрос.Значение) КАК ЗначениеПредставление
ИЗ
Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ЗначенияПериодическихРеквизитовСрезПоследних.Объект КАК Объект,
ЗначенияПериодическихРеквизитовСрезПоследних.Реквизит КАК Реквизит,
ЗначенияПериодическихРеквизитовСрезПоследних.Значение КАК Значение
ИЗ
РегистрСведений.ЗначенияПериодическихРеквизитов.СрезПоследних(&Период, Объект Ссылка Справочник.ДоговорыКонтрагентов) КАК ЗначенияПериодическихРеквизитовСрезПоследних) КАК ВложенныйЗапрос
ПО (ВложенныйЗапрос.Объект = ДоговорыКонтрагентов.Ссылка
И ВложенныйЗапрос.Реквизит = &П)
Данная конструкция не оптимальная. Обращение к срезу последних происходило бы быстрее если оптимизировать запрос:
РегистрСведений.ЗначенияПериодическихРеквизитов.СрезПоследних(&Период, Объект Ссылка Справочник.ДоговорыКонтрагентов и Реквизит = &П) КАК ЗначенияПериодическихРеквизитовСрезПоследних) КАК ВложенныйЗапрос
То есть поле, по которому мы производим отбор или группировку, должно передаваться в параметры виртуальной таблицы СрезПоследних, но компоновщик почему-то это не делает. Также в конструкцию характеристик не удается вписать элементы компоновки данных, и конструкция следующего вида будет выдавать ошибку:
РегистрСведений.ЗначенияПериодическихРеквизитов.СрезПоследних(&Период, {(ВЫРАЗИТЬ(Объект КАК Справочник.ДоговорыКонтрагентов)).* КАК ДоговорКОнтрагента}) КАК ЗначенияПериодическихРеквизитовСрезПоследних)
Обойти данную ситуацию можно написанием процедуры, которая дорабатывает текст запроса перед компоновкой результата.