Вопрос по заполнению списка выбора (программно)

1. user2068011 18.03.24 10:00 Сейчас в теме
Доброго времени суток, уважаемые Формучане!

Пишу к Вам с просьбой помочь мне разобраться, что я делаю не так. Пишу маленькую конфигурацию с нуля, для, так сказать, адаптации к 1С'ным реалиям. (перешёл с другого ЯПа)

Моя цель: заполнить выпадающий список (он же в 1С "список выбора") в документе на управляемой форме таким образом, чтобы в нём присутствовали только те значения, которые находятся по значению реквизита-ссылки на справочник.

Архитектура: 2 справочника: договор и контрагенты.
Справочник "Договор" - используется общий реквизит код, а также реквизит-ссылка на справочник "Контрагенты" (наименование);
Справочник "Контрагент" - общие реквизиты (код и наименование);
Документ "Заказ контрагенту" - 2 основных реквизита-ссылки:
1) Реквизит-ссылка на справочник "Контрагент", наименование;
2) Реквизит-ссылка на справочник "Договор", код.

Ситуация: допустим, есть множество контрагентов, с каждым из них может быть заключено несколько договоров, которые хранятся в справочнике "Договор". Мне необходимо при использовании реквизита-ссылки на справочник "Контрагент", заполнить реквизит список выбора "Договор" теми значениями, которые относятся только к выбранному в данный момент времени контрагенту.

Код:

Процедура в модуле формы с клиентским контекстом:
Процедура ДоговорНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	Перем СсылкаНаВыбранногоПоставщика, СписокДоговоров;
	Элементы.Договор.СписокВыбора.Очистить();
	СписокДоговоров = Новый СписокЗначений;
	СсылкаНаВыбранногоПоставщика = Объект.Поставщик;
	СписокДоговоров = ЗаполнитьВыпадающийСписокВыборкойПоОрганизации(СсылкаНаВыбранногоПоставщика);
	Элементы.Договор.СписокВыбора.ЗагрузитьЗначения(СписокДоговоров);
КонецПроцедуры
Показать


Функция в модуле формы с серверным контекстом:

Функция ЗаполнитьВыпадающийСписокВыборкойПоОрганизации(СсылкаНаВыбранногоПоставщика)
        Перем СписокДоговоров, ЗапросНаДоговор, РезультатЗапроса, Выборка;
	СписокДоговоров = Новый СписокЗначений;
	ЗапросНаДоговор = Новый Запрос(
	"ВЫБРАТЬ
	|	СправочникСписокДоговоров.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.СправочникСписокДоговоров КАК СправочникСписокДоговоров
	|ГДЕ
	|	СправочникСписокДоговоров.Поставщик.Ссылка = &ПараметрСсылкаНаВыбранногоПоставщика");
	ЗапросНаДоговор.УстановитьПараметр("ПараметрСсылкаНаВыбранногоПоставщика", СсылкаНаВыбранногоПоставщика);
	
	РезультатЗапроса = ЗапросНаДоговор.Выполнить();	
	
	Выборка = РезультатЗапроса.Выбрать();
	Пока Выборка.Следующий() Цикл
		СписокДоговоров.Добавить(Выборка.Ссылка);
	КонецЦикла;
	Возврат СписокДоговоров;
КонецФункции
Показать


Проблема возникает на этапе выполнения запроса, так, например, переменная "РезультатЗапроса" возвращает значение "Ссылка", однако тип в "Вычислителе выражения" (SHIFT+F9) показывает "Строка". При проверке передаваемого параметра в серверную функцию в отладчике видно, что тип "СправочникСсылка.Контрагент". Не понимаю, что не так.

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

В результате высвечивается ошибка "Несоответствие типов (параметр номер '1')".

Подскажите пожалуйста, в чём может быть проблема?

P.S.
Буду рад также любым советам, где можно найти хорошую документацию по платформе. Огорчает, что некоторые вещи подсветка синтаксиса не всегда показывает, что на мой взгляд большой минус. Благо, что есть встроенный помощник по синтаксису в виде описаний команд, но он на мой взгляд бывает перегружен выборами под различные объекты платформы, как новичок я довольно легко теряюсь.
По теме из базы знаний
Найденные решения
2. Sashares 35 18.03.24 10:06 Сейчас в теме
(1)
В результате высвечивается ошибка "Несоответствие типов (параметр номер '1')".

1)Там еще как бы пишется, в какой строке модуля ошибка. Какая сложность найти эту строку?

2) нельзя в НачалоВыбора вызывать серверную процедуру.

3)
Соответственно дальше до цикла "Пока Выборка.Следующий() Цикл" не доходит, программа просто пропускает его.


Это означает, что пустой результат. То есть по данному отбору данных в базе нет.

4) СписокЗначений (ValueList)
ЗагрузитьЗначения (LoadValues)
Синтаксис:
ЗагрузитьЗначения(<МассивЗначений>)

Параметры:
<МассивЗначений> (обязательный)
Тип: Массив.
Массив, содержащий значения для заполнения списка значений.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Sashares 35 18.03.24 10:06 Сейчас в теме
(1)
В результате высвечивается ошибка "Несоответствие типов (параметр номер '1')".

1)Там еще как бы пишется, в какой строке модуля ошибка. Какая сложность найти эту строку?

2) нельзя в НачалоВыбора вызывать серверную процедуру.

3)
Соответственно дальше до цикла "Пока Выборка.Следующий() Цикл" не доходит, программа просто пропускает его.


Это означает, что пустой результат. То есть по данному отбору данных в базе нет.

4) СписокЗначений (ValueList)
ЗагрузитьЗначения (LoadValues)
Синтаксис:
ЗагрузитьЗначения(<МассивЗначений>)

Параметры:
<МассивЗначений> (обязательный)
Тип: Массив.
Массив, содержащий значения для заполнения списка значений.
3. user2068011 18.03.24 10:25 Сейчас в теме
(2)
Здравствуйте, Sashares!

1) Строка ссылается на процедуру в клиентской части, а именно при попытке загрузить пустоту в выпадающий список (Элементы.Договор.СписокВыбора.ЗагрузитьЗначения(СписокДоговоров);)

2) Подскажите пожалуйста, в какой момент тогда обрабатывать реквизит с выпыдающим списком? Я, честно, ранее не рассматривал, что в этом может быть причина, первое что сейчас в голову приходит - обработать его не при открытии реквизита, который нужно заполнить, а при заполнении реквизита-поставщика.

3) Пожалуй, не лишним будет дополнить, что изначально я делал немного по-другому, я передавал значение реквизита в виде строки-наименования поставщика, и использовал запрос в качестве поиска по наименованию. Ошибка была та же самая, однако, используя подключаемый внешний модуль "Консоль запросов", у меня при написании того же запроса, что и в модуле формы - в окно с результатом выполнения запроса значения вываливались (список наименований). Запрос ни на йоту не менял.
4. Sashares 35 18.03.24 10:40 Сейчас в теме
(3)
1) Строка ссылается на процедуру в клиентской части, а именно при попытке загрузить пустоту в выпадающий список (Элементы.Договор.СписокВыбора.ЗагрузитьЗначения(СписокДоговоров);)


Тогда какие еще вопросы? Загружается не пустота, а пустой СписокЗначений.
А загружать надо Массив. п.4 предыдущего сообщения.

2) Подскажите пожалуйста, в какой момент тогда обрабатывать реквизит с выпыдающим списком?


Несколько мест:
- ПриСозданииНаСервере
- когда меняется реквизит Поставщик - в ПриИзменении, и если он еще где-то программно меняется, то и там.
5. user2068011 18.03.24 11:01 Сейчас в теме
(4)

Благодарю Вас, Sashares!

Действительно, проблема решилась. Я почему-то считал, что поведение будет как при использовании конструктора копирования в плюсах, Объекту с типом "Список Значений" возвращается "Список Значений", который бы присвоил полям текущего объекта значения возвращаемого и сразу же залетал бы в "СписокВыбора", который имеет тип "СписокЗначений".

Значение находит, осталось теперь разобраться как в массив записать именно что ссылку, а не просто значение. В выборке приходит с типом "Ссылка", но в Массив пишется как строка, из-за чего ругается на не соответствие типов. Но, думаю, с этим я сам попробую разобраться, спасибо Вам ещё раз. Я помечу Ваше первое сообщение как ответ на вопрос.
6. SlavaKron 18.03.24 11:12 Сейчас в теме
(1) Почитайте про связи параметров выбора. Тут кодить ничего не нужно – платформа сама это умеет.
PowerBoy; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот