Как связать предопределенный элемент справочника в 1с

Обновлено: 19.04.2024

Из-за добавления в платформу функционала по разделителям разработчиками была существенно пересмотрена работа с предопределенными значениями объектов. Опишу те моменты, с которыми нам довелось столкнуться.

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

Для управления созданием предопределенных элементов существуют следующие механизмы:
1) В Конфигураторе для объекта метаданных можно определить способ обновления предопределенных данных - Авто, Обновлять автоматически, Не обновлять автоматически.
2) Для информационной в целом можно установить режим создания предопределенных через метод:
УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(ОбновлениеПредопределенныхДанных), где
ОбновлениеПредопределенныхДанных - системное перечисление с вариантами Авто, Обновлять автоматически, Не обновлять автоматически
3) Для конкретной таблицы информационной базы можно установить режим создания предопределенных через менеджера через метод:
УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных), например
Справочники.Номенклатура.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
4) На создание предопределенных элементов также влияет тип информационной базы - главный узел РИБ (не подчинен ни одному плану обмена, являющемуся РИБ) или периферийный узел РИБ.

  • Если для объекта метаданных в данных установлен режим обновления, отличный от Авто, то используется это значение. (пункт 3 из списка выше)
  • Иначе, если для объекта метаданных в конфигурации установлен режим обновления, отличный от Авто, то используется это значение. (пункт 1 из списка выше)
  • Иначе, если для информационной базы установлен режим обновления, отличный от Авто, то используется это значение. (пункт 2 из списка выше)
  • Иначе, если это периферийный узел РИБ, то предопределенные данные не будут обновлены. Если проверка выполняется для центрального узла РИБ, или для базы, не являющейся РИБ, обновление предопределенных данных будет выполнено.

Что можно сделать:
- выставлять способ обновления для объекта метаданных в конфигурации = "Обновлять автоматически" не совсем правильно, если в конфигурации есть несколько разных планов обмена РИБ с разным составом, а этот объект входит только в часть из них. Если это сделать, то в данной конкретной ситуации ошибка будет исправлена - в периферийном узле предопределенные элементы будут созданы. Но при создании РИБ по другим планам обмена (куда данный объект входит) элементы задублируются - в периферийный узел придут предопределенные из главного узла.
Если РольДоступна("ПолныеПрава") Тогда //методы ниже требуют прав на удаление объектов, поэтому правильнее выполнять их под полными правами
Справочники.ГруппыПользователей.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
Справочники.ГруппыВнешнихПользователей.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
КонецЕсли;
КонецЕсли;

В платформе 8.3 реализована возможность связать предопределенные данные с элементами соответствующего типа. Для этого у объектов, которые могут иметь предопределенные элементы (они указаны выше), добавлено новое свойство ИмяПредопределенныхДанных. Оно отображается в списке стандартных реквизитов:


Чтобы "отсоединить" элемент данных от элемента предопределенных данных, нужно присвоить свойству ИмяПредопределенныхДанных пустую строку и записать элемент:

Чтобы связать предопределенный элемент с новой записью, нужно присвоить свойству ИмяПредопределенныхДанных имя предопределенного элемента:

Функциональные возможности обработки:

  • Выбор объекта конфигурации, содержащего предопределенные данные
  • Визуальное отображение статуса связи ( - связь установлена, - связь отсутствует)

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

Предыстория:

Когда давным давно задавался этим вопросом, что я только не читал на разных форумах!
Например:
1) Создавать новую сущность и все хранить в константах.
2) Создавать предопределенный элемент, копировать все реквизиты, а затем обработкой " ПоискИЗаменаЗначений " менять обычный на предопределенный, в конечном итоге удаляя первичный элемент.
3) И даже наткнулся на совсем
удивительную ВЕЩЬ , в которую даже не стал вникать = )))

Далее я приведу описание простенькой обработки для работы с предопределенными данными (может, кому понадобится):


1) В конфигураторе у объекта метаданных добавляем нужные Предопределенные элементы:

2) Если у объекта метаданных изменить свойство "Обновление предопределенных данных" на " Не обновлять автоматически ", то при обновление "Конфигурации БД" НЕ БУДУТ СОЗДАНЫ предопределенные элементы. Изменять это свойство или нет, решать Вам.



3) Запускаем обработку.

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

П.С. Работает в управляемой и обычной форме, но тестировал в 8.3.7 в режиме совместимости 8.3.6 = ))

Чтобы связать предопределенный элемент с новой записью, нужно присвоить свойству ИмяПредопределенныхДанных имя предопределенного элемента:

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

(5) Почему?
Нельзя создавать новые предопределенные элементы.
Но можно перепривязать одни элементы данных вместо других к предопределенным.

«Отключить» элемент данных от элемента предопределенных данных. Для этого необходимо присвоить свойству ИмяПредопределенныхДанных пустую строку и записать элемент:

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

(8) ИМХО, это не баг. Это фича.
В истории из ссылки в (7) описан классический случай необдуманных действий специалиста, который допустил ошибочную ситуацию нарушения уникальности данных, не учтя эту самую фичу.
Разработчики платформы тут не при чем.
В документации к платформе всё это описано. В том числе и особенности обменов данными и использования РИБ.

Постоянно глюки возникают: то задваиваются (и не как в 7, просто добавил новый и понеслась), то не создаются

(4) а какой смысл в этом действии без изменения конфигурации?
(8) +1 тоскливо и уныло становится еще, когда в базе несколько планов обмена, реализующие иерархию баз. Нет настройки миграции "Отженись от моих мозгов, сделай само так, чтобы это пошло из центра везде одинаково"

1. Предопределенные данные - это данные, созданные в Конфигураторе. Такие данные нужны, когда на них завязана логика программы, т.е. когда они прописаны (или предполагается, что будут прописаны) в программном коде. Предопределенные данные в чем-то похожи на перечисления.

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

3. Обращение в программном коде к предопределенным элементам нужно осуществлять только по его имени, которое задается при создании элемента в Конфигураторе (не путать с кодом и наименованием).

4. Код и наименование, родителя предопределенного элемента пользователь может изменить. Удалить и пометить на удаление предопределенный элемент нельзя (в том числе программно).

5. Имя элемента в режиме «Предприятие» прочитать невозможно (пока способ не найден).

6. В подчиненных справочниках нельзя ввести предопределенные элементы.

7. Можно ввести предопределенные элементы и группы, если объект иерархический с иерархией групп и элементов.

8. В конфигураторе для предопределенных элементов можно заполнить только имя, код, наименование и указать родителя (для иерархических объектов). Если у предопределенного элемента нужно заполнить другие реквизиты, то это нужно сделать в программном модуле, например, ПриНачалеРаботыСистемы или в Стартовом помощнике и запретить их изменять (событие ПередЗаписью, ПриОткрытии).

9. В запросы предопределенные элементы нужно передавать как параметры. Нельзя сравнивать их по наименованию, оно может быть изменено. Если запретить изменение наименования, то сравнивать можно, но методически неправильно.

10. У предопределенных данных есть обычная Ссылка с нормальным уникальным идентификатором.

11. У любого плана обмена есть один предопределенный узел, который не имеет имени,
но создается системой автоматически при создании плана обмена. Этот узел представляет текущую базу, в которой он находится. При создании начального образа для филиала, в нем создается новый предопределенный узел. Он доступен через метод ЭтотУзел() объекта типа ПланОбменаМенеджер:

Читайте также: