Уважаемые знатоки, здравствуйте! Я только начал изучать 1С и не могу решить одну задачу на 1С:Предприятие 8 учебная версия
Необходимо сделать так, чтобы при выборе поля "Покупатель", если у данного покупателя всего 1 контакт, то поле "Контактное Лицо" должно заполниться автоматически, иначе поле "Контактное Лицо" не заполняется автоматически. Я смог сделать так, чтобы автоматически выбирался основной контакт, но при наличие более одного контакта он все равно выбирается. Как осуществить это через запрос? Ведь при получении результата запроса у нас будет таблица, а как ее записывать потом поле тоже не очень понимаю. Помогите
---
```1c
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ВЫБОР
    | КОГДА КоличествоКонтактов.ОдинКонтакт
    | ТОГДА Контрагенты.КонтактноеЛицо
    | ИНАЧЕ NULL
    | КОНЕЦ КАК КонтактноеЛицо
    |ИЗ
    | Справочник.Контрагенты КАК Контрагенты
    | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    | СвязиКонтрагентКонтакт.Контрагент КАК Контрагент,
    | КОЛИЧЕСТВО(*) = 1 КАК ОдинКонтакт
    | ИЗ
    | РегистрСведений.СвязиКонтрагентКонтакт КАК СвязиКонтрагентКонтакт
    |
    | СГРУППИРОВАТЬ ПО
    | СвязиКонтрагентКонтакт.Контрагент) КАК КоличествоКонтактов
    | ПО (Контрагенты.Ссылка = КоличествоКонтактов.Контрагент)
    |ГДЕ
    | Контрагенты.Ссылка = &Контрагент";

    Запрос.УстановитьПараметр("Контрагент", Контрагент);

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

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

    ВыборкаДетальныеЗаписи.Следующий();

    КонтактноеЛицо = ВыборкаДетальныеЗаписи.КонтактноеЛицо;
```
---
Новички должны уважать старожил и приходить, как к врачу с анализами с пробами.
---
будет таблица
"ВЫБРАТЬ ПЕРВЫЕ 1 " в запросе будет 1 строка.
Таблица не нужна
```1c
    Выборка = Запрос.Выполнить().Выбрать():
    Если Выборка.Следующий() Тогда
    КонтактноеЛицо = Выборка.КонтактноеЛицо;
    КонецЕсли;
```
---
все правильно! Только раз пользователь новичок, то правильнее было бы разбить выполнение функций на переменные, как указано в требованиях к разработке от фирмы 1С)
Чтобы сразу учились писать правильно, согласно документации)

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

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

    Если Выборка.Следующий() Тогда
    КонтактноеЛицо = Выборка.КонтактноеЛицо;
    КонецЕсли;
```
---
У тебя уже есть на руках выборка. Её же можно и на количество проверить. Получается, что если Выборка.Количество () = 1 — данные выборки цепляем автоматически. Если же иное количество — заворачиваем данные выборки в список значений. В таком случае основным всегда будет единственный контакт.
---
(4) В задании по-другому: если больше одного, то поле должно быть пустым.
---
верно) тогда:
Выбрать все

```1c
    КонтактноеЛицо = Неопределенно;

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

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

    Если Результат.Количество() = 1 Тогда
    КонтактноеЛицо = Результат[0]. КонтактноеЛицо;
    КонецЕсли;
```
---
Я новичкам пытаюсь дать удочку, даже невод. А вы рыбьей мордой в харю ему тычите. Забери меня дедушка отсюда.
---
Я обычно показываю направление к сараю, в котором есть удочка...
---
На первой строчке ошибка не выскакивает, все нормально?
---
КонтактноеЛицо = Неопределенно;

выдаёт ошибку, попробовал сделать по вашему, но без первой строки:

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

    ЗапросНовый.УстановитьПараметр("Контрагент", Контрагент);
    РезультатЗапроса = ЗапросНовый.Выполнить();
    Результат = РезультатЗапроса.Выгрузить();

    Если Результат.Количество()= 1
    Тогда
    КонтактноеЛицо = Результат[0].КонтактноеЛицо;
    КонецЕсли;
    КонецПроцедуры
```

В итоге все равно заполняет только основной контакт, остальные игнорирует, если один контакт, но не основной, то он тоже не заполнится
---
и да, у меня поле "Контактное Лицо" ссылается на Справочник.Контрагенты.КонтактноеЛицо, в этом может быть проблема?
---
(10) а контактное лицо это реквизит справочника или табличная часть? Если это реквизит справочника, то как тут может быть заполнено больше 1?
---
это реквизит справочника Контрагенты, получается им может быть только одно контактное лицо? Как тогда весь список контактов проверить... Кажется я понял почему у меня только основной контакт записывается. У меня большой трабл в том, что не работал в данной среде ещё, а тут целая конфигурация, сижу и кручу её, смотрю что куда
---
А проделать мне это нужно в форме документа ЗаказПокупателя
---
что за конфигурация? Контактные лица хранятся скорее всего в регистре сведений, а не в реквизите справочника контрагенты. Ну или может контактные лица это справочник подчиненный как владельцу справочника контрагенты. По условию задания вам просто дан пример как это реализовано на форме элемента справочника контрагенты.
---
Управление Нашей Фирмой ред 1.6 учебная
---
```1c
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ВЫБОР
    | КОГДА КоличествоКонтактов.ОдинКонтакт
    | ТОГДА Контрагенты.КонтактноеЛицо
    | ИНАЧЕ NULL
    | КОНЕЦ КАК КонтактноеЛицо
    |ИЗ
    | Справочник.Контрагенты КАК Контрагенты
    | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    | СвязиКонтрагентКонтакт.Контрагент КАК Контрагент,
    | КОЛИЧЕСТВО(*) = 1 КАК ОдинКонтакт
    | ИЗ
    | РегистрСведений.СвязиКонтрагентКонтакт КАК СвязиКонтрагентКонтакт
    |
    | СГРУППИРОВАТЬ ПО
    | СвязиКонтрагентКонтакт.Контрагент) КАК КоличествоКонтактов
    | ПО (Контрагенты.Ссылка = КоличествоКонтактов.Контрагент)
    |ГДЕ
    | Контрагенты.Ссылка = &Контрагент";

    Запрос.УстановитьПараметр("Контрагент", Контрагент);

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

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

    ВыборкаДетальныеЗаписи.Следующий();

    КонтактноеЛицо = ВыборкаДетальныеЗаписи.КонтактноеЛицо;
```
---
Куда вставлять? Можно скриншотами? Я третий день в 1С и ничего не понимаю :((((
---
А что вам вообще нужно сделать, похожий запрос?
---
То же самое задание. Я просто пока не понимаю куда нажимать. Интуитивно работаю
Где что открыть и куда вставить
---
Ну сразу скажу тот запрос, который тут как решение стоит, неправильный, используйте как пример. Он помог разобраться в языке запросов. Вот консоль запросов, тут можно поковыряться в конфигурации и понять что вообще получаешь в запросе
---
объясни
---
не выяснили в чем ошибка кода, выделенного как правильный ответ?
---
кто должен выяснить?
---
а есть правильное решение?
работаю над аналогичной задачкой по сборнику
---
работаю над аналогичной задачкойА сам что-нибудь уже сделал?
---
само собой)
но парочка вещей не работает из-за непонимания взаимосвязи документов
---
А не подскажешь как должен выглядеть правильный запрос? Этот работает при условии, что КонтактноеЛицо это строка с переменным значением, тогда все правильно выводится в поле формы, но по заданию необходимо, чтобы КонтактноеЛицо было "ссылкой на соответствующий справочник". Как я не пробовал, когда ставишь контакному лицу тип ссылки на справочник Контрагенты вместо строки - по итогу ничего не выводит в поле формы вне зависимости от того сколько там контактных лиц. Встрял на этом пункте из за этого.
(18)
---
А не подскажешь как должен выглядеть правильный запрос? Этот работает при условии, что КонтактноеЛицо это строка с переменным значением, тогда все правильно выводится в поле формы, но по заданию необходимо, чтобы КонтактноеЛицо было "ссылкой на соответствующий справочник". Как я не пробовал, когда ставишь контакному лицу тип ссылки на справочник Контрагенты вместо строки - по итогу ничего не выводит в поле формы вне зависимости от того сколько там контактных лиц. Встрял на этом пункте из за этого.

у реквизита КонтактноеЛицо какой тип должен быть? СправочникСсылка.КонтактныеЛица или СправочникСсылка.Контрагенты?
---
Вообще, думал изначально что СсылкаСправочник.Контрагенты нужно использовать, потому что именно при использовании формы этого справочника туда заносятся данные о новых компаниях и их контактных лицах.
Посмотрев повнимательнее понял, что реквизит справочника Контрагентов, в который как раз записываются и хранятся необходимые по заданию данные с ФИО контактных лиц, в свою очередь ссылается на, как раз, СсылкаСправочник.КонтактныеЛица.
Из этого следует что в наш реквизит, в документе, нужно указывать тип СсылкаСправочник.КонтактныеЛица
Ну, если я ничего не путаю конечно)
---
(37)
Поменял со СправочникСсылка.Контрагент на СправочникСсылка.КонтактноеЛицо – заработало как надо) Спасибо за подсказку!
---
ВЫБРАТЬ
       КОГДА КоличествоКонтактов.ОдинКонтакт

вы отдельно создавали обьект КоличествоКонтактов?
(18)
---
ВЫБРАТЬ
       КОГДА КоличествоКонтактов.ОдинКонтакт

вы отдельно создавали обьект КоличествоКонтактов?
---
объект? Где ты увидел объект?
---
Тогда чем у вас является КоличествоКонтактов?
Это отдельно созданный реквизит или что-то другое?
я не очень понимаю к чему пренадежит вырожение КоличествоКонтактов.ОдинКонтакт в запросе
(41)
---
так там же вложенный запрос

```1c
    |ИЗ
    | Справочник.Контрагенты КАК Контрагенты
    | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    | СвязиКонтрагентКонтакт.Контрагент КАК Контрагент,
    | КОЛИЧЕСТВО(*) = 1 КАК ОдинКонтакт
    | ИЗ
    | РегистрСведений.СвязиКонтрагентКонтакт КАК СвязиКонтрагентКонтакт
    |
    | СГРУППИРОВАТЬ ПО
    | СвязиКонтрагентКонтакт.Контрагент) КАК КоличествоКонтактов
    | ПО (Контрагенты.Ссылка = КоличествоКонтактов.Контрагент)
```
---
я разобрался. недавно начал с запросами рабоать и еще не все до конца понимаю.
спасибо за ответ.
---
А ты не тестовое задание выполняешь при приеме на работу?)
---
Ну не совсем работу, я только хочу стажироваться, сначала идёт самостоятельное обучение с задачками. Раньше с механизмом запросов таким не сталкивался, ток в питоне с библиотекой pandas с датафреймами баловался. Смотрел вводы про запросы в 1с, но там на простых случаях объясняют, просто вытаскивают таблички с данными, а я не знал как тут быть. Если есть на примете какой-нибудь полезный материал для начала, то ссылки приветствуются ахах
---
насчет ссылок не знаю что посоветовать. Вот пособие есть https://its.1c.ru/db/pubdevguide83
Только на ИТС доступ нужен. Можешь в гугле посмотреть пособия М.Г. Радченко, Е.Ю. Хрусталева по 1С
---
ещё дурацкий вопрос, путь к данным реквизита Контактное лицо это Объект.КонтактноеЛицо?
---
из модулей справочника Контрагенты - да. Из других модулей через Контрагент.КонтактноеЛицо.
---
Обозначил процедуру с запросом, вызываю её в процедуре КонтрагентПриИзменении с передачей туда Контрагент ну или Объект.Контрагент, в итоге поле "Контактное лицо" заполняется только основным контактом(сам реквизит КонтактноеЛицо
ссылается на Контрагент.КонтактноеЛицо), пытался вывести результат запроса, выводит через сообщить пустую строку, я не так процедуру вызываю?
---
А всё, запрос работает, я разобрался, спасибо огромное!
---
Привет, я уже которую неделю над этим бьюсь, только сейчас наткнулся на это обсуждение и немного запутался, ты создал поле с "Путь к данным": Объект.КонтактноеЛицо, а сам Объект.КонтактноеЛицо - СправочникСсылка контактные лица? И вопрос по запросу, его вписывать в "ПриИзменении"? Можешь дать наводку как разобраться с этим запросами? Буду очень благодарен)
---
(10) ошибся, неопределено с одной «н»
---
Можешь какой-то контакт дать, где с тобой связаться? Почту или что-то такое, к примеру? Застрял на этом моменте
---
Сообщение было скрыто модератором.
---
Куда вставлять? Можно скриншотами? Я третий день в 1С и ничего не понимаю :((((
---
что вставлять?
---
Добрый день, не подскажите где в этой задаче мы создаем запрос? Перед изменением (Поля КонтактноеЛицо) или в какую процедуру? И еще вопрос, не могли бы вы мне объяснить логику запроса, который вы написали? Буду очень благодарен за ответ.

(34)
---
скорее всего при открытии формы
---
Привет, я уже которую неделю над этим бьюсь, только сейчас наткнулся на это обсуждение и немного запутался, ты создал поле с "Путь к данным": Объект.КонтактноеЛицо, а сам Объект.КонтактноеЛицо - СправочникСсылка контактные лица? И вопрос по запросу, его вписывать в "ПриИзменении"? Можешь дать наводку как разобраться с этим запросами? Буду очень благодарен)