Помощь - Поиск - Пользователи - Календарь
Полная версия: Доступ к элементу подчинённого справочника
1C-PRO - Форум по 1С > Форумы по платформе "1С:Предприятие 8.x" > (8.х) Конфигурирование на платформе "1С:Предприятие 8.x"
DDRON
Добрый день.
Есть справочник Контрагенты.
Есть подчинённый ему справочник ДоговорыКонтрагентов.

В свойстах справочника ДоговорыКонтрагентов в качестве владельца стоит Справочник.Контрагенты.
А вкладка "Ввод на основании" пустая.

Я програмно создаю документ в котором есть поля "Контрагент" и "ДоговорКонтрагента".

Если с записью контрагента проблем не возникает:
Код

НовДок.Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту("СтарыйКод",Строка(Лист.Cells(2, 3).Value));
//Пояснение: значение реквизита "старый код" я беру из соответствующего поля экселевского документа


То как Записать в "НовДок.ДоговорКонтрагента" договор, соответствующий выбранному выше контрагенту я не знаю. Подскажите пожалуйста.
ПОиск юзал, но точно такой же задачи не нашёл, а с помощью имеющихся разобраться не смог.

tunec
конфигурация?

1) можно запросом, выбрать контрагента и подцепить к нему соответствующие записи справочника ДоговорыКонтрагентов... Только как-то неправильно получается... некрасиво...
2) в семерке есть "использоватьВладельца"... В восьмерке это "выбрать". Получается что-то вроде:
Код
НовДок.Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту("СтарыйКод",Строка(Лист.Cells(2, 3).Value));
Струк = новый Структура("Наименование"); //Структура нужна чтобы устроить отбор по реквизиту
Струк.Наименование = <наимДоговора>;
СпрДог = Справочники.ДоговорыКонтрагентов;
Выборка = СпрДог.Выбрать(,НовДок.Контрагент,Струк,); //Похоже это спец процедура для выбора из подчиненного справочника, по крайней мере в ней есть все что нужно
Если Выборка.Следующий() тогда //предыдущий код возвращает значение с типом выборка
НовДок.ДоговорКонтрагента = Выборка.ПолучитьОбъект();
конецесли;




Вот написал быстренько код, и кажется, что он работать не будет... Но если пробовал бы делать через объектную модель, и по простому выбрать не получалось бы, то лез бы наверно через этот проход :)

П.С. А какой код у тебя присваивает значение договора? Кстати а в справочнике договоров уникальность соблюдается?

п.п.с. добавил коментарии к коду
DDRON
Кхм...
1С: предприятние - Бухгалтерия предприятия, редакция 1.6

ИМХО либо я не понял что вы мне объясняете, либо вы меня.

Мне не нужны никакие выбырки и конструкции вроде "Выборка.Следующий".

У меня есть в документе 2 поля.
Одно - Контрагенты. ТипДанных - Справочники.Контрагенты.
Второе - ДоговорыКонтрагентов. Тип данных - Справочники.ДоговорыКонтрагентов.

Первому полю присваиваю значение так как написал в 1-ом сообщении.
Как присвоить значение второму полю?

Левая часть скорее всего такая:
Код
НовДок.ДоговорКонтрагента = ......

А что справа - я хз.
Справочник ДоговорыКонтрагентов - яявляется подчинённым для справочника Контрагенты. То есть каждому контрагенту соответствует 1 или более договоров (вроде всем только один, но не уверен)

Цитата
П.С. А какой код у тебя присваивает значение договора? Кстати а в справочнике договоров уникальность соблюдается?

Где посмотреть?
tunec
посмотреть в конфигураторе для этого справочника закладка "нумерация", галочка "контроль уникальности".

Просто в 7.7 есть фича связь по владельцу. Не выбрав предварительно владельца выбирать запись подчиненного справочника бесполезно. Вроде в 8 можно обойтись и без этого, но тогда может получиться, что у тебя в доке стоит связь по владельце между этими двумя полями, а договор подбирается не тот, т.е. от другого контрагента, .т.к. у него такой же код или наименование, или по чему ты там выбираешь... вот для этого и есть контроль уникальности.
x_under
В типовых сделано так:
Все зависит от того, какой договор ты туда хочешь подставить.

Код
// Получает договор контрагента по умолчанию с учетом условий отбора. Возвращается основной договор или единственный или пустая ссылка
//
// Параметры
// ВладелецДоговора – <СправочникСсылка.Контрагенты>
// Контрагент, договор которого нужно получить
// ОрганизацияДоговора – <СправочникСсылка.Организации>
// Организация, договор которой нужно получить
// СписокВидовДоговора – <Массив> или <СписокЗначений>, состоящий из значений типа <ПеречислениеСсылка.ВидыДоговоровКонтрагентов>
// Нужные виды договора
// СтруктураПараметров – <Структура>
// Структура дополнительных параметров отбора договоров по реквизитам.
// Элементы структуры СтруктураПараметров:
// Ключ - имя реквизита договора, Значение - еще одна структура
//
// Элементы структуры, которая находится в Значение:
// Ключ - "ЗначениеОтбора", Значение - значение реквизита договора для отбора. Обязательный элемент.
// Ключ - "ВидСравненияОтбора", Значение - <ВидСравнения>. Необязательный элемент, по умолчанию ВидСравнения.Равно
//
// Возвращаемое значение:
// <СправочникСсылка.ДоговорыКонтрагентов> – найденный счет или пустая ссылка
//
Функция УстановитьДоговорКонтрагента(ДоговорКонтрагента,ВладелецДоговора, ОрганизацияДоговора, СписокВидовДоговора=неопределено, СтруктураПараметров = Неопределено) Экспорт

НовыйДоговор = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();

Запрос = Новый Запрос;
ТекстЗапроса =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 2
| ДоговорыКонтрагентов.Ссылка,
| ВЫБОР
| КОГДА СправочникВладелец.Ссылка ЕСТЬ НЕ NULL
| ТОГДА 1
| ИНАЧЕ 2
| КОНЕЦ КАК Приоритет
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК СправочникВладелец
| ПО ДоговорыКонтрагентов.Владелец = СправочникВладелец.Ссылка
| И ДоговорыКонтрагентов.Ссылка = СправочникВладелец.ОсновнойДоговорКонтрагента
|ГДЕ
| &ТекстФильтра
|
|УПОРЯДОЧИТЬ ПО
| Приоритет";

Запрос.УстановитьПараметр("ВладелецДоговора", ВладелецДоговора);
Запрос.УстановитьПараметр("ОрганизацияДоговора", ОрганизацияДоговора);
Запрос.УстановитьПараметр("СписокВидовДоговора", СписокВидовДоговора);

ТекстФильтра = "
| ДоговорыКонтрагентов.Владелец = &ВладелецДоговора
| И ДоговорыКонтрагентов.Организация = &ОрганизацияДоговора
| И ДоговорыКонтрагентов.ПометкаУдаления = ЛОЖЬ"
+?(СписокВидовДоговора<>неопределено,"
| И ДоговорыКонтрагентов.ВидДоговора В (&СписокВидовДоговора)","");

Если ТипЗнч(СтруктураПараметров) = Тип("Структура") Тогда
Для каждого Параметр Из СтруктураПараметров Цикл
ИмяРеквизита = Параметр.Ключ;
СтруктураОтбора = Параметр.Значение;
ВидСравненияЗапроса = ПолучитьВидСравненияДляЗапроса(СтруктураОтбора);
ТекстФильтра = ТекстФильтра + "
| И ДоговорыКонтрагентов." + ИмяРеквизита + " " + ВидСравненияЗапроса + " (&" + ИмяРеквизита + ")";
Запрос.УстановитьПараметр(ИмяРеквизита, СтруктураОтбора.ЗначениеОтбора);
КонецЦикла;
КонецЕсли;

ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстФильтра", ТекстФильтра);

Запрос.Текст = ТекстЗапроса;
Результат = Запрос.Выполнить();

Если Не Результат.Пустой() Тогда

Выборка = Результат.Выбрать();
Выборка.Следующий();

НайденОсновнойДоговор = Выборка.Приоритет = 1;
НайденОдинДоговор = Выборка.Количество() = 1;

Если НайденОсновнойДоговор ИЛИ НайденОдинДоговор Тогда
НовыйДоговор = Выборка.Ссылка;
КонецЕсли;

КонецЕсли;

Если (ДоговорКонтрагента.Владелец<>ВладелецДоговора ИЛИ ДоговорКонтрагента.Организация<>ОрганизацияДоговора) ИЛИ (не ЗначениеЗаполнено(ДоговорКонтрагента)) Тогда
ДоговорКонтрагента = НовыйДоговор;
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;

КонецФункции // ПолучитьДоговорКонтрагента()

tunec
так он не хочет запросом! А реквизит, по которому отбирается договор лежит во внешнем файле...
x_under
Ну как только он расскажет по какому реквизиту он хочет искать договор, ему сразу напишут как это сделать.
Мастер_миража
Цитата(DDRON @ 22.9.2008, 12:07) *

Добрый день.
Есть справочник Контрагенты.
Есть подчинённый ему справочник ДоговорыКонтрагентов.

В свойстах справочника ДоговорыКонтрагентов в качестве владельца стоит Справочник.Контрагенты.
А вкладка "Ввод на основании" пустая.

Я програмно создаю документ в котором есть поля "Контрагент" и "ДоговорКонтрагента".

Если с записью контрагента проблем не возникает:
Код

НовДок.Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту(\"СтарыйКод\",Строка(Лист.Cells(2, 3).Value));
//Пояснение: значение реквизита \"старый код\" я беру из соответствующего поля экселевского документа



То как Записать в "НовДок.ДоговорКонтрагента" договор, соответствующий выбранному выше контрагенту я не знаю. Подскажите пожалуйста.
ПОиск юзал, но точно такой же задачи не нашёл, а с помощью имеющихся разобраться не смог.



честно говоря 1с 8 не юзал еще, но в 7.7
кажется можно:
СпрДоговор=создатьОбъект("Справочник.ДоговорКонтрагента");
СпрДоговор.ИспользоватьВладельца(Контрагент);
//получим все договоры контрагента и ищим срединих какой-нить подходящий






tunec
угу, тока в 8ке нет "использовать владельца"... :)

зато есть "отбор"...
DDRON
Проблему я вчера решил.
Код такой:
Код
Выборка = Справочники.ДоговорыКонтрагентов.Выбрать(,Справочники.Контрагенты.НайтиПоРеквизиту("СтарыйКод",Строка(Лист.Cells(2, 3).Value)));   
Пока Выборка.Следующий() цикл
ОбъектВыборка = Выборка.ПолучитьОбъект();
НовДок.ДоговорКонтрагента = ОбъектВыборка.Ссылка;
КонецЦикла;



Пояснения про реквизит "СтарыйКод" - в первом сообщении
tunec
учти, что если у тебя нет уникальности в пределах справочника, то этот код когда-нить тебе выкинет западло, подобрав не тот договор...

Если же нет - то не проблема :)

Я обычно подстаховываюсь и если есть владелец стараюсь сделать еще и отбор по нему... тем более, что он тебе известен...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2009 Invision Power Services, Inc.