8.х Доступ к элементу подчинённого справочника

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем DDRON, 22 сен 2008.

  1. TopicStarter Overlay
    DDRON
    Offline

    DDRON Опытный в 1С

    Регистрация:
    26 авг 2008
    Сообщения:
    55
    Симпатии:
    0
    Баллы:
    26
    Добрый день.
    Есть справочник Контрагенты.
    Есть подчинённый ему справочник ДоговорыКонтрагентов.

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

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

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

    tunec Опытный в 1С

    Регистрация:
    2 июн 2008
    Сообщения:
    469
    Симпатии:
    0
    Баллы:
    26
    конфигурация?

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

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

    п.п.с. добавил коментарии к коду
  3. TopicStarter Overlay
    DDRON
    Offline

    DDRON Опытный в 1С

    Регистрация:
    26 авг 2008
    Сообщения:
    55
    Симпатии:
    0
    Баллы:
    26
    Кхм...
    1С: предприятние - Бухгалтерия предприятия, редакция 1.6

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

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

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

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

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

    Где посмотреть?
  4. tunec
    Offline

    tunec Опытный в 1С

    Регистрация:
    2 июн 2008
    Сообщения:
    469
    Симпатии:
    0
    Баллы:
    26
    посмотреть в конфигураторе для этого справочника закладка "нумерация", галочка "контроль уникальности".

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

    x_under Модераторы Команда форума Модератор

    Регистрация:
    25 апр 2007
    Сообщения:
    2.576
    Симпатии:
    13
    Баллы:
    29
    В типовых сделано так:
    Все зависит от того, какой договор ты туда хочешь подставить.

    Код:
    // Получает договор контрагента по умолчанию с учетом условий отбора. Возвращается основной договор или единственный или пустая ссылка
    //
    // Параметры
    //  ВладелецДоговора	–	<СправочникСсылка.Контрагенты> 
    //							Контрагент, договор которого нужно получить
    //  ОрганизацияДоговора	–	<СправочникСсылка.Организации> 
    //							Организация, договор которой нужно получить
    //  СписокВидовДоговора	–	<Массив> или <СписокЗначений>, состоящий из значений типа <ПеречислениеСсылка.ВидыДоговоровКонтрагентов> 
    //							Нужные виды договора
    //  СтруктураПараметров	–	<Структура>
    //							Структура дополнительных параметров отбора договоров по реквизитам.
    //							Элементы структуры СтруктураПараметров:
    //							Ключ - имя реквизита договора, Значение - еще одна структура
    //							
    //							Элементы структуры, которая находится в Значение:
    //							Ключ - "ЗначениеОтбора", Значение - значение реквизита договора для отбора. Обязательный элемент.
    //							Ключ - "ВидСравненияОтбора", Значение - <ВидСравнения>. Необязательный элемент, по умолчанию ВидСравнения.Равно
    //
    // Возвращаемое значение:
    //   <СправочникСсылка.ДоговорыКонтрагентов> – найденный счет или пустая ссылка
    //
    Функция УстановитьДоговорКонтрагента(ДоговорКонтрагента,ВладелецДоговора, ОрганизацияДоговора, СписокВидовДоговора=неопределено, СтруктураПараметров = Неопределено) Экспорт
    
    НовыйДоговор = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
    
    Запрос = Новый Запрос;
    ТекстЗапроса = 
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 2
    |	ДоговорыКонтрагентов.Ссылка,
    |	ВЫБОР
    |		КОГДА СправочникВладелец.Ссылка ЕСТЬ НЕ NULL 
    |			ТОГДА 1
    |		ИНАЧЕ 2
    |	КОНЕЦ КАК Приоритет
    |ИЗ
    |	Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
    |		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК СправочникВладелец
    |		ПО ДоговорыКонтрагентов.Владелец = СправочникВладелец.Ссылка
    |			И ДоговорыКонтрагентов.Ссылка = СправочникВладелец.ОсновнойДоговорКонтрагента
    |ГДЕ
    |	&ТекстФильтра
    |
    |УПОРЯДОЧИТЬ ПО
    |	Приоритет";
    
    Запрос.УстановитьПараметр("ВладелецДоговора", ВладелецДоговора);
    Запрос.УстановитьПараметр("ОрганизацияДоговора", ОрганизацияДоговора);
    Запрос.УстановитьПараметр("СписокВидовДоговора", СписокВидовДоговора);
    
    ТекстФильтра = "
    |	ДоговорыКонтрагентов.Владелец = &ВладелецДоговора
    |	И ДоговорыКонтрагентов.Организация = &ОрганизацияДоговора
    |	И ДоговорыКонтрагентов.ПометкаУдаления = ЛОЖЬ"
    +?(СписокВидовДоговора<>неопределено,"
    |	И ДоговорыКонтрагентов.ВидДоговора В (&СписокВидовДоговора)","");
    
    Если ТипЗнч(СтруктураПараметров) = Тип("Структура") Тогда
    Для каждого Параметр Из СтруктураПараметров Цикл
    ИмяРеквизита = Параметр.Ключ;
    СтруктураОтбора = Параметр.Значение;
    ВидСравненияЗапроса = ПолучитьВидСравненияДляЗапроса(СтруктураОтбора);
    ТекстФильтра = ТекстФильтра + "
    |	И ДоговорыКонтрагентов." + ИмяРеквизита + " " + ВидСравненияЗапроса + " (&" + ИмяРеквизита + ")";
    Запрос.УстановитьПараметр(ИмяРеквизита, СтруктураОтбора.ЗначениеОтбора);
    КонецЦикла;
    КонецЕсли;
    
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстФильтра", ТекстФильтра);
    
    Запрос.Текст = ТекстЗапроса;
    Результат = Запрос.Выполнить();
    
    Если Не Результат.Пустой() Тогда
    
    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    
    НайденОсновнойДоговор = Выборка.Приоритет = 1;
    НайденОдинДоговор     = Выборка.Количество() = 1;
    
    Если НайденОсновнойДоговор ИЛИ НайденОдинДоговор Тогда
    НовыйДоговор = Выборка.Ссылка;
    КонецЕсли;
    
    КонецЕсли;
    
    Если (ДоговорКонтрагента.Владелец<>ВладелецДоговора ИЛИ ДоговорКонтрагента.Организация<>ОрганизацияДоговора) ИЛИ (не ЗначениеЗаполнено(ДоговорКонтрагента)) <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/тогда')">Тогда	</span>
    ДоговорКонтрагента = НовыйДоговор;
    Возврат Истина;
    Иначе
    Возврат Ложь;
    КонецЕсли;
    
    КонецФункции // ПолучитьДоговорКонтрагента()
    
    
  6. tunec
    Offline

    tunec Опытный в 1С

    Регистрация:
    2 июн 2008
    Сообщения:
    469
    Симпатии:
    0
    Баллы:
    26
    так он не хочет запросом! А реквизит, по которому отбирается договор лежит во внешнем файле...
  7. x_under
    Offline

    x_under Модераторы Команда форума Модератор

    Регистрация:
    25 апр 2007
    Сообщения:
    2.576
    Симпатии:
    13
    Баллы:
    29
    Ну как только он расскажет по какому реквизиту он хочет искать договор, ему сразу напишут как это сделать.
  8. Мастер_миража
    Offline

    Мастер_миража Опытный в 1С

    Регистрация:
    22 сен 2008
    Сообщения:
    148
    Симпатии:
    0
    Баллы:
    26

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

    tunec Опытный в 1С

    Регистрация:
    2 июн 2008
    Сообщения:
    469
    Симпатии:
    0
    Баллы:
    26
    угу, тока в 8ке нет "использовать владельца"... :)

    зато есть "отбор"...
  10. TopicStarter Overlay
    DDRON
    Offline

    DDRON Опытный в 1С

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

    tunec Опытный в 1С

    Регистрация:
    2 июн 2008
    Сообщения:
    469
    Симпатии:
    0
    Баллы:
    26
    учти, что если у тебя нет уникальности в пределах справочника, то этот код когда-нить тебе выкинет западло, подобрав не тот договор...

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

    Я обычно подстаховываюсь и если есть владелец стараюсь сделать еще и отбор по нему... тем более, что он тебе известен...

Поделиться этой страницей