Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2, свеженьких 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Помогите понять принцип создания запросов в 1с 7.7 конф 7.7.00 3 страниц V  < 1 2 3          
Макс1С Подменю пользователя
сообщение 04.10.19, 14:36
Сообщение #41

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 189
Из: Днепр
Спасибо сказали: 62 раз
Рейтинг: 58.6

ZUBR @ Вчера, 17:43 * ,
На примере этого запроса:
    ТекстЗапросаАкс = 
    "
    |Период с НачДата по КонДата;
    |ОбрабатыватьДокументы Проведенные;
    |СтатусЗаказа = Документ.РасходнаяНакладная.СтатусЗаказа;    
    |Товар = Документ.РасходнаяНакладная.Товар;
    |СуммаСНДС = Документ.РасходнаяНакладная.СуммаСНДС;
    |Функция СумАкс = Сумма(СуммаСНДС);
    |Группировка Товар Без Групп;
    |Условие (СтатусЗаказа = Перечисление.Статусы.Акс);";
  
Запрос.Выполнить(ТекстЗапросаАкс);  //*1

    Пока Запрос.Группировка() = 1 Цикл   //*2
        СумАкс = Запрос.СумАкс;
    КонецЦикла;
Сообщить("Сумма акс:"+СумАкс); //*3


//*1 - на этой строке у нас выполняется запрос и мы получаем таблицу с колонками "Товар" и "СумАкс" в которой строк будет столько, сколько разных товаров мы продали за период
пусть будет 3 строки: Товар1 на сумму 5000,00, Товар2 - 7000,00, Товар3- 3000,00

//*2 - в цикле мы обходим строки этой талицы, т.е. код внутри цикла выполнится 3 раза. Если мы условно уберем цикл, то наш код (напишу со значениями которые записываем в переменную) будет выглядеть примерно так:
СумАкс = 5000;
СумАкс = 7000;
СумАкс = 3000;
т.е. мы в одну переменную просто три раза присваиваем разные значения

и вот когда мы доходим до //*3 - у нас будет СумАкс = 3000; - именно последнее значение которое мы туда записали.

А если сделаем так:
СумАкс = 0;
Пока Запрос.Группировка() = 1 Цикл
    СумАкс = СумАкс  + Запрос.СумАкс;
КонецЦикла;
Сообщить("Сумма акс:"+СумАкс);

после выхода из цикла у нас СумАкс = 15000,00.

Если у вас на выходе получается сумма, то это магия или я совсем ничего не понимаю в 1С 7.7)))

PS. Ваш вариант сработает в случае, если во всей выборке запроса будет всего 1 товар(точнее во всех документах из выборки будет одинаковый товар) и цикл выполнится 1 раз

ZUBR Подменю пользователя
сообщение 04.10.19, 19:47
Сообщение #42

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 3

Макс1С @ Сегодня, 15:36 * ,
Я сейчас проверю и сообщу результат

Макс1С @ Сегодня, 15:36 * ,
У меня все считает правильно. Товары со статусом заказа АКС (Это аксессуары) разные и в разных количествах. Услуги тоже разные. Видов 4 или 5. В разных документах могут быть разные товары и услуги. Привожу реально работающую часть кода еще раз.

Процедура Сформировать() 

    Запрос = СоздатьОбъект("Запрос");
    
        ТЗ = СоздатьОбъект ("ТаблицаЗначений");
    
//Создание колонок
     ТЗ.НоваяКолонка("НачДата");    
     ТЗ.НоваяКолонка("КонДата");    
     ТЗ.НоваяКолонка("КолСис");   //Количество систем
     ТЗ.НоваяКолонка("Вал");     //Общая стоимость работ
     ТЗ.НоваяКолонка("СумУс");  //Стоимость услуг
     ТЗ.НоваяКолонка("ЗЧ");     //Стоимость запчастей
     ТЗ.НоваяКолонка("СумАкс");   //Стоимость аксессуаров
    
ТекстЗапросаС =
    "
    |Период с НачДата по КонДата;
    |ОбрабатыватьДокументы Проведенные;
    |СтатусЗаказа = Документ.РасходнаяНакладная.СтатусЗаказа;    
    |Товар = Документ.РасходнаяНакладная.Товар;
    |ВидТовара = Документ.РасходнаяНакладная.Товар.ВидТовара;
    |СуммаСНДС = Документ.РасходнаяНакладная.СуммаСНДС;
    |Функция Сум = Сумма(СуммаСНДС);
    |Функция СумУс = Сумма(СуммаСНДС) когда (ВидТовара = Перечисление.ВидыТоваров.Услуга);
    |Группировка Товар Без Групп;
    |Условие ((СтатусЗаказа = Перечисление.Статусы.Выдан)или(СтатусЗаказа = Перечисление.Статусы.Выезд)или(СтатусЗаказа = Перечисление.Статусы.ВыдОтказ));";
    
ТекстЗапросаК =
     "    
    |Период с НачДата по КонДата;
    |ОбрабатыватьДокументы Проведенные;
    |ТекДок = Документ.РасходнаяНакладная.ТекущийДокумент;
    |СтатусЗаказа = Документ.РасходнаяНакладная.СтатусЗаказа;
    |Функция КолСис = Счётчик(ТекДок);
    |Группировка  ТекДок;
    |Условие ((СтатусЗаказа = Перечисление.Статусы.Выдан)или(СтатусЗаказа = Перечисление.Статусы.Выезд)или(СтатусЗаказа = Перечисление.Статусы.ВыдОтказ));";
    
    ТекстЗапросаАкс =
    "
    |Период с НачДата по КонДата;
    |ОбрабатыватьДокументы Проведенные;
    |СтатусЗаказа = Документ.РасходнаяНакладная.СтатусЗаказа;    
    |Товар = Документ.РасходнаяНакладная.Товар;
    |СуммаСНДС = Документ.РасходнаяНакладная.СуммаСНДС;
    |Функция СумАкс = Сумма(СуммаСНДС);
    |Группировка Товар Без Групп;
    |Условие (СтатусЗаказа = Перечисление.Статусы.Акс);";
    
Запрос.Выполнить(ТекстЗапросаС);
    Пока Запрос.Группировка() = 1 Цикл
        Вал = Запрос.Сум;
        СумУс = Запрос.СумУс;
    КонецЦикла;
    
Запрос.Выполнить(ТекстЗапросаК);
   КолСис = Запрос.КолСис;
  
Запрос.Выполнить(ТекстЗапросаАкс);
    Пока Запрос.Группировка() = 1 Цикл
        СумАкс = Запрос.СумАкс;
    КонецЦикла;
    
Сообщить("Количество систем:"+КолСис);    
Сообщить("Сумма:"+Вал);
Сообщить("Сумма услуг:"+СумУс);
Сообщить("Сумма акс:"+СумАкс);  
  
   ТЗ.НоваяСтрока();
   ТЗ.НачДата = НачДата;
   ТЗ.КонДата = КонДата;
   ТЗ.КолСис = КолСис;
   ТЗ.Вал = Вал;
   ТЗ.СумУс = СумУс;
   ТЗ.ЗЧ = Вал - СумУс;

// и т.д. Дальше идут колонки, данные в которые заносятся на основании предыдущих колонок

КонецПроцедуры


Сумму услуг считает правильно. Общую сумму и сумму аксесуаров за указанный период тоже считает правильно.

Вот такая вот магия. Оценивать я не могу, потому что до сих пор мелко плаваю в запросах.

ZUBR Подменю пользователя
сообщение 04.10.19, 23:27
Сообщение #43

Завсегдатай
****
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 3

Цитата(andrew76 @ 03.10.19, 4:59) *
Это смотря по ситуации.Замеряйте производительность в каждом варианте ( запрос или перебор документов ).
Ну а код должен быть лёгким для восприятия.Мой вариант считает правильно ?


Ваш вариант считает только количество систем. Но если его немного поправить, тогда он считает отлично! 32000000.gif


Процедура Сформировать() 
    
        ТЗ = СоздатьОбъект ("ТаблицаЗначений");
    Расх = СоздатьОбъект("Документ.РасходнаяНакладная");    
    
//Создание колонок
     ТЗ.НоваяКолонка("НачДата");    
     ТЗ.НоваяКолонка("КонДата");    
     ТЗ.НоваяКолонка("КолСис");   //Количество систем
     ТЗ.НоваяКолонка("Вал");     //Общая стоимость работ
     ТЗ.НоваяКолонка("СумУс");  //Стоимость услуг
      
//и т.д.
    
    
         СумУс=0;
             КолСис=0;
             СумАкс=0;
             Вал=0;

Расх.ВыбратьДокументы(НачДата,КонДата);
          
Пока Расх.ПолучитьДокумент()=1 Цикл
        
     Если  (Расх.СтатусЗаказа = Перечисление.Статусы.Выдан) или (Расх.СтатусЗаказа = Перечисление.Статусы.Выезд) или (Расх.СтатусЗаказа =
                Перечисление.Статусы.ВыдОтказ) тогда
              КолСис=КолСис+1;
              Вал=Вал+Расх.Итог("СуммаСНДС");
    
             Расх.ВыбратьСтроки();
             Пока Расх.ПолучитьСтроку() = 1 Цикл
                 Если Расх.Товар.ВидТовара = Перечисление.ВидыТоваров.Услуга тогда
               СумУс=СумУс+Расх.СуммаСНДС;
                КонецЕсли;
     КонецЦикла;

    КонецЕсли;

    Если Расх.СтатусЗаказа = Перечисление.Статусы.Акс тогда
           СумАкс =СумАкс+Расх.Итог("СуммаСНДС");
    КонецЕсли;

КонецЦикла;

Сообщить("Количество систем:"+КолСис);    
Сообщить("Сумма:"+Вал);
Сообщить("Сумма услуг:"+СумУс);
Сообщить("Сумма акс:"+СумАкс);
    
КонецПроцедуры


Думаю, этот вариант более быстрый, чем вариант с тремя запросами. И мне, например, он пока легче в понимании. Вам спасибо.

andrew76 Подменю пользователя
сообщение 05.10.19, 5:21
Сообщение #44

Оратор
*****
Группа: Пользователи
Сообщений: 443
Из: Казахстан
Спасибо сказали: 43 раз
Рейтинг: 43

Доброе утро !

Оказывается в накладной есть Табличная часть, она же многострочная.Цикл я писал не учитывая это обстоятельство.
Тогда конечно , такой вариант должен работать правильно.

Если  (Расх.СтатусЗаказа = Перечисление.Статусы.Выдан) или (Расх.СтатусЗаказа = Перечисление.Статусы.Выезд) или (Расх.СтатусЗаказа = 
                Перечисление.Статусы.ВыдОтказ) тогда
         КолСис=КолСис+1;
         Вал=Вал+Расх.Итог("СуммаСНДС");
    
         Расх.ВыбратьСтроки();
         Пока Расх.ПолучитьСтроку() = 1 Цикл
                 Если Расх.Товар.ВидТовара = Перечисление.ВидыТоваров.Услуга тогда
                        СумУс=СумУс+Расх.СуммаСНДС;
                КонецЕсли;
         КонецЦикла;

КонецЕсли;

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


3 страниц V  < 1 2 3
Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 20.04.24, 4:21
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!