Имя: Пароль:
1C
1С v8
Найти элемент по владельцу
0 PiotrLoginov
 
02.11.12
19:18
Здравствуйте всем. Переношу данные в восьмерку. В одном из ПКО пишу:

Объект.БанковскийСчетКонтрагента = Справочники.БанковскиеСчетаКонтрагентов.НайтиПоРеквизиту("Владелец",Объект.Контрагент,,Объект.Контрагент);

То есть я хочу, чтобы во время загрузки данных в справочник базы-приемника при создании очередного элемента после заполнения нескольких реквизитов этого элемента, в том числе реквизита Контрагент (за это отвечает другой код, ранее выполняемый), программа считала значение этого реквизита, обратилась в справочник БанковскиеСчетаКонтрагентов и нашла там элемент с таким владельцем-контрагентом. Такое возможно?

Допустим, она контрагента считала успешно. Как быть далее? На данный момент при попытке перенести получаю:

"Ошибка при вызове метода контекста (НайтиПоРеквизиту): Неверно указан реквизит"

Не нашел в СП, каким же методом воспользоваться. Нашел на мисте это: v8: как найти элемент справочника по владельцу . Насколько понял, там предложили сделать запрос на получение ссылки на искомый элемент. А попроще никак не получится?

Допустим, попроще никак. Тогда значит надо составить запрос на получение ссылки на элемент справочника БанковскийСчетКонтрагента и вписать условие что-то вроде ГДЕ Владелец = "Такое-то наименование контрагента" Можно ли такое вписывать в обработчик ПКО?

В общем, для моего уровня засада полная... Прошу помощи. Заранее спасибо.
1 Wobland
 
02.11.12
19:21
запрос - это хорошо. это ничего, что страшный, это хорошо. и с наименованиями не работай. в твоём случае ссылка в ГДЕ. далее. я в отдельных случаях по коду ищу, пусть мои юзеры переименовывают как хотят
2 PiotrLoginov
 
02.11.12
19:21
* в одном из ПКО пишу:

после загрузки:

Объект.БанковскийСчетКонтр ... *далее по тексту*
3 Wobland
 
02.11.12
19:24
я так и не увидел, в каком событии ты это делаешь, кстати
4 Ork
 
02.11.12
19:25
(0)
1. У "Владельца" может быть несколько подчиненных.
2. У "владельца" может не быть подчиненных вообще.

Посему нужен не поиск по реквизиту, а выборка. И если в ней есть что-либо тогда из всех нужно выбрать того, который вам больше подходит.
5 Wobland
 
02.11.12
19:26
(4) а запросом достать и посмотреть? у меня так где-то делается, но из дома не покажу
6 Ork
 
02.11.12
19:27
+(4) Вот это вот : "ГДЕ Владелец = "Такое-то наименование контрагента"" - вообще феерично.
Владельцем может быть только элемент справочника. И ни в коем случае не его наименование.
7 Ork
 
02.11.12
19:28
(5) Как получать выборку - не важно. Хотя сама 1С рекомендует запрос.
8 Wobland
 
02.11.12
19:28
(6) а наименование у владельца может совпадать с нужным наименованием ;)
П.С. это явный и безусловный копроподход, которым часто страдают мм... новички
9 Wobland
 
02.11.12
19:30
(7) я об этом:
Если Количество=1 Тогда
//нам подходит, его берём
ИначеЕсли Количество=0 Тогда
//создаём новый элемент
Иначе
//что-то иначе
10 hohol
 
02.11.12
19:43
Владелец  не реквизит. Реквизит должен быть  проиндексирован. По коду всю жизнь искали. И ты ищи по коду. В методе НайтиПоКоду есть свойство владелец.
11 Ork
 
02.11.12
20:35
(10) "И ты ищи по коду". У ТС нет кода. У него есть Контрагент, а у контрагента есть расчетные счета. Какой код выбрать?
Есму нужно именно получить выборку элементов подчиненных Владельцу.
12 hhhh
 
02.11.12
21:46
(11) вроде нет у него контрагента.
13 PiotrLoginov
 
02.11.12
23:07
К сожалению, пришлось отбежать от компа...

(3) ПКО для справочника Договоры. Каждый элемент справочника Договоры в базе-приемнике имеет реквизит Контрагент (ссылка на элемент справочника Контрагенты) и реквизит СчетКонтрагента (ссылка на элемент справочника БанковскиеСчетаКонтрагентов). Для того, чтобы у каждого из формируемых в приемнике элементов был заполнен реквизит СчетКонтрагента, в обработчике ПКО "после загрузки:" пишу:

Объект.БанковскийСчетКонтрагента = Справочники.БанковскиеСчетаКонтрагентов.НайтиПоРеквизиту("Владелец",Объект.Контрагент,,Объект.Контрагент);

Раньше всегда использовал НайтиПоНаименованию. Срабатывало безукоризненно. В данном случае Наименование не подходит. Но можно ориентировать программу на только что заполненный в элементе реквизит Контрагент.

Я вот что думаю: у метода НайтиПоНаименованию НайтиПоРеквизиту четвертый параметр - Владелец искомого элемента. Если бы в первый параметр вписать символ, означающий "любая последовательность символов"... Не ?
14 PiotrLoginov
 
03.11.12
00:10
Короче. Написал так:

   Запрос = Новый Запрос;
   Запрос.Текст =  "ВЫБРАТЬ
   |    ДоговорыКонтрагентов.БанковскийСчетКонтрагента.Ссылка
   |ИЗ
   |    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
   |ГДЕ
   |    ДоговорыКонтрагентов.БанковскийСчетКонтрагента.Владелец = &Владелец";
   Запрос.УстановитьПараметр("Владелец", Объект.Контрагент);
   Счет = Запрос.Выполнить().Выгрузить();

Объект.БанковскийСчетКонтрагента = Счет;

Не помогло. Реквизит у выгруженных элементов незаполнен.
15 PiotrLoginov
 
03.11.12
00:17
(4) В моем случае я знаю наверняка, что у каждого контрагента ровно один подчиненный элемент в справочнике БанковскиеСчетаКонтрагентов
16 hhhh
 
03.11.12
02:08
(15) как бы голову тебе совершенно снесло. В счет у тебя ведь таблица значений. И ты целую огромную таблицу значений пытаешься запихнуть в маленький элементик банковский счет.
17 PiotrLoginov
 
03.11.12
03:51
После долгих поисков  добился положительного результата:

Запрос = Новый Запрос;
   Запрос.Текст =  "ВЫБРАТЬ
|    БанковскиеСчетаКонтрагентов.Ссылка КАК БСКС
|ИЗ
|    Справочник.БанковскиеСчетаКонтрагентов КАК БанковскиеСчетаКонтрагентов
|ГДЕ
|    БанковскиеСчетаКонтрагентов.Владелец = &Владелец";
   Запрос.УстановитьПараметр("Владелец", Объект.Контрагент);
   Если Запрос.Выполнить().Пустой() Тогда
       Сообщить ("Здесь не нашелся Банковский счет");
   Иначе
       Результат = Запрос.Выполнить().Выгрузить();
   Счет = Результат[0].БСКС;    
КонецЕсли;
Объект.БанковскийСчетКонтрагента = Счет;
18 PiotrLoginov
 
03.11.12
04:03
Думаю, тема раскрыта :) Но всплыли новые проблемы. Всех неравнодушных милости прошу сюда: v8: УТ11: после переноса бывает, что в форме выбора не отображаются элементы