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

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

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

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

Запросы к справочнику

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

lira89

Здравствуйте. У меня следующая ситуация. Мне нужно с помощью запроса, который находиться в модуле документа, найти элемент справочника провести в нем изменения (например изменить адрес) и записать(сохранить) изменения. С помощью запроса я получила элемент справочника в переменную Эл (код запроса ниже):
Код:
Запр = СоздатьОбъект("Запрос");
Текст = "//{{Запр()
|Период С {ДатаПериода} По {ДатаПериода};
|Эл = Справочник.Обучение.ТекущийЭлемент;
|Студ = Справочник.Обучение.ФизЛицо;
|Фак = Справочник.Обучение.Факультет;
|Спец = Справочник.Обучение.Специальность;
|Группировка Эл Упорядочить По Эл.Наименование Без Групп;
|Условие ((Студ = ФизЛицо) и (Фак = Факультет) и (Спец = Специальность));
|"//}}ЗАПР

Чтобы сохранить какие либо изменения в данном элементе справочника должна выполнить следующее :
Код:
СпрОб.НайтиЭлемент(Запр.Эл);
СпрОб.Адрес = Адрес;
СпрОб.Записать()
Я не могу написать Запр.Эл.Записать, потому что это элемент, а не обект. Или можно обойтись без метода НайтиЭлемент()???Если да, то каким образом? Если использовать следующий код:
Код:
Запр.Эл.Адрес = Адрес;
СпрОб.Записать()
то данные не записываются.
 
K

KiR

СпрОб = создатьОбъект("Справочник."нужный тип справочника"")?
 
A

Andruha

Где полный код - выборка запроса, чтоб увидеть как ты ищешь этот эл. справочника?
 
H

Hryv

Во-первых, как уже заметил KiR, действительно ли
СпрОб = СоздатьОбъект("Справочник.Обучение");
???

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

В третьих, хорошо бы проверить, а вдруг Адрес - это периодический реквизит
 
V

vitfil

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

lira89

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

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

СпрОб = СоздатьОбъект("Справочник.Обучение");
 
L

lira89

я так и делала, просто думала, что возможно ли было бы обойтись без метода НайтиЭлемент, ведь у на в Запр.Эл уже есть элемент справочника Обучение . Только вот метод Записать тогда не применишь к элементу(
 
H

Hryv

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

Для того, что между
|"//}}ЗАПР

и
СпрОб.НайтиЭлемент(Запр.Эл);

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


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

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