Преобразовать элемент в группу 1с

Обновлено: 07.07.2024

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

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

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

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

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

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

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

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

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

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

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

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

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

Справочник организации - предопределенный элемент

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

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

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

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

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

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

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

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

Выбор полей

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

2 thoughts on “ Предопределенные элементы справочников 1С 8.3 ”

аааагромное спасибо это понятно, а все-таки именно преобразовать можно типа флажок где-нить поменять?

:))которую неделю изучаем 1С. если бы спросил субсчет в счет я бы еще понял про флажки. но ЭТО. ))прямо хоть СС пиши кандидата.

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

Если внутри группы нет ничего, то правь ДБФ файл справочника. Хотя если есть ссылки, то надо еще подумать

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

это просто ошибочная группа, нафиг не нужна, я потому и захотел в элемент преобразовать

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

Поставь IsFolder = 1, и удали индексный файл. Ничего базе не будет, сглючит поменяешь назад

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

этта. Отойди подальше от базы и ничего не трогай! раз уж задаёшь _такие_ вопросы.

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

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

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

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

Загляни в 1cv77.dds. Потом в BOL от SQL-сервера. Потом перечитай ветку.

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

Лазить в таблицы нужно только по большой необходимости. Это не только опасно (как уже сказали), но в большинстве случаев прежде всего глупо, ибо гораздо более трудоёмко, чем штатными методами. Правильный ответ - в .

Указанная форма - это форма группы, она даже как основная помечена. Открывается именно она. Но когда я там жму "записать и закрыть", то создается ЭЛЕМЕНТ, а не группа. Уже час бьюсь, что я сделал не так??

в общем маразм да и только. Странно, что в сети никто с этим не сталкивался.

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


я когда-нибудь поймаю главного одинэсника и выскажу ему все, что накопилось за столько лет. Это ж надо додуматься, что в форму группы нужно отправлять параметр ЭтоГруппа, чтобы не дай бог не создался элемент ИЗ ФОРМЫ ГРУППЫ! Да еще и по реквизиту, который везде только на чтение. Браво.

(2) Euroset1, и чего б я ото злился :) Нужно же просто почитать СП.

Интерфейс (управляемый) - Управляемая форма - Расширение справочника - Параметры формы

.
Там есть парочка интересных функций.

p.s.:
Новый метод (что бы тыком не ходить ;) ).

Следующий код по ссылке откроет форму элемента.

(3) dj_serega, да это я знаю как раз. Нехитрое дело открыть по ссылке. А речь шла именно о группе, которой еще нет. Вызываем форму группы, она благополучно открывается, дает заполнить данные и при сохранении вместо группы создает элемент. Это ненормально, что форме ГРУППЫ нужно передавать дополнительную подсказку, что нужно записывать именно группу. Это говорит о слабости платформы, отсутствии систематизации функционала. Желтыми книгами и синтаксом можно тыкать сколько угодно, но они в данном случае на правах мелкого текста внизу страницы на кредитном договоре.

(4) ElenaMoshko, к сожалению, мне приходится программировать на 1с порядка 10 лет. Я не использую многие из классов платформы по причине их непродуманности, заменяю стандартные механизмы самописными почти всегда и на это есть причины. По сути я использую 1с как СУБД и клиент-серверное ядро, потому что оно в этом плане более-менее годно и привычно. Франчи, как обычно, не поймут, но я и не стремлюсь к этому. Но каждый раз, когда я имею неосторожность воспользоваться стандартными механизмами (лень такая штука), то потом жалею об этом больше времени, чем писал бы кастом с нуля. Данная платформа обладает удивительной особенностью выдавать подводные камни при малейшей попытке сделать "как запланировал", а не "как все обычно делают по привычке". Я конечно понимаю, что они тянут лямку совместимости еще с 77. но уж навести порядок с формами давно пора. В 8.3.7 они попытались это сделать, но видно не до всего руки дошли.

Вызываем форму группы, она благополучно открывается, дает заполнить данные и при сохранении вместо группы создает элемент. Это ненормально, что форме ГРУППЫ нужно передавать дополнительную подсказку, что нужно записывать именно группу.

Ок. Представим ситуацию.
Есть Спр1. У него есть 10 реквизитов. Все они доступны как для элемента так и для группы.
Для создания элемента используется общая форма с типом основного реквизита Спр1Объект.

Вопрос:
Как платформе понять что пользователь хотел создать при открытии формы без ключа?

(6) dj_serega, как минимум, прийти к единому стандарту. Если дали возможность пользоваться общей формой, то при ее открытии в параметрах указывать в явном или неявном виде. Например, подсадить в путь по принципу ". МойСправочник.ФормаГруппы.Форма1", где Форма1 в данном случае доступна и по пути ". ФормаЭлемента.Форма1". С уходом от модальности всю плешь проели и со своим "режимом одного окна". А реальную функциональность платформы так и не привели в порядок.

Причем это я наименее корявый метод привел из всех вариантов "в их стиле". А самым лучшим вариантом будет, если ЭтоГруппа наконец станет доступен для редактирования и формы для групп и элементов будут различаться лишь в свойствах формы. После введения иерархичности между элементами это самый логичный шаг. Да и в некоторых случаях полезно иметь возможность элемент превратить в группу или наоборот. Частенько по этой причине приходится делать иерархию элементов и добавлять свой реквизит плюс подменять картинки в форме списка на значение этого реквизита.

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

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