Имя: Пароль:
1C
1С v8
Возврат значение функции
,
0 OLGA_
CHELNY_2015
 
07.07.15
15:53
Всем доброго!
Пишу .. и что то не так не вижу ошибку


&НаСервере
Процедура ПроверитьКодФиделиоКонтрагентаНаСервере()
    КодКонтрагента=ВыборКонтрагента(Объект.Кон);
    
    КодФ=Справочники.Контрагенты.НайтиПоКоду(КодКонтрагента).Ссылка;
    
    Сообщить("Результат функции"+КодФ);     //!!!ничего не сообщает  , только "Результат функции" .....
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьКодФиделиоКонтрагента(Команда)
    ПроверитьКодФиделиоКонтрагентаНаСервере(); //команда
КонецПроцедуры

Функция ВыборКонтрагента(код)//передаем код -внешний источник из загр файла)
    
    Запрос= Новый Запрос;
    Запрос.Текст=
    "ВЫБРАТЬ
    |    ДополнительныеСведения.Свойство,
    |    ДополнительныеСведения.Значение,
    |    ДополнительныеСведения.Объект
    |ИЗ
    |    РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
    |ГДЕ
    |    ДополнительныеСведения.Свойство = &Свойство
    |    И ДополнительныеСведения.Значение = &Значение";
    Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("КодФиделио_Контрагент"));
    Запрос.УстановитьПараметр("Значение", код);
    
    Результат = Запрос.Выполнить();
    ВыборкаРезультата=Результат.Выбрать();
    
        Пока ВыборкаРезультата.следующий() Цикл
            Если ВыборкаРезультата.Значение = код тогда
                 Возврат ВыборкаРезультата.Объект.Код; // получаю значение в вычислить выражение видно
             КонецЕсли;
        КонецЦикла;
            
    Сообщить("ВыборкаРезультата.Значение"+ВыборкаРезультата.Объект.Код); // код контрагента получила теперь надо в процедуре найти этого контрагента по полученному коду
            
КонецФункции
1 SleepyHead
 
гуру
07.07.15
15:54
А если в выборке ни одной строки нет, что вернет функция?
2 SleepyHead
 
гуру
07.07.15
15:54
Срочно отобрать у нее компьютер и отправить варить борщ. *facepalm.
3 PuhUfa
 
07.07.15
15:55
А кому ты хочешь Сообщить( &НаСервере ?
4 Franchiser
 
гуру
07.07.15
15:55
ВыборкаРезультата.Объект м.б. пустая ссылка поэтому ошибка
5 SleepyHead
 
гуру
07.07.15
15:56
(3) Да сообщить-то можно, вопрос в том, что она сообщает :)
6 Timon1405
 
07.07.15
15:57
(3) а расскажите, в чем проблема с сообщить на сервере?
7 Franchiser
 
гуру
07.07.15
15:57
сообщить в цикл надо
8 Franchiser
 
гуру
07.07.15
15:57
уже не в чем, с какого то релиза сообщить работает на сервере и возвращается на клиента, если конечно в обработке не больше 1-й формы
9 OLGA_
CHELNY_2015
 
07.07.15
15:58
(4) нет я специально так все разложила это просто внешняя обработка пытаюсь понять как будет работать...код который передаю точно есть как доп сведение
10 Franchiser
 
гуру
07.07.15
15:59
Если ВыборкаРезультата.Объект = Справочник.Контрагенты.ПустаяСсылка
тогда будет ошибка в коде:

ВыборкаРезультата.Объект.Код
11 OLGA_
CHELNY_2015
 
07.07.15
16:00
(3) проверка где сообщает а где перестает видеть значение
12 Franchiser
 
гуру
07.07.15
16:01
короче пиши так
Если Значениезаполнено(ВыборкаРезультата.Объект) тогда
Возврат ВыборкаРезультата.Объект.Код;
КонецЕсли;
13 Franchiser
 
гуру
07.07.15
16:01
аналогично
Если Значениезаполнено(ВыборкаРезультата.Объект) тогда
Сообщить("ВыборкаРезультата.Значение"+ВыборкаРезультата.Объект.Код);
КонецЕсли;
14 OLGA_
CHELNY_2015
 
07.07.15
16:03
(10) &НаСервере
Процедура ПроверитьКодФиделиоКонтрагентаНаСервере()
    КодКонтрагента=ВыборКонтрагента(Объект.Кон);
    
    КодФ=Справочники.Контрагенты.НайтиПоКоду(КодКонтрагента).Ссылка;
    
    Сообщить("Результат функции"+КодФ);     //!!!ничего не сообщает  , только "Результат функции" .....
КонецПроцедуры
здесь проблема, код получила в процедуре то не могу им воспользоваться
15 OLGA_
CHELNY_2015
 
07.07.15
16:04
Объект.Кон- это просто поле ввода, тип строка, длина 6 , целое. ввожу 126- то что точно есть в базе, это доп сведение
16 OLGA_
CHELNY_2015
 
07.07.15
16:05
функция получает и сообщает правильно
17 Franchiser
 
гуру
07.07.15
16:05
Кто так пишет: КодФ=Справочники.Контрагенты.НайтиПоКоду(КодКонтрагента).Ссылка; ?
18 Franchiser
 
гуру
07.07.15
16:06
Посмотри в СП что возвращает НайтиПоКоду()
19 OLGA_
CHELNY_2015
 
07.07.15
16:06
а в поце не могу этим кодом воспользоваться почему то...чтобы найти нужного мне контрагента
20 OLGA_
CHELNY_2015
 
07.07.15
16:07
(17) а что не так?
21 Franchiser
 
гуру
07.07.15
16:07
ОбщегоНазначенияКлиентСервер.СообщитьПользователю() сделай вместо Сообщить()
22 Franchiser
 
гуру
07.07.15
16:08
(20) то что
Возвращаемое значение:

Тип: СправочникСсылка.<Имя справочника>; Неопределено.
Если не существует ни одного элемента с требуемым кодом, то будет возвращена пустая ссылка.
Если для справочника код не задан (длина = 0), то будет возвращено Неопределено.
23 D_E_S_131
 
07.07.15
16:09
(21) Это что-то изменит?
24 Franchiser
 
гуру
07.07.15
16:09
1. Нет смысла писать ".Ссылка"
2. Случай когда = Неопределено у тебя и вернет пустое сообщение.
25 OLGA_
CHELNY_2015
 
07.07.15
16:10
(17) чушь какую то..точно не мой элемент а какой то пустой
26 Franchiser
 
гуру
07.07.15
16:10
КодФ - это что, по твоему коду это ссылка а не код
27 OLGA_
CHELNY_2015
 
07.07.15
16:10
(24) Хорошо, это поняла
28 Franchiser
 
гуру
07.07.15
16:11
3. Случай когда = пустаяссылка у тебя тоже вернет пустое сообщение.
29 antoneus
 
07.07.15
16:11
Я, может, не в курсе каких-то тонкостей, но зачем в функции находить ссылку, брать ее код и потом по коду опять находить эту же ссылку, а не возвращать сразу ссылку?
30 Timon1405
 
07.07.15
16:11
зачем вообще искать по коду?
судя по коду в строке
Возврат ВыборкаРезультата.Объект.Код;// получаю значение в вычислить выражение видно
в "ВыборкаРезультата.Объект" уже сидит контрагент.
а если там сидит другой тип, то можно в том же запросе соединиться с таблицей контрагентов по коду и сразу вытащить нужного
31 OLGA_
CHELNY_2015
 
07.07.15
16:13
(29) я в функции нахожу доп сведение, и потом хозяина(объекта) этого свойства и значения, нахожу по коду полученного объекта. Работа с дополнительными сведениями справочника
32 Franchiser
 
гуру
07.07.15
16:13
(29) честно, не знаю, не я писал этот код
33 OLGA_
CHELNY_2015
 
07.07.15
16:13
пока не вижу другого варианта чем через запрос и функ.
34 OLGA_
CHELNY_2015
 
07.07.15
16:14
нет а как еще в доп сведениям объекта обращаться? как мне искать значение доп сведения, например если это ключ к полю загрузки?
35 Franchiser
 
гуру
07.07.15
16:14
что ты хочешь сообщить в функции?
36 OLGA_
CHELNY_2015
 
07.07.15
16:15
(30) да точно хороший вариант-сейчас приклею еще таблицу
37 OLGA_
CHELNY_2015
 
07.07.15
16:16
(35) уже сообщила-код объекта, он получен.
Теперь в процедуре, нужно по полученному коду находить нужный объект
38 antoneus
 
07.07.15
16:17
Так в регистре в измерении "Объект" сразу ссылка на контрагента же и сидит, не?
39 Franchiser
 
гуру
07.07.15
16:17
Почему так нельзя?
Если ТипЗНЧ(ВыборкаРезультата.Объект) = Тип("Справочник.Контрагенты") Тогда Сообшить(ВыборкаРезультата.Объект.Код)
Конецесли;
40 Timon1405
 
07.07.15
16:18
(38) видимо там сидит другая сущность
41 OLGA_
CHELNY_2015
 
07.07.15
16:20
ну надо мне код для начала, и по коду найти, ставила уже вместо кода ссылку на объетк-тоже возвращает - все хорошо-но проблема в том что дальше в процедуре не могу воспользоваться возвращаемым значением
42 OLGA_
CHELNY_2015
 
07.07.15
16:20
(40) о какой сущности речь?
43 Franchiser
 
гуру
07.07.15
16:21
Объект - это по-моему и есть контрагент
44 OLGA_
CHELNY_2015
 
07.07.15
16:21
доп сведения, поиск и загрузка данных по значению доп свед
45 OLGA_
CHELNY_2015
 
07.07.15
16:21
(43) именно, возвращает мне название контрагента-все отлично здесь функция рабочая
46 OLGA_
CHELNY_2015
 
07.07.15
16:22
процедура не рабочая
Процедура ПроверитьКодФиделиоКонтрагентаНаСервере()
    КодКонтрагента=ВыборКонтрагента(Объект.Кон);
    
    КодФ=Справочники.Контрагенты.НайтиПоКоду(КодКонтрагента).Ссылка;
    
    Сообщить("Результат функции"+КодФ);    //!!!ничего не сообщает  , только "Результат функции" .....
47 OLGA_
CHELNY_2015
 
07.07.15
16:22
Сообщить("Результат функции"+КодКонтрагента);  тоже ничего
48 Franchiser
 
гуру
07.07.15
16:24
Замени КодФ=Справочники.Контрагенты.НайтиПоКоду(КодКонтрагента).Ссылка;
На
СсылкаКонтр = Справочники.Контрагенты.НайтиПоКоду(КодКонтрагента);
Если
ЗначениеЗаполнено(СсылкаКонтр) тогда
КодФ = СсылкаКонтр.Код;
Иначе
КодФ = "---";
КонецЕсли;
Сообщить("Результат функции"+КодФ);
49 OLGA_
CHELNY_2015
 
07.07.15
16:27
(48) сейчас попробую
50 Franchiser
 
гуру
07.07.15
16:29
лучше писать даже СсылкаКонтр = Справочники.Контрагенты.НайтиПоКоду(СокрЛП(КодКонтрагента));
51 Timon1405
 
07.07.15
16:30
(45) он возвращает не название а ссылку на контрагента!
52 OLGA_
CHELNY_2015
 
07.07.15
16:32
Результат функции---
53 Franchiser
 
гуру
07.07.15
16:33
значит по коду не нашел
54 OLGA_
CHELNY_2015
 
07.07.15
16:33
(51) Функция ВыборКонтрагента(код)//передаем код -внешний источник из загр файла)
    
    Запрос= Новый Запрос;
    Запрос.Текст=
    "ВЫБРАТЬ
    |    ДополнительныеСведения.Свойство,
    |    ДополнительныеСведения.Значение,
    |    ДополнительныеСведения.Объект
    |ИЗ
    |    РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
    |ГДЕ
    |    ДополнительныеСведения.Свойство = &Свойство
    |    И ДополнительныеСведения.Значение = &Значение";
    Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("КодФиделио_Контрагент"));
    Запрос.УстановитьПараметр("Значение", код);
    
    Результат = Запрос.Выполнить();
    ВыборкаРезультата=Результат.Выбрать();
    
        Пока ВыборкаРезультата.следующий() Цикл
            Если ВыборкаРезультата.Значение = код тогда
                Если Значениезаполнено(ВыборкаРезультата.Объект) тогда
                    Возврат ВыборкаРезультата.Объект.Код;
                КонецЕсли; // получаю значение в вычислить выражение видно
             КонецЕсли;
        КонецЦикла;
            
    Сообщить("ВыборкаРезультата.Значение"+ВыборкаРезультата.Объект.Код); // код контрагента получила теперь надо в процедуре найти этого контрагента по полученному коду
            
КонецФункции



сообщает: ВыборкаРезультата.Значение00-000901
55 OLGA_
CHELNY_2015
 
07.07.15
16:34
по коду 00-000901 есть такой контрагент в базе
56 Franchiser
 
гуру
07.07.15
16:34
как ты передаешь этот код в ту процедуру?
57 Franchiser
 
гуру
07.07.15
16:35
в процедуру ПроверитьКодФиделиоКонтрагентаНаСервере()
58 Franchiser
 
гуру
07.07.15
16:36
пробуй написать СсылкаКонтр = Справочники.Контрагенты.НайтиПоКоду(СокрЛП(КодКонтрагента));
59 Franchiser
 
гуру
07.07.15
16:36
отладчик пробовала запускать?
60 OLGA_
CHELNY_2015
 
07.07.15
16:37
да, пусто в нем просто пусто.. поэтому и на форум зашла
61 Franchiser
 
гуру
07.07.15
16:37
КодКонтрагента у тебя случайно не реквизит формы?
62 OLGA_
CHELNY_2015
 
07.07.15
16:38
(58) это да написал именно так)
63 OLGA_
CHELNY_2015
 
07.07.15
16:38
ща гляну ..хотя станд буха
64 OLGA_
CHELNY_2015
 
07.07.15
16:39
(61) вот это блин-код это реквизит формы? в дереве конф в реквизитах нет КОДа
65 Franchiser
 
гуру
07.07.15
16:39
А если так:
СсылкаКонтр = Справочники.Контрагенты.НайтиПоКоду(СокрЛП(Объект.Кон));
Если
ЗначениеЗаполнено(СсылкаКонтр) тогда
КодФ = СсылкаКонтр.Код;
Иначе
КодФ = "---";
КонецЕсли;
Сообщить("Результат функции"+КодФ);
66 D_E_S_131
 
07.07.15
16:39
(54) По хорошему надо бы проверить еще характеристику:

ИмяСвойства = "КодФиделио_Контрагент";

СвойствоКодФид = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(ИмяСвойства, Истина);

Если СвойствоКодФид.Пустая() Тогда
   Сообщить("Нет свойства «" + ИмяСвойства + "»!");
   Возврат;
КонецЕсли;

Запрос= Новый Запрос;
...
67 Franchiser
 
гуру
07.07.15
16:40
(64) не понял, если реквизит формы (а не обработки) нужно проверить что он тип строка
68 Mirnin
 
07.07.15
16:42
Сам факт того, что вышеприведенный код что-то сообщает, говорит о том, что Возврат в функции не происходит - иначе бы до Сообщить() дело не дошло.

Копайте в условия цикла.

ВыборкаРезультата.Значение = код

СокрЛП(код) может быть. Проверьте корректность сравнения, поставьте точку останова и посмотрите значения.
69 OLGA_
CHELNY_2015
 
07.07.15
16:44
(67) пока еще мучаюсь) сейчас еще разок все должно получиться
70 D_E_S_131
 
07.07.15
16:44
+ к (68). Что будете делать, если у нескольких контрагентов этот "код_фиделио" одинаковый?
71 Franchiser
 
гуру
07.07.15
16:44
Проверь что происходит до и после
КодКонтрагента=ВыборКонтрагента(Объект.Кон);

Происходит ли присвоение, чему равен Объект.Кон в отладчике.
Если присвоение не работает, значит разные типы.
72 OLGA_
CHELNY_2015
 
07.07.15
16:47
"126   " и "126" пробелы у левого значения , в сравнении ВыборкаРезультата.Значение = код
73 OLGA_
CHELNY_2015
 
07.07.15
16:47
(70) ну так не должно это уникальный код
74 Franchiser
 
гуру
07.07.15
16:48
СокрЛП() пробуй
75 D_E_S_131
 
07.07.15
16:53
(74) Беда....
76 OLGA_
CHELNY_2015
 
07.07.15
16:54
нормалек! Победили! показывает типы и длина и лишние пробелы в совокупности мешали получить результат функции в проце. спасибы!!!!
77 D_E_S_131
 
07.07.15
16:56
(76) Вообще так отладчик творит чудеса. В нем можно проверить каждую строчку своего "неординарного" кода.
78 SleepyHead
 
гуру
08.07.15
05:27
(77) Некоторых просто с кухни выпускать не надо. Задолбали особи с женской логикой, возомнившие себя "программистами".
79 Альбатрос
 
08.07.15
05:31
(78) +100500!!!. У меня в отделе один программист женского пола. Это пздц...