Динамические константы или избавляемся от поиска по наименованию



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

Как хранить предопределенные значения или список значений?
Можно добавить константу в метаданные и не забыть дать на нее права всем кому потребуется…
Можно в коде прописать НайтиПоНаименованию(…), НайтиПоКоду(…) и надеяться, что наименование или код не поменяется…
Можно добавить предопределенное значение в объект метаданных, но такой элемент уже есть в базе…

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

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

Примеры использования:

в коде:

МояОрганизация = Справочники.БДВ_Константы.ПолучитьЗначениеКонстанты("Моя организация", 1);
СписокПользователей = Справочники.БДВ_Константы.ПолучитьЗначениеКонстанты("СписокПользователей", 0);

Второй параметр указывает в каком виде возвращается значение: 
0 — список значений,
1 — текущее значение.

в запросе:

"ВЫБРАТЬ Первые 1
| К.Значение КАК Значение
|ИЗ
| Справочник.БДВ_Константы.Значения КАК К
|ГДЕ
| К.НаименованиеКонстанты = ""Моя организация"""

установка константы в коде:

Справочники.БДВ_Константы.УстановитьЗначениеКонстанты("Моя организация", Справочники.Организация.НайтиПоКоду("000001"));

СписокПользователей = Новый СписокЗначений;
СписокПользователей.Добавить(ПараметрвСеанса.ТекущийПользователь);
Справочники.БДВ_Константы.УстановитьЗначениеКонстанты("СписокПользователей", СписокПользователей, Истина);

Наименование константы может содержать любые символы.

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

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

Константы можно группировать по папкам.

Конфигурация тестировалась на платформе 8.3.10.2580.

12 Comments

  1. buganov

    А еще как вариант использовать связку ПВХ + РегистрСведений. Если константы меняются редко и их много, то для скорости получения можно использовать модуль с повторным использованием

    Reply
  2. popenko

    присоединяюсь к (1)

    СписокПользователей = Новый СписокЗначений;

    СписокПользователей.Добавить(ПараметрвСеанса.СекущийПользователь);

    но улыбнуло — СекущийПользователь ,может быть ТекущийПользователь

    Reply
  3. VmvLer

    А можно вообще не лепить таблицы в БД, а создать обработку в расширении или через механизм БСП, а в ней

    макет «Константы» с колонками

    Имя/ТипМетаданныхСтрокой/ ВидМетаданныхСтрокой/ УидXmlСтрокой

    ….

    «Филиал1″/»Справочник»/»Организации»/»……»

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

    обслуживание таких «констант» заключается в добавлении новой строки в макет и сохранении обработки

    в любой момент без «терзания» основной конфигурации.

    думаю это будет не медленнее, чем обращение к таблицам

    Reply
  4. le0nid

    Используем: Регистр сведений, повторно используемый модуль, ОбщееХранилищеНастроек (на служебного пользователя, для некритичных задач)

    Reply
  5. bashinsky

    (2)Поправил

    Reply
  6. bashinsky

    (4) Повторно используемый модуль там используется.

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

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

    Поэтому пришлось использовать справочник.

    Reply
  7. bashinsky

    (3) вариантов можно много придумать, один из них вы видите здесь

    Reply
  8. skobzarev

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

    Контроль удаления решили через настройку прав доступа к регистру

    Reply
  9. popenko

    может я раньше не полностью высказался — для наглядной структуры — справочник, а вот же возможна периодика — с записью в регистр сведений за (1) + (8) . но полностью согласен с автором — каждый придумывает свое решение. Я лишь добавлю что ДОЛЖНА быть периодика, если хотите гибкости в длительном периоде, но это будет сложней.

    Reply
  10. Terve!R

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

    Если надо хранить список значений, так пусть это и будет список где-нибудь в хранилище, да хоть таблица значений. Есть же тип значения в колонке.

    Параметры 0 и 1 лишние, проще было бы без параметра берется текущее значение, а с каким-либо параметром (Истина, например) — весь массив значений.

    Reply
  11. bashinsky

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

    Reply
  12. acanta

    Константы / предопределенные элементы или Найти по наименованию в коде отчета/обработки — это уже холивар.

    Есть математический принцип доказательств «Необходимо и достаточно». Необходимо чтобы данные заполнения для конкретно этой(любой) обработки/отчета/документа/справочника хранились либо для одного пользователя либо для всех.

    Для одного пользователя хранится в кэше. При очистке кэша пропадает.

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

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

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

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

    Мне вот понравилось как отчеты в ЗУП 2,5 настройки сохраняют.

    Можно же сделать такое на документах/обработках/справочниках, нажал на кнопочку, видим список реквизитов/параметров которые можно сохранить и выбираем себе или всем или кому то конкретному. Как элемент БСП.

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

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *