• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

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

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Группы справочника, 1с77

  • Автор темы lira89
  • Дата начала
L

lira89

Здравствуйте. Есть два вопроса:
1) Как запретить создание новой группы в справочнике (вот например создание нового элемента можно запретить в процедуре ВводНового(), поставив СтатусВозврата(0), а как быть с группой)?
2) Есть трехуровневый справочник. Есть реквизит ФормыЭлемента данного справочника справочника "Группа". Нужно, чтобы при выборе данного реквизита открылась форма списка 3-х уровневого справочника и видны были только группы второго уровня и можно было выбрать данные папки и ,если их открывать, то не видно было бы элементов, которые записаны в эту папку. Есть метод ВыборГрупп(1) и тогда можно выбрать папку, но когда я пишу его в процедуру ПриОткрытии, то я вижу и элементы данной папки и папки 1го уровня. что в таких случаях надо делать?
 
V

vbs

1. То же самое проделать в ФОРМЕ ГРУППЫ справочника
2. Похоже, что для этого придется написать программку, имитирующую форму списка.
Например, предварительно заполнить ТЗ только группами 2-го уровня и сделать на этой ТЗ вызов соответствующей группы при клике по таблице.
Еще попробуй поисследовать процедуру ИспользоватьСписокЭлементов, может, это поможет, я ее подробно не изучал
 
P

puh14

1)Поставь проверки в форме списка и в форме группы на ЭтоГруппа() = 1 В процедуре вводнового()
2)Вариант - сделать отдельную форму списка, на которой оставить только дерево групп. Вариант два - программно делать список значений подчиненных групп с выбором из него. ИспользоватьСписокЭлементов - тоже катит, только надо очень аккуратно делать, иначе будет гора красных крестиков в форме списка.
 
U

User1C

Здравствуйте. Есть два вопроса:
1) Как запретить создание новой группы в справочнике (вот например создание нового элемента можно запретить в процедуре ВводНового(), поставив СтатусВозврата(0), а как быть с группой)?
2) Есть трехуровневый справочник. Есть реквизит ФормыЭлемента данного справочника справочника "Группа". Нужно, чтобы при выборе данного реквизита открылась форма списка 3-х уровневого справочника и видны были только группы второго уровня и можно было выбрать данные папки и ,если их открывать, то не видно было бы элементов, которые записаны в эту папку. Есть метод ВыборГрупп(1) и тогда можно выбрать папку, но когда я пишу его в процедуру ПриОткрытии, то я вижу и элементы данной папки и папки 1го уровня. что в таких случаях надо делать?


1) Процедура ПриВводеСтроки()
СтатусВозврата(0);
КонецПроцедуры

Так же может пригодиться: ПриОткрытии() укажи РедактироватьВДиалоге(0,0), и в справочнике поставь редактировать: обеими способами!

2) Используй УстановитьОтбор(), или пиши обработку, которая бы отображала на форме то что ты хочешь видить.
 
L

lira89

Всем спасибо за ответы. А вот еще вопросик возник:
Я делаю подбор значений в документе с помощью след кода:
Код:
Процедура ОбработкаПодбора(ЗначениеПодбора)
Студент = ЗначениеПодбора; 
КонецПроцедуры
Процедура ВыборФормы()	 //повешена на кнопку	 
ОткрытьПодбор("Справочник.Обучение","ФормаСпискаДляОплаты"); 
Конецпроцедуры
В справочнике обучение я сделала отдельную форму списка и написала в ней след код:
Код:
Процедура ПриОткрытии()	
СписокЭлементов=СоздатьОбъект("СписокЗначений");
СпрОб =СоздатьОбъект("Справочник.Обучение");
СпрОб.ВыбратьЭлементы();
Пока СпрОб.ПолучитьЭлемент() = 1 Цикл
Если СпрОб.ТекущийЭлемент().ЭтоГруппа()=0 Тогда							//если элемент не группа то добавляю его в список
СписокЭлементов.ДобавитьЗначение(СпрОб.ТекущийЭлемент());
КонецЕсли;
КонецЦикла;	 
ИспользоватьСписокЭлементов(СписокЭлементов); 
КонецПроцедуры
Т.е. должна открыться форма списка со списком всех элементов справочника и без папок, но открывается форма списка, в которой есть элементы, но они пустые!!! и на папочках стоит красный вопросик!!!. Что здесь не срабатывает или что не так, почему пустые значения реквизитов и откуда взялись красные вопросы и что они значат?
 
V

vbs

Это засада !
ИспользоватьСписокЭлементов(СписокЭлементов);
Как я его ни вертел - не работает !
Может, это не для среднего ума ? :ya_lamo:

Puh14, подсказывай, в чем проблема !

PS. Я бы плюнул, сформировал нужный список (или ТЗ) и выбирал бы элемент из них, а не из формы списка
 
K

kaa

попробуй перед использованием ИспользоватьСписокЭлементов - отключить иерархию
 
U

User1C

СписокЭлементов=СоздатьОбъект("СписокЗначений");
СпрОб =СоздатьОбъект("Справочник.Обучение");
СпрОб.ВыбратьЭлементы();
Пока СпрОб.ПолучитьЭлемент() = 1 Цикл
Если СпрОб.ТекущийЭлемент().ЭтоГруппа()=0 Тогда
СписокЭлементов.ДобавитьЗначение(СпрОб.ТекущийЭлемент());
КонецЕсли;
КонецЦикла;
//ИспользоватьСписокЭлементов(СписокЭлементов);

ОткрытьПодбор("Справочник.Обучение","ИмяФормы",СписокЭлементов,1); //будет тебе отобранный список без папок
 
P

puh14

Это засада !
ИспользоватьСписокЭлементов(СписокЭлементов);
Как я его ни вертел - не работает !


Уххх - если честно я так и не смог заставить его работать как мне надо. Если ты хочешь вывести чисто элементы без иерархии - тогда делаешь как в предыдущем ответе, проблем нет. Можно и с иерархией - но это охрененный гемор - при каждой смене родителя надо формировать список заново чтоб в нем были только элементы внутри выбранного родителя. Иначе будут красные вопросики и пустые элементы ;-)
 
L

lira89

ОткрытьПодбор("Справочник.Обучение","ИмяФормы",СписокЭлементов,1); //будет тебе отобранный список без папок
Я что-то непоняла, этот кусок кода надо писать в форме списка справочника?
А что тогда в документе на кнопку вешать, ведь у меня там на кнопке была процедура:????
Код:
Процедура ВыборФормы()	 //повешена на кнопку	 
ОткрытьПодбор("Справочник.Обучение","ФормаСпискаДляОплаты"); 
Конецпроцедуры
 
U

User1C

Я что-то непоняла, этот кусок кода надо писать в форме списка справочника?
А что тогда в документе на кнопку вешать, ведь у меня там на кнопке была процедура:????
Код:
Процедура ВыборФормы()	 //повешена на кнопку	 
ОткрытьПодбор("Справочник.Обучение","ФормаСпискаДляОплаты"); 
Конецпроцедуры


На кнопку в документе повесь :

Код:
Процедура ВыборФормы()	 //повешена на кнопку

СписокЭлементов=СоздатьОбъект("СписокЗначений");
СпрОб =СоздатьОбъект("Справочник.Обучение");
СпрОб.ВыбратьЭлементы();
Пока СпрОб.ПолучитьЭлемент() = 1 Цикл
Если СпрОб.ТекущийЭлемент().ЭтоГруппа()=0 Тогда 
СписокЭлементов.ДобавитьЗначение(СпрОб.ТекущийЭлемент());
КонецЕсли;
КонецЦикла; 
//ИспользоватьСписокЭлементов(СписокЭлементов); 

ОткрытьПодбор("Справочник.Обучение","ФормаСпискаДляОплаты",СписокЭлементов,1); //будет тебе отобранный список без папок

Конецпроцедуры
 
L

lira89

Вот все хорошо, да вот только в список значений попадают нужные значения (это очень радует), а в документе открывается форма и в ней все равно присутствуют папки, только у них нет названия. Справочник 3-х уровневый. Я попробовала написать в форме списка справочника ИерархическийСписок(0,0);, но ведь это тоже не решает проблему, папки все равно видны.
Прошу прощения за навязчивость, но что тут-то не так?
 
V

vbs

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

User1C

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

Код:
СписокЭлементов=СоздатьОбъект("СписокЗначений");
СпрОб =СоздатьОбъект("Справочник.Обучение");
СпрОб.ВыбратьЭлементы();
Пока СпрОб.ПолучитьЭлемент() = 1 Цикл
// Если Спр.ПринадлежитГруппе(Родитель_какой_то_добавь_на_форму_документа)=1 Тогда
Если СпрОб.ТекущийЭлемент().ЭтоГруппа()=0 Тогда 
СписокЭлементов.ДобавитьЗначение(СпрОб.ТекущийЭлемент());
КонецЕсли;
// КонецЕсли;
КонецЦикла; 
//ИспользоватьСписокЭлементов(СписокЭлементов); 

ОткрытьПодбор("Справочник.Обучение","ФормаСпискаДляОплаты",СписокЭлементов,1); //будет тебе отобранный список без папок

А в справочнике Обучение, на форме ФормаСпискаДляОплаты поставь обязательно вот это:

//*************************************************
Код:
Процедура ПриОткрытии()
Если ПустоеЗначение(Форма.Параметр)=0 Тогда
ИерархическийСписок(0,0);
ИспользоватьСписокЭлементов(Форма.Параметр);
КонецЕсли;
КонецПроцедуры
//*************************************************
Код:
Процедура ПриЗакрытии()
ИерархическийСписок(1,1);
КонецПроцедуры
 
L

lira89

Всем большое спасибо, все получилось и работает как надо :)
Только у меня еще вопросик возник, немножко не по тому, что обсуждалось выше. Вот на форме документа есть две кнопки, на каждую из которой повешена процедура (пускай ради примера будет описанная выше процедура ВыборФормы1() и ВыборФормы2()), которая содержит метод ОткрытьПодбор(данный метод идентичен в обоих процедурах и формирует один и тот же список элементов). Процедуры идентичные по своему составу. Однако в процедуре ОбработкаПодбора(ЗначениеПодбора) мне нужно, чтобы в один реквизит документа попало значение, выбранное с помощью первой кнопки, а во второй реквизит - значение, выбранное с помощью второй кнопки. Если сформировать вопрос короче, то можно ли формировать на одной форме несколько подборов и как потом различить, результат какого подбора в какой реквизит записывать (ведь я как понимаю, то процедура ОбработкаПодбора должна быть одна в модуле формы?)? Вобщем, как вы успели заметить, то я не особо дружу с данными процедурами и в книгах ответа не нашла, так что надеюсь на вашу помощь)
 
U

User1C

В ОткрытьПодбор(...), добавить еще один парамет (какой нибудь флаг, например передай 0 - это кнопка подбора №1, а 1 - это кнопка подбора №2), после тогда как передашь этот параметр, то дальше выполняй соответствующий алгоритм для определенной кнопки!

Можно еще проще, создай переменку в модуле, например Нкопки. Когда счелкнишь по кнопке 1 ВыборФормы1(1) и соостветственно ВыборФормы1(2) у тя передасться зн. 1 или 2. а дальше все просто, в зависимости от передаваемого значения присваивай значение определенному реквизиту на форме.
 
V

vbs

Можно еще проще, создай переменку в модуле, например Нкопки. Когда счелкнишь по кнопке 1 ВыборФормы1(1) и соостветственно ВыборФормы1(2) у тя передасться зн. 1 или 2. а дальше все просто, в зависимости от передаваемого значения присваивай значение определенному реквизиту на форме.
Вроде и ответы разумные, а вот стиль...
А раньше, вроде, вполне грамотно писал :)


Добавлено:
В ОткрытьПодбор(...), добавить еще один парамет (какой нибудь флаг, например передай 0 - это кнопка подбора №1, а 1 - это кнопка подбора №2), после тогда как передашь этот параметр, то дальше выполняй соответствующий алгоритм для определенной кнопки!
Думаю, точнее эти действия производить в процедуре ОбработкаПодбора()
 
Мы в соцсетях:

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