Отправляет email-рассылки с помощью сервиса Sendsay

Записки программиста

  Все выпуски  

Записки программиста


Записка №1

Как заставить отчет по реализации товара учитывать возвраты от покупателей?


Исходный материал: конфигурация "Простой учет v7.040.18" (загрузить можно по адресу http://programmer.com.ua)

Итак, смотрим, чем занимается упомянутый отчет - открываем конфигурацию и заглядываем в модуль отчета "Реализация". Несложно заметить, что сердцем отчета является запрос с таким текстом:

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

Выглядит страшновато, но уже при беглом взгляде на текст становится ясно - запрос выполняется по двум видам документов: РасходнаяНакладная и РасходнаяРозничная. Таким образом задача сводится к внедрению в запрос еще одного документа - РасходнаяВозврат. Почему именно РасходнаяВозврат? Потому что именно его пользователь видит как "Возврат от покупателя" и его попросили учесть в отчете.
Теперь приступим. В начале запроса определяются переменные, которые потом будут использоваться в отчете и в группировках и функциях самого запроса, переменные, ссылающиеся на реквизиты документов нам необходимо дополнить ссылками на реквизиты документа РасходнаяВозврат. Здесь нужно быть внимательным и проследить, чтобы не возникло ссылок на несуществующие реквизиты. Конечно, при выполнении запроса программа выдаст ошибку, но лучше сразу четко представлять себе, с чем имеешь дело.
Редактируем строки:

 |Фирма = Документ.РасходнаяНакладная.Фирма, Документ.РасходнаяРозничная.Фирма, Документ.РасходнаяВозврат.Фирма;  
 |Валюта = Документ.РасходнаяНакладная.Валюта, Документ.РасходнаяРозничная.Валюта, Документ.РасходнаяВозврат.Валюта;
 |Курс = Документ.РасходнаяНакладная.Курс, Документ.РасходнаяРозничная.Курс, Документ.РасходнаяВозврат.Курс;    
 |ВидНДС = Документ.РасходнаяНакладная.ВидНДС, Документ.РасходнаяРозничная.ВидНДС, Документ.РасходнаяВозврат.ВидНДС;    
 |МестоХранения = Документ.РасходнаяНакладная.МестоХранения, Документ.РасходнаяРозничная.МестоХранения, Документ.РасходнаяВозврат.МестоХранения;  
 |Контрагент = Документ.РасходнаяНакладная.Контрагент, Документ.РасходнаяРозничная.Контрагент, Документ.РасходнаяВозврат.Контрагент;  
 |Товар = Документ.РасходнаяНакладная.Товар, Документ.РасходнаяРозничная.Товар, Документ.РасходнаяВозврат.Товар;  
 |Инфо = Документ.РасходнаяНакладная.Инфо, Документ.РасходнаяРозничная.Инфо, Документ.РасходнаяВозврат.Инфо;  

Тут все просто, первые реквизиты описаны в конфигурации как "Общие" для всех документов, поэтому их без опасения можно прописывать, остальные по именам и типам тоже совпадают, а вот дальше встречается переменная Партия, ссылка на реквизит Партия в расходной - такого реквизита в возвратной накладной нет. Как тут поступать надо решать для каждого случая отдельно, я сделал следуещее: с помощью функции поиска проверил модуль отчета на наличие ссылок на реквизит запроса Партия и обнаружил, что их нет, т.е. попросту говоря эта переменная в запросе лишняя и ее можно пропустить или даже вобще удалить из запроса.
Следующие переменные снова повторяются по именам и типам для возвратной накладной, кроме последней - Скидка. Т.к. реквизита "Скидка" в документе "РасходнаяВозврат" нет, эту переменную оставляем как есть.

Дальше следуют группировки и функции. Менять порядок или состав группировок не нужно, а вот функции надо пересмотреть. Дело в том, что для вывода информации о возвратах есть два варианта - откорректировать количество и сумму в соответствующих столбцах отчета на количество и сумму возвратов или вывести информацию о возвратах отдельным столбцом. Как представляется мне - второй вариант более информативен и правилен, он не искажает первичную информацию об объемах реализации и вместе с тем информирует про объемы возвратов. Вот и рассмотрим его в следующей записке.

В избранное