|
v7: 1С7.7: ПустоеЗначение для агрегатной переменной | ☑ | ||
---|---|---|---|---|
0
Smoleu
23.02.20
✎
17:57
|
Проблема при получении элементов справочника в переменную Контрагент, созданную как Контрагент = СоздатьОбъект("Справочник.Контрагенты"):
1) Метод ПустоеЗначение(Контрагент) выдает, что значение переменной пустое (хотя оно заведомо не пустое); 2) Метод Контрагент.Выбран() выдает, что Контрагент таки выбран (что очевидно). Код: Контрагент = СоздатьОбъект("Справочник.Контрагенты"); Контрагент.ВыбратьЭлементы(); Контрагент.ПолучитьЭлемент(); Сообщить("Получили первый элемент справочника."); Сообщить("Значение переменной Контрагент2:"); Сообщить(Контрагент); Сообщить("Метод ""ПустоеЗначение(Контрагент2)"" возвращает значение:"); Сообщить(ПустоеЗначение(Контрагент)); Сообщить("Метод ""Контрагент.Выбран()"" возвращает значение:"); Сообщить(Контрагент.Выбран()); Если аргумент = выборка из справочника через элемент формы Реквизит диалога, то метод возвращает непустое значение, т.е. корректное. Если Реквизит диалога присваивать любой переменной - всё тоже работает прекрасно. ___ Как только выборка делается переменной - всё наперекосяк. Вариант "не использовать Метод ПустоеЗначение" (т.е. заменить на др. метод) не рассматривается - он размещен в Глобальном модуле, и редактировать ее нельзя. ______ Всевозможные Гуглы и форумы показали мне лишь одно: Функция ПустоеЗначение() определяет, является ли пустым переданное значение. При этом применяются следующие правила: а) значение неопределенного типа — всегда пустое; б) значения следующих типов: «Справочник», «Перечисление», «Документ», «Счет», «Вид субконто», «План счетов», «Календарь» проверяются как в методах Выбран() для соответствующего типа объекта; Переменная Контрагент таки объявлена: СоздатьОбъект("Справочник.Контрагенты"); _______ Просим помощи. |
|||
1
ДенисЧ
23.02.20
✎
18:22
|
.ТекущийЭлемент() ?
|
|||
2
Smoleu
23.02.20
✎
18:41
|
.ТекущийЭлемент() во всех случаях возвращает прекрасные результат (в приведенном коде это первый элемент Справочника контрагентов)
|
|||
3
Smoleu
23.02.20
✎
18:45
|
Само собой, агрегатная переменная содержит все атрибуты элементов справочника при их (и элементов, и атрибутов) переборе. При том, что метод ПустоеЗначение() всегда возвращает пустое значение.
|
|||
4
Smoleu
23.02.20
✎
18:50
|
От же ж.
Если подвести под аргумент метода ПустоеЗначение(Контрагент.ТекущийЭлемент()), работает корректно. Проблема в том, что в отчете, который допиливаю, работа со значением Реквизит диалога ведется "в лоб", без .ТекущийЭлемент() - и оно работает! Всю голову свернул. |
|||
5
Smoleu
23.02.20
✎
19:10
|
Господин ДенисЧ, гигантское спасибо за оперативную помощь!
|
|||
6
MWWRuza
гуру
23.02.20
✎
19:27
|
Контрагент = СоздатьОбъект("Справочник.Контрагенты");
Контрагент.ВыбратьЭлементы(); Пока Контрагент.ПолучитьЭлемент() = 1 Цикл Сообщить("Контрагент: " + СокрЛП(Контрагент)); КонецЦикла; |
|||
7
Злопчинский
24.02.20
✎
14:18
|
(5) Потому что ты не понимаешь сути.
. "Если аргумент = выборка из справочника через элемент формы Реквизит диалога, то метод возвращает непустое значение, т.е. корректное. Если Реквизит диалога присваивать любой переменной - всё тоже работает прекрасно." - это что за поток сознания... . Контрагент как переменная и Контрагент как реквизит диалога - это две совершенно разные вещи. Контрагент = СоздатьОбъект("Справочник.Контрагенты"); Контрагент.ПолучитьЭлемент(); Сообщить(ПустоеЗначение(Контрагент)) . здесь Контрагент - не элемент справочника. здесь Контрагент - всего лишь некий указатель-курсор на очередной элемент справочника |
|||
8
Злопчинский
24.02.20
✎
14:18
|
А при выводах идет преобразование
|
|||
9
vcv
24.02.20
✎
15:04
|
(0) Если есть знакомство с 1С8, то ознакомься с различием между СправочникОбъект и СправочникВыборка.
Реквизит типа Справочник.Контрагенты содержит ссылку на конкретный элемент справочника - СправочникОбъект. Ссылка может быть пустой или непустой. Выборка из справочника не является ссылкой на элемент. Из неё можно получить ссылку с помощью ТекущийЭлемент(), что бы проверить его на пустое значение. Саму выборку проверять на ПустоеЗначение смысла не имеет. Как минимум потому, что выборка - это не значение. |
|||
10
Midrash
24.02.20
✎
23:10
|
(0) НЕ ЗначениеЗаполнено(Котрагент)
|
|||
11
Smoleu
25.02.20
✎
01:25
|
Господа, всем спасибо, вопрос решил.
Тов. Злопчинский вам тоже спасибо, сути отличия Реквизита диалога и выбора элемента справочника манипуляциями с переменной и я действительно не понимаю - при чтении атрибутов эти два объекта ведут себя идентично. Поток сознания означает ровно то, что написано: 1) К примеру, у меня есть Реквизит диалога "Контрагент" (само собой, предварительно настроенный на работу со "Справочник.Контрагенты"); 2) Выбираем в нем некий элемент (справочника); 3) Передаем полученное таким образом агрегатное значение названному в шапке методу: ПустоеЗначение(Контрагент) работает правильным и корректным образом; ______________ 4) Объявляем переменную Контрагент и выбираем любой, да хоть первый попавшийся, элемент справочника (Контрагент.ПолучитьЭлемент() и еже с ним) - получаем ТАКЖЕ агрегатное значение. Хрен знает, что за "некий указатель-курсор" имеется в виду - в документации 1С на этот характер полученного значения называется вполне однозначно, а про "указатель-курсор" не повествуется. 5) Передаем полученное таким образом агрегатное значение названному в шапке методу: а) ПустоеЗначение(Контрагент) НЕ работает корректным образом; Примечательно то, что Контрагент.Выбран() при этом показывает корректное значение; б) ПустоеЗначение(Контрагент.ТекущийЭлемент()) работает шикарно. Так же шикарно это работает и с данными, приобретенными Реквизитом диалога "Контрагент" по пунктам 1-3. |
|||
12
Smoleu
25.02.20
✎
01:26
|
Тов. vcv, с 1С8 пока не знаком, увы. За описание спасибо, я в доку на 1с77 подобного не видал - видимо, пока очень суровой документацией обладаю.
|
|||
13
Smoleu
25.02.20
✎
01:27
|
Тов. Midrash, спасибо за вариант :)
|
|||
14
Злопчинский
25.02.20
✎
02:24
|
ПЕРВЫЙ ВАРИАНТ
"1) К примеру, у меня есть Реквизит диалога "Контрагент" (само собой, предварительно настроенный на работу со "Справочник.Контрагенты"); 2) Выбираем в нем некий элемент (справочника); 3) Передаем полученное таким образом агрегатное значение названному в шапке методу: ПустоеЗначение(Контрагент) работает правильным и корректным образом;" - совершенно верно, потому что в реквизите диалога "контрагент" сидит конкретная ССЫЛКА на некий элемент спр.контрагенты (утрировано: сидит сам элемент) ВТОРОЙ ВАРИАНТ "4) Объявляем переменную Контрагент и выбираем любой, да хоть первый попавшийся, элемент справочника (Контрагент.ПолучитьЭлемент() и еже с ним) - получаем ТАКЖЕ агрегатное значение." - неверно. Есть одна тонкость.. ;-) "получаем ТАКЖЕ агрегатное значение." - нет, не получаешь ты агрегатное значение значение. В "контрагент" у тебя (упрощенно) сидит "указатель" на очередной объект (которым является элемент спр.контрагенты). Чтобы получить сам объект (значение из справочника, состоящее из кучи полей) - надо дернуть через .ТекущийЭлемент() |
|||
15
Smoleu
28.02.20
✎
00:42
|
Если возможно дайте ссылку (указатьль:) где почитать про этот указатель.
В книгах что нашел дичь какая-то написана, откуда неочевидно всё. Мне надо разобраться. |
|||
16
Злопчинский
28.02.20
✎
03:34
|
(15) нету про этот "указатель" чтива. упрощенно я тебе изложил. там все сложнее.
. вот например если ты напишешь МояПеременная = Спр.ТекущийЭлемент() - то в МояПеременная у тебя будет объект а вот если напишешь ТаблЗначений.Элемент = Спр.ТекущийЭлемент(); - то в ТЗ у тебя будет ссылка на обьект. . и то... есть нюансы... |
|||
17
Злопчинский
28.02.20
✎
03:37
|
(15) ты должен понимать - где ты работаешь с Объектом, где со ссылкой, а где - с выборокой. тогда сразу все станет понятно.
Вот если у теяб есть выборка по Справочнику Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент()=1 Цикл КакаяТоМояПроцедура(Спр); //здесь ты в процедуру передаешь выборку, в процедуре можешь дальше идти по выборке и прочее КакаяТоМояПроцедура(Спр.ТекущийЭлемент()); //тут передаешь объект - единственную запись справочника - и работаешь только с ней |
|||
18
Злопчинский
28.02.20
✎
03:42
|
вот в (11) в п.4 у тебя в Контрагенте - ВЫБОРКА.
. еще путаница у тебя может происходить из-за того, что когда ты пытаешься визуализировать (в табло/сообщение/в строку) объект или выборку - они у тебя приводятся к типу "строка", т.е. во время приведения визуальное значение получается как результат преобразования небазового значения в прсотую строку. Это создает иллюзию и непонятнку потому что разные сущности дают одинаковое визуальное представление. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |