Имя: Пароль:
1C
1С v8
Получить значение реквизита от объекта заранее неизвестного типа в запросе
,
0 kassbar
 
14.03.23
11:31
Пример запроса:

ВЫБРАТЬ
    &Регистратор КАК ДокументРегистратор
ПОМЕСТИТЬ Т
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Т.ДокументРегистратор КАК ДокументРегистратор,
        ??? КАК Подразделение
ИЗ
    Т КАК Т

Параметром может передаваться совершенно рандомный документ.
Задача - если это документ "Заказ клиента", то в поле "Подразделение" вывести значение его реквизита "Подразделение"(оно там точно есть), иначе вывести Неопределено.
1 Timon1405
 
14.03.23
11:34
Выбор когда Т.ДокументРегистратор ссылка документ.ЗаказКлиента тогда
Выразить(Т.ДокументРегистратор как документ.ЗаказКлиента).Подразделение
иначе
Неопределено
конец
2 PR
 
14.03.23
11:34
ВЫБОР и ССЫЛКА
3 kassbar
 
14.03.23
11:35
А вы сначала попробуйте )
Я же не просто так тему открыл
4 Amra
 
14.03.23
11:35
Выбор когда Т.ДокументРегистратор ССЫЛКА Документ.ЗаказПокупателя тогда
Т.ДокументРегистратор.Подразделение
Иначе НЕопределено
Конец Как Подразделение
5 Timon1405
 
14.03.23
11:35
(3) тогда расскажите как пробуете и что не работает
6 kassbar
 
14.03.23
11:36
(5) я перепробовал собственно все что вышеперечислено. Не работает, когда в качестве регистратора даем документ, у которого в принципе нет реквизита "Подразделение". Например, Ввод начальных остатков
7 Garykom
 
гуру
14.03.23
11:43
(6) плохо пробовал
8 p-soft
 
14.03.23
11:46
(3) день новых открытий, да..
9 RomanYS
 
14.03.23
12:05
(0) В БСП есть функции получения реквизитов по ссылке, в них Ваш вопрос решён
10 PR
 
14.03.23
12:09
(3) Да ладно
Что, такое не работает, точно?

ВЫБОР
    КОГДА Т.ДокументРегистратор ССЫЛКА Документ.ЗаказКлиента
        ТОГДА Т.ДокументРегистратор.Подразделение
    ИНАЧЕ НЕОПРЕДЕЛЕНО
КОНЕЦ
11 DJ Anthon
 
14.03.23
12:10
еще есть ЕСТЬNULL
12 Мультук
 
гуру
14.03.23
12:12
(10)

{ВнешняяОбработка.КонсольЗапросов.МодульОбъекта(676)}: Ошибка при вызове метода контекста (ВыполнитьПакет): {(8, 39)}: Несовместимые типы "ССЫЛКА"
ВЫБОР КОГДА Т.ДокументРегистратор <<?>>ССЫЛКА Документ.ЗаказКлиента ТОГДА

Оно (данный конкретный пример) примерно вот так работает в консоли. В обработке лень смотреть

P.S.
А автор тот еще троль! +1
13 PR
 
14.03.23
12:13
(11) Ну да, можно ЕСТЬNULL(Т.ДокументРегистратор, НЕОПРЕДЕЛЕНО)
Но ТС же нужен один конкретный документ, а не все, в которых есть реквизит Подразделение
14 RomanYS
 
14.03.23
12:14
(10) а должно?
15 RomanYS
 
14.03.23
12:15
(10) с выразить возможно будет работать
16 PR
 
14.03.23
12:16
(14) А, там же в (0) из параметра во внешнюю таблицу кидается сначала
Не знаю тогда, может и не будет такое работать
Но вообще нахрена тогда вычислять это в запросе, а не сделать еще один параметр &Подразделение
17 PR
 
14.03.23
12:18
(15) Ну конечно будет, раз мы одинеске явно говорим, что за тип мы получаем

ВЫБОР
    КОГДА ВЫРАЗИТЬ(Т.ДокументРегистратор КАК Документ.ЗаказКлиента) ССЫЛКА Документ.ЗаказКлиента
        ТОГДА ВЫРАЗИТЬ(Т.ДокументРегистратор КАК Документ.ЗаказКлиента).Подразделение
    ИНАЧЕ НЕОПРЕДЕЛЕНО
КОНЕЦ
18 RomanYS
 
14.03.23
12:21
(17) первый ВЫРАЗИТЬ выглядит лишним
19 RomanYS
 
14.03.23
12:26
+(18) и дает ошибку
Несовместимые типы "ВЫРАЗИТЬ"

Вероятно можно проверку ССЫЛКА заменить на сравненеи типов, только непонятно зачем всё это
20 kassbar
 
14.03.23
12:27
(16) ОК, упрощаю запрос (в контексте моей задачи это недопустимо, но для поиска решения сгодится):
ВЫБРАТЬ
    &Регистратор КАК ДокументРегистратор,
    ??? КАК Подразделение
21 Garykom
 
гуру
14.03.23
12:31
(20) через ВЫБОР с опорой на какой то заведомо существующий реквизит
например ХозяйственнаяОперация

или соединением с Документы.ЗаказКлиента
22 RomanYS
 
14.03.23
12:31
(20) что мешает определить тип параметра до передачи в запрос?
Без этого собирай запрос по всем метаданным, где есть поле Подразделение
23 Мультук
 
гуру
14.03.23
12:33
(20)

Я правильно понимаю ход мыслей?

ВЫБРАТЬ
    &Регистратор КАК ДокументРегистратор,
    &Подразделение КАК Подразделение
ПОМЕСТИТЬ ВТ_Т
;

///  Нельзя получить ТекущийРуководитель  /////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Т.ДокументРегистратор КАК ДокументРегистратор,
    ВТ_Т.Подразделение.ТекущийРуководитель КАК ПодразделениеТекущийРуководитель
ИЗ
    ВТ_Т КАК ВТ_Т
;

// Работает //////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Т.ДокументРегистратор КАК ДокументРегистратор,
    СтруктураПредприятия.ТекущийРуководитель КАК ТекущийРуководитель
ИЗ
    ВТ_Т КАК ВТ_Т
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СтруктураПредприятия КАК СтруктураПредприятия
    ПО
        ВТ_Т.Подразделение КАК Подразделение = СтруктураПредприятия.Ссылка
24 PR
 
14.03.23
12:35
(20) Ой, ладно, упрощатор

ВЫБРАТЬ
    &Регистратор КАК ДокументРегистратор,
    &Подразделение КАК Подразделение
25 kassbar
 
14.03.23
12:54
(21) Красавчик, выписываю премию )
ВЫБРАТЬ
    &Регистратор КАК ДокументРегистратор
ПОМЕСТИТЬ Т
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ    
    Т.ДокументРегистратор КАК ДокументРегистратор,
    ЕСТЬNULL(ЗаказКлиента.Подразделение, Неопределено) КАК Подразделение
ИЗ
    Т КАК Т
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента КАК ЗаказКлиента
        ПО (Т.ДокументРегистратор = ЗаказКлиента.Ссылка
26 Garykom
 
гуру
14.03.23
12:55
&НаСервере
Процедура ПроверитьНаСервере()
    
    Сообщить(""+Документ);
    
    ТекущийОбъект = РеквизитФормыВЗначение("Объект");
    
    Запрос = Новый Запрос(
    "ВЫБРАТЬ
    |    &Документ КАК ДокументРегистратор
    |ПОМЕСТИТЬ ВтДокументы
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    Документы.ДокументРегистратор КАК ДокументРегистратор,
    |    ЗаказКлиента.Подразделение КАК Подразделение
    |ИЗ
    |    ВтДокументы КАК Документы
    |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента КАК ЗаказКлиента
    |        ПО Документы.ДокументРегистратор = ЗаказКлиента.Ссылка");
    
    Запрос.УстановитьПараметр("Документ", Документ);
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    Сообщить(""+РезультатЗапроса[0].Подразделение);
        
КонецПроцедуры
27 Garykom
 
гуру
14.03.23
12:57
(25) >ЕСТЬNULL(ЗаказКлиента.Подразделение, Неопределено) КАК Подразделение

ЕСТЬNULL лишнее тут
28 PR
 
14.03.23
13:04
(27) Будет NULL, а не НЕОПРЕДЕЛЕНО
29 Garykom
 
гуру
14.03.23
13:22
(28) и в данном случае это плохо, инфу потеряли что соединение не произошло
30 kassbar
 
14.03.23
16:42
(29) да садись уже, пять )