• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Создание Групп В Справочнике

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

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

puh14

Ну так создай, проблема то в чем? Есть встроенный реквизит Владелец для подчиненных справочников. Заполнен - владелец есть, не заполнен - нетути.
 
G

Guest

Ну так создай, проблема то в чем? Есть встроенный реквизит Владелец для подчиненных справочников. Заполнен - владелец есть, не заполнен - нетути.

ну вот смотри
есть справочник ДисциплиныУчебногоПлана и его владелец УчебныеПланыСпециальностей
получается я должен создать группу и элемент, чтобы это всё отобразилось во 2-м

б = Справочники.ДисциплиныУчебногоПлана.СоздатьЭлемент();
б.Владелец = Справочники.УчебныеПланыСпециальностей;
б.Дисциплина = "111";
б.Записать();
(это мои предположения)
помоги пожалуйста :blush:
 
P

puh14

б.Владелец = Справочники.УчебныеПланыСпециальностей

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

б.Владелец = Справочники.УчебныеПланыСпециальностей.НайтиПоКоду("0001");
 
D

Darlock

А не проще в конструкторе заполнить вкладку "Владельцы"? И указать, что владелец одного справочника - элементы другого.
 
G

Guest

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

б.Владелец = Справочники.УчебныеПланыСпециальностей.НайтиПоКоду("0001");


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

В моем случае появляется форма Нового элемента, создается Код и мне тут уже нужно автоматом добавить группы
Как мне обратиться к этому "новому" коду?
 
A

Allexei

С каждой темой вопросы все интереснее и интереснее... А ЖКК не читает уже ни кто...Я рад что есть такие люди, благодаря им у меня всегда есть работа :))))

А теперь по теме:
1. Создали элемент владелец.
2. В модуле объекта объявили переменную "ЭтоНовый". Если элемент новый присвоили ей истину.
3. При записи написали следующий код:
Процедура ПриЗаписи(Отказ)
Если ЭтоНовыйОбъект Тогда
//Создали структуру подчиненых элементов
КонецЕсли;
КонецПроцедуры
 
D

Darlock

"2. В модуле объекта объявили переменную "ЭтоНовый". Если элемент новый присвоили ей истину."

в обработчике "ПередЗаписью()" доступна функция "ЭтоНовый()" - опять же, если это 8.х
 
A

Allexei

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

Darlock

Вот именно, функция "ЭтоНовый()" и возвращает Истина или ложь. я с обработчиком ошибся, "ПриОткрытии()" или "ПередОткрытием()" целесообразней использовать.

Код:
ЭтоНовый (IsNew)
Синтаксис:
ЭтоНовый() 
Возвращаемое значение:
Тип: Булево. Истина - изменяется еще ни разу не записанный элемент; Ложь - элемент уже записан. 
Описание:
Определяет, записан ли элемент в базу данных. 
Пример:
Если Объект.ЭтоНовый() Тогда
Объект.Наименование = "Новый элемент";
КонецЕсли;
 
A

Allexei

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

Darlock

В целом, прав. Возникает пара вопросов:
1 - как себя поведет платформа при появлении переменной по имени совпадающей с функцией?
2 - почему не использовать метод "ПолучитьСсылкуНового()"?

Отсюда следующий вариант развития -
1) имеем ссылку на не записаный объект.
2) в транзакции начинаем создавать все группы в дочернем справочнике и в случае косяка транзакцию отменяем (группы удаляются) и элемент не записан.
 
G

Guest

Да сложняк понять что вы тут понаписали... работаю в 1С давно а такого ещё не видел... в чём суть парни?
 
A

Allexei

1. Ни как не повлияет, да и имя переменной может быть любое.
2. Вопрос, где получаем ссылку нового?В какой момент времени? Если до того как объект будет записан то как раз и будем "иметь ссылку на не записанный объект". Если после того как объект записан(например в теле процедуры ПриЗаписи()) то для нового объекта он выдаст ссылку, а для перезаписываемого объекта - ошибку. Конечно ошибку можно в попытку вставить но... не нравятся мне эти попытки и исключения.
3. По поводу создания в транзакции и прочего, так транзакцию всегда можно откатить, да и вообще это не касается данного вопроса.

Я предложил самый простой (на мой взгляд) вариант, который не является на 100% самым оптимальным и правильным, но я бы что бы не забивать себе голову сделал бы так. :)
 
G

Guest

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

б = Справочники.ДисциплиныУчебногоПлана.СоздатьГруппу();
р=Справочники.ДисциплиныУчебногоПлана.НайтиПоНаименованию("Дисциплины учебного плана"); // это корневая группа
б.Наименование = "111";
б.Владелец=Справочники.УчебныеПланыСпециальностей.НайтиПоКоду(); // ЧТО здесь писать???
б.Родитель=р;
б.Записать();


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

б.Владелец=Справочники.УчебныеПланыСпециальностей.НайтиПоКоду("000001");


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

Allexei

Отлично, тогда вопрос. Форму открыли, создали группы, а потом форму закрыли без записи? что с группами?Остались? И вообще ежели не секрет а зачем все это? Почему нельзя создавать группы когда пользователь запишет элемент владелец.
 
G

Guest

да потому что мне все группы нужно программно добавить, а не ручками в уже открытой форме

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

puh14

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

Дайнеко

А что, дело так и не сдвинулось?

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!