Имя: Пароль:
1C
1C 7.7
v7: Подскажите с методикой реализации отчета
0 tixis
 
28.08.13
15:09
Что имеем: ТиС 9.2, товар продают документом реализация, есть отчет который собирает эти реализации, т.е. отчет имеет такой вид:

ДатаДок НомерДок Контрагент СуммаПоДок

отчет собирает все это по документам, т.е вот начало кода:

Д = СоздатьОбъект("Документ.Реализация");
    Д.ВыбратьДокументы(НачДата, КонДата);
                      
    Пока Д.ПолучитьДокумент() = 1 Цикл
И все это записывается в таблицу значений ТЗ1
теперь в этом отчете хотят видеть оплачен документ или нет.
Особенности(собственно в чем трудность реализации у меня ):
На одного контрагента могут сделать несколько реализаций и через какое то время сделать приходник. Приходник может быть на сумму или одного документа реализации или на все сразу, или на часть каких то реализаций. Вот собственно как определять какие документы уже оплачены  а какие нет?

Пока планы такие: брать регистр покупатели, выдергивать конечный остаток, договор, и текДокумент, все это в таблицу значений и сортировать в обратном порядке по дате, брать конечный остаток и от него отнимать суммы документов до тех пор пока разница не станет нулевой или отрицательной и в документе в отдельной колонке проставлять оплачен или нет в таблицу Значений 2

Потом при выводе на печать из первой Тз искать по номеру во второй тз документ и смотреть на колонку оплачен или нет. По моему чтото до боли кривое получается, долгое, и вообще не правильно, хотелось бы услышать метод более красивый и быстрый, ну и правльный с точки зрения логики. а то что то я нагородил ........
1 Ёпрст
 
гуру
28.08.13
15:10
(0) Открыть для себя ведомость по Взаиморасчетам , закрыть пофигуратор и не ипать мозг
2 Ёпрст
 
гуру
28.08.13
15:12
в ТиСе это Ведомость по Контрагентам, если че, с группировкой по КредДоку.
3 tixis
 
28.08.13
15:30
(1) есть еще особенность в том что в реализации проставляется "проект"- это сотрудник, отчет выполняется или по выбранному проекту или по всем проектам сразу, с разбиением на отдельные проекты
4 Ёпрст
 
гуру
28.08.13
16:03
(3) ты не поверишь,  это есть в ведомости
5 Масянька
 
28.08.13
16:12
(0) Это я писала отчет "Сверка по контрагенту"

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

    мНомерСтроки = 9;
    
    НачальноеСальдо = Запрос.НачОстРуб;

    Если (НачальноеСальдо <> 0) Тогда
        ПечНачальноеСальдо = "По данным регистра ""Взаиморасчеты покупателей"" сальдо на " + ДатаНачалаПечать + " составляет: " +
                             СокрЛП(Формат(НачальноеСальдо, "Ч15.2. "));
    КонецЕсли;

    ПечТабл.ВывестиСекцию("Заголовок");
    ПечТабл.ВывестиСекцию("Шапка");
    
    НачОстОплата     = 0;
    НачОстПродажа    = 0;

    Если НачальноеСальдо < 0 Тогда
        НачОстОплата = -НачальноеСальдо;
    ИначеЕсли НачальноеСальдо > 0 Тогда
        НачОстПродажа = НачальноеСальдо;
    КонецЕсли;
    
    Если (НачОстОплата > 0) или (НачОстПродажа > 0) Тогда
        ПечТабл.ВывестиСекцию("НачальноеСальдо");
        
        мОбласть    = "R" + Строка(мНомерСтроки + 1) + "C5:R" + Строка(мНомерСтроки + 1) + "C7";
        мКрасим     = ПечТабл.Область(мОбласть);
        мКрасим.ЦветТекста(255,0,0);
    
        мНомерСтроки = мНомерСтроки + 1;
    КонецЕсли;
    
    ОбщийИтогПоСчетам         = 0;
    ОбщийИтогПоОплате         = 0;
    ОбщийИтогПоРеализации    = 0;
    
    Пока ТабСчетов.ПолучитьСтроку() = 1 Цикл
        ИтогоПоСчету         = 0;
        ИтогоПоОплате         = 0;
        ИтогоПоРеализации    = 0;
        
        // сначала выводим счет
        ВидДокумента = ТабСчетов.Ссылка.Вид();
        ТекСчет     = ТабСчетов.Ссылка;
        ДатаСчета     = ТекСчет.ДатаДок;
        СуммаСчета     = ТекСчет.Итог("Сумма");
        
        ИтогоПоСчету = ИтогоПоСчету + СуммаСчета;
        
        ПечСчет         = глПредставлениеДокумента(ТекСчет);
        ПечДатаСчета    = ДатаСчета;
        ПечСуммаСчета    = СуммаСчета;
        ПечТабл.ВывестиСекцию("СтрокаСчет");
        
        мНомерСтроки = мНомерСтроки + 1;
        
        // выбираем подчиненые док-ты
        Если ДокПодчиненные.ВыбратьПодчиненныеДокументы(ДатаНачала, ДатаОкончания, ТекСчет) = 1 Тогда    // формируем таблицу подчиненных док-ов
            ТабПодчиненных.УдалитьСтроки();
            Пока ДокПодчиненные.ПолучитьДокумент() = 1 Цикл
                Если ДокПодчиненные.Проведен() = 1 Тогда                        // из подчиненных док-ов выбираем только проведенные
                    Если (Найти(СокрЛП(ДокПодчиненные.Вид()), "СтрокаВыпискиПриход") = 1) Тогда            // оплата
                        ТабПодчиненных.НоваяСтрока();
                        ТабПодчиненных.Ссылка            = ДокПодчиненные.ТекущийДокумент();
                        ТабПодчиненных.Документ         = "Оплата";
                        ТабПодчиненных.НомерДокумента     = глУдалениеВедущихНулей(ДокПодчиненные.ТекущийДокумент().НомерДок);
                        ТабПодчиненных.ДатаДокумента     = ДокПодчиненные.ТекущийДокумент().ДатаДок;
                        ТабПодчиненных.СуммаДокумента     = ДокПодчиненные.ТекущийДокумент().Итог("Сумма");
                    ИначеЕсли (Найти(СокрЛП(ДокПодчиненные.Вид()), "ПКО") = 1) Тогда            // оплата
                        ТабПодчиненных.НоваяСтрока();
                        ТабПодчиненных.Ссылка            = ДокПодчиненные.ТекущийДокумент();
                        ТабПодчиненных.Документ         = "Оплата";
                        ТабПодчиненных.НомерДокумента     = глУдалениеВедущихНулей(ДокПодчиненные.ТекущийДокумент().НомерДок);
                        ТабПодчиненных.ДатаДокумента     = ДокПодчиненные.ТекущийДокумент().ДатаДок;
                        ТабПодчиненных.СуммаДокумента     = ДокПодчиненные.ТекущийДокумент().Итог("Сумма");
                    ИначеЕсли (Найти(СокрЛП(ДокПодчиненные.Вид()), "Реализация") = 1) Тогда                // реализация
                        ТабПодчиненных.НоваяСтрока();
                        ТабПодчиненных.Ссылка            = ДокПодчиненные.ТекущийДокумент();
                        ТабПодчиненных.Документ         = "Реализация";
                        ТабПодчиненных.НомерДокумента     = глУдалениеВедущихНулей(ДокПодчиненные.ТекущийДокумент().НомерДок);
                        ТабПодчиненных.ДатаДокумента     = ДокПодчиненные.ТекущийДокумент().ДатаДок;
                        ТабПодчиненных.СуммаДокумента     = ДокПодчиненные.ТекущийДокумент().Итог("Сумма");
                        ТабПодчиненных.Контроль            = ДокПодчиненные.ТекущийДокумент().Контроль;
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;
            
            ТабПодчиненных.Сортировать(, 1);
            
            ТабПодчиненных.ВыбратьСтроки();
            
            Пока ТабПодчиненных.ПолучитьСтроку() = 1 Цикл    
                Если (Строка(ТабПодчиненных.Документ) = "Оплата") Тогда                // теперь выводим оплату
                    ТекВыписка        = ТабПодчиненных.Ссылка;
                    ПечДатаВыписки    = ТабПодчиненных.ДатаДокумента;
                    ПечВыписка        = глПредставлениеДокумента(ТабПодчиненных.Ссылка);
                    ПечСуммаВыписки    = ТабПодчиненных.СуммаДокумента;
                    ИтогоПоОплате     = ИтогоПоОплате + ТабПодчиненных.СуммаДокумента;
                    ПечТабл.ВывестиСекцию("СтрокаОплата");
                    мНомерСтроки = мНомерСтроки + 1;
                ИначеЕсли (Строка(ТабПодчиненных.Документ) = "Реализация") Тогда    // теперь выводим реализацию
                    ТекРеализация        = ТабПодчиненных.Ссылка;
                    ПечДатаРеализации    = ТабПодчиненных.ДатаДокумента;
                    ПечРеализация       = глПредставлениеДокумента(ТабПодчиненных.Ссылка);
                    ПечКонтроль         = ?(ТабПодчиненных.Контроль = 1, "+","");
                    ПечСуммаРеализации    = ТабПодчиненных.СуммаДокумента;
                    ИтогоПоРеализации    = ИтогоПоРеализации + ТабПодчиненных.СуммаДокумента;
                    ПечТабл.ВывестиСекцию("СтрокаРеализация");
                    мНомерСтроки = мНомерСтроки + 1;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
        
        ПечТабл.ВывестиСекцию("ВсегоПоСчету");
        мНомерСтроки = мНомерСтроки + 1;
        
        // проверка долгов по конкретному счету
        Если (ИтогоПоСчету <> ИтогоПоОплате) ИЛИ (ИтогоПоСчету <> ИтогоПоРеализации) ИЛИ (ИтогоПоРеализации <> ИтогоПоОплате) Тогда
            ВыделяемТекстФон(мНомерСтроки, ПечТабл);
        КонецЕсли;
        
        ОбщийИтогПоСчетам         = ОбщийИтогПоСчетам + ИтогоПоСчету;
        ОбщийИтогПоОплате         = ОбщийИтогПоОплате + ИтогоПоОплате;
        ОбщийИтогПоРеализации    = ОбщийИтогПоРеализации + ИтогоПоРеализации;

    КонецЦикла;
    
    ПечТабл.ВывестиСекцию("ОбщиеИтоги");
    
    мНомерСтроки = мНомерСтроки + 1;
    
    // проверка долгов по всем счетам
    Если (ОбщийИтогПоСчетам <> ОбщийИтогПоОплате) ИЛИ (ОбщийИтогПоОплате <> ОбщийИтогПоРеализации) ИЛИ (ОбщийИтогПоСчетам <> ОбщийИтогПоРеализации) Тогда
        ВыделяемТекстФон(мНомерСтроки, ПечТабл);
    КонецЕсли;

    Если (НачальноеСальдо <> 0) Тогда
        ОборотыПоСчетам     = ОбщийИтогПоСчетам;
        ОборотыПоОплате        = ОбщийИтогПоОплате + НачОстОплата;
        ОборотыПоРеализации    = ОбщийИтогПоРеализации + НачОстПродажа;
        ПечТабл.ВывестиСекцию("Обороты");
        мНомерСтроки = мНомерСтроки + 1;
    КонецЕсли;    
    
    мЕстьДолг = (ОбщийИтогПоРеализации + НачОстПродажа) - (ОбщийИтогПоОплате + НачОстОплата);

    КонОстОплата     = 0;
    КонОстПродажа    = 0;

    Если мЕстьДолг < 0 Тогда
        КонОстОплата = -мЕстьДолг;
    ИначеЕсли мЕстьДолг > 0 Тогда
        КонОстПродажа = мЕстьДолг;
    КонецЕсли;

    Если (КонОстОплата > 0) или (КонОстПродажа > 0) Тогда
        мНомерСтроки = мНомерСтроки + 1;
        ПечТабл.ВывестиСекцию("КонечноеСальдо");
        мОбласть    = "R" + Строка(мНомерСтроки + 1) + "C5:R" + Строка(мНомерСтроки + 1) + "C7";
        мКрасим     = ПечТабл.Область(мОбласть);
        мКрасим.ЦветТекста(255,0,0);
    КонецЕсли;

    КонечноеСальдо = Запрос.КонОстРуб;

    Если (КонечноеСальдо <> 0) Тогда
        ПечКонечноеСальдо = "По данным регистра ""Взаиморасчеты покупателей"" сальдо на " + ДатаОкончанияПечать + " составляет: " +
                             СокрЛП(Формат(КонечноеСальдо, "Ч15.2. "));
        ПечТабл.ВывестиСекцию("Подвал");
    КонецЕсли;
    
    ПечТабл.Опции(0, 0, 0, 0, "Сверка", "Сверка");
    ПечТабл.ПараметрыСтраницы(1,100,,5,5,5,5,,,,,);
    ПечТабл.ТолькоПросмотр(1);
    ПечТабл.ПовторятьПриПечатиСтроки(6, 7);
    
    ПечТабл.Показать("Сверка по покупателю","");  
    
КонецПроцедуры    // СверкаПоПокупателю

Смысл: выбираются проведенные счета, для каждого счета выбираются док-ты реализации и док-ты оплаты. В отчет выводится сначала счет, потом оплаты и реализации (по выведенному счету).
Хочешь - разбирайся.