Имя: Пароль:
1C
 
Типы данных параметра запроса
↓ (Волшебник 12.08.2025 11:36)
0 formista2000
 
12.08.25
10:28
Пытаюсь определить тип данных параметра запроса, но выдаёт ошибку. Параметром может быть документ любого из двух типов. Конструкции типа ССЫЛКА, а также ТИПЗНАЧЕНИЯ = ТИП отрабатывают только если заданный параметр того типа, на который идёт проверка, проверка на другой тип выдаёт ошибку.
Задача - выразить параметр как определённый тип, чтобы обратиться к одинаковому реквизиту обоих типов документов.
Есть ли рецепт?
Спасибо!
1 arsik
 
гуру
12.08.25
12:42
(0) Пример-то покажи. Мне ничего пока непонятно
2 Волшебник
 
12.08.25
10:30
Должна работать конструкция:
ТИПЗНАЧЕНИЯ(&П) = ТИП(Документ.ИмяДок)
3 Fish
 
гуру
12.08.25
10:40
(0) Надо строить запрос так, чтобы работал с любым типом, не выдавая ошибки.
4 arsik
 
гуру
12.08.25
10:41
(3) Прям чат жипити
5 formista2000
 
12.08.25
10:41
выбрать выбор когда типзначения(&док) = тип(документ.Счет) тогда выразить(&док как документ.Счет)
        когда  типзначения(&док) = тип(документ.Накладная) тогда выразить(&док как документ.Накладная) конец док

если параметр типа документ.Счет, то ошибка при ВЫРАЗИТЬ(&док как документ.Накладная), и наоборот.
6 YaFedor
 
12.08.25
10:43
(5) В Выбор же есть Иначе, в него и пихай второй выбор Когда
7 Fish
 
гуру
12.08.25
10:46
(5) А зачем вообще это выразить? Оно тут явно лишнее.
8 formista2000
 
12.08.25
10:47
(6) мимо
9 formista2000
 
12.08.25
10:50
(7) Чтобы обратиться к реквизиту. Реквизит называется одинаково в обоих типах документов. Например, "Контрагент".
+ иначе выдаёт ошибку "Поле не найдено".
10 Fish
 
гуру
12.08.25
10:50
(9) А почему сразу Контрагента не передать параметром?
11 formista2000
 
12.08.25
10:51
(10) красоты хочется
12 Ненавижу 1С
 
гуру
12.08.25
10:55
ВЫБРАТЬ
    Док.ФизическоеЛицо КАК ФизЛицо
ИЗ
    Документ.ПриемНаРаботу КАК Док
ГДЕ
    Док.Ссылка = &док

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Док.ФизическоеЛицо КАК ФизЛицо
ИЗ
    Документ.Увольнение КАК Док
ГДЕ
    Док.Ссылка = &док
13 formista2000
 
12.08.25
11:01
(12) Оно! Спасибо преогромнейшее!
14 Волшебник
 
12.08.25
11:02
(12) хрень какая-то
15 Ненавижу 1С
 
гуру
12.08.25
11:06
(14) согласен, но так хотел заказчик
16 formista2000
 
12.08.25
11:13
(14) (15) Ничего вы не понимаете! То что надо!
17 Fish
 
гуру
12.08.25
11:15
(16) Некрасиво же.
18 Волшебник
 
12.08.25
11:16
(15) Ему надо объяснить, что он дурак не прав
19 ангел
 
12.08.25
11:19
(18) Все верно. Потом кто-то другой откроет этот код и скажет "абзац...что за дурак писал"!
20 formista2000
 
12.08.25
11:19
(17) Всё красиво! Не хочу параметры плодить.
(18) Чогой-то? Есть ещё варианты решения?
21 ангел
 
12.08.25
11:21
(20) Контекст задачи не совсем понятен чтобы предложить варианты.
22 Волшебник
 
12.08.25
11:22
(20) Делайте запрос сразу к нужной таблице
23 Волшебник
 
12.08.25
11:23
Или вообще не делайте запрос:
док.ФизическоеЛицо выдаст требуемое
24 ангел
 
12.08.25
11:26
(20) Может быть есть регистр Сведений, например "Кадровые документы" или что-то еще ?
Какой контекст? Получен документ по ссылке ? Дальше что? Помещение в ВТ ?
25 ангел
 
12.08.25
11:31
(23)

ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДокументСсылка, "ФизическоеЛицо")
26 Ненавижу 1С
 
гуру
12.08.25
11:28
ОбщегоНазначения.ЗначениеРеквизитаОбъекта
27 Ненавижу 1С
 
гуру
12.08.25
11:35
(18) кому и зачем надо?
28 Волшебник
 
12.08.25
11:37
(26) Это ж извращение.

Здесь достаточно док.ФизическоеЛицо
29 formista2000
 
12.08.25
11:41
(22) Как например?
30 ангел
 
12.08.25
12:39
(29)
Запрос = Новый Запрос(
"ВЫБРАТЬ
    Док.ФизическоеЛицо КАК ФизЛицо
ИЗ
    Документ.ПриемНаРаботу КАК Док
ГДЕ
    Док.Ссылка = &док");
Если ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.Увольнение") Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "Документ.ПриемНаРаботу, "Документ.Увольнение");
КонецЕсли;

___________________________
Как вариант.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший