8.х Внешняя печатная форма М4: неправильно выводит информацию

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем MyNameNoName, 25 сен 2013.

  1. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте. Создал внешнюю печатную форму М4 для поступления товаров и услуг в БП 2.0. По непонятной для меня причине он в некоторых случаях неправильные выводит цифры. В чем причина - не могу понять. Прошу помочь.
    [​IMG]
    Через штатную форму М4 все выводится корректно. Ничего в печатной форме не менял, полностью стандартную вытащил - а в итоге в отдельных документах(особенно где одна и таже номенклатура несколько строк занимает) некорректные цифры.
    Код:
    Перем мВалютаРегламентированногоУчета Экспорт;
    
    Функция Печать() Экспорт
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект.Ссылка);
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ПоступлениеТоваровУслуг.Номер КАК Номер,
    |    ПоступлениеТоваровУслуг.Дата КАК ДатаСоставления,
    |    ПоступлениеТоваровУслуг.НомерВходящегоДокумента КАК НомерСопроводительногоДокумента,
    |    ПоступлениеТоваровУслуг.Организация,
    |    ПоступлениеТоваровУслуг.Организация КАК ЮрФизЛицо,
    |    ПоступлениеТоваровУслуг.Склад КАК МестоПриемки,
    |    ПоступлениеТоваровУслуг.Склад.Представление КАК СкладНаименование,
    |    ПоступлениеТоваровУслуг.Контрагент.Код КАК ПоставщикКод,
    |    ПоступлениеТоваровУслуг.Контрагент КАК Поставщик,
    |    ЕСТЬNULL(ПоступлениеТоваровУслуг.ДоговорКонтрагента.РасчетыВУсловныхЕдиницах, ЛОЖЬ) КАК РасчетыВУсловныхЕдиницах,
    |    ПоступлениеТоваровУслуг.ВалютаДокумента,
    |    ПоступлениеТоваровУслуг.КурсВзаиморасчетов КАК Курс,
    |    ПоступлениеТоваровУслуг.КратностьВзаиморасчетов КАК Кратность,
    |    ПоступлениеТоваровУслуг.УчитыватьНДС,
    |    ПоступлениеТоваровУслуг.СуммаВключаетНДС,
    |    ПоступлениеТоваровУслуг.СчетУчетаРасчетовСКонтрагентом КАК СубСчет
    |ИЗ
    |    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
    |ГДЕ
    |    ПоступлениеТоваровУслуг.Ссылка = &ТекущийДокумент";
    
    Шапка = Запрос.Выполнить().Выбрать();
    Шапка.Следующий();
    
    ЗапросПоТоварам = Новый Запрос();
    ЗапросПоТоварам.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект.Ссылка);
    ЗапросПоТоварам.УстановитьПараметр("Курс",		    ЗаполнениеДокументов.КурсДокумента(ЭтотОбъект, мВалютаРегламентированногоУчета));
    ЗапросПоТоварам.УстановитьПараметр("Кратность",	   ЗаполнениеДокументов.КратностьДокумента(ЭтотОбъект, мВалютаРегламентированногоУчета));
    ЗапросПоТоварам.Текст = "ВЫБРАТЬ
    |    ПоступлениеТоваровУслуг.Номенклатура КАК Номенклатура,
    |    ВЫРАЗИТЬ(ПоступлениеТоваровУслуг.Номенклатура.НаименованиеПолное КАК СТРОКА(1000)) КАК ТоварНаименование,
    |    ПоступлениеТоваровУслуг.Номенклатура.Код КАК ТоварКод,
    |    ПоступлениеТоваровУслуг.Номенклатура.БазоваяЕдиницаИзмерения.Наименование КАК ЕдиницаИзмеренияНаименование,
    |    ПоступлениеТоваровУслуг.Номенклатура.БазоваяЕдиницаИзмерения.Код КАК ЕдиницаИзмеренияКод,
    |    ПоступлениеТоваровУслуг.СтавкаНДС КАК СтавкаНДС,
    |    СУММА(ПоступлениеТоваровУслуг.Количество) КАК КоличествоПринято,
    |    СУММА(ПоступлениеТоваровУслуг.Сумма * &Курс / &Кратность) КАК Стоимость,
    |    СУММА(ПоступлениеТоваровУслуг.СуммаНДС * &Курс / &Кратность) КАК СуммаНДС,
    |    МИНИМУМ(ПоступлениеТоваровУслуг.НомерСтроки) КАК НомерСтроки
    |ИЗ
    |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслуг
    |ГДЕ
    |    ПоступлениеТоваровУслуг.Ссылка = &ТекущийДокумент
    |
    |СГРУППИРОВАТЬ ПО
    |    ПоступлениеТоваровУслуг.Номенклатура,
    |    ПоступлениеТоваровУслуг.ЕдиницаИзмерения,
    |    ПоступлениеТоваровУслуг.Цена,
    |    ПоступлениеТоваровУслуг.СтавкаНДС
    |
    |УПОРЯДОЧИТЬ ПО
    |    НомерСтроки";
    
    
    Если Константы.ДополнительнаяКолонкаПечатныхФормДокументов.Получить() = Перечисления.ДополнительнаяКолонкаПечатныхФормДокументов.Артикул Тогда
    ЗапросПоТоварам.Текст = СтрЗаменить(ЗапросПоТоварам.Текст, "Номенклатура.Код","Номенклатура.Артикул");
    КонецЕсли;
    
    ЗапросТовары = ЗапросПоТоварам.Выполнить().Выгрузить();
    
    Если СсылкаНаОбъект.Проведен И (Шапка.РасчетыВУсловныхЕдиницах
    ИЛИ (Шапка.ВалютаДокумента <> мВалютаРегламентированногоУчета И СсылкаНаОбъект.Дата >= '20090101000000')) Тогда
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект.Ссылка);
    Запрос.УстановитьПараметр("СчетУчетаРасчетовСКонтрагентом", СсылкаНаОбъект.СчетУчетаРасчетовСКонтрагентом);
    Текст =
    "ВЫБРАТЬ
    |    СУММА(Хозрасчетный.Сумма) КАК Сумма
    |ИЗ
    |    РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
    |ГДЕ
    |    Хозрасчетный.Регистратор = &Ссылка
    |    И Хозрасчетный.СчетКт = &СчетУчетаРасчетовСКонтрагентом
    |    И Хозрасчетный.СчетДт В
    |            (ВЫБРАТЬ РАЗЛИЧНЫЕ
    |                ПоступлениеТоваровУслуг.СчетУчета
    |            ИЗ
    |                Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслуг
    |            ГДЕ
    |                ПоступлениеТоваровУслуг.Ссылка = &Ссылка
    |
    |		   ОБЪЕДИНИТЬ
    |
    |            ВЫБРАТЬ РАЗЛИЧНЫЕ
    |                ПоступлениеТоваровУслуг.СчетУчетаНДС
    |            ИЗ
    |                Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслуг
    |            ГДЕ
    |                ПоступлениеТоваровУслуг.Ссылка = &Ссылка)";
    
    Запрос.Текст = Текст;
    СуммаВзаиморасчетов = Запрос.Выполнить().Выгрузить()[0].Сумма;
    
    РасчетСуммыНДСПоСтавке =  УчетНДС.РасчетНДСвРубляхПоСтавкеДокумента(Шапка.ДатаСоставления);
    
    Если НЕ СуммаВзаиморасчетов = NULL Тогда
    
    ЗапросТовары.Колонки.Добавить("СуммаБезНДС");
    
    МассивРаспределения = Новый Массив;
    
    Для Каждого СтрокаТовар Из ЗапросТовары Цикл
    
    СуммаСНДС = СтрокаТовар.Стоимость + ?(Шапка.СуммаВключаетНДС, 0, СтрокаТовар.СуммаНДС);
    СуммаБезНДС = СуммаСНДС - СтрокаТовар.СуммаНДС;
    
    МассивРаспределения.Добавить(СуммаСНДС);
    СтрокаТовар.СуммаБезНДС = СуммаБезНДС;
    
    КонецЦикла;
    
    ЗапросТовары.Колонки.Добавить("СуммаРублевая");
    УчетНДС.РаспределитьСуммуПоСтолбцу(МассивРаспределения, СуммаВзаиморасчетов, ЗапросТовары, "СуммаРублевая");
    
    Для Каждого СтрокаТовар Из ЗапросТовары Цикл
    
    Если РасчетСуммыНДСПоСтавке Тогда
    //Выделение суммы НДС, Расчет суммы без НДС
    ЗначениеСтавкиНДС = УчетНДС.ПолучитьСтавкуНДС(СтрокаТовар.СтавкаНДС);
    
    СтрокаТовар.СуммаНДС = ?(ЗначениеСтавкиНДС = 0, 0, Окр(СтрокаТовар.СуммаРублевая * ЗначениеСтавкиНДС/(100+ЗначениеСтавкиНДС),2));
    СтрокаТовар.Стоимость = СтрокаТовар.СуммаРублевая - СтрокаТовар.СуммаНДС;
    
    Иначе
    МассивРаспределения.Очистить();
    МассивРаспределения.Добавить(СтрокаТовар.СуммаБезНДС);
    МассивРаспределения.Добавить(СтрокаТовар.СуммаНДС);
    МассивРаспределенныхСумм = ОбщегоНазначения.РаспределитьПропорционально(СтрокаТовар.СуммаРублевая, МассивРаспределения);
    Если МассивРаспределенныхСумм <> Неопределено Тогда
    СтрокаТовар.Стоимость = МассивРаспределенныхСумм[0];
    СтрокаТовар.СуммаНДС = МассивРаспределенныхСумм[1];
    КонецЕсли;
    КонецЕсли;
    
    Если Шапка.СуммаВключаетНДС Тогда
    СтрокаТовар.Стоимость = СтрокаТовар.Стоимость+СтрокаТовар.СуммаНДС;
    КонецЕсли;
    
    КонецЦикла;
    
    КонецЕсли;
    
    КонецЕсли;
    
    ТабДокумент = Новый ТабличныйДокумент;
    
    // Зададим параметры макета
    ТабДокумент.ПолеСверху		 = 0;
    ТабДокумент.ПолеСлева		  = 0;
    ТабДокумент.ПолеСнизу		  = 0;
    ТабДокумент.ПолеСправа		 = 0;
    ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
    
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ПоступлениеТоваровУслуг_М4";
    
    Макет = ПолучитьОбщийМакет("М4");
    
    ОбластьМакетаШапка			  = Макет.ПолучитьОбласть("Шапка");
    ОбластьМакетаЗаголовокДокумента = Макет.ПолучитьОбласть("ЗаголовокДокумента");
    ОбластьМакетаЗаголовокТаблицы   = Макет.ПолучитьОбласть("ЗаголовокТаблицы");
    ОбластьМакетаСтрока			 = Макет.ПолучитьОбласть("Строка");
    ОбластьМакетаПодвалСтрок	    = Макет.ПолучитьОбласть("ПодвалСтрок");
    ОбластьМакетаИтого			  = Макет.ПолучитьОбласть("Итого");
    ОбластьМакетаПодвал			 = Макет.ПолучитьОбласть("Подвал");
    
    // Выводим общие реквизиты шапки
    СведенияОПокупателе = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Шапка.ЮрФизЛицо, Шапка.ДатаСоставления);
    
    ОбластьМакетаШапка.Параметры.Заполнить(Шапка);
    ОбластьМакетаШапка.Параметры.ПредставлениеОрганизации = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПокупателе);
    ОбластьМакетаШапка.Параметры.ОрганизацияПоОКПО	    = СведенияОПокупателе.КодПоОКПО;
    ОбластьМакетаШапка.Параметры.НомерДокумента		   = ОбщегоНазначения.ПолучитьНомерНаПечать(Шапка);
    
    ТабДокумент.Вывести(ОбластьМакетаШапка);
    
    // Выводим заголовок документа
    ОбластьМакетаЗаголовокДокумента.Параметры.Заполнить(Шапка);
    ОбластьМакетаЗаголовокДокумента.Параметры.ДатаСоставления = Шапка.ДатаСоставления;
    ПредставлениеКонтрагента = ФормированиеПечатныхФорм.ОписаниеОрганизации(
    УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Шапка.Поставщик, Шапка.ДатаСоставления), "НаименованиеДляПечатныхФорм,");
    ОбластьМакетаЗаголовокДокумента.Параметры.ПоставщикНаименование = ПредставлениеКонтрагента;
    ТабДокумент.Вывести(ОбластьМакетаЗаголовокДокумента);
    
    // Выводим заголовок таблицы
    ТабДокумент.Вывести(ОбластьМакетаЗаголовокТаблицы);
    
    // Инициализация итогов в документе
    ИтогоКоличествоПринято = 0;
    ИтогоСуммаБезНДС	   = 0;
    ИтогоСуммаНДС		  = 0;
    ИтогоВсегоСНДС		 = 0;
    Ном				    = 0;
    
    // Инициализация счетчиков страниц и строк
    НомерСтраницы   = 1;
    НомерСтроки	 = 0;
    КоличествоСтрок = ЗапросТовары.Количество();
    
    // Выводим многострочную часть документа
    Для Каждого ВыборкаСтрок Из ЗапросТовары Цикл
    
    НомерСтроки = НомерСтроки + 1;
    
    ОбластьМакетаСтрока.Параметры.Заполнить(ВыборкаСтрок);
    
    Кратность = ?(Шапка.Кратность = 0, 1, Шапка.Кратность);
    ВсегоСНДС = (ВыборкаСтрок.Стоимость
    + ?(Шапка.СуммаВключаетНДС, 0, ВыборкаСтрок.СуммаНДС));
    
    КоличествоПринято = ВыборкаСтрок.КоличествоПринято;
    СуммаНДС		  = ВыборкаСтрок.СуммаНДС;
    Цена			  = (ВсегоСНДС - СуммаНДС) / ?(КоличествоПринято = 0, 1, КоличествоПринято);
    
    ОбластьМакетаСтрока.Параметры.КоличествоПринято = КоличествоПринято;
    ОбластьМакетаСтрока.Параметры.ВсегоСНДС		 = ВсегоСНДС;
    ОбластьМакетаСтрока.Параметры.СуммаБезНДС	   = ВсегоСНДС - СуммаНДС;
    ОбластьМакетаСтрока.Параметры.СуммаНДС		  = СуммаНДС;
    ОбластьМакетаСтрока.Параметры.Цена			  = Цена;
    ОбластьМакетаСтрока.Параметры.ТоварНаименование = СокрЛП(ВыборкаСтрок.ТоварНаименование);
    
    // Проверим вывод
    СтрокаСПодвалом = Новый Массив;
    СтрокаСПодвалом.Добавить(ОбластьМакетаСтрока);
    Если НомерСтроки = КоличествоСтрок Тогда		   // если последняя строка, должен
    СтрокаСПодвалом.Добавить(ОбластьМакетаИтого);  // помещаться и подвал документа
    СтрокаСПодвалом.Добавить(ОбластьМакетаПодвал);
    Иначе											  // иначе - только подвал строк
    СтрокаСПодвалом.Добавить(ОбластьМакетаПодвалСтрок);
    КонецЕсли;
    
    Если НЕ ФормированиеПечатныхФорм.ПроверитьВыводТабличногоДокумента(ТабДокумент, СтрокаСПодвалом) Тогда
    
    ТабДокумент.Вывести(ОбластьМакетаПодвалСтрок);
    ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
    
    
    НомерСтраницы = НомерСтраницы + 1;
    ОбластьМакетаЗаголовокТаблицы.Параметры.НомерСтраницы = "Страница " + НомерСтраницы;
    
    ТабДокумент.Вывести(ОбластьМакетаЗаголовокТаблицы);
    
    КонецЕсли;
    
    ТабДокумент.Вывести(ОбластьМакетаСтрока);
    
    ИтогоКоличествоПринято = ИтогоКоличествоПринято + КоличествоПринято;
    ИтогоСуммаБезНДС	   = ИтогоСуммаБезНДС	   + ВсегоСНДС - СуммаНДС;
    ИтогоСуммаНДС		  = ИтогоСуммаНДС		  + СуммаНДС;
    ИтогоВсегоСНДС		 = ИтогоВсегоСНДС		 + ВсегоСНДС;
    
    КонецЦикла;
    
    // Выводим итоги по документу
    ОбластьМакетаИтого.Параметры.ИтогоКоличествоПринято = ИтогоКоличествоПринято;
    ОбластьМакетаИтого.Параметры.ИтогоСуммаБезНДС	   = ИтогоСуммаБезНДС;
    ОбластьМакетаИтого.Параметры.ИтогоСуммаНДС		  = ИтогоСуммаНДС;
    ОбластьМакетаИтого.Параметры.ИтогоВсегоСНДС		 = ИтогоВсегоСНДС;
    ТабДокумент.Вывести(ОбластьМакетаИтого);
    
    // Выводим итоги по документу
    ОбластьМакетаПодвал = Макет.ПолучитьОбласть("Подвал");
    ОбластьМакетаПодвал.Параметры.Заполнить(Шапка);
    ТабДокумент.Вывести(ОбластьМакетаПодвал);
    
    Возврат ТабДокумент;
    
    КонецФункции
    
  2. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.990
    Симпатии:
    399
    Баллы:
    104
    Сомневаюсь, что задав такой вопрос, Вы создали эту печатную форму. Все данные высчитываются, а не берутся напрямую из документа. Это видно даже в запросе по этой строке
    Код:
    СУММА(ПоступлениеТоваровУслуг.Сумма * &Курс / &Кратность)
  3. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Я взял из документа ПоступлениеТоваровУслуг из модуля объекта Функция ПечатьМ4(), и немного подправил ее(добавил СсылкаНаОбъект......)

    Про что конкретно вы говорите? Не могу понять.
  4. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.990
    Симпатии:
    399
    Баллы:
    104
    Что именно Вам не понятно? На примере СуммыНДС разберем. В запросе в строке
    Код:
    СУММА(ПоступлениеТоваровУслуг.СуммаНДС * &Курс / &Кратность)
    видно, что сумма ндс высчитывается. Т.е. берется то, что стоит в документе, умножается на курс валюты и все это делится на кратность. По сути курс и кратность должны равняться 1. Но у Вас, видимо, нет. Затем в цикле перебирается результат запроса
    Код:
    СуммаНДС    = ВыборкаСтрок.СуммаНДС;
    ОбластьМакетаСтрока.Параметры.СуммаНДС    = СуммаНДС;
    И здесь уже видно, что приравнивается к СуммаНДС. Данные берутся полностью из запроса. Соответственно в запросе все высчитывается. Проверяйте, что передается в параметры Курс и Кратность.
  5. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Стоимость и СуммаНДС считаются корректно, ошибка начинается с неверного заполнения СуммаРублевая
    Код:
    ЗапросТовары.Колонки.Добавить("СуммаРублевая");
    УчетНДС.РаспределитьСуммуПоСтолбцу(МассивРаспределения, СуммаВзаиморасчетов, ЗапросТовары, "СуммаРублевая");
    
    Кратность и курс =1
  6. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.990
    Симпатии:
    399
    Баллы:
    104
    Этот процесс и называется отладкой. Нужно сидеть и смотреть.
  7. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.175
    Симпатии:
    13
    Баллы:
    29
    отладчик не рулит? + кинь запрос в консоль и посмотри что там
  8. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Это как?

Поделиться этой страницей