Имя: Пароль:
1C
1С v8
Объект в параметр запроса
0 FromRome
 
02.07.16
13:08
Добрый день! подскажите пожалуйста, как правильно передать текущий объект (еще не записанный) параметром в запрос, например можно в запросе использовать ТЧ документа передав его параметром &Товары. А как передать сам объект (Знаю что можно передавать типизированные поля ТаблицыЗначений)? Все мои попытки приводят к ошибке метода Запрос.Выполнить().
Пример:

ТекОбъект = РеквизитФормыВЗначение("Объект", Тип("ДокументОбъект.Договор"));
Запрос = Новый запрос;                            ЗАпрос.Текст =
                                "ВЫБРАТЬ
       |    Договор.Пациент,
       |    Договор.Организация
       |ПОМЕСТИТЬ ТДог
       |ИЗ
       |    &ТекОбъект КАК Договор
       |;
       |
                               |////////////////////////////////////////////////////////////////////////////////
       |ВЫБРАТЬ
       |    ТДог.Пациент,
       |    ТДог.Организация
       |ИЗ
       |    ТДог КАК ТДог" ;
                               Запрос.УстановитьПараметр("ТекОбъект", ТекОбъект);
                               Результат = Запрос.Выполнить();
ТЗ = Результат.Выгрузить();
1 ovrfox
 
02.07.16
13:10
Текущий объект, который не записан , отсутсвует в базе данных , поэтому к нему нельзя обратиться через запрос.
Его прежнее состояние, которое было до начала редактирования можно получить запросом по парамерту Ссылка
2 4St
 
02.07.16
13:13
Добрый день!
Какая-то жесть, если честно. Для чего это?
Проще сделать новую ТаблицуЗначений с 2 колонками и 1 строкой (Пациент,Организация). 6 строк кода (можно даже 5).
Задача, кажется, вырвана из контекста.
3 FromRome
 
02.07.16
13:19
(2) Я задачу так и реализовал, сделал ТЗ с 2 колонками и 1 строкой и передал ее параметром, но возник интересующий меня вопрос, можно ли как то по другому передать текущие данные формы в запрос? без ТЗ

К примеру табличную часть можно передать в запрос следующимм образом:
Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Т_ДоговорУслуги.Услуга,
        |    Т_ДоговорУслуги.Цена
        |ПОМЕСТИТЬ ВТДок
        |ИЗ
        |    &Услуги КАК Т_ДоговорУслуги
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ВТДок.Услуга,
        |    ВТДок.Цена
        |ИЗ
        |    ВТДок КАК ВТДок";
    Запрос.УстановитьПараметр("Услуги", Услуги);


А можно ли передать весь объект в запрос? не используя условие что Документ.Ссылка = &Ссылка
4 4St
 
02.07.16
13:24
(3) Можно попробовать так

Запрос.Текст =
    "ВЫБРАТЬ
       |    &Пациент,
       |    &Организация
       |ПОМЕСТИТЬ ТДог
       |;
       |
       |ВЫБРАТЬ
       |    ТДог.Пациент,
       |    ТДог.Организация
       |ИЗ
       |    ТДог КАК ТДог" ;
                               Запрос.УстановитьПараметр("Пациент", ТекОбъект.Пациент);
Запрос.УстановитьПараметр("Организация", ТекОбъект.Организация);
5 FromRome
 
02.07.16
13:27
(4) а без секции "ИЗ Документ.Договор как Договор" разве будет работать?
6 FromRome
 
02.07.16
13:32
вот собственно моя функция:
Интерес чисто академический, варианты передачи параметров в запрос для выходной таблицы, кроме как Тз с описанием типов полей. Суть задачи в том что нужно проверять что конкретно взятая медицинская организация может принимать детей и конкретно взятый пациент это непосредственно ребенок, проверку нужно производить при заполнении формы документа ( при изменении пациента и организации )

ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Пациент", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
    ТЗ.Колонки.Добавить("Организация", Новый ОписаниеТипов("СправочникСсылка.Организации"));
    ЗначениеТЗ = ТЗ.Добавить();
    ЗначениеТЗ.Пациент = Объект.Пациент;
    ЗначениеТЗ.Организация = Объект.Организация;    
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Т_Договор.Пациент,
    |    Т_Договор.Организация
    |ПОМЕСТИТЬ ТТ
    |ИЗ
    |    &ТекОбъект КАК Т_Договор
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    Контрагенты.ТипВозраста,
    |    Контрагенты.Ссылка
    |ПОМЕСТИТЬ ВТК
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    Контрагенты.Ссылка В
    |            (ВЫБРАТЬ
    |                ТТ.Пациент
    |            ИЗ
    |                ТТ КАК ТТ)
    |    И Контрагенты.ТипВозраста = ЗНАЧЕНИЕ(ПЕРЕЧИСЛЕНИЕ.ТИПВОЗРАСТА.РЕБЕНОК)
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ТТ.Пациент,
    |    ТТ.Организация,
    |    ВТК.ТипВозраста
    |ИЗ
    |    ТТ КАК ТТ
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТК КАК ВТК
    |        ПО ТТ.Пациент = ВТК.Ссылка
    |ГДЕ
    |    ТТ.Организация В
    |            (ВЫБРАТЬ
    |                Организации.Организация
    |            ИЗ
    |                РегистрСведений.Организации КАК Организации
    |            ГДЕ
    |                Организации.ПринимаетДетей)";
    Запрос.УстановитьПараметр("ТекОбъект", ТЗ);
    Результат = Запрос.Выполнить();
    Если Результат.Выбрать().Следующий() Тогда
        Возврат  Истина;    
    Иначе
        Возврат Ложь;    
    КонецЕсли;
7 4St
 
02.07.16
13:39
(6)
Тогда хотя бы так:

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Контрагенты.ТипВозраста,
    |    Контрагенты.Ссылка
    |ПОМЕСТИТЬ ВТК
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    Контрагенты.Ссылка=&Пациент
    |    И Контрагенты.ТипВозраста = ЗНАЧЕНИЕ(ПЕРЕЧИСЛЕНИЕ.ТИПВОЗРАСТА.РЕБЕНОК)
    |;
    |
    |ВЫБРАТЬ Первые 1 1
    |ИЗ ВТК Внутреннее соединение РегистрСведений.Организации как РС_Орг По РС_Орг.Организация=&Организация и РС_Орг.ПринимаетДетей)";

    Запрос.УстановитьПараметр("Пациент", Объект.Пациент);
    Запрос.УстановитьПараметр("Организация", Объект.Организация);
    

    Результат = Запрос.Выполнить();
    Возврат Не Результат.Пустой();

Можно сократить вообще до одной таблицы.
8 4St
 
02.07.16
13:53
А если отойти от академизма в запросах и вернуться к академизмам в разработке, то задач в действительности две:

1) Проверить, что конкретно взятая медицинская организация может принимать детей
2) Проверить, что конкретно взятый пациент это непосредственно ребенок.

И они должны выполняться разными запросами. Да, их можно выполнить и единым пакетом, и даже вложенными запросами, но сами запросы разные, и миксовать их вместе - излишнее усложнение.
9 FromRome
 
02.07.16
14:11
(8) спасибо за идеи :)
10 FromRome
 
02.07.16
14:15
(8) Просто хочется все делать за 1 обращение к бд 1 запросом)
11 makfromkz
 
02.07.16
14:20
запросы могут быть разные, типо в 1 запрос можно запихать 100500 простых запросов
12 sash-ml
 
02.07.16
15:01
объект нельзя, как SQL поймет что там?.
Возможно когда нибудь будет реализована поддержка ХМЛ объектов. https://msdn.microsoft.com/ru-ru/library/ms187752.aspx
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший