Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 1C: Предприятие, SAP, ERP и учётные системы > Печатная форма счёт фактура, проблема вывода строк


Автор: WTF4XZ 13.7.2008, 15:32
Суть проблемы кратко:

Что делаю:
Создаю счёт фактуру (выданные), с двумя позициями (строками) имеющие различные значения.
Нажимаю печать, выводится предварительный просмотр
И вот первый глюк, заполнены столбцы только 1, 10, 11. (Наименование, Страна происхождение (тама идёт ----), Таможня (так же -----) )
остальная часть пустая....
Заходим в форму, и жмахаем на любом значение в одной из строк, снова нажимаем на печать и...
теперь вроде бы строки и заполнены, только вот с 2 по 9 столбцы в строках идентичны по значениям, хотя строка итого показывает правильное значение.

*конфигурация изменена очень сильно, перегнал в типовую конфигурацию модуль счёт фактура, глюк всё равно не проходит. Где мне искать и где править? Если нужен код какого либо модуля предоставлю, только скажите какого нано.

Автор: Naghual 13.7.2008, 16:09
Для начала, необходим код процедуры печати и описание структуры документа (реквизитов).

Автор: WTF4XZ 13.7.2008, 16:18
Заполнение строк

Код

    Таб.ВывестиСекцию("Шапка"); 
        
    // Печать строк документа.
    ТабДок.ВыбратьСтроки();
    Ном=0;
    Пока ТабДок.ПолучитьСтроку()=1 Цикл
        Ном=Ном+1;
        Если ТипЗначения(ТабДок.Товар) = 2 Тогда
            Наименование = ТабДок.Товар;
            ЕдиницаИзмерения = "";
            
        ИначеЕсли ТабДок.Товар.Вид() = "Номенклатура" Тогда
            Наименование = ?(ПустаяСтрока(ТабДок.Товар.ПолнНаименование)=1, ТабДок.Товар.Наименование, ТабДок.Товар.ПолнНаименование);
            ЕдиницаИзмерения = ТабДок.Товар.ЕдиницаИзмерения;
            
        ИначеЕсли ТабДок.Товар.Вид() = "ОсновныеСредства" Тогда
            Наименование = ТабДок.Товар.Наименование;
            ЕдиницаИзмерения = "";
            
        ИначеЕсли ТабДок.Товар.Вид() = "НематериальныеАктивы" Тогда
            Наименование = ТабДок.Товар.Наименование;
            ЕдиницаИзмерения = "";
            
        ИначеЕсли ТабДок.Товар.Вид() = "Материалы" Тогда
            Наименование = ТабДок.Товар.Наименование;
            ЕдиницаИзмерения = ТабДок.Товар.ЕдиницаИзмерения;
        КонецЕсли;          
        Если ПустоеЗначение(ЕдиницаИзмерения) = 1 Тогда
            ЕдиницаИзмерения = "-----";
        КонецЕсли;        
        Если ПустоеЗначение(ТабДок.ГТД) = 1 Тогда
            НомерГТД_Н = "-----";
            СтранаН = "-----";
        Иначе
            НомерГТД_Н = ТабДок.ГТД;
            Если ПустаяСтрока(ТабДок.ГТД.СтранаПроисхождения) = 1 Тогда
                СтранаН = "-----";
            Иначе
                СтранаН = ТабДок.ГТД.СтранаПроисхождения;
            КонецЕсли;
        КонецЕсли;
        Если НДСпоСтавкеНольПроцентов = 1 Тогда
            ПредставлениеСтавкиНДС = "0%";
        Иначе
            Если (ТабДок.СтавкаНДС.Выбран() = 1) и (ТабДок.СтавкаНДС.Ставка > 0) Тогда
                ПредставлениеСтавкиНДС = "" + ТабДок.СтавкаНДС.Ставка + "%";
                
                Если СуммаНДСопределяетсяРасчетнымМетодом = 1 Тогда
                    ПредставлениеСтавкиНДС = ПредставлениеСтавкиНДС + " / 1" + ТабДок.СтавкаНДС.Ставка + "%";
                КонецЕсли;
                
            Иначе
                ПредставлениеСтавкиНДС = "Без НДС";
            КонецЕсли;
        КонецЕсли;
        Если ТабДок.Количество = 0 Тогда
            ПечКоличество = "-----";
            ПечЦена          = "-----";
        ИначеЕсли (ВидОперации = Перечисление.ВидыОперацийСчетаФактурыВыданного.Аванс)
        ИЛИ (ВидОперации = Перечисление.ВидыОперацийСчетаФактурыВыданного.СуммоваяРазница) 
        ИЛИ (Аванс = 1) Тогда
            ПечКоличество = "-----";
            ПечЦена          = "-----";
        Иначе                 
            ПечКоличество = Формат(ТабДок.Количество, "Ч015.3");
            Если ТабДок.Цена = 0 Тогда
                ПечЦена          = "-----";
            Иначе                
                ПечЦена = Формат(ТабДок.Цена, "Ч15.2-");
            КонецЕсли;
        КонецЕсли;
        Если (ВидОперации = Перечисление.ВидыОперацийСчетаФактурыВыданного.Аванс)
        ИЛИ (ВидОперации = Перечисление.ВидыОперацийСчетаФактурыВыданного.СуммоваяРазница) 
        ИЛИ (Аванс = 1) Тогда
            ПечСумма = "-----";
        ИначеЕсли ТабДок.Сумма = 0 Тогда
            ПечСумма = "-----";
        Иначе                  
            ПечСумма = Формат(ТабДок.Сумма, "Ч15.2-");
        КонецЕсли;

        ПечАкциз = ?(ТабДок.АкцизСумма=0, "-----", Формат(ТабДок.АкцизСумма,"Ч15.2-"));
                
        ПечНДС = ?(ТабДок.НДС=0,"-----", Формат(ТабДок.НДС,"Ч15.2-"));
        ПечВсего = ?(ТабДок.Всего=0,"-----", Формат(ТабДок.Всего,"Ч15.2-"));
        ПечИтогНДС = ?(ТабДок.Итог("НДС")=0,"-----", Формат(ТабДок.Итог("НДС"),"Ч15.2-"));
        печИтогВсего = ?(ТабДок.Итог("Всего")=0,"-----", Формат(ТабДок.Итог("Всего"),"Ч15.2-"));

        
        
        Таб.ВывестиСекцию("Строка");
    КонецЦикла;

    Таб.ВывестиСекцию("Подвал");

    Таб.Опции(0, 0, 0, 0, "ОпцииПечатиСчетаФактуры", "ОкноСчетаФактуры");
    
    Если ПустоеЗначение(ТекстПредупреждения) = 1 Тогда
        Таб.ОбластьПечати(1,,,);
    Иначе
        Таб.ОбластьПечати(2,,,);
    КонецЕсли;
    
    Таб.ПовторятьПриПечатиСтроки( 15, 15 );
    Таб.ТолькоПросмотр(1);
    Таб.ПараметрыСтраницы(2,,,,,,,,,1,,);
    Таб.Показать("Печать счета-фактуры","");
    
КонецПроцедуры


Выгрузка в таблицу

Код

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

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

        ОплСумма = Таб.Сумма * ДоляОплаченнойОтгрузки;
        Таб.Сумма = Окр(ОплСумма * КурсОплаты + (Таб.Сумма - ОплСумма) * КурсСФ, 2, 1);
        
        ОплНДС = Таб.НДС * ДоляОплаченнойОтгрузки;
        Таб.НДС = Окр(ОплНДС * КурсОплаты + (Таб.НДС - ОплНДС) * КурсСФ, 2, 1);
        
        ОплНП = Таб.НП * ДоляОплаченнойОтгрузки;
        Таб.НП = Окр(ОплНП * КурсОплаты + (Таб.НП - ОплНП) * КурсСФ, 2, 1);
        
        ОплАкцизСумма = Окр(Таб.АкцизСумма * ДоляОплаченнойОтгрузки, 2, 1);
        Таб.АкцизСумма = Окр(ОплАкцизСумма * КурсОплаты + (Таб.АкцизСумма - ОплАкцизСумма) * КурсСФ, 2, 1);
        
    КонецЦикла;


Добавлено через 6 минут и 56 секунд
Прогонял в отладчике на значения, по формирование строк в печатной форме, значения верные,
но вот как только закончил, прогнал последнюю строку, так её значением и заполнил предыдущие,
хотя сумма посчиталась правильно прихожу к выводу что баг именно в этом месте, где формирует на печать.

Автор: WTF4XZ 16.7.2008, 11:26
Можете вкратце объяснить, как идёт формирование печатной формы счёта фактуры (выданной), без конкретных привязок, оперируя только названием модулей, тоесть не писать код а примерный алгоритм, что и откуда (мне хотелось бы понять куда эти связи уходят из текущей формы).

Автор: SaschaL 17.7.2008, 04:49
Вам нужно объяснить как формируется печатная форма, принцип формирования, примерный алгоритм или вам нужно знать как формируется печатная форма имеено счета фактуры выданного?

Автор: WTF4XZ 20.7.2008, 18:50
SaschaL, именно счёт фактуры выданного. Поскольку в СФ полученных такой глюк не наблюдается. В общих чертах алгоритм (лучше не кодом а словами)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)