Имя: Пароль:
1C
 
Как присвоить полю выбора на форме документа уже найденное значение?
, ,
0 AleksandrKulik
 
10.08.18
08:07
Есть документ с реквизитами Название абонента(Тип СправочникСсылка.Абоненты2) и Лицевой счет(Тип  Строка);
у документа есть еще и табличная часть, но мы пока о ней говорить не будем, так как вобпрос не в этом.
и есть справочник Абоненты 2 где хранится информация об этих абонентах и имя абонента (стандартный реквизит Наименование) и его лицевой счет (реквизит ЛицСчет)
В автоматически сгенерированной платформой форме документа у реквизита НазваниеАбонента(Вид Поле ввода) (ПутьКДанным Объект.НазваниеАбонента) есть кнопка выбора.
Она прекрасно работает и позволяет выбрать нужного абонента в форме выбора. В принципе мне все так и нужно.
Но стоит такая задача, что пользователи кто как... кто привык по лицевому счету выбирать, кто по названию.
То есть если в пустую форму я введу лицевой счет, то процедура ПриИзменении должна найти соответствующее имя абонента и подставить это значение в поле выбора, но этого не происходит.

Пишу для поля Лицевой счет следующий код:

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

&НаКлиенте
Процедура ЛицевойСчетПриИзменении(Элемент)
        
    ОтвФункц = ПолучитьИмяАбонента(Объект.ЛицевойСчет);
    Сообщить (ОтвФункц);
    // Сообщает правильное значение, значит до сих пор все ок.
    //здесь нужно както присвоить полю с выпадающим списком
    //выбора уже найденное значение    ОтвФункц
    Объект.НазваниеАбонента = ОтвФункц;
КонецПроцедуры

Код правильно отрабатывает но проблема возникает как раз при попытке присвоить объекту (Объект.НазваниеАбонента) найденное значение.
Помогите кто знает пожалуйста.
1 catena
 
10.08.18
08:19
Потому что тип поля СправочникСсылка, а вы туда пихаете строку.
2 Мимохожий Однако
 
10.08.18
08:19
Как получаешь выпадающий список?
Какой тип у переменной ОтвФункц?
Какой тип у реквизита НазваниеАбонента?
Приведи текст возникающей ошибки
3 catena
 
10.08.18
08:20
И посик через перебор выборки, приведение ссылки к строковому значению для сравнения - это жесть.
4 AleksandrKulik
 
10.08.18
08:31
Как получаешь выпадающий список?
Поставил тип поля СправочникСсылка ...
Какой тип у переменной ОтвФункц?
  Там Строка
Какой тип у реквизита НазваниеАбонента?
СправочникСсылка ...
Приведи текст возникающей ошибки
Ошибку не выдает. просто значение не подставляется.


Я понимаю что пихаю стоку в ссылку. и что из-за несоответствия типов и не работает. вопрос можно ли как то обойти эту проблему. Возможно есть решение...
5 catena
 
10.08.18
08:33
(4)Конечно есть. Работать не с наименованием, а с ссылкой.
6 AleksandrKulik
 
10.08.18
08:33
И посик через перебор выборки, приведение ссылки к строковому значению для сравнения - это жесть.

Из Вашего поста я так понял что нет решения "малой кровью" в этой ситуации и решать ее нужно другим способом.
7 AleksandrKulik
 
10.08.18
08:34
Конечно есть. Работать не с наименованием, а с ссылкой.

А подробнее вы не могли бы пояснить, а то я не пойму как
8 AleksandrKulik
 
10.08.18
08:36
То есть ответом функции должна быть ссылка на конкретное значение реквизита в справочнике?
9 Мимохожий Однако
 
10.08.18
09:12
(8) пытаешься "впихнуть невпихуемое". Какой тип в реквизите, с таким же типом и значение присваивай.
10 AleksandrKulik
 
10.08.18
09:32
(9) Ок.

Вопрос как изменить код, что бы функция получила ссылку на найденное имя абонента. вот сейчас с этим и бодаюсь.
11 Мимохожий Однако
 
10.08.18
09:33
(10) Сделай запросом для начала
12 Mankubus
 
10.08.18
09:37
(10) имяабон =выбр.Сссылка
13 AleksandrKulik
 
10.08.18
09:50
(12) Спасибо все получилось. Спасибо за помощь.
Код работает в таком виде:

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

&НаКлиенте
Процедура ЛицевойСчетПриИзменении(Элемент)
    ОтвФункц = ПолучитьИмяАбонента(Объект.ЛицевойСчет);
    Объект.НазваниеАбонента = ОтвФункц;
КонецПроцедуры
14 catena
 
10.08.18
10:54
(13)Осталось переписать функцию ПолучитьИмяАбонента, например, на запрос.
Ошибка? Это не ошибка, это системная функция.