Уважаемые знатоки, здравствуйте! Я только начал изучать 1С и не могу решить одну задачу на 1С:Предприятие 8 учебная версия
Необходимо сделать так, чтобы при выборе поля "Покупатель", если у данного покупателя всего 1 контакт, то поле "Контактное Лицо" должно заполниться автоматически, иначе поле "Контактное Лицо" не заполняется автоматически. Я смог сделать так, чтобы автоматически выбирался основной контакт, но при наличие более одного контакта он все равно выбирается. Как осуществить это через запрос? Ведь при получении результата запроса у нас будет таблица, а как ее записывать потом поле тоже не очень понимаю. Помогите
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВЫБОР
| КОГДА КоличествоКонтактов.ОдинКонтакт
| ТОГДА Контрагенты.КонтактноеЛицо
| ИНАЧЕ NULL
| КОНЕЦ КАК КонтактноеЛицо
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| СвязиКонтрагентКонтакт.Контрагент КАК Контрагент,
| КОЛИЧЕСТВО(*) = 1 КАК ОдинКонтакт
| ИЗ
| РегистрСведений.СвязиКонтрагентКонтакт КАК СвязиКонтрагентКонтакт
|
| СГРУППИРОВАТЬ ПО
| СвязиКонтрагентКонтакт.Контрагент) КАК КоличествоКонтактов
| ПО (Контрагенты.Ссылка = КоличествоКонтактов.Контрагент)
|ГДЕ
| Контрагенты.Ссылка = &Контрагент";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ВыборкаДетальныеЗаписи.Следующий();
КонтактноеЛицо = ВыборкаДетальныеЗаписи.КонтактноеЛицо;
(3) все правильно! Только раз пользователь новичок, то правильнее было бы разбить выполнение функций на переменные, как указано в требованиях к разработке от фирмы 1С)
Чтобы сразу учились писать правильно, согласно документации)
РезультатЗапррса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
КонтактноеЛицо = Выборка.КонтактноеЛицо;
КонецЕсли;
У тебя уже есть на руках выборка. Её же можно и на количество проверить. Получается, что если Выборка.Количество () = 1 — данные выборки цепляем автоматически. Если же иное количество — заворачиваем данные выборки в список значений. В таком случае основным всегда будет единственный контакт.
(12) это реквизит справочника Контрагенты, получается им может быть только одно контактное лицо? Как тогда весь список контактов проверить... Кажется я понял почему у меня только основной контакт записывается. У меня большой трабл в том, что не работал в данной среде ещё, а тут целая конфигурация, сижу и кручу её, смотрю что куда
(15) что за конфигурация? Контактные лица хранятся скорее всего в регистре сведений, а не в реквизите справочника контрагенты. Ну или может контактные лица это справочник подчиненный как владельцу справочника контрагенты. По условию задания вам просто дан пример как это реализовано на форме элемента справочника контрагенты.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВЫБОР
| КОГДА КоличествоКонтактов.ОдинКонтакт
| ТОГДА Контрагенты.КонтактноеЛицо
| ИНАЧЕ NULL
| КОНЕЦ КАК КонтактноеЛицо
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| СвязиКонтрагентКонтакт.Контрагент КАК Контрагент,
| КОЛИЧЕСТВО(*) = 1 КАК ОдинКонтакт
| ИЗ
| РегистрСведений.СвязиКонтрагентКонтакт КАК СвязиКонтрагентКонтакт
|
| СГРУППИРОВАТЬ ПО
| СвязиКонтрагентКонтакт.Контрагент) КАК КоличествоКонтактов
| ПО (Контрагенты.Ссылка = КоличествоКонтактов.Контрагент)
|ГДЕ
| Контрагенты.Ссылка = &Контрагент";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ВыборкаДетальныеЗаписи.Следующий();
КонтактноеЛицо = ВыборкаДетальныеЗаписи.КонтактноеЛицо;
(31)Ну сразу скажу тот запрос, который тут как решение стоит, неправильный, используйте как пример. Он помог разобраться в языке запросов. Вот консоль запросов, тут можно поковыряться в конфигурации и понять что вообще получаешь в запросе
(32) А не подскажешь как должен выглядеть правильный запрос? Этот работает при условии, что КонтактноеЛицо это строка с переменным значением, тогда все правильно выводится в поле формы, но по заданию необходимо, чтобы КонтактноеЛицо было "ссылкой на соответствующий справочник". Как я не пробовал, когда ставишь контакному лицу тип ссылки на справочник Контрагенты вместо строки - по итогу ничего не выводит в поле формы вне зависимости от того сколько там контактных лиц. Встрял на этом пункте из за этого.
(18)
А не подскажешь как должен выглядеть правильный запрос? Этот работает при условии, что КонтактноеЛицо это строка с переменным значением, тогда все правильно выводится в поле формы, но по заданию необходимо, чтобы КонтактноеЛицо было "ссылкой на соответствующий справочник". Как я не пробовал, когда ставишь контакному лицу тип ссылки на справочник Контрагенты вместо строки - по итогу ничего не выводит в поле формы вне зависимости от того сколько там контактных лиц. Встрял на этом пункте из за этого.
у реквизита КонтактноеЛицо какой тип должен быть? СправочникСсылка.КонтактныеЛица или СправочникСсылка.Контрагенты?
(36)Вообще, думал изначально что СсылкаСправочник.Контрагенты нужно использовать, потому что именно при использовании формы этого справочника туда заносятся данные о новых компаниях и их контактных лицах.
Посмотрев повнимательнее понял, что реквизит справочника Контрагентов, в который как раз записываются и хранятся необходимые по заданию данные с ФИО контактных лиц, в свою очередь ссылается на, как раз, СсылкаСправочник.КонтактныеЛица.
Из этого следует что в наш реквизит, в документе, нужно указывать тип СсылкаСправочник.КонтактныеЛица
Ну, если я ничего не путаю конечно)
(41)
Тогда чем у вас является КоличествоКонтактов?
Это отдельно созданный реквизит или что-то другое?
я не очень понимаю к чему пренадежит вырожение КоличествоКонтактов.ОдинКонтакт в запросе
(41)
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| СвязиКонтрагентКонтакт.Контрагент КАК Контрагент,
| КОЛИЧЕСТВО(*) = 1 КАК ОдинКонтакт
| ИЗ
| РегистрСведений.СвязиКонтрагентКонтакт КАК СвязиКонтрагентКонтакт
|
| СГРУППИРОВАТЬ ПО
| СвязиКонтрагентКонтакт.Контрагент) КАК КоличествоКонтактов
| ПО (Контрагенты.Ссылка = КоличествоКонтактов.Контрагент)
(19)Ну не совсем работу, я только хочу стажироваться, сначала идёт самостоятельное обучение с задачками. Раньше с механизмом запросов таким не сталкивался, ток в питоне с библиотекой pandas с датафреймами баловался. Смотрел вводы про запросы в 1с, но там на простых случаях объясняют, просто вытаскивают таблички с данными, а я не знал как тут быть. Если есть на примете какой-нибудь полезный материал для начала, то ссылки приветствуются ахах
(20) насчет ссылок не знаю что посоветовать. Вот пособие есть https://its.1c.ru/db/pubdevguide83 Только на ИТС доступ нужен. Можешь в гугле посмотреть пособия М.Г. Радченко, Е.Ю. Хрусталева по 1С
(23) Обозначил процедуру с запросом, вызываю её в процедуре КонтрагентПриИзменении с передачей туда Контрагент ну или Объект.Контрагент, в итоге поле "Контактное лицо" заполняется только основным контактом(сам реквизит КонтактноеЛицо
ссылается на Контрагент.КонтактноеЛицо), пытался вывести результат запроса, выводит через сообщить пустую строку, я не так процедуру вызываю?
(25)
Привет, я уже которую неделю над этим бьюсь, только сейчас наткнулся на это обсуждение и немного запутался, ты создал поле с "Путь к данным": Объект.КонтактноеЛицо, а сам Объект.КонтактноеЛицо - СправочникСсылка контактные лица? И вопрос по запросу, его вписывать в "ПриИзменении"? Можешь дать наводку как разобраться с этим запросами? Буду очень благодарен)
Добрый день, не подскажите где в этой задаче мы создаем запрос? Перед изменением (Поля КонтактноеЛицо) или в какую процедуру? И еще вопрос, не могли бы вы мне объяснить логику запроса, который вы написали? Буду очень благодарен за ответ.
(25)
Привет, я уже которую неделю над этим бьюсь, только сейчас наткнулся на это обсуждение и немного запутался, ты создал поле с "Путь к данным": Объект.КонтактноеЛицо, а сам Объект.КонтактноеЛицо - СправочникСсылка контактные лица? И вопрос по запросу, его вписывать в "ПриИзменении"? Можешь дать наводку как разобраться с этим запросами? Буду очень благодарен)