Заполнение реквизитов предопределенных элементов

О чем эта статья

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

Применимость

В статье рассматривается платформа 1С:Предприятие версии 8.3.4.465. Материал актуален и для текущих релизов платформы.

Предопределенные элементы в «1С:Предприятие 8.3»

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

Во встроенном языке существуют методы для поиска данных, например, НайтиПоКоду() или НайтиПоНаименованию().

Однако алгоритмы, опирающиеся на код или наименование, зачастую являются ненадежными.

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

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

Таким образом, у предопределенных данных есть две “стороны”: во-первых, существует список предопределенных элементов, созданный в конфигураторе, а, во-вторых, для данных информационной базы указывается, является ли конкретный элемент предопределенным.

Предопределенные элементы могут быть созданы у:

  • справочников;
  • планов счетов;
  • планов видов характеристик;
  • планов видов расчета.

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

Для примера, создадим в справочнике Организации предопределенный элемент ОсновнаяОрганизация:
Справочник организации - предопределенный элемент

Для увеличения нажмите на изображение.

Обращение к этому элементу из программного кода будет следующим:

Код обращения

В платформе 8.3 реализована возможность связать предопределенные данные с элементами соответствующего типа.

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

ИмяПредопрделенныхДанных

Выберем при помощи запроса все поля из справочника Организации:

Выбор полей

Для увеличения нажмите на изображение.

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

Предопределенный элемент в списке отображается специальной пиктограммой:

Предопределенный элемент

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

&НаКлиенте
Процедура Отсоединить(Команда)
ОтсоединитьНаСервере();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ОтсоединитьНаСервере()
ОбъектДанных = Справочники.Организации.ОсновнаяОрганизация.ПолучитьОбъект();
ОбъектДанных.ИмяПредопределенныхДанных = “”;
ОбъектДанных.Записать();
КонецПроцедуры

Пиктограмма в списке изменилась:

Отсоединенный элемент

Теперь предопределенный элемент существует только в конфигурации и в данных нет элемента, привязанного к идентификатору ОсновнаяОрганизация:

Идентификатор ОсновнаяОрганизация

Для увеличения нажмите на изображение.

Обращение из программного кода к предопределенному элементу вызовет исключение:

Предопределенный элемент отсутствует в данных

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

&НаКлиенте
Процедура Привязать(Команда)
ПривязатьНаСервере();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПривязатьНаСервере()
НайденнаяСсылка = Справочники.Организации.НайтиПоНаименованию(“ООО “”Товары”””);
ОбъектДанных = НайденнаяСсылка.ПолучитьОбъект();
ОбъектДанных.ИмяПредопределенныхДанных = “ОсновнаяОрганизация”;
ОбъектДанных.Записать();
КонецПроцедуры

Теперь с пиктограммой предопределенного элемента выводится другой элемент справочника:

Пиктограмма предопределенного элемента

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

В случае его обнаружения будет выдано сообщение об ошибке:

Предопределенный элемент не уникален

При помощи запроса обратимся к полю ИмяПредопределенныхДанных.

Запрос = Новый Запрос;
Запрос.УстановитьПараметр(“ИмяПредопределенныхДанных”, ИмяПредопределенныхДанных);

Запрос.Текст =
“ВЫБРАТЬ
| Организации.Ссылка,
| Организации.Наименование,
| Организации.Код
|ИЗ
| Справочник.Организации КАК Организации
|ГДЕ
| Организации.ИмяПредопределенныхДанных = &ИмяПредопределенныхДанных”
;

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = Выборка.Наименование;
Сообщение.Сообщить();
КонецЕсли;

Если параметр запроса ИмяПредопределенныхДанных принимает значение “ОсновнаяОрганизация”, запрос выполняется без ошибок.

Если используется любое другое значение, не указанное в конфигураторе, то во время выполнения произойдет исключение:

Предопределенный элемент не принадлежит Организации

При использовании в конфигурации Библиотеки стандартных подсистем (БСП) версии 2.1.4 и выше рекомендуется использовать функцию ПредопределенныйЭлемент общего модуля ОбщегоНазначенияКлиентСервер, которая возвращает Неопределено для несуществующих в информационной базе предопределенных элементов:

Организация= ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент(“Справочник.Организации.
ОсновнаяОрганизация”
);

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


ОбъектДанных= Метаданные.Справочники.Организации;
ТекстЗапроса =
|ВЫБРАТЬ
| ИмяОбъекта.Ссылка
|ИЗ
| “
+ ОбъектДанных.ПолноеИмя() + ” КАК ИмяОбъекта
|
|ГДЕ
| ИмяОбъекта.Предопределенный
;

Запрос = Новый Запрос(ТекстЗапроса);
Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
ИмяПредопределенного = Справочники[ОбъектДанных.Имя].ПолучитьИмяПредопределенного
(
Выборка.Ссылка);
Сообщить(ИмяПредопределенного);
КонецЦикла;

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

Однако начиная с платформы 8.3.3, метод ПолучитьИмяПредопределенного() является устаревшим и поддерживается для совместимости, поэтому даже в Синтакс-помощнике платформы 8.3.4 он не отображается.

Синтакс-помощник платформы

В платформе 8.3 существует метод глобального контекста ПолучитьПолноеИмяПредопределенногоЗначения(). Этот метод выполняет действие, обратное методу ПредопределенноеЗначение(), – по ссылке на предопределенный элемент возвращает полное имя предопределенного значения.

Метод глобального контекста

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

Теперь в платформе присутствуют новые права доступа, определяющие возможность редактирования предопределенных данных:

  • ИнтерактивноеУдалениеПредопределенныхДанных,
  • ИнтерактивнаяПометкаУдаленияПредопределенныхДанных,
  • ИнтерактивноеСнятиеПометкиУдаленияПредопределенныхДанных,
  • ИнтерактивноеУдалениеПомеченныхПредопределенныхДанных.

Права доступа для редактирования предопределенных данных

Ограничения доступа к данным одновременно назначаются на поля Предопределенный и ИмяПредопределенныхДанных (оба флажка устанавливаются и снимаются одновременно):

Ограничения доступа к данным

Однако “интерактивные” права на просмотр и редактирование стандартных реквизитов Предопределенный и ИмяПредопределенныхДанных можно установить по отдельности:

Права на просмотр и редактирование

Для увеличения нажмите на изображение.

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

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

  • Авто – необходимость создания предопределенных элементов и обновление существующих будет определяться системой автоматически;
  • НеОбновлятьАвтоматически – не будет выполняться автоматическое создание предопределенных элементов и обновление существующих значений. В случае отсутствия элемента данных, связанного с предопределенным элементом, будет сгенерировано исключение при попытке обращения к нему;
  • ОбновлятьАвтоматически – будет выполняться автоматическое создание предопределенных элементов и обновление существующих значений.

Чтобы принять решение, нужно ли создавать и обновлять предопределенные данные, система последовательно анализирует следующие значения:

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

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

Подробнее будет рассмотрено ниже.

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

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

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

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

1. Если для объекта метаданных в информационной базе (т.е. в данных) установлен режим обновления, отличный от Авто, то используется это значение.

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

Эти методы доступны у объектов типа СправочникМенеджер, ПланСчетовМенеджер, ПланВидовХарактеристикМенеджер, ПланВидовРасчетаМенеджер.

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

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

Обновление предопределенных данных

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

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

4. Иначе анализируется вид узла распределенной базы. Если это периферийный узел, то предопределенные данные не будут обновлены (соответствует значению НеОбновлятьАвтоматически).

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

Если база находится в режиме совместимости “Версия 8.3.3”, то алгоритм определения необходимости обновления предопределенных данных выглядит немного по-другому.

Обновление не будет производиться:

  • если в метаданных или в данных установлено НеОбновлятьАвтоматически;
  • если в метаданных или в данных установлено Авто и текущий узел является периферийным.

В противном случае предопределенные данные будут обновлены.

Создание в информационной базе данных, связанных с предопределенными, может быть выполнено следующими способами:

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

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

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

Обновление данных, связанных с предопределенными, будет выполняться, если:

  • разрешено автоматическое обновление предопределенных данных;
  • предопределенные данные связаны с данными информационной базы;
  • предопределенные данные изменены в конфигураторе.

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

Если в конфигураторе удалить предопределенный элемент, то будут выполнены следующие действия:

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

Установим для справочника Организации в конфигураторе свойство ОбновлениеПредопределенныхДанных в НеОбновлятьАвтоматически и удалим предопределенный элемент ОсновнаяОрганизация.

В пользовательском режиме у элемента справочника, связанного с предопределенным, значение свойства ИмяПредопределенныхДанных стало равным #708c7031-c7bd-45d4-a8c9-65b2fecfde62, где символы после знака “#” – это уникальный идентификатор удаленного элемента метаданных.

Идентификатор удаленного элемента метаданных в пользовательском режиме

Для увеличения нажмите на изображение.

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

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

Автоматического создания предопределенных данных в периферийной базе не происходит.

В распределенной базе иногда могут возникать ошибки, которые исправляются после отключения от РИБа, загрузки в периферийную базу конфигурации центральной базы и дальнейшего подключения к распределенной базе.

При работе на платформе 8.3 следует учитывать следующую особенность.

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

Чтобы не допустить такого поведения, можно использовать метод глобального контекста УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы() или использовать параметр командной строки в пакетном режиме запуска конфигуратора /SetPredefinedDataUpdate, который предназначен для указания режимов обновления предопределенных данных.

Этот параметр может принимать одно из трех значений:

    • UpdateAutomatically – при реструктуризации информационной базы будет выполняться автоматическое создание предопределенных элементов и обновление существующих значений;
    • DoNotUpdateAutomatically – при реструктуризации информационной базы не будет выполняться автоматическое создание новых предопределенных элементов и обновление их значений;
    • Auto – фактическое значение вычисляется автоматически. Для главного узла информационной базы значение будет равно UpdateAutomatically, для периферийного узла информационной базы будет равно DoNotUpdateAutomatically.

Командная строка запуска конфигуратора с этим параметром будет выглядеть следующим образом:

“C:Program Files1cv88.3.4.437bin1cv8.exe DESIGNER /F”ПутьКБазе” /N”Администратор” /P”Пароль” /SetPredefinedDataUpdate -DoNotUpdateAutomatically”

Таким образом возможно задавать признак обновления предопределенных данных, когда информационная база отключается от РИБ, например, для восстановления работоспособности.

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

Для информационной базы, где создаются предопределенные элементы, следует использовать значение UpdateAutomatically, а для второй информационной базы – DoNotUpdateAutomatically.

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

Таким образом можно создавать обработки загрузки предопределенных данных из файла.

В платформе 8.2.14 появился механизм разделения данных. При использовании разделенной базы предопределенные элементы создавали ряд ограничений.

Так, было невозможно использовать предопределенные данные для объектов конфигурации, входящих в состав разделителя в режиме “Независимо и совместно”.

Теперь в платформе 8.3 предопределенные данные можно использовать для объектов, входящих в состав любых разделителей.

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

Например, рассмотрим предопределенный элемент ОсновнаяОрганизация в справочнике Организации.

Пусть в базе есть две области: с кодами 01 и 02.

Значит, уникальный идентификатор элемента данных, связанного с элементом ОсновнаяОрганизация в области с кодом 01, не будет равен уникальному идентификатору элемента данных, связанного с элементом ОсновнаяОрганизация в области 02.

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

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

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

Один предопределенный элемент имел одинаковую ссылку во всех областях данных.

При обмене данными с использованием РИБа предопределенные данные передавались только с изменениями конфигурации прикладного решения. Управлять созданием и обновлением предопределенных данных было невозможно.

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

На этом мы завершаем наше первое знакомство с предопределенными элементами.

Вы, скорее всего, уже заметили, что основное время во время написания программного кода мы находились в конфигураторе. И, наверное, вы уже задавались вопросом, что значат все эти кнопки, панели и меню в нем. Когда и зачем их нужно использовать?

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

PDF-версия статьи для участников группы ВКонтакте

Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.

Если Вы еще не вступили в группу – сделайте это сейчас и в блоке ниже (на этой странице) появятся ссылка на скачивание материалов.

Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)

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

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

Автор G13ma, 03 сен 2014, 18:23

0 Пользователей и 1 гость просматривают эту тему.

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

Пробовал из обработки
Процедура КнопкаВыполнитьНажатие(Кнопка)
   Справочники.МойСправочник.ПредопределенныйЭлемент.Реквизит = «12354»;
КонецПроцедуры

Пробовал из модуля приложения
Процедура ПриНачалеРаботыСистемы()
    Сообщить(«Старт»);
    Справочники.МойСправочник.ПредопределенныйЭлемент.Реквизит = «12354»;
КонецПроцедуры

Во всех случаях пишет «{МодульОбычногоПриложения(3)}: Поле объекта недоступно для записи (Реквизит)
Основной режим запуска обычно приложение
Платформа 8.2


Ну тебе же прямо говорят, что «Поле объекта недоступно для записи».
Чтобы он стал доступен для записи, нужно получить объект! А чтобы получить объект, нужно получить сначала ссылку на него.

Cегодня не все могут провести завтрашним числом. Вернее, не только лишь все — мало кто может это сделать.


Цитата: TreeDogNight от 03 сен 2014, 18:41
Ну тебе же прямо говорят, что «Поле объекта недоступно для записи».
Чтобы он стал доступен для записи, нужно получить объект! А чтобы получить объект, нужно получить сначала ссылку на него.

Чем тебе вот это не ссылка? :bleh:

Справочники.МойСправочник.ПредопределенныйЭлемент


Спасибо, сообразил

Процедура КнопкаВыполнитьНажатие(Кнопка)
спр =     Справочники.МойСправочник.ПредопределенныйЭлемент.ПолучитьОбъект();
Спр.Реквизит = «1234»;
Спр.Записать();
КонецПроцедуры


Где прописать авто заполнение реквизитов предопределнных элементов

Я
   XxGunnxX

27.01.12 — 12:02

Допустим, добавил в конфу новый справочник с рядом предопределнных элементов. Наименование заполнил. Остальные реквизиты должны быть автоматически заполнены в момент установки cfu.

В какую предопределенную процудуру будет правильно добавить код заполнения? (типовые модули трогать нельзя или категорически не желательно)

(типовой код смотрел но там без отладчика не разберешься, а конфы нет под рукой чтобы попробывать развернуть)

  

Партнерская программа EFSOL Oblako

   Shurjk

1 — 27.01.12 — 12:06

(0) В типовых есть механизмы, но правильные 1с-ки всегда пишут в модуле документа при открытии.

   XxGunnxX

2 — 27.01.12 — 12:09

Заполнение предопределенных элементов справочника, при открытии документа? о_0

   Cube

3 — 27.01.12 — 12:10

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

   kosts

4 — 27.01.12 — 12:11

Может имеется ввиду заполнение реквизитов, а не предопределенных элементов? Последние даже не знаю как можно заполнить, они и так заданы в конфигурации…

   XxGunnxX

5 — 27.01.12 — 12:13

Да — я ж пишу «заполнение реквизитов предопределенных элементов»

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

Вообще речь идет о служебном ПВХ форма которого вообще никогда не будет открываться. Поэтому вариант «ПриОткрытии» не подходит.

(3) Вещать на запуск системы как то не кошерно, но если ничего не придумаю придется…

   kosts

6 — 27.01.12 — 12:15

а ну да в заголовке

   kosts

7 — 27.01.12 — 12:17

Способ 1 — внешняя обработка. Запустить после загрузки cfu.

Способ 2 — прописать так же как как реализовано в типовых «при обновлении».

   XxGunnxX

8 — 27.01.12 — 12:22

(7) Способ 1: я уже сделал. Но это временное решение.

Нужен способ 2, но я пока не могу разобраться. Может кто делал такое? Какую процедуру использовать?

   Ненавижу 1С

9 — 27.01.12 — 12:28

Хранить в макете

Вызывать при открытии из привелигированного модуля

   kosts

10 — 27.01.12 — 12:35

[1с]

Процедура ПриНачалеРаботыСистемы()

   // Ожидается, что этот кусок выполнится один раз перед обновлением типовым способом

   Если ВерсияКонфигурацииВКонстанте <> ВерсияКонфигурацииВМетаданных Тогда

       Если ВерсияКонфигурацииВМетаданных = 1.2.3.4 Тогда

           ВыполнитьЗаполнениеРеквизитовПредопределенныхЭлементов();

       КонецЕсли;

   КонецЕсли;

   // Ожидается что версии уравняются типовой обработкой

   …

КонецПроцедуры

[1с]

  

XxGunnxX

11 — 27.01.12 — 13:08

Да похоже нет никакого отдельного события возникающего при обновлении конфигурации.

В типовом коде есть подходящая процедура ВыполнитьОбновлениеИнформационнойБазы() но и она вызывается из ПриНачалеРаботыСистемы().

Вопрос закрыт. Всем спасибо!

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

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

К примеру, мы в нашей конфигурации для целей учета создали справочник Валюты, поскольку мы живем в Российской федерации, то валюта Рубль всегда будет в нашей конфигурации, которая используется на территории РФ.  Поэтому наиболее логичнее её сделать в виде предопределенного элемента. Поэтому создадим для справочника Валюты предопределенный элемент Рубль. Для того, чтобы добавить предопределенный элемент необходимо выделить нужный справочник, вызвать контекстное меню и выбрать в этом меню команду «Открыть предопределенные данные».

Открыть список предопределенных элементов справочников 1С

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

Список предопределенных элементов справочников 1С

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

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

Список предопределенных элементов иерархического справочника 1С

Если мы зайдем в форму списка справочника Страны в пользовательском режиме «1С: Предприятия», то обнаружим, что уже имеются группы и элементы с точкой внизу. Так платформа помечает предопределенные элементы и группы.

Предопределенные элементы и группы в справочнике 1С

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

Реквизит предопределенного элемента

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

ЭлементКитай = Справочники.Страны.Китай;

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

ЭлементКитай = ПредопределенноеЗначение("Справочник.Страны.Китай");

Имейте в виду, что и при помощи метода ПредопределенноеЗначение и при помощи прямого обращения посредством менеджера объекта мы получим ссылку на элемент, с которой можем работать как с обычной ссылкой на элемент справочника: присваивать её какому-нибудь реквизиту, получать объект из этой ссылки и т.д.

Ссылка на предопределенный элемент справочника

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

Мы уже научились создавать предопределенные элементы справочника в конфигураторе, но можно ли создать предопределенный элемент программно? И да, и нет.

Мы можем из простого элемента сделать предопределенный, и наоборот предопределенный элемент сделать простым.

Для этих целей у справочников имеется стандартный реквизит ИмяПредопределенныхДанных.

Реквизит ИмяПредопределнныхДанных справочника 1С

Если мы получим ссылку на предопределенный элемент, то этот реквизит заполнен.

Реквизит ИмяПредопределнныхДанных у предопределенного элемента справочника 1С

Если же мы возьмем какой-то не предопределенный элемент, то этот реквизит будет пустой.

Реквизит ИмяПредопределнныхДанных у простого элемента справочника 1С

Если мы этому реквизиту присвоим  какое-нибудь имя (помня об уникальности имен предопределенных элементов в контексте конкретного справочника), то мы программно «создадим» предопределенный элемент, но только в том случае если это имя уже существует в списке предопределенных элементов справочника, которые были заданы в конфигураторе 1С!

Например, тот же элемент «Тунис» справочника «Страны» у нас простой.

Простой элемент справочника 1С

В какой-нибудь обработке напишем код, в котором попробуем сделать из этого элемента предопределенный элемент.

&НаСервере
Процедура СоздатьНаСервере()
	ЭлТунис = Справочники.Страны.НайтиПоНаименованию("Тунис");
	ОбТунис = ЭлТунис.ПолучитьОбъект();
	ОбТунис.ИмяПредопределенныхДанных = "Тунис";
	ОбТунис.Записать();
КонецПроцедуры

&НаКлиенте
Процедура Создать(Команда)
	СоздатьНаСервере();
КонецПроцедуры

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

Предопределенный элемент не существует

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

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

Сделаем на обработке две команды. Первая будет снимать предопределенность у элемента справочника с именем «Китай», а вторая устанавливать.

Снимем предопределенность.

&НаСервере
Процедура ОтсоединитьНаСервере()
	ЭлементКитай = Справочники.Страны.Китай;
	ОбЭлКитай = ЭлементКитай.ПолучитьОбъект();
	ОбЭлКитай.ИмяПредопределенныхДанных = "";
	ОбЭлКитай.Записать();
КонецПроцедуры

&НаКлиенте
Процедура Отсоединить(Команда)
	ОтсоединитьНаСервере();
КонецПроцедуры

Теперь обратно установим.

&НаСервере
Процедура ПрисоединитьНаСервере()
	ЭлКитай = Справочники.Страны.НайтиПоНаименованию("Китай");
	ОбЭлКитай = ЭлКитай.ПолучитьОбъект();
	ОбЭлКитай.ИмяПредопределенныхДанных = "Китай";
	ОбЭлКитай.Записать();
КонецПроцедуры

&НаКлиенте
Процедура Присоединить(Команда)
	ПрисоединитьНаСервере();
КонецПроцедуры

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

Имя предопределенного элемента справочника

У нас до снятия элемент «Китай» был предопределенным.

Предопределенный элемент справочника 1С

А после снятия это стал простой элемент.

Элемент справочника 1С

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

Начиная с платформы 1С 8.3 предопределенные элементы можно удалять в пользовательском режиме.

Установка пометки на удаление предопределенного элемента справочника 1С

Пометка на удаление предопределенного элемента справочника 1С

Если сейчас этот элемент удалить через стандартную обработку «Удаление помеченных объектов», то он исчезнет из базы.

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

Права на удаление предопределенного элемента

Что делать, если мы ошиблись и хотим опять «вернуть» предопределенный элемент? Есть несколько способов. Но самый простой это создать новый элемент справочника в пользовательском режиме и присвоить ему имя удаленного предопределенного элемента, как мы это уже делали.

Остальные статьи по теме конфигурирования:

Документы в 1С 8.3

Справочники в 1С 8.3

Предопределенные элементы справочников 1С

Формы справочников в 1С 8.3

Журнал документов в 1С 8.3

Табличные части объектов 1С

Подсистемы в 1С 8.3

Общие реквизиты в 1С

Более подробно и основательно работа со справочниками, документами и другими объектами метаданных дается в моей книге:

Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

Эту и другие технические статьи написали наши программисты 1С и получили за них премии. Если вы тоже работаете с 1С и любите делиться опытом, приходите разработчиком в Neti

В этой статье речь пойдет о предопределенных элементах, которые можно создать в платформе 1С:Предприятие 8.

Для чего нужны предопределенные элементы

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

Куда можно добавить

Предопределенные элементы могут быть созданы у:

  • справочников;
  • планов счетов;
  • планов видов характеристик;
  • планов видов расчета.

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

Предопределенные элементы в 1С

Рис. 1. Добавление предопределенных элементов невозможно

Предопределенные элементы в 1С

https://its.1c.ru/db/v8315doc#bookmark:dev:TI000000306

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

В платформе 8.3 появилась возможность удалять предопределенные элементы в режиме 1С:Предприятие, ровно как и связывать существующие, задав им имена. В связи с этим в было добавлено системное перечисление ОбновлениеПредопределенныхДанных, содержащее следующие значения:

  • Авто;
  • НеОбновлятьАвтоматически – предопределенные элементы не создаются в БД;
  • ОбновлятьАвтоматически – предопределенные элементы будут созданы.

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

Предопределенные элементы в 1С

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

ЭлементСсылка = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Производитель");
Объект = ЭлементСсылка.ПолучитьОбъект();
Объект.ИмяПредопределенныхДанных = "Производитель";
Объект.Записать();

А также можно «отвязать» элемент в базе данных от предопределенного элемента.

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

Список = Метаданные.ПланыВидовХарактеристик.СвойстваОбъектов.ПолучитьИменаПредопределенных();

Более подробно можно почитать на ИТС https://its.1c.ru/db/v8315doc#bookmark:dev:TI000000280

Предопределенные элементы в 1C 8.3

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

Во встроенном языке существуют методы для поиска данных, например, НайтиПоКоду() или НайтиПоНаименованию().

Однако алгоритмы, опирающиеся на код или наименование, зачастую являются ненадежными.

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

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

Таким образом, у предопределенных данных есть две “стороны”: во-первых, существует список предопределенных элементов, созданный в конфигураторе, а, во-вторых, для данных информационной базы указывается, является ли конкретный элемент предопределенным.

Предопределенные элементы могут быть созданы у:

  • справочников;
  • планов счетов;
  • планов видов характеристик;
  • планов видов расчета.

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

Для примера, создадим в справочнике Организации предопределенный элемент ОсновнаяОрганизация:

Обращение к этому элементу из программного кода будет следующим:

В платформе 8.3 реализована возможность связать предопределенные данные с элементами соответствующего типа.

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

Выберем при помощи запроса все поля из справочника Организации:

Для увеличения нажмите на изображение.

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

Предопределенный элемент в списке отображается специальной пиктограммой:

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

&НаКлиенте
Процедура Отсоединить(Команда)
ОтсоединитьНаСервере();
КонецПроцедуры

 

&НаСервереБезКонтекста
Процедура ОтсоединитьНаСервере()
ОбъектДанных = Справочники.Организации.ОсновнаяОрганизация.ПолучитьОбъект();
ОбъектДанных.ИмяПредопределенныхДанных = “”;
ОбъектДанных.Записать();
КонецПроцедуры

Пиктограмма в списке изменилась:

Теперь предопределенный элемент существует только в конфигурации и в данных нет элемента, привязанного к идентификатору ОсновнаяОрганизация:

Для увеличения нажмите на изображение.

Обращение из программного кода к предопределенному элементу вызовет исключение:

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

&НаКлиенте
Процедура Привязать(Команда)
ПривязатьНаСервере();
КонецПроцедуры

 

&НаСервереБезКонтекста
Процедура ПривязатьНаСервере()
НайденнаяСсылка = Справочники.Организации.НайтиПоНаименованию(“ООО “”Товары”””);
ОбъектДанных = НайденнаяСсылка.ПолучитьОбъект();
ОбъектДанных.ИмяПредопределенныхДанных = “ОсновнаяОрганизация”;
ОбъектДанных.Записать();
КонецПроцедуры

 

Теперь с пиктограммой предопределенного элемента выводится другой элемент справочника:

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

В случае его обнаружения будет выдано сообщение об ошибке:

При помощи запроса обратимся к полю ИмяПредопределенныхДанных.

Запрос = Новый Запрос;
Запрос.УстановитьПараметр(“ИмяПредопределенныхДанных”, ИмяПредопределенныхДанных);

 

Запрос.Текст =
“ВЫБРАТЬ
| Организации.Ссылка,
| Организации.Наименование,
| Организации.Код
|ИЗ
| Справочник.Организации КАК Организации
|ГДЕ
| Организации.ИмяПредопределенныхДанных = &ИмяПредопределенныхДанных”;

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = Выборка.Наименование;
Сообщение.Сообщить();
КонецЕсли;

Если параметр запроса ИмяПредопределенныхДанных принимает значение “ОсновнаяОрганизация”, запрос выполняется без ошибок.

Если используется любое другое значение, не указанное в конфигураторе, то во время выполнения произойдет исключение:

При использовании в конфигурации Библиотеки стандартных подсистем (БСП) версии 2.1.4 и выше рекомендуется использовать функцию ПредопределенныйЭлемент общего модуля ОбщегоНазначенияКлиентСервер, которая возвращает Неопределено для несуществующих в информационной базе предопределенных элементов:

Организация= ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент(“Справочник.Организации.
ОсновнаяОрганизация”);

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

ОбъектДанных= Метаданные.Справочники.Организации;
ТекстЗапроса = “
|ВЫБРАТЬ
| ИмяОбъекта.Ссылка
|ИЗ
| “ + ОбъектДанных.ПолноеИмя() + ” КАК ИмяОбъекта
|
|ГДЕ
| ИмяОбъекта.Предопределенный;

 

Запрос = Новый Запрос(ТекстЗапроса);
Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
ИмяПредопределенного = Справочники[ОбъектДанных.Имя].ПолучитьИмяПредопределенного
(Выборка.Ссылка);
Сообщить(ИмяПредопределенного);
КонецЦикла;​

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

Однако начиная с платформы 8.3.3, метод ПолучитьИмяПредопределенного() является устаревшим и поддерживается для совместимости, поэтому даже в Синтакс-помощнике платформы 8.3.4 он не отображается.

В платформе 8.3 существует метод глобального контекста ПолучитьПолноеИмяПредопределенногоЗначения(). Этот метод выполняет действие, обратное методу ПредопределенноеЗначение(), – по ссылке на предопределенный элемент возвращает полное имя предопределенного значения.

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

Теперь в платформе присутствуют новые права доступа, определяющие возможность редактирования предопределенных данных:

  • ИнтерактивноеУдалениеПредопределенныхДанных,
  • ИнтерактивнаяПометкаУдаленияПредопределенныхДанных,
  • ИнтерактивноеСнятиеПометкиУдаленияПредопределенныхДанных,
  • ИнтерактивноеУдалениеПомеченныхПредопределенныхДанных.

Ограничения доступа к данным одновременно назначаются на поля Предопределенный и ИмяПредопределенныхДанных (оба флажка устанавливаются и снимаются одновременно):

Однако “интерактивные” права на просмотр и редактирование стандартных реквизитов Предопределенный и ИмяПредопределенныхДанных можно установить по отдельности:

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

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

  • Авто – необходимость создания предопределенных элементов и обновление существующих будет определяться системой автоматически;
  • НеОбновлятьАвтоматически – не будет выполняться автоматическое создание предопределенных элементов и обновление существующих значений. В случае отсутствия элемента данных, связанного с предопределенным элементом, будет сгенерировано исключение при попытке обращения к нему;
  • ОбновлятьАвтоматически – будет выполняться автоматическое создание предопределенных элементов и обновление существующих значений.

Чтобы принять решение, нужно ли создавать и обновлять предопределенные данные, система последовательно анализирует следующие значения:

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

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

Подробнее будет рассмотрено ниже.

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

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

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

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

1. Если для объекта метаданных в информационной базе (т.е. в данных) установлен режим обновления, отличный от Авто, то используется это значение.

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

Эти методы доступны у объектов типа СправочникМенеджер, ПланСчетовМенеджер, ПланВидовХарактеристикМенеджер, ПланВидовРасчетаМенеджер.

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

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

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

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

4. Иначе анализируется вид узла распределенной базы. Если это периферийный узел, то предопределенные данные не будут обновлены (соответствует значению НеОбновлятьАвтоматически).

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

Если база находится в режиме совместимости “Версия 8.3.3”, то алгоритм определения необходимости обновления предопределенных данных выглядит немного по-другому.

Обновление не будет производиться:

  • если в метаданных или в данных установлено НеОбновлятьАвтоматически;
  • если в метаданных или в данных установлено Авто и текущий узел является периферийным.

В противном случае предопределенные данные будут обновлены.

Создание в информационной базе данных, связанных с предопределенными, может быть выполнено следующими способами:

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

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

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

Обновление данных, связанных с предопределенными, будет выполняться, если:

  • разрешено автоматическое обновление предопределенных данных;
  • предопределенные данные связаны с данными информационной базы;
  • предопределенные данные изменены в конфигураторе.

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

Если в конфигураторе удалить предопределенный элемент, то будут выполнены следующие действия:

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

Установим для справочника Организации в конфигураторе свойство ОбновлениеПредопределенныхДанных в НеОбновлятьАвтоматически и удалим предопределенный элемент ОсновнаяОрганизация.

В пользовательском режиме у элемента справочника, связанного с предопределенным, значение свойства ИмяПредопределенныхДанных стало равным #708c7031-c7bd-45d4-a8c9-65b2fecfde62, где символы после знака “#” – это уникальный идентификатор удаленного элемента метаданных.

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

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

Автоматического создания предопределенных данных в периферийной базе не происходит.

В распределенной базе иногда могут возникать ошибки, которые исправляются после отключения от РИБа, загрузки в периферийную базу конфигурации центральной базы и дальнейшего подключения к распределенной базе.

При работе на платформе 8.3 следует учитывать следующую особенность.

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

Чтобы не допустить такого поведения, можно использовать метод глобального контекста УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы() или использовать параметр командной строки в пакетном режиме запуска конфигуратора /SetPredefinedDataUpdate, который предназначен для указания режимов обновления предопределенных данных.

Этот параметр может принимать одно из трех значений:

    • UpdateAutomatically – при реструктуризации информационной базы будет выполняться автоматическое создание предопределенных элементов и обновление существующих значений;
    • DoNotUpdateAutomatically – при реструктуризации информационной базы не будет выполняться автоматическое создание новых предопределенных элементов и обновление их значений;
    • Auto – фактическое значение вычисляется автоматически. Для главного узла информационной базы значение будет равно UpdateAutomatically, для периферийного узла информационной базы будет равно DoNotUpdateAutomatically.

Командная строка запуска конфигуратора с этим параметром будет выглядеть следующим образом:

“C:Program Files1cv88.3.4.437bin1cv8.exe DESIGNER /F”ПутьКБазе” /N”Администратор” /P”Пароль” /SetPredefinedDataUpdate -DoNotUpdateAutomatically”

Таким образом возможно задавать признак обновления предопределенных данных, когда информационная база отключается от РИБ, например, для восстановления работоспособности.

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

Для информационной базы, где создаются предопределенные элементы, следует использовать значение UpdateAutomatically, а для второй информационной базы – DoNotUpdateAutomatically.

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

Таким образом можно создавать обработки загрузки предопределенных данных из файла.

В платформе 8.2.14 появился механизм разделения данных. При использовании разделенной базы предопределенные элементы создавали ряд ограничений.

Так, было невозможно использовать предопределенные данные для объектов конфигурации, входящих в состав разделителя в режиме “Независимо и совместно”.

Теперь в платформе 8.3 предопределенные данные можно использовать для объектов, входящих в состав любых разделителей.

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

Например, рассмотрим предопределенный элемент ОсновнаяОрганизация в справочнике Организации.

Пусть в базе есть две области: с кодами 01 и 02.

Значит, уникальный идентификатор элемента данных, связанного с элементом ОсновнаяОрганизация в области с кодом 01, не будет равен уникальному идентификатору элемента данных, связанного с элементом ОсновнаяОрганизация в области 02.

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

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

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

Один предопределенный элемент имел одинаковую ссылку во всех областях данных.

При обмене данными с использованием РИБа предопределенные данные передавались только с изменениями конфигурации прикладного решения. Управлять созданием и обновлением предопределенных данных было невозможно.

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

You have no rights to post comments

Skip to content

1С, что такое предопределенный элемент, как создать?

Что такое предопределенный элемент, как создать?

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

Пример создания предопределенного элемента:

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

  • Заходим в конфигуратор;
  • Открываем справочник договоры -> Прочее -> Предопределенные

  • Нажимаем кнопку «Создать» (зеленый круг с плюсом), затем заполняем «Имя», без пробелов.

  • Обновляем базу;
  • Затем в пользовательском режиме открываем справочник «Договоры». Видим, что уже есть 1 элемент справочника, созданный нами в конфигураторе. Договор помечен желтым кружком, что говорит нам о том, что он предопределенный.

Пример программного обращения к предопределенному элементу

Создадим обработку, с формой, на форму выведем кнопку. При нажатии на кнопку организуем вывод сообщения с наименованием договора созданного в конфигураторе.

Пример процедуры:

&НаСервере
Процедура СообщитьНаименованиеПредопределенногоЭлементаНаСервере()
	// Пример обращения с помощью встроенного языка
	Сообщить(Справочники.Договоры.ДоговорПодряда); 
	Сообщить(Справочники.Договоры.ДоговорПодряда.Наименование); 
	Сообщить(Справочники.Договоры.ДоговорПодряда.Код); 	
КонецПроцедуры

Пример использования предопределенных элементов в СКД

  • Данные элементы мы можем использовать при отборе, в схеме компоновки данных. Создадим отчет СКД, с текстом запроса:
ВЫБРАТЬ
	ЗаказПокупателя.Ссылка КАК Ссылка,
	ЗаказПокупателя.ВерсияДанных КАК ВерсияДанных,
	ЗаказПокупателя.ПометкаУдаления КАК ПометкаУдаления,
	ЗаказПокупателя.Номер КАК Номер,
	ЗаказПокупателя.Дата КАК Дата,
	ЗаказПокупателя.Проведен КАК Проведен,
	ЗаказПокупателя.Контрагент КАК Контрагент,
	ЗаказПокупателя.Договор КАК Договор
ИЗ
	Документ.ЗаказПокупателя КАК ЗаказПокупателя
  • Далее в форме СКД переходим на вкладку Настройки -> Отбор -> Договор, переместить в правую область -> Выбрать «Договор подряда» из доступных значений;

  • Результат запроса будет отфильтрован по договору подряда.

Связанные статьи

Понравилась статья? Поделить с друзьями:
  • Идеи бизнеса 2023 году с минимальными вложениями
  • Железнодорожные кассы в митино адрес часы работы
  • Заполнить реквизиты для уплаты страховых взносов
  • Идеи бизнеса в частном доме без больших вложений
  • Железяка автозапчасти на мкаде 86 км часы работы