Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не правильно формирует вес
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
inna.innainna84
Отчет создала первый раз с нуля. И застряла на весе товара в таблице во всех секциях поставила Запрос.РасхОстатокТовара/2*Запрос.Вес, где Запрос.Вес должен вытягивать значение из самого справочника товаров(т.е.|Вес = Регистр.ПартииТоваров.Товар.Вес;)
И не получается. Подскажите как решить эту проблему. Второй день с этим ВЕСОМ ковыряюсь
Да еще приходная накладная -это возврат от покупателя может я здесь тоже не туплю.

 Перем КодыОперацийПродажи;  

// ========================================================================
Процедура ДобавитьКонтрагента(Режим=0)
    Перем Фрм, Тек;

    ОткрытьПодбор("Справочник.Контрагенты",,Фрм,Режим,Тек);  
    Фрм.ВыборГруппы(1);
КонецПроцедуры
                
//==========================================================================


Процедура УдалитьКонтрагента(Режим = 0)
    Если Режим = 0 Тогда
        Если МФКонтрагентов.ТекущаяСтрока() <> 0 Тогда
            МФКонтрагентов.УдалитьЗначение(МФКонтрагентов.ТекущаяСтрока());
        КонецЕсли;
    Иначе
        Если Вопрос("Список объектов будет полностью очищен! Продолжить?", "Да+Нет") = "Да" Тогда
            МФКонтрагентов.УдалитьВсе();
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры // Удалить                              


//===================================================================================
Процедура ОбработкаПодбора(Эл,Кон)  


    //==================Для списка клиентов======================
    Если Эл.Вид()="Контрагенты" Тогда  
    Если МФКонтрагентов.Принадлежит(Эл.ТекущийЭлемент()) = 1 Тогда             
        Сообщить("уже присутствует в списке");      
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;  
    МФКонтрагентов.ДобавитьЗначение(Эл.ТекущийЭлемент(), +"Группа "+Эл.ТекущийЭлемент().Наименование);
КонецЕсли;              
КонецПроцедуры  
                

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


    

    // Заполнение полей "Итого"
    Таб.ВывестиСекцию("Итого");
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
КонецПроцедуры
ВыбНачПериода="26.10.16";
ВыбКонПериода="26.10.16";
Sharzem
inna.innainna84 @ Сегодня, 15:33 необходимо зарегистрироваться для просмотра ссылки ,
Странно, при таком раскладе должно время от времени кидать ошибку на "Запрос.РасхОстатокТовара/2*Запрос.Вес"... Нет проверки на равенство 0 Запрос.Вес...
А зачем деление на 2 ?
При таком построении запроса условие должно отработать только в Таб.ВывестиСекцию("Товар"), в других будет 0;
К запросу целая телега претензий. Кроме "Группировка()" не помешает использование "ВНачалоВыборки()", "Когда"...
Оптимизируйте его без явного указания ТекущийДокумент.РасходнаяНакладная или ТекущийДокумент.РасходнаяПриходнаяНакладная - такое на SQL еще более или менее шустро работает, а на DBF - имеем 2-5 сек "висяка" перед обработкой...
mister-x
Що не виходить, "Вес" не витягує?
inna.innainna84
mister-x @ Сегодня, 16:26 необходимо зарегистрироваться для просмотра ссылки ,
Вес вытягивает, по товарно считает верно, но не правильно суммирует итоговые
Деление на 2 почему то суммы из регистров тянутся задвоенными

Sharzem
mister-x @ Сегодня, 16:26 необходимо зарегистрироваться для просмотра ссылки ,
А как Вам такое чудо при всех тех группировках:
Цитата(inna.innainna84 @ 04.11.16, 15:33) необходимо зарегистрироваться для просмотра ссылки
|Кво=               Регистр.ПартииТоваров.ОстатокТовара;


47067070.gif
mister-x
І у групуванні по документу також "Вес" витягує?
logist
Sharzem, вы бы обратили внимание, что пользователь далек от программирования и старается его освоить.
mister-x
inna.innainna84 врахуйте це
Цитата(Sharzem @ 04.11.16, 16:25) необходимо зарегистрироваться для просмотра ссылки
При таком построении запроса условие должно отработать только в Таб.ВывестиСекцию("Товар"), в других будет 0;

тому так не вірно рахує разом по вазі по іншим групуванням
Sharzem
Цитата(logist @ 04.11.16, 16:36) необходимо зарегистрироваться для просмотра ссылки
далек от программирования и старается его освоить

Обещаю, уже стал на тропинку исправления... blush.gif
mister-x
змініть порядок групувань

inna.innainna84 ви запит конструктором "писали"?
inna.innainna84
ТекущийДокумент.РасходнаяПриходнаяНакладная убрала теперь вообще итоговые суммы не верны

нет вручную mister-x @ Сегодня, 16:56 необходимо зарегистрироваться для просмотра ссылки ,
Vofka
Цитата(logist @ 04.11.16, 16:36) необходимо зарегистрироваться для просмотра ссылки
Sharzem, вы бы обратили внимание, что пользователь далек от программирования и старается его освоить.

На мой взгляд это inna.innainna84 было бы не плохо писать в каждой теме либо написать 1 раз в подписи о том, что с программированием у неё плохо, но она старается научиться.
logist
Информация из профиля
Цитата
Уровень знаний 1С: Что такое 1С?

Если там лень раз заполнять при регистрации, что говорить о подписи, или в топике...
Vofka
Цитата(logist @ 04.11.16, 17:31) необходимо зарегистрироваться для просмотра ссылки
Если там лень раз заполнять при регистрации, что говорить о подписи, или в топике...

Ну это 100% не проблемы Sharzem
Sharzem
Цитата(logist @ 04.11.16, 17:31) необходимо зарегистрироваться для просмотра ссылки
лень раз заполнять при регистрации, что говорить о подписи, или в топике

И данное замечание принял во внимание, сегодня же исправлю.
inna.innainna84
Я же написала вначале что "Отчет создала первый раз с нуля." Не судите меня строго. Буду стараться исправить отчет. Всем спасибо за замечания.
Sharzem
logist @ Вчера, 17:31 необходимо зарегистрироваться для просмотра ссылки ,
Ув, logist, как и обещал выполняю свои обещания исправиться.

Ув. inna.innainna84, итак начнем:

При подготовке отчета, Вы имеете дело с регистром остатков - "ПартииТоваров".
Данный регистр имеет:
1. Измерения: Фирма, Товар, Контрагент (Вы упустили Фирму и Контрагент, а они тоже нужны);
2. Ресурсы: ОстатокТовара;
3. Реквизиты: Оборот;

Соответственно мы должны обратиться к измерениям, ресурсам и реквизитам (дополнительным реквизитам, если тип справочник) задав им переменные:
ТекстПеременных = "
|Период с ВыбНачПериода по ВыбКонПериода;
|Фирма = Регистр.ПартииТоваров.Фирма;
|Товар = Регистр.ПартииТоваров.Товар;
|Контрагент = Регистр.ПартииТоваров.Контрагент;
|ТекДокумент = Регистр.ПартииТоваров.ТекущийДокумент;
|Вес = Регистр.ПартииТоваров.Товар.Вес;
|Категория = Регистр.ПартииТоваров.Товар.КатегорияДляГруппировки;
|Количество = Регистр.ПартииТоваров.ОстатокТовара;
|Оборот = Регистр.ПартииТоваров.Оборот;";

Для получения информации по ресурсам и реквизитам используются функции:
ТекстФункций = "
|Функция КолРасход = Расход(Количество) когда (ТекДокумент.Вид() = ""РасходнаяНакладная"");
|Функция Сумма = Сумма(Оборот) когда (ТекДокумент.Вид() = ""РасходнаяНакладная"");
|Функция ВесРасход = Сумма(Запрос.КолРасход * Вес + Количество - Количество);";

Обратите внимание что в функциях КолРасход и Сумма используется доп условие "Когда". Это для того что бы итоги отбирались только по указанному виду документов. Дело в том что документ Приходная накладная делает движения по приходу, т.е. движений по расход в регистре по данному виду нет. В итоге в функции Сумма у Вас не будет двоиться.
По поводу функции ВесРасход то это один из методов борьбы с фичей 7.7. останавливаться здесь не буду.
Далее задаем группировки:
ТекстГруппировок = "
|Группировка Фирма;
|Группировка Категория без групп;
|Группировка Контрагент без групп;
|Группировка Товар без групп;
|Группировка ТекДокумент;";

И условия:
ТекстУсловий = "
|Условие(Фирма = ВыбФирма);
|Условие(Контрагент в ВыбКонтрагент);
|Условие(Категория в ВыбКатегория);";

В итоге:
ТекстЗапроса = ТекстПеременных+РазделительСтрок+ТекстФункций+РазделительСтрок+ТекстГруппировок+РазделительСтрок+ТекстУсловий;
Сообщить(ТекстЗапроса);
Запрос = СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
КонецЕсли;
//И в конце уже заполнение выходной таблицы по группировкам 1 - Фирма, 2 - Категория, 3 - Контрагент, 4 - Товар, 5 - ТекДокумент


Если что-то не получиться отпишитесь в теме.
inna.innainna84
Приходная накладная- это приходная (возврат от покупателя) поэтому я применила "Расход(Количество)" к этому док. Я не смогла понять как указать, что это все же возврат, но данные подтягивалась верно со знаком "-" Sharzem @ Сегодня, 12:32 необходимо зарегистрироваться для просмотра ссылки ,


|Функция ВесРасход = Сумма(Запрос.КолРасход * Вес + Количество - Количество);";
я изменила на |Функция ВесРасход = Сумма(Запрос.КолРасход * Вес + Количество - Количество) когда (ТекДокумент.Вид() = ""РасходнаяНакладная""); Потому как вытягивает все документы(приход,расход,перемещение,списание)Sharzem @ Вчера, 12:32 необходимо зарегистрироваться для просмотра ссылки ,
inna.innainna84
Все же мне кажется нужно во всех переменых указывать док. расходная накладная, а то по группировке контрагент вытягивает и поставщика
т.е.
|Покупатель=Регистр.ПартииТоваров.ТекущийДокумент.РасходнаяНакладная.Контрагент,

inna.innainna84 @ Сегодня, 0:41 необходимо зарегистрироваться для просмотра ссылки ,
Sharzem
inna.innainna84 @ Сегодня, 2:31 необходимо зарегистрироваться для просмотра ссылки ,
Вы правы, в Измерение "Контрагент" в модуле проведения действительно пишется не покупатель, а поставщик. Кроме того, в измерении Фирма пусто...
А почему бы Вам для этого отчета не воспользоваться регистром "ОборотПродаж" ?

Дело в том что конструкция: Покупатель=Регистр.ПартииТоваров.ТекущийДокумент.РасходнаяНакладная.Контрагент на файловой версии 1 С очень долго будет отрабатывать + сам регистр "ПартииТоваров" тяжелый.
Попробуйте так:

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

Отработает значительно быстрее и выведет только реализацию и возвраты.
inna.innainna84
Не выбрала потому, что данные с приходной(возврат от покупателя) не записываются в регистр оборот товара. Нужна фактич. сумма продажи. (расход-возврат).Если я не права, сообщите пожалуйста. Sharzem @ Сегодня, 18:28 необходимо зарегистрироваться для просмотра ссылки ,
inna.innainna84
Я понимаю, что это не правильно. Чтобы быстрее формировались данные можно не сколько видов печати?
печать 1 -группирует только категория товара
печать 2 -группирует категория+контрагент
печать 3 -группирует категория+контрагент+товар
печать 4 -группирует категория+контрагент+товар+текдок
печать 5 -группирует категория+товар
засекала время группирует категорию товара -по сформировать по всем группировкам с выборкой только категория товара-1 минута 5 сек,
а при печать (1) - 19 секунд.


inna.innainna84 @ Сегодня, 20:35 необходимо зарегистрироваться для просмотра ссылки ,


Еще вариант
|ТекДок = Регистр.ПартииТоваров.ТекущийДокумент; // это оставляю !!!!!!!!
а
|Контрагент= Регистр.ПартииТоваров.ТекущийДокумент.РасходнаяНакладная.Контрагент, Регистр.ПартииТоваров.ТекущийДокумент.ПриходнаяНакладная.Контрагент; //указываю вид документа
и добавляю
|Условие (ПустоеЗначение(Контрагент)=0); // тогда удаляет поставщиков


inna.innainna84 @ Сегодня, 23:11 необходимо зарегистрироваться для просмотра ссылки ,
Sharzem
Цитата(inna.innainna84 @ 06.11.16, 20:35) необходимо зарегистрироваться для просмотра ссылки
данные с приходной(возврат от покупателя) не записываются в регистр оборот товара

Хммм... Действительно у Вас в конфигурации отсутствует документ Возвратная накладная (как покупателя, так и поставщику)...
Движения по возвратам реализованы документом приходная накладная faceoff.gif

Все остановочка: мухи отдельно, котлеты отдельно.

Цитата(inna.innainna84 @ 04.11.16, 15:33) необходимо зарегистрироваться для просмотра ссылки
... застряла на весе товара в таблице во всех секциях поставила Запрос.РасхОстатокТовара/2*Запрос.Вес, где Запрос.Вес должен вытягивать значение из самого справочника товаров(т.е.|Вес = Регистр.ПартииТоваров.Товар.Вес;)
И не получается. Подскажите как решить эту проблему.


Изначальная проблема решена ?
inna.innainna84
Да, вы очень помогли. Спасибо. Функция ВесРасход = Сумма(Запрос.КолРасход * Вес + Количество - Количество).
Контрагента выбираю через Регистр.ПартииТоваров.ТекущийДокумент.РасходнаяНакладная.Контрагент, Регистр.ПартииТоваров.ТекущийДокумент.ПриходнаяНакладная.Контрагент
и создала на каждую группировку -Печать1() Печать2() и тд. теперь формирует очень быстро. И поставила |Условие (ПустоеЗначение(Контрагент)=0); тогда убирает поставщиков из приходки.

Sharzem @ Сегодня, 10:51 необходимо зарегистрироваться для просмотра ссылки ,
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.