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

lira89

Well-known member
12.03.2010
154
0
#1
Здравствуйте. У меня следующая ситуация. Мне нужно с помощью запроса, который находиться в модуле документа, найти элемент справочника провести в нем изменения (например изменить адрес) и записать(сохранить) изменения. С помощью запроса я получила элемент справочника в переменную Эл (код запроса ниже):
Код:
Запр = СоздатьОбъект("Запрос");
Текст = "//{{Запр()
|Период С {ДатаПериода} По {ДатаПериода};
|Эл = Справочник.Обучение.ТекущийЭлемент;
|Студ = Справочник.Обучение.ФизЛицо;
|Фак = Справочник.Обучение.Факультет;
|Спец = Справочник.Обучение.Специальность;
|Группировка Эл Упорядочить По Эл.Наименование Без Групп;
|Условие ((Студ = ФизЛицо) и (Фак = Факультет) и (Спец = Специальность));
|"//}}ЗАПР
Чтобы сохранить какие либо изменения в данном элементе справочника должна выполнить следующее :
Код:
СпрОб.НайтиЭлемент(Запр.Эл);
СпрОб.Адрес = Адрес;
СпрОб.Записать()
Я не могу написать Запр.Эл.Записать, потому что это элемент, а не обект. Или можно обойтись без метода НайтиЭлемент()???Если да, то каким образом? Если использовать следующий код:
Код:
Запр.Эл.Адрес = Адрес;
СпрОб.Записать()
то данные не записываются.
 

KiR

НЕ шибка опытный програмер)
11.09.2007
1 581
0
#2
СпрОб = создатьОбъект("Справочник."нужный тип справочника"")?
 
A

Andruha

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

Hryv

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

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

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

vitfil

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

lira89

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

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

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

lira89

Well-known member
12.03.2010
154
0
#8
я так и делала, просто думала, что возможно ли было бы обойтись без метода НайтиЭлемент, ведь у на в Запр.Эл уже есть элемент справочника Обучение . Только вот метод Записать тогда не применишь к элементу(
 
H

Hryv

#9
Вот и для чего это? Если в запросе получена ссылка, значит элемент есть. Особенно для служебного справочника. Насколько я понял, тот таковым и является.
Для того, что между
|"//}}ЗАПР

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

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


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