Имя: Пароль:
1C
1С v8
Выборка из табличной части докуметов. Проблема с запросом
0 Анастасия Изотова
 
15.12.15
05:38
Помогите разобраться с внешней обработкой. У меня 1С 8.1. обработка-отчет.
Однотипные документы с табличной частью.
в процедуре первый запрос перебирает все документы за период, и берет реквизиты с формы.
А второй запрос выбирает из каждого документа содержимое табличной части, все что вписано в нее.
Например:
0001 Иванов ФизЛицо Колбасы 15кг  1000р
0001 Иванов ФизЛицо Сыры 10кг 2000р
0002 Петров ФизЛицо Колбасы 7кг 700р

У меня в процедуре какой то косяк, я не понимаю как из Результатов первой выборки обратиться с запросом к табличной части выбранных документов
1 Анастасия Изотова
 
15.12.15
05:39
Макет = ПолучитьМакет("Макет");

            
        Область = Макет.ПолучитьОбласть("Шапка");
            
        ДН = Формат(НачПериода, "ДФ=dd.MM.yyyy" );
        ДК = Формат(КонПериода, "ДФ=dd.MM.yyyy" );    
            
    
            ТабДок.Вывести(Область);

            Запрос = Новый Запрос;
            Запрос.Текст =
            
            "ВЫБРАТЬ
            |    НазначениеНаОсмотр.Пациент.Ссылка КАК Пациент,
            |    НазначениеНаОсмотр.Пациент.ДатаРождения КАК ДатаРождения,
            |    НазначениеНаОсмотр.Услуга КАК Услуга,
            |    НазначениеНаОсмотр.Номер КАК Номер,
            |    НазначениеНаОсмотр.Дата КАК ДатаДок
            |ИЗ
            |    Документ.НазначениеНаОсмотр КАК НазначениеНаОсмотр
            |ГДЕ
            |    НазначениеНаОсмотр.Дата <= &ДатаКон
            |    И НазначениеНаОсмотр.Дата >= &ДатаНач
            |    И НазначениеНаОсмотр.Проведен = &Истина" ;
            
            Запрос.УстановитьПараметр("ДатаКон", КонПериода);
            Запрос.УстановитьПараметр("ДатаНач", НачПериода);    
            Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес);    
            Запрос.УстановитьПараметр("Истина", Истина);                            
            
            
            Результат = Запрос.Выполнить().Выбрать();
            
            н = 1;
            Пока Результат.Следующий() цикл
                
                Область = Макет.ПолучитьОбласть("Строка");        
                Область.Параметры.ФиоП = Результат.Пациент;
                Область.Параметры.УслугаП = Результат.Услуга;
                
                Номер = Результат.Номер;
                
                Запрос2=Новый Запрос;
                Запрос2.Текст=
                "ВЫБРАТЬ
                |        ТабличнаяЧасть.Услуга,
                |        ТабличнаяЧасть.СпециализацияВрача,
                |        ТабличнаяЧасть.Сотрудник,
                |        ТабличнаяЧасть.Кабинет
                |    ИЗ
                |        Документ.НазначениеНаОсмотр.Услуги КАК ТабличнаяЧасть
                |    ГДЕ
                |        НазначениеНаОсмотр.Ссылка.Номер = &Номер";

                Запрос2.УстановитьПараметр("Номер",Номер);
                Результат = Запрос2.Выполнить().Выбрать();
    
                            Пока Результат.Следующий() Цикл
                            Область.Параметры.Кабинет=Результат.Кабинет;
        
                            ТабДок.Вывести(Область);
                            КонецЦикла;

                

                ТабДок.Вывести(Область);        
                н = н + 1;        
            КонецЦикла;
            
            Табдок.Показать("Отчет по за период");
2 Godofsin
 
15.12.15
05:43
В одном запросе делай
3 Godofsin
 
15.12.15
05:44
|    И НазначениеНаОсмотр.Проведен;
4 Анастасия Изотова
 
15.12.15
05:59
У меня не получается обьединить Табличную часть, и то что на форме ...
когда пишу
|ИЗ
            |    Документ.НазначениеНаОсмотр КАК НазначениеНаОсмотр
, выбираю то что на форме,

а когда
|    ИЗ
                |        Документ.НазначениеНаОсмотр.Услуги КАК ТабличнаяЧасть
из табличной части ...
5 Маратыч
 
15.12.15
06:02
Запрос в цикле - зло. Тут же без проблем можно к реквизитам шапки через Документ.НазначениеНаОсмотр.Услуги.Ссылка обратиться.
6 Маратыч
 
15.12.15
06:04
+(5) И это не "то, что на форме". Есть реквизиты шапки, есть реквизиты ТЧ, а как они представлены на форме (если вообще представлены) - зависит от разработчика. На форме их вообще может не быть, или, наоборот, на форме может быть размещен реквизит формы, к которому обратиться через реквизиты документа не получится.
7 Godofsin
 
15.12.15
06:12
(4) Бери таб. часть в запросе как источник. Там доступны реквизиты документа через слово "ссылка".
8 Godofsin
 
15.12.15
06:15
"ВЫБРАТЬ
                |        ТабличнаяЧасть.Ссылка.Пациент КАК Пациент,
                |        ТабличнаяЧасть.Услуга,
                |        ТабличнаяЧасть.СпециализацияВрача,
                |        ТабличнаяЧасть.Сотрудник,
                |        ТабличнаяЧасть.Кабинет
                |    ИЗ
                |        Документ.НазначениеНаОсмотр.Услуги КАК ТабличнаяЧасть
9 Godofsin
 
15.12.15
06:16
И лучше выбирать из регистра, если он есть конечно. Ибо .Проведен всего лишь галочка совсем неозначающая, что документ сделал движения.
10 Анастасия Изотова
 
15.12.15
06:23
так, ага .. значит нужны реквизиты из шапки, и реквизиты ТЧ...

А если Этот ВЫБАТЬ  работает с
|    ИЗ
                |        Документ.НазначениеНаОсмотр.Услуги КАК ТабличнаяЧасть

то как мне в этом же запросе к реквизитам шапки обратиться ?

и, регистров нет. Понятие Проведен - чисто номинальное. Проведенные документы в правилах безопасности участвуют
11 Мэс33
 
15.12.15
06:27
(10)
В консоли попробуй сделать обращение к табличной части.
А реквизиты шапки получишь по ссылке. Просто попробуй.
ТЧ не существует отдельно от документа.
12 Маратыч
 
15.12.15
06:27
(10) >как мне в этом же запросе к реквизитам шапки обратиться

Через ТабличнаяЧасть.Ссылка.
13 Мэс33
 
15.12.15
06:28
(0) Движений точно нет? Документ при проведении не создает их?
14 Мэс33
 
15.12.15
06:28
(12) по ходу фото понравилось. Никто не острит, все помогают ))))
15 Godofsin
 
15.12.15
06:28
(10)  |        ТабличнаяЧасть.Ссылка.Пациент КАК Пациент,
Читай внимательно.
16 Маратыч
 
15.12.15
06:30
+(12) Т.е. обращайся так: ТабличнаяЧасть.Ссылка.Услуга, ТабличнаяЧасть.Ссылка.Дата и т.д.

(14) Бгг, а я только посмотрел, кстати. Очень даже :)
17 Анастасия Изотова
 
15.12.15
06:46
Движений нет. В регистры он ничего не пишет ))
Я, поняла, когда :

"ВЫБРАТЬ
                |        ТабличнаяЧасть.Ссылка.Пациент КАК Пациент,  // эти строки забирают
        |        ТабличнаяЧасть.Ссылка.НомерДокумента КАК НомерДокумента,  // значения реквизитов
        |        ТабличнаяЧасть.Ссылка.ответственный КАК ответственный,   // из шапки
        |        ТабличнаяЧасть.Ссылка.Примечания КАК Примечания,  // формы
                |        ТабличнаяЧасть.Услуга,     // а  эти строки
                |        ТабличнаяЧасть.СпециализацияВрача,  // забирают значения
                |        ТабличнаяЧасть.Сотрудник,   //  из табличной
                |        ТабличнаяЧасть.Кабинет       //  части
                |    ИЗ
                |        Документ.НазначениеНаОсмотр.Услуги КАК ТабличнаяЧасть

так ?
18 hhhh
 
15.12.15
06:52
ты же так и делала

ГДЕ
                |        НазначениеНаОсмотр.Ссылка.Номер = &Номер";

Что такое у тебя НазначениеНаОсмотр.Ссылка.Номер  ?? Ведь Номер из шапки. А обращалась из табличной части. Посмотри свой же запрос.
19 Анастасия Изотова
 
15.12.15
06:59
Мой - был с двумя запросами. я сначала запросила документы, а потом искала как бы запросить ТЧ, по номеру документа, полученном в первом запросе ...

а +17 пост, там я все правильно поняла ?
20 Маратыч
 
15.12.15
07:11
(19) Ага, оно самое. И никаких запросов в цикле.
21 Маратыч
 
15.12.15
07:15
+(20) Только не "шапка формы", а "шапка документа". Форма документа - эт другое.
22 Анастасия Изотова
 
15.12.15
07:37
эхх, говорит что поле не найдено:

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

{Форма.Форма(41)}: Ошибка при вызове метода контекста (Выполнить): {(13, 2)}: Поле не найдено "НазначениеНаОсмотр.Ссылка.Дата"
<<?>>НазначениеНаОсмотр.Ссылка.Дата <= &ДатаКон
            Результат = Запрос.Выполнить().Выбрать();
по причине:
{(13, 2)}: Поле не найдено "НазначениеНаОсмотр.Ссылка.Дата"
<<?>>НазначениеНаОсмотр.Ссылка.Дата <= &ДатаКон
23 Мимохожий Однако
 
15.12.15
07:42
Удали это поле из списка
24 Zmich
 
15.12.15
07:43
(22). ГДЕ ТабличнаяЧасть.Ссылка.Дата и т.д.
25 Zmich
 
15.12.15
07:44
И еще, не нужно задавать параметр "Истина".
Просто ТабличнаяЧасть.Ссылка.Проведен = ИСТИНА
26 Мимохожий Однако
 
15.12.15
07:45
(0)Есть такой инструмент - консоль запросов. Второй инструмент - режим отладки.
27 Godofsin
 
15.12.15
07:54
(25) Просто ТабличнаяЧасть.Ссылка.Проведен
28 Анастасия Изотова
 
15.12.15
08:16
Такая же беда (((

|ИЗ
            |    Документ.НазначениеНаОсмотр.Услуги КАК ТабличнаяЧасть
            |ГДЕ
            |    ТабличнаяЧасть.Ссылка.Дата <= &ДатаКон
            |    ТабличнаяЧасть.Ссылка.Дата >= &ДатаНач
            |    И ТабличнаяЧасть.Ссылка.Проведен = Истина" ;


по причине:
{(14, 2)}: Синтаксическая ошибка "ТабличнаяЧасть.Ссылка.Дата"
<<?>>ТабличнаяЧасть.Ссылка.Дата >= &ДатаНач
29 Маратыч
 
15.12.15
08:24
(28) Перед ТабличнаяЧасть.Ссылка.Дата >= &ДатаНач не хватает "И".
30 ЛисИзЛеса
 
15.12.15
08:28
Предлагаю так!
|ГДЕ
            |    ТабличнаяЧасть.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
            |    И ТабличнаяЧасть.Ссылка.Проведен = Истина" ;
31 Мимохожий Однако
 
15.12.15
08:28
(28)Повторюсь. Консоль запросов есть у тебя?
32 denis_jj
 
15.12.15
08:58
Можно в вашем первом запросе добавить выбор тч услуги.
|Выбрать
|НазначениеНаОсмотр.Услуги КАК ТЧУслуги
|Из Документ.НазначениеНаОсмотр
Тогда в первом цикле в этом поле выборки первого запроса будет находиться результат запроса по табличной части. Его можно будет обойти вторым циклом.
По поводу оптимизации и запроса в цикле.....
Если в коде есть
Область.Параметры.ФиоП = Результат.Пациент;
Область.Параметры.УслугаП = Результат.Услуга;
и Результат.Пациент и Результат.Услуга это ссылочные типы, то при таком заполнении макета система неявно выполняет запрос в базу чтобы получить текстовое представление этих объектов. Так что с точки зрения оптимизации есть над чем поработать. Для исключения неявных запросов вместо ссылок нужно использовать Представление в запросе.
33 Анастасия Изотова
 
18.12.15
03:13
Получилось ! Спасибо огромное, парни )) А я возилась столько сидела !!!  И советы грамотные , приятно и прочесть и главное что после - все РАБОТАЕТ !!!!!  (:*
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.