Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
09 мая 2024, 11:01

Автозаполение реквизитов формы из справочника

Автор sas_255, 15 дек 2015, 14:25

0 Пользователей и 1 гость просматривают эту тему.

sas_255

Добрый день.
У меня 1С 8.2
Ситуация такая. Есть справочник контрагентов. И документ ЗаявкаНаОбслуживание.
По факту нужно, чтобы при выборе в документе Контрагента (он там идентифицируется по номеру мобильного телефона)в поля адрес, имя и т.д вписывались данные из справочника.
Пытался сделать функцию на сервере, но при передаче данных происходит ошибка.
Сейчас пытаюсь сделать с помощью процедуры на сервере, но ни как не могу понять как заполнить форму на сервере и отправить ее на клиент. Может я конечно иду не тем путем, но опыта у меня нет. Подскажите, кто знает.



&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)

ЗаполнитьРеквизиы(Объект.Контрагент);
ОбновитьОтображениеДанных();

КонецПроцедуры

&НаСервере
Процедура ЗаполнитьРеквизиы(Наименование)

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Имя,
| Контрагенты.Район,
| Контрагенты.Улица,
| Контрагенты.Дом,
| Контрагенты.Квартира,
| Контрагенты.Подъезд,
| Контрагенты.Этаж
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Наименование = &Наименование";

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

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

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


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


vitasw

 |    Справочник.Контрагенты КАК Контрагенты
        |ГДЕ
        |    Контрагенты.Ссылка = &Наименование";
...
Выборка = Результат.Выбрать();
Выборка.Следующий();
    Объект.Улица=Выборка.Улица;
...

sas_255

Цитата: vitasw от 15 дек 2015, 14:32
|    Справочник.Контрагенты КАК Контрагенты
        |ГДЕ
        |    Контрагенты.Ссылка = &Наименование";
...
Выборка = Результат.Выбрать();
Выборка.Следующий();
    Объект.Улица=Выборка.Улица;
...

Спасибо. Все заработало.
Только если не сложно поясните почему нужно писать именно Контрагенты.Ссылка и Выборка.Следующий();
Для понимания ситуации. Просто оно то заработало, за что вам большое спасибо. Но я не понял почему заработало. Прокомментируйте если не сложно.

vitasw

Контрагент - это элемент справочника, т.е. имеет ссылочный тип. Контрагент.Наименование - это строка.
В вашем условие "Где" было обязательное условие: где строка = СправочникСсылка - естественно получали пустой набор.
РезультатЗапроса.Выбрать() - грубо говоря, команда вида "Подготовиться к разгрузке вагона". А "Следующий()" - это собственно сам процесс перемещения мешка из вагона на склад. Команда и процесс = разные вещи.

AIFrame

sas_255,
Контрагент.Наименование - тип данных Строка.
ЗаполнитьРеквизиы(Объект.Контрагент); - Объект.Контрагент - это ссылка на объект. Нельзя сравнивать строку и объект.
При сравнении по наименованию параметр запроса должен выглядеть так:
Запрос.УстановитьПараметр("Наименование", Справочники.Контрагенты.НайтиПоИмени(Наименование));

Про Выборка.Следующий() - это перебор данных массива. Если массив результата выборки всегда возвращает одно значение - эта команда позволит получить строку выборки и работать с ней. Аналогично:
Пока Выборка.Следующий() Цикл
Имя = Выборка.Имя;
Район = Выборка.Район;
// и т.д.
ДанныеФормыУлица = Улица;
// и т.п.
КонецЦикла;

cska-fanat-kz

Цитата: AIFrame от 16 дек 2015, 06:18Про Выборка.Следующий() - это перебор данных массива

этот метод...
ЦитироватьПолучает следующую запись из результата запроса. Для обхода результата запроса нужно после получения выборки вызвать данный метод для позиционирования на первый элемент и далее вызывать до тех пор, пока не будет возвращено значение Ложь.

Цитата: AIFrame от 16 дек 2015, 06:18Если массив результата выборки всегда возвращает одно значение - эта команда позволит получить строку выборки и работать с ней

это ваще на каком языке? :kmtu:
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

AIFrame

Цитата: cska-fanat-kz от 16 дек 2015, 07:57
Цитата: AIFrame от 16 дек 2015, 06:18Про Выборка.Следующий() - это перебор данных массива

этот метод...
ЦитироватьПолучает следующую запись из результата запроса. Для обхода результата запроса нужно после получения выборки вызвать данный метод для позиционирования на первый элемент и далее вызывать до тех пор, пока не будет возвращено значение Ложь.

Именно это и сказал. Я надеюсь, спорить о том, что результат запроса - суть массив данных, мы не будем.
Цитата: cska-fanat-kz от 16 дек 2015, 07:57
Цитата: AIFrame от 16 дек 2015, 06:18Если массив результата выборки всегда возвращает одно значение - эта команда позволит получить строку выборки и работать с ней

это ваще на каком языке? :kmtu:
Ищем запросом контрагента. Мы предполагаем, что по заданной в запросе логике, значение всегда будет одно (Аналогично ВЫБРАТЬ 1). Поэтому мы уверены, что Выборка.Следующий() вернет нам нужный объект, а повторный вызов этой функции вернет Ложь, т.к. это будет конец массива. Поэтому же запускать Цикл будет лишним. Так понятнее?

vitasw

cska-fanat-kz, только не размазывайте его тонким слоем. Что с него взять, молодо-зелено.

cska-fanat-kz

Цитата: vitasw от 16 дек 2015, 14:31
cska-fanat-kz, только не размазывайте его тонким слоем. Что с него взять, молодо-зелено.

никогда не увлекался "давлением авторитетом, опытом и т.п."
ибо не считаю себя таким уж гуру.

Цитата: AIFrame от 16 дек 2015, 13:55Именно это и сказал. Я надеюсь, спорить о том, что результат запроса - суть массив данных, мы не будем.

вы правы, но я всего лишь хотел обратить внимание, что помимо "массива данных" в 1С существует и непосредственно "Массив" как один из видов коллекций значений. поэтому у ТС'а могло возникнуть разночтение.
причем если мы говорим именно о выборке из результата запроса, то это достаточно своеобразный массив данных - несколько отличается от вышеупомянутого классического массива. например нельзя обойти циклом "Для каждого" и обходить записи можно только последовательно либо через поиск, но никак не по индексу.

Цитата: AIFrame от 16 дек 2015, 13:55Ищем запросом контрагента. Мы предполагаем, что по заданной в запросе логике, значение всегда будет одно (Аналогично ВЫБРАТЬ 1). Поэтому мы уверены, что Выборка.Следующий() вернет нам нужный объект, а повторный вызов этой функции вернет Ложь, т.к. это будет конец массива. Поэтому же запускать Цикл будет лишним. Так понятнее?

всему свое время )
пусть приучается обходить выборку циклом, даже возвращающую в итоге всего одну строку.
так даже конструктор запроса с обработкой результата делает ;)
в целом не страшно что цикл выполнится один раз.
а до конструкций типа
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    ...
сам потом дойдет )
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск