8.х Обратиться к подчиненному справочнику

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем AlenkaInt, 6 авг 2012.

  1. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    Добрый день. Есть справочник Контрагенты и подчиненный ему справочник Контактные Лица. Надо выбрать Конрагентов у которых нет КЛ. Часть кода я написала уже. Вот он.

    Процедура ПроверкаКонтрагентов()
    Выборка = Справочники.Контрагенты.Выбрать();
    Пока Выборка.Следующий() Цикл
    Если КонтактноеЛицо = Неопределено
    //Не знаю как обратиться к КЛ.
    Тогда
    Сообщить(Выборка.Наименование);
    КонецЕсли;
    КонецЦикла;
  2. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Смотри в синтаксис помощнике "СправочникМенеджер.<Имя справочника>.Выбрать"
    Нужна структура отбора в которой Контрагент.КонтактноеЛицо = ПустаяСсылка

    Проще запросом
    Код:
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ *
    |ИЗ Справочник.Контрагенты КАК Контрагенты
    |ГДЕ Контрагенты.КонтактноеЛицо ЕСТЬ NULL
    |";
    Результат = Запрос.Выполнить.Выгрузить();
  3. Azamat
    Offline

    Azamat Опытный в 1С

    Регистрация:
    29 июл 2011
    Сообщения:
    271
    Симпатии:
    0
    Баллы:
    26
    Код:
     Выборка = Справочники.Контрагенты.Выбрать();
    КЛ = Выборка.ОсновноеКонтактноеЛицо;
    Пока Выборка.Следующий() Цикл
    Если КЛ = Неопределено Тогда
    Сообщить(Выборка);
    КонецЕсли; 
    КонецЦикла
    как-то так....
    только что это за конфа? в типовой просто контактные лица не подчинены справочнику контрагенты
  4. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    В таблице "Результат" у тебя будут контрагенты у которых нет контактного лица
  5. alexburn
    Online

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.765
    Симпатии:
    509
    Баллы:
    204
    Тут, наверно, не Неопределено нужно, а Пустая(), т.е
    Код:
    Выборка = Справочники.КонтактныеЛица.Выбрать();
    Пока Выборка.Следующий() Цикл
    Если Не Выборка.КонтактноеЛицо.Пустая() И Не Выборка.ЭтоГруппа Тогда
    Сообщить(Выборка.Наименование)
    КонецЕсли;
    КонецЦикла;
    Можно на владельца проверять, вариантов - куча.
  6. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    Я бы предложил вариант с запросом :)
    Код:
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Контрагенты.Ссылка КАК Контрагент,
    | КонтактныеЛица.Ссылка КАК КонтактноеЛицо
    |ИЗ
    | Справочник.Контрагенты КАК Контрагенты
    |  ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛица КАК КонтактныеЛица
    |  ПО Контрагенты.Ссылка = КонтактныеЛица.Владелец
    |ГДЕ
    | НЕ Контрагенты.ЭтоГруппа
    | И КонтактныеЛица.Ссылка ЕСТЬ NULL ";
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
    Сообщить("Для контрагента <" + Выборка.Контрагент + "> не создано ни одного контактного лица");
    КонецЦикла;
  7. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    И, как сказал Azamat, в некоторых типовых справочник "Контактные лица" действительно не является подчиненным справочнику "Контрагенты". В этом случае будет все немного по-другому. Поэтому проверьте наверняка :)
  8. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    To Azamat. Конфа это конфигурация? Это пустая.
    To alexburn. Я пробовала через владельца, но не получилось. Я делала вторую выборку, уже для КЛ, потом в цикле писала так - Если Выборка.Родитель = Неопределено, но не знала как привязать отсутствие КЛ именно к этому контрагенту.
    Вот такой код был.
    Выборка1 = Справочники.КонтактныеЛица.Выбрать();
    Выборка = Справочники.Контрагенты.Выбрать();
    Пока Выборка.Следующий() Цикл
    Если Выборка1.Родитель = Неопределено
    Тогда
    Сообщить(Выборка.Наименование);
    КонецЕсли;
  9. alexburn
    Online

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.765
    Симпатии:
    509
    Баллы:
    204
    Вы сейчас вообще не понятно что написали:), вам тут кучу вариков предложили, выбирайте любой:)
  10. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    Я просто хочу разобраться с тем, что у меня не получилось. С вариантом через владельца. За варианты спасибо :)
  11. alexburn
    Online

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.765
    Симпатии:
    509
    Баллы:
    204
    Владелец - это реквизит подчиненного объекта(справочника), он является типовым.
    В зависимости от выбранного варианта, через запрос, либо прямая выборка, зависит условие на сравнение.
  12. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    Просто там не все так просто.))
    Вы делаете выборку по контрагентам. Для каждого контрагента может быть задано неограниченное число контактных лиц. Вот Вам и надо, перебрав в цикле всех контрагентов, проверить, а есть ли у каждого из них контактные лица. Если ни одного контактного лица у данного контрагента нет, выводим сообщение и переходим к следующему контрагенту и т.д.
    Т.е. думаю, вполне очевидно, что внутри выборки по контрагентам надо открывать еще одну выборку - выборку по контактным лицам ЭТОГО КОНТРАГЕНТА (т.е. выборку с отбором по владельцу). И проверять, есть ли в этой выборке хоть один элемент.

    Вот Вам код:

    Код:
    ВыборкаКонтрагенты = Справочники.Контрагенты.Выбрать();
    
    Пока ВыборкаКонтрагенты.Следующий() Цикл
    
    Если НЕ ВыборкаКонтрагенты.ЭтоГруппа Тогда
    
    ВыборкаКонтактныеЛица = Справочники.КонтактныеЛица.Выбрать(, ВыборкаКонтрагенты.Ссылка);
    
    Если НЕ ВыборкаКонтактныеЛица.Следующий() Тогда
    Сообщить("Для контрагента <" + ВыборкаКонтрагенты + "> не создано ни одного контактного лица");
    КонецЕсли;
    
    КонецЕсли;
    
    КонецЦикла;
    Однако, это не самый хороший вариант с точки зрения производительности.
    Лучше использовать запрос.
    Пример в сообщении № 6
  13. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    При таком коде
    Выборка = Справочники.КонтактныеЛица.Выбрать();
    Пока Выборка.Следующий() Цикл
    Если Не Выборка.КонтактноеЛицо.Пустая() И Не Выборка.ЭтоГруппа Тогда
    Сообщить(Выборка.Наименование)
    КонецЕсли;
    КонецЦикла;
    А здесь почему мы выборку делаем по контактным лицам? Нам же нужны названия контрагентов.
  14. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    И еще не понятно, что такое Выборка.КонтактноеЛицо? Такого нет. Есть владелец, Родитель, Этогруппа и прочее.
  15. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    скорее всего вот тут другой справочник
    Код:
    Выборка = Справочники.Контрагенты.Выбрать();
    а внутри него уже ищите в цикле незаполненное поле Контакное Лицо (ну или как оно у вас называется)
  16. alexburn
    Online

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.765
    Симпатии:
    509
    Баллы:
    204
    Тигра, +1, нечистый попутал:)))), нужно выбирать из Контрагентов.
    Выборка - почти тоже самое что и через запрос, только тут отбираются элементы со всеми полями(реквизитами), что сказывается на производительности(маленько, но сказывается:))))
    Выборка.КонтактноеЛицо - обращение к полю выборки.
  17. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    Выборка.КонтактноеЛицо - обращение к полю выборки. Не обращается, пишет нет такого поля :-(
  18. Draco
    Online

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.639
    Симпатии:
    948
    Баллы:
    204
    Да напишите простой запрос!
    1. Получаете выборку контрагентов у которых есть контактные лица. Это запрос к Контактным лицам и выбираем их владельцев.
    2. Делаем запрос к контрагнетам, где в условии ставим что ссылка не в резултате запроса 1

    в общем макет таков

    Выбрать
    Ссылка
    Из конрагенты
    Где контрагенты.Ссылка не в (Выбрать
    Владелец
    из контактные лица)

    И все
  19. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    Сделала как 1cUserAndrew написал, немного исправила код. Получилось, спасибо.

    Как запрос я умею, мне хочется разобраться с тем, что не получается.
  20. Draco
    Online

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.639
    Симпатии:
    948
    Баллы:
    204
    Запросы быстреее работают, и в СКД Вам пригодятся больше. А тяга к знаниям - хорошо, но в меру. Лишним голову порой не надо захломлять.

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