gifts2017

Реализация периодических характеристик для произвольных объектов

Опубликовал Сергей Растатурин (tristarr1) в раздел Программирование - Практика программирования

Все мы помним старую 7-ку, в которой периодические реквизиты были вроде как "по умолчанию". В 8-ке на смену им пришли периодические регистры сведений. Сегодня попытаюсь рассказать о том, как мы реализовали это в своей конфигурации и с какими проблемами столкнулись.

Итак, наченм:

1. Для чего это.

 Мы столкнулись с тем, что предприятие имеет множество филиалов по всей стране и каждый филиал работал в своей базе данных, начиная от Excel и заканчивая 1С8 или MS Access. Соответственно нам пришлось (как правильно выразился один из разработчиков)  "автоматизировать облако". Поэтому было решено ссоздать механизм, который позволял бы наделять некоторые объекты конфигурации произвольными свойствами, которые при необходимости можно было бы создавать или удалять, не затрагивая саму конфигурацию, так как работа была в РИБ.

2. Подробнее о реализации.

 Какие объекты были созданы в конфигурации:

2.1 План видов характеристик (ПВХ) "Периодические характеристики"

      В нем содержались следующие реквизиты:

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

Были также другие реквизиты, но на них не стоит заострять внимание. 

2.2 Периодический регистр сведений "Значения периодических реквизитов"

Здесь вроде все стандартно, два измерения:

  • Объект - объект, для которого назначется дополнительное свойство
  • Реквизит - ссылка на элемент ПВХ

Ресурсы:

  • Значение - характеристика ПВХ

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

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

Практическое применение рассмотрим на примере справочника "ДоговорыКонтрагентов".

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

{ХАРАКТЕРИСТИКИ
	ТИП(Справочник.ДоговорыКонтрагентов) 
	ВИДЫХАРАКТЕРИСТИК (ВЫБРАТЬ
			ПериодическиеХарактеристики.Ссылка,
			ПериодическиеХарактеристики.Наименование,
			ПериодическиеХарактеристики.ТипЗначения
		ИЗ
			ПланВидовХарактеристик.ПериодическиеХарактеристики КАК ПериодическиеХарактеристики
		ГДЕ 
			НЕ СвойстваОбъектов.ПометкаУдаления
			И НЕ ПериодическиеХарактеристики.ЭтоГруппа
			И СвойстваОбъектов.Ссылка В ИЕРАРХИИ
					(ВЫБРАТЬ
						ПериодическиеХарактеристики.Ссылка
					ИЗ
						ПланВидовХарактеристик.ПериодическиеХарактеристики КАК ПериодическиеХарактеристики
					ГДЕ
						НЕ ПериодическиеХарактеристики.ПометкаУдаления
						ПериодическиеХарактеристики.ЭтоГруппа
						И ПериодическиеХарактеристики.Назначение = Значение(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)))
	ПОЛЕКЛЮЧА Ссылка
	ПОЛЕИМЕНИ Наименование
	ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения
	ЗНАЧЕНИЯХАРАКТЕРИСТИК (ВЫБРАТЬ
			ЗначенияПериодическихРеквизитовСрезПоследних.Объект,
			ЗначенияПериодическихРеквизитовСрезПоследних.Реквизит,
			ЗначенияПериодическихРеквизитовСрезПоследних.Значение
		ИЗ
			РегистрСведений.ЗначенияПериодическихРеквизитов.СрезПоследних КАК ЗначенияПериодическихРеквизитовСрезПоследних)
	ПОЛЕОБЪЕКТА Объект
	ПОЛЕВИДА Реквизит
	ПОЛЕЗНАЧЕНИЯ Значение }

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

ОСВ с периодическими характеристиками

 

В отчетах системы после выполнения макета СКД текст запроса будет выглядеть следующим образом:

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

Данная конструкция не оптимальная. Обращение к срезу последних происходило бы быстрее если оптимизировать запрос:

 

 РегистрСведений.ЗначенияПериодическихРеквизитов.СрезПоследних(&Период, Объект Ссылка Справочник.ДоговорыКонтрагентов и Реквизит = &П) КАК ЗначенияПериодическихРеквизитовСрезПоследних) КАК ВложенныйЗапрос

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

РегистрСведений.ЗначенияПериодическихРеквизитов.СрезПоследних(&Период, {(ВЫРАЗИТЬ(Объект КАК Справочник.ДоговорыКонтрагентов)).* КАК ДоговорКОнтрагента}) КАК ЗначенияПериодическихРеквизитовСрезПоследних)

Обойти данную ситуацию можно написанием процедуры, которая дорабатывает текст запроса перед компоновкой результата.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Юрий Семенихин (human_new) 13.07.15 14:06
Сергей, а почему нельзя было воспользоваться при разработке стандартными дополнительными реквизитами?
2. Никита Коротаев (bforce) 01.08.15 21:56
В эту статью меня заставил заглянуть ее заголовок. Однако в содержании Вы описали обычное использование того, что в типовых называется Дополнительные сведения. Все то же самое я могу получить и путем внедрения в свою самописную конфу подсистемы Свойства Библиотеки стандартных подсистем. Не ясно, что же нового по сравнению с имеющимся предлагаете Вы? Может я что-то недопонял?
Вот, если бы показали нам настоящий пример использования периодичности дополнительных свойств, тогда это бы ценно с прикладной, а может и теоретической, точки зрения. На данный момент, я не понимаю, как пользователь может их менять, сохраняя старое значение.

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

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

Ну, и последний момент, который бросился в глаза. К сообщению я приложил два скриншота из демонстрационной базы, которую публикуют вместе с платформой. Вопрос: знаете ли для чего нужна кнопка Характеристики?
Скорее всего, нет, потому что в статье Вы пишете о том, как нужно дорабатывать все отчеты, чтобы пользователи могли в них использовать свойства. Посмотрев в демонстрационную конфигурацию, Вы узнаете, что достаточно один раз прописать в метаданных объекта использование дополнительных свойств и они всегда будут видны в отчетах, без их доработки, как реквизиты объекта.
Прикрепленные файлы:
3. Сергей Растатурин (tristarr1) 02.08.15 19:19
(2) bforce, 1. Если Вы обратили внимание, то в получении значений реквизитов используется виртуальная таблица "РегистрСведений.ЗначенияПериодическихРеквизитов.СрезПоследних" из чего можно сделать что значения хранятся в ПЕРИОДИЧЕСКОМ регистре сведений. Как их менять "сохраняя старые значения" - очень просто добавлять запись в регистр сведений с заполненным периодом, а с помощью регистратора этоо будет или независимо, уже не важно.

2. Что касается реквизита "ИмяРеквизита" для использования в конфигураторе - все очень просто. Представим себе ситуацию когда у вас очень большая РИБ в разных частях страны (а может и света) вводу разности во времени вы не имеете возможность выгонять пользоватей из базы и ждать обновления, так что неплохо бы иметь возможность обновлять конфигурацию динамически. Для этого и была реализована данная возможность. Должна это быть неотъемлемая часть объекта или нет это не принципиально данная конструкция позволяет работать с дополнительными сведениями как с полноценными реквизитами объекта. Что касается нашего случая, то был разработан механизм, который позволяет размещать дополнительные реквизиты на форме документов в режиме предприятия, как раз потому что нет возможности выгонять пользователей из 85 филиалов по всей стране.

3. Ну и по последнему пункту. Не надо утверждать что я знаю или чего не знаю это не профессионально и мы здесь не для того чтобы мериться друг с другом знаниями или опытом, а для того чтобы делиться ими. Хотелось бы в качестве приложения увидеть скрин где таблица из которой вы получаете значения характеристик была бы виртуальная таблица регистра "СрезПоследних" и все это с помощью той же кнопки "Характристики". Заранее спасибо.
4. Сергей Растатурин (tristarr1) 03.08.15 17:35
(1) human_new, По причинам указанным выше, в комментарии для пользователя bforce
5. Никита Коротаев (bforce) 04.08.15 06:47
(3) tristarr1,
1. Конечно, я приметил виртуальную таблицу. Но я ожидал, что Вы, все-таки, используете доработанный кусок БСП и надеялся, что Вы расскажете секрет о том, где и что пришлось изменить, чтобы все это заработало. БСП дает хороший инструментарий, который я бы не стал писать вручную. Речь об этом.
Что касается нашего случая, то был разработан механизм, который позволяет размещать дополнительные реквизиты на форме документов в режиме предприятия


2. Здесь сложно как-то высказываться, так как у Вас своя специфика: много баз, разные часовые пояса и прочее. Но, ведь, конфигурацию все-равно когда-то приходится обновлять? Вряд ли она у вас на замке от поставщика.

3. Вы абсолютно правы! Срез последних там не выбрать, но учитывая то, что я сказал в первом абзаце, можно легко найти выход. Первое, что приходит в голову: берем типовую подсистему Свойства, добавляем регистр История дополнительных сведений (периодический), создаем подписку на типовой регистр и записываем измененные свойства в наш регистр. При такой настройке мы имеем все возможности, которые дает БСП, а также, можем просматривать историю изменения свойств. Я так понимаю, непосредственно в логике конфигурации история изменений не нужна? Она требуется в редких случаях, когда пользователь хочет посмотреть кто и что менял? В этом случае, остается добавить отчет или команду для просмотра истории.

И это снова мое ИХМО на ту задачу, что Вы описали. Специфики я не знаю, поэтому не стану утверждать, что мое видение правильное. Решать в любом случае Вам, так как Вы ближе к проблемной области.
6. Сергей Растатурин (tristarr1) 04.08.15 10:14
(5) bforce, 3. Представьте что вам потребуется использовать эти самые реквизиты в печатной форме. И что тогда? проще обращаться в периодический регистр на дату документа, чем в зависимости от рабочей даты скакать по разным регистрам. И вообще на мой взгляд использование всякого рода "костылей" в виде подписок является плохим тоном, так как их выполнение не очевидно и проблематично в отладке.

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