Имя: Пароль:
1C
1С v8
Внешняя печатная форма ИНВ-19
0 slavabatov
 
11.11.11
14:10
Здравствуйте.
Если есть возможность помогите в следующем вопросе.
Создаю внешнюю печатную форму ИНВ-19 для КА 1.1 (1.1.12.1). Она практически идентична стандартной, кроме "косметических" отличий и попытки реализовать автоматическое заполнение тех полей которые в стандартной пустые.
Сделав это через Параметры ОбластиМакета (установил аналогичные стандартному заполнению) я столкнулся с проблемой ресурсоёмкости заполнения формы (безусловно до оптимальности решения тут далеко).
Не могу понять как сделать так что бы значения получались единожды, а после просто распределялись по необходимым ячейкам.
И проблема номер два это фомирование в печатной форме множества пустых страниц имеющих в себе только ЗаголовокТаблицы.
Код и файл прикладываю http://depositfiles.com/files/lqnn45chc

Только большая просьба советы давайте "с поправкой на ветер")) не силен я в разработке приложений. (например- "добавь вот такой кусок кода...")
1 Нуф-Нуф
 
11.11.11
14:10
пригласите специалиста
2 slavabatov
 
11.11.11
14:11
Код

Перем мВалютаРегламентированногоУчета Экспорт;

// Валюта курс и кратность для пересчета регламентированных сумм
Перем мВалютаУпрУчета Экспорт;
Перем мКурсУпрУчета Экспорт;
Перем мКратностьУпрУчета Экспорт;
Перем Дата Экспорт;
Перем Склад Экспорт;

Функция Печать() Экспорт

   ДопКолонка = Константы.ДополнительнаяКолонкаПечатныхФормДокументов.Получить();
   Если ДопКолонка = Перечисления.ДополнительнаяКолонкаПечатныхФормДокументов.Артикул Тогда
       ТоварКод = "Артикул";
   Иначе
       ТоварКод = "Код";
   КонецЕсли;
   
       
   //Запрос = Новый Запрос;
   //Если Склад.ВидСклада = Перечисления.ВидыСкладов.НТТ Тогда
   //ВалютаПересчета = мВалютаРегламентированногоУчета;
   //Иначе
   ВалютаПересчета = мВалютаУпрУчета;
   //КонецЕсли;
   
   //Запрос.УстановитьПараметр("ВидСкладаНТТ",    Перечисления.ВидыСкладов.НТТ);

   ВалютаПечати = мВалютаРегламентированногоУчета;
   Параметры    = МодульВалютногоУчета.ПолучитьКурсВалюты(ВалютаПересчета, Дата);
   Запрос       = Новый Запрос;

   Запрос.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект.Ссылка);
   Запрос.УстановитьПараметр("Курс",            Параметры.Курс);
   Запрос.УстановитьПараметр("Кратность",       Параметры.Кратность);
   Запрос.УстановитьПараметр("ВидСкладаНТТ",    Перечисления.ВидыСкладов.НТТ);

   Запрос.Текст =
   "ВЫБРАТЬ
   |    Номер  КАК НомерДокумента,
   |    Дата   КАК ДатаДокумента,
   |    Дата   КАК ДатаНачалаИнвентаризации,
   |    Организация КАК Руководители,
   |    Организация,
   |    Склад.Представление КАК ПредставлениеСклада,
   |    Товары.(
   |        НомерСтроки КАК Номер,
   |        Номенклатура,
   |        Номенклатура.НаименованиеПолное КАК ТоварНаименование,
   |        Номенклатура." + ТоварКод + "   КАК ТоварКод,
   |        ЕдиницаИзмерения.Представление  КАК ЕдиницаИзмеренияНаименование,
   |        ЕдиницаИзмерения.ЕдиницаПоКлассификатору.Код КАК ЕдиницаИзмеренияКодПоОКЕИ,
   |        Количество                     КАК ФактКоличество,
   |        КоличествоУчет                 КАК БухКоличество,
   |        ВЫБОР
   |            КОГДА Склад.ВидСклада = &ВидСкладаНТТ ТОГДА ЦенаВРознице
   |            ИНАЧЕ Цена * &Курс / &Кратность
   |        КОНЕЦ КАК Цена,
   |        ВЫБОР
   |            КОГДА Склад.ВидСклада = &ВидСкладаНТТ ТОГДА Количество * ЦенаВРознице
   |            ИНАЧЕ Сумма * &Курс / &Кратность
   |        КОНЕЦ КАК ФактСумма,
   |        ВЫБОР
   |            КОГДА Склад.ВидСклада = &ВидСкладаНТТ ТОГДА КоличествоУчет *ЦенаВРознице
   |            ИНАЧЕ СуммаУчет * &Курс / &Кратность
   |        КОНЕЦ КАК БухСумма,
   |        ХарактеристикаНоменклатуры     КАК Характеристика,
   |        СерияНоменклатуры КАК Серия
   |    )
   |ИЗ
   |    Документ.ИнвентаризацияТоваровНаСкладе КАК ИнвентаризацияТоваровНаСкладе
   |
   |ГДЕ
   |    ИнвентаризацияТоваровНаСкладе.Ссылка = &ТекущийДокумент
   |УПОРЯДОЧИТЬ ПО
   |    Товары.НомерСтроки";

   Шапка = Запрос.Выполнить().Выбрать();
   Шапка.Следующий();
   ВыборкаСтрокТовары = Шапка.Товары.Выбрать();

   ТабДокумент = Новый ТабличныйДокумент;
   ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ИнвентаризацияТоваровНаСкладе_ИНВ19";
   Макет       = ПолучитьМакет("ИНВ19а");

   // Выводим шапку накладной
   ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
   ОбластьМакета.Параметры.Заполнить(Шапка);
   СведенияОбОрганизации = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Шапка.Организация, Шапка.ДатаДокумента);
   ОбластьМакета.Параметры.ПредставлениеОрганизации = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОбОрганизации);
   ОбластьМакета.Параметры.ОрганизацияПоОКПО        = СведенияОбОрганизации.КодПоОКПО;
   ОбластьМакета.Параметры.ДатаДокумента            = Шапка.ДатаДокумента;
   ОбластьМакета.Параметры.ДатаНачалаИнвентаризации = Шапка.ДатаНачалаИнвентаризации;
   ОбластьМакета.Параметры.НомерДокумента           = ОбщегоНазначения.ПолучитьНомерНаПечать(СсылкаНаОбъект);

   Руководители = РегламентированнаяОтчетность.ОтветственныеЛицаОрганизаций(Шапка.Руководители, Шапка.ДатаДокумента,);
   Руководитель = Руководители.Руководитель;
   Бухгалтер    = Руководители.ГлавныйБухгалтер;

   ТабДокумент.Вывести(ОбластьМакета);
   ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();

   СтрокНаСтранице = 19;
   СтрокШапки      = 5;
   СтрокПодвала    = 5;
   НомерСтраницы   = 2;
   Ном             = 0;

   ИтогоРезультатИзлишекКолво   = 0;
   ИтогоРезультатИзлишекСумма   = 0;
   ИтогоРезультатНедостачаКолво = 0;
   ИтогоРезультатНедостачаСумма = 0;

   // Выводим заголовок таблицы
   ЗаголовокТаблицы = Макет.ПолучитьОбласть("ЗаголовокТаблицы1");
   ЗаголовокТаблицы.Параметры.НомерСтраницы = "Страница " + НомерСтраницы;
   ТабДокумент.Вывести(ЗаголовокТаблицы);

   КоличествоСтрок = ВыборкаСтрокТовары.Количество();

   Если КоличествоСтрок = 1 Тогда
       ПереноситьПоследнююСтроку = 0;
   Иначе
       ЦелыхСтраницСПодвалом     = Цел((СтрокШапки + КоличествоСтрок + СтрокПодвала) / СтрокНаСтранице);
       ЦелыхСтраницБезПодвала    = Цел((СтрокШапки + КоличествоСтрок - 1) / СтрокНаСтранице);
       ПереноситьПоследнююСтроку = ЦелыхСтраницСПодвалом - ЦелыхСтраницБезПодвала;
   КонецЕсли;

   // Выводим многострочную часть документа
   ВыборкаСтрокТовары = Шапка.Товары.Выбрать();
   ОбластьМакета = Макет.ПолучитьОбласть("СтрокаТаблицы1");
   Пока ВыборкаСтрокТовары.Следующий() Цикл

       Если НЕ ЗначениеЗаполнено(ВыборкаСтрокТовары.Номенклатура) Тогда
           Сообщить("В одной из строк не заполнено значение номенклатуры - строка при печати пропущена.", СтатусСообщения.Важное);
           Продолжить;
       КонецЕсли;

       //Начинаем новую страницу, если предыдущая строка была последней на странице
       //или пора переносить последнюю строку на последнюю страницу с подвалом.
       ЦелаяСтраница = (СтрокШапки + Ном - 1) / СтрокНаСтранице;

       Если (ЦелаяСтраница = Цел(ЦелаяСтраница))
        или ((ПереноситьПоследнююСтроку = 1) и (Ном = КоличествоСтрок)) Тогда

           ОбластьИтоговПоСтранице = Макет.ПолучитьОбласть("ИтогоТаблицы1");
           ТабДокумент.Вывести(ОбластьИтоговПоСтранице);

           НомерСтраницы = НомерСтраницы + 1;
           ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();

           ЗаголовокТаблицы.Параметры.НомерСтраницы = "Страница " + НомерСтраницы;
           ТабДокумент.Вывести(ЗаголовокТаблицы);

       КонецЕсли;

       ОбластьМакета.Параметры.Заполнить(ВыборкаСтрокТовары);
       ОбластьМакета.Параметры.ТоварНаименование = ВыборкаСтрокТовары.ТоварНаименование + ФормированиеПечатныхФорм.ПредставлениеСерий(ВыборкаСтрокТовары);

       Разница     = 0;
       РазницаСумм = 0;

       Разница     = ВыборкаСтрокТовары.ФактКоличество - ВыборкаСтрокТовары.БухКоличество;
       РазницаСумм = ВыборкаСтрокТовары.ФактСумма      - ВыборкаСтрокТовары.БухСумма;
       Если Разница = 0 Тогда
           Продолжить;
       КонецЕсли;

       Если Разница < 0 И РазницаСумм < 0 Тогда
           ОбластьМакета.Параметры.РезультатНедостачаКолво = - Разница;
           ОбластьМакета.Параметры.РезультатНедостачаСумма = - РазницаСумм;
           ОбластьМакета.Параметры.РезультатИзлишекКолво   = 0;
           ОбластьМакета.Параметры.РезультатИзлишекСумма   = 0;

           ИтогоРезультатНедостачаКолво = ИтогоРезультатНедостачаКолво + (- Разница);
           ИтогоРезультатНедостачаСумма = ИтогоРезультатНедостачаСумма + (- РазницаСумм);
       ИначеЕсли Разница < 0 И РазницаСумм >= 0 Тогда
           ОбластьМакета.Параметры.РезультатНедостачаКолво = - Разница;
           ОбластьМакета.Параметры.РезультатНедостачаСумма = РазницаСумм;
           ОбластьМакета.Параметры.РезультатИзлишекКолво   = 0;
           ОбластьМакета.Параметры.РезультатИзлишекСумма   = 0;

           ИтогоРезультатНедостачаКолво = ИтогоРезультатНедостачаКолво + (- Разница);
           ИтогоРезультатНедостачаСумма = ИтогоРезультатНедостачаСумма + РазницаСумм;
       Иначе
           ОбластьМакета.Параметры.РезультатНедостачаКолво = 0;
           ОбластьМакета.Параметры.РезультатНедостачаСумма = 0;
           ОбластьМакета.Параметры.РезультатИзлишекКолво   = Разница;
           ОбластьМакета.Параметры.РезультатИзлишекСумма   = РазницаСумм;

           ИтогоРезультатИзлишекКолво   = ИтогоРезультатИзлишекКолво   + Разница;
           ИтогоРезультатИзлишекСумма   = ИтогоРезультатИзлишекСумма   + РазницаСумм;
       КонецЕсли;

       ТабДокумент.Вывести(ОбластьМакета);

       Ном = Ном + 1;

   КонецЦикла;

   ОбластьИтоговПоСтранице = Макет.ПолучитьОбласть("ИтогоТаблицы1");
   ОбластьИтоговПоСтранице.Параметры.ИтогоРезультатИзлишекКолво   = ИтогоРезультатИзлишекКолво;
   ОбластьИтоговПоСтранице.Параметры.ИтогоРезультатИзлишекСумма   = ИтогоРезультатИзлишекСумма;
   ОбластьИтоговПоСтранице.Параметры.ИтогоРезультатНедостачаКолво = ИтогоРезультатНедостачаКолво;
   ОбластьИтоговПоСтранице.Параметры.ИтогоРезультатНедостачаСумма = ИтогоРезультатНедостачаСумма;
   ТабДокумент.Вывести(ОбластьИтоговПоСтранице);

   ОбластьМакета = Макет.ПолучитьОбласть("Подвал");
   ОбластьМакета.Параметры.ФИОБухгалтера =  Бухгалтер;
   ОбластьМакета.Параметры.Заполнить(Шапка);
   ТабДокумент.Вывести(ОбластьМакета);

   // Зададим параметры макета
   ТабДокумент.ПолеСверху = 0;
   ТабДокумент.ПолеСлева  = 0;
   ТабДокумент.ПолеСнизу  = 0;
   ТабДокумент.ПолеСправа = 0;
   ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;

   Возврат ТабДокумент;

КонецФункции // ПечатьИНВ19()

мВалютаРегламентированногоУчета = глЗначениеПеременной("ВалютаРегламентированногоУчета");
мВалютаУпрУчета                 = глЗначениеПеременной("ВалютаУправленческогоУчета");
3 slavabatov
 
11.11.11
15:02
может я решил это и по "колхозному" без запросов получения данных или внешней обработкой заполнения, но результат по первому вопросу получил путем добавления параметров

код
ОбластьМакета.Параметры.РезультатИзлишекКолво2 = ОбластьМакета.Параметры.РезультатНедостачаКолво;
       ОбластьМакета.Параметры.РезультатИзлишекСумма2 = ОбластьМакета.Параметры.РезультатИзлишекСумма;
       ОбластьМакета.Параметры.РезультатНедостачаКолво2 = ОбластьМакета.Параметры.РезультатНедостачаКолво;
       ОбластьМакета.Параметры.РезультатНедостачаСумма2 = ОбластьМакета.Параметры.РезультатНедостачаСумма;
       
       ИтогоРезультатИзлишекКолво2 = ИтогоРезультатИзлишекКолво;
       ИтогоРезультатИзлишекСумма2 = ИтогоРезультатИзлишекСумма;
       ИтогоРезультатНедостачаКолво2 = ИтогоРезультатНедостачаКолво;
       ИтогоРезультатНедостачаСумма2 = ИтогоРезультатНедостачаСумма;
       
       ТабДокумент.Вывести(ОбластьМакета);

       Ном = Ном + 1;

   КонецЦикла;
4 slavabatov
 
11.11.11
15:05
Ну и соответственно в макете в Параметрах установил новые значения.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс