7.7 Учусь делать запросы

Тема в разделе "Типовые решения "1С:Предприятие 7.7"", создана пользователем К_Е, 25 авг 2010.

  1. TopicStarter Overlay
    К_Е
    Offline

    К_Е Опытный в 1С

    Регистрация:
    8 июл 2008
    Сообщения:
    176
    Симпатии:
    0
    Баллы:
    26
    Всем день добрый!

    Осваиваю использование запросов, не могу "допереть" в чем мои ошибки и кое-где не понимаю смысла кода (инструкции не помогают).

    База: ТиС, 7.7

    Задача.
    Получить данные вида:

    Касса № 1
    = Чек № 0001 = проведен = сумма: 100 руб
    = Чек № 0002 = проведен = сумма: 110 руб
    = Чек № 0003 = не проведен = сумма: 200 руб

    и т.д. Т.е. по каждой кассе (всего кассс 7) вывести список чеков с номерами, суммами и статусом и видом чеков.
    (статус: проведен/не проведен/удален
    проведен = 1
    не проведен = 0;
    вид: чек/чек на возврат)

    Вот код:

    Код:
    
    Запрос = СоздатьОбъект("Запрос");
    
    ТекстЗапроса=
    " //{{ ЗАПРОС (ВыборЧеков)
    |Период с кн_дата по кн_дата; // кн_дата - берется из диалогового окна
    |ОбрабатыватьДокументы Все;//проведенные, непроведенные
    |Обрабатывать Все;//помеченные на удаление, не помеченные на удаление 
    |ЧЕК = Документ.ЧекККМ.ТекущийДокумент; // вот тут я не понимаю, что именно надо указать "ТекущийДокумент" или "НомерЧекаККМ"
    |КАССА = Справочник.Кассы.Наименование;
    |НомерЧека =  Документ.ЧекККМ.НомерЧекаККМ;
    |СТАТУСЧека = Документ.ЧекККМ.ЧекПробитККМ; 
    |ВИДЧека = Документ.ЧекККМ.ВидОперации;
    |СуммаПоЧеку = Документ.ЧекККМ.Сумма; 
    |Группировка Касса;
    |Группировка ЧЕК;
    |Функция Сум = Сумма(СуммаПоЧеку);
    |"//}}ЗАПРОС
    ;
    
    Если	Запрос.Выполнить(ТекстЗапроса) =0 Тогда
    Сообщить ("Ошибка выполнения запроса отбора чеков");  
    Возврат;
    Иначе
    
    Сообщить ("Выбрана дата: " + кн_дата);
    
    Пока Запрос.Группировка("Касса", 1) = 1 Цикл
    
    Пока Запрос.Группировка("чек", 1) = 1 Цикл
    
    Сообщить ("Касса: " + запрос.касса ); // название касс выводит правильно
    
    Сообщить ("Номер чека: " + запрос.НомерЧека);    // вместо номера выводит "0"
    
    Сообщить ("Статус чека: " + запрос.статусЧека );  // выводит "0"
    
    Сообщить ("Вид чека: " + запрос.видЧека );  // вообще ничего не выводит
    
    Сообщить("ок1"); 
    
    КонецЦикла;        
    
    Сообщить("ок2");
    
    КонецЦикла;
    
    Сообщить ("Общая сумма: " + запрос.Сум + " руб.");
    КонецЕсли; 
    
    
    
    Вопросы по порядку:

    1) |ЧЕК = Документ.ЧекККМ.ТекущийДокумент; // вот тут я не понимаю, что именно надо указать "ТекущийДокумент" или "НомерЧекаККМ" или что-то еще?
    Вообще не понимаю смысла атрибута "Текущий документ" в данном случае, в запросах в принципе :(

    2) После выполнения запроса, по идее получены результаты, если я правильно понимаю, в виде:

    = чек = касса = номер чека = статус чека = вид чека =


    3) Начинаю цикл в порядке указанных группировок, сначала по кассе, потом по чекам.

    Названия касс выводятся правильно и в нужном количестве - 7 штук.
    НО, не могу понять, почему название выводит ТОЛЬКО во вложенном цикле по чекам
    А в цикле по КАССАМ - нет.

    По идее должны же быть доступны названия. (просто из данного кода я строчку убрала, а сначал было вот так:

    Код:
    Пока Запрос.Группировка("Касса", 1) = 1 Цикл
    
    Сообщить ("Касса: " + запрос.касса ); // а здесь название касс не выводит
    
    Пока Запрос.Группировка("чек", 1) = 1 Цикл
    

    Короче, не поняла я, что доступно в первом цикле???


    4) Почему внешний цикл - по кассам, проходит правильно - 7 раз (по кол-ву касс), а внутренний цикл - по чекам - проходит только 1 раз для каждой кассы, хотя в моем понимании, должно быть так:
    внешний - 7 раз (по кол-ву касс), а внутренний - по кол-ву чеков каждой кассы соответственно (в базе чеки есть)

    5) ну и почему в цикле по чекам не выводится нужная инфа? Где я накосячила? 2-е сутки бьюсь
    Код:
    Сообщить ("Номер чека: " + запрос.НомерЧека);    // вместо номера выводит "0"
    
    Сообщить ("Статус чека: " + запрос.статусЧека );  // выводит "0"
    
    Сообщить ("Вид чека: " + запрос.видЧека );  // вообще ничего не выводит
    

    п.с. Без запросов, просто с условиями у меня все работает. Мне просто для изучения конструкции.
  2. TopicStarter Overlay
    К_Е
    Offline

    К_Е Опытный в 1С

    Регистрация:
    8 июл 2008
    Сообщения:
    176
    Симпатии:
    0
    Баллы:
    26
    подумала и убрала строчку:
    |Группировка Чек

    и соответственно, цикл по чекам
  3. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Смысл в том, что 1С предметноориентированный язык, и построен он на так называемых метаданных.
    Так вот ТекущийДокумент - это и есть сам документ (не номер, а именно объект метаданных со всеми его реквизитами, атрибутами и методами)

    любая база данных, и информационные базы 1С в том числе, это набор таблиц.
    в результате запроса так же получается таблица с определенными нами полями (переменные и функции запроса) и конкретным содержимым (отфильтрованное через условия).


    Чесно говоря, не понял о чем вообще речь


    Тут проблема в том, что в запросе касса и чеки никак не связаны.
    По идее касса - это реквизит чека, значит через чек ее и надо определять.

    В запросе нужно работать с самими объектами, а при обработке группировок уже выбирать нужные реквизиты.

    Для изучения очень полезно пользоваться конструктором запроса. Там все интуитивно понятно, а после получения нужного результата можно разбирать текст запроса.
    Так же полезно сразу после выполнения запроса выгружать его в таблицу значений, предварительно размещенную на форме (все возможные поля, но без итогов). Таким образом будет виден "голый" результат запроса (та таблица, о которой писал в самом начале).
    Если выгружать в таблицу с итогами, то можно просмотреть результаты итогов по группировкам, но это уже следующий шаг.

    Какие инструкции? В стандартной литературе этому пункту уделено много внимания (и теория и примеры различных задач)

    PS А вообще сильно много в одном посте написано, не удобно читать)))
    В следующий раз лучше маленькими порциями
  4. TopicStarter Overlay
    К_Е
    Offline

    К_Е Опытный в 1С

    Регистрация:
    8 июл 2008
    Сообщения:
    176
    Симпатии:
    0
    Баллы:
    26
    :unsure: вот!!!! СПАСИБО ОГРОМНОЕ ЗА ЭТУ МЫСЛЬ!!! В этом было все дело! А меня как заклинило на этом в неправильном направлении...

    учту, исправлюсь.

    За столь развернутый ответ спасибо, все прочитала, пойду осваивать :)

Поделиться этой страницей