Имя: Пароль:
1C
1C 7.7
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 у тебя в Контрагенте - ВЫБОРКА.
.
еще путаница у тебя может происходить из-за того, что когда ты пытаешься визуализировать (в табло/сообщение/в строку) объект или выборку - они у тебя приводятся к типу "строка", т.е. во время приведения визуальное значение получается как результат преобразования небазового значения в прсотую строку. Это создает иллюзию и непонятнку потому что разные сущности дают одинаковое визуальное представление.