Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
26 июн 2024, 11:15

(Печать внешняя обработка)

Автор GanG031, 07 июн 2016, 10:05

0 Пользователей и 1 гость просматривают эту тему.

GanG031

Доброго времени суток, уважаемые!
Суть в следующем: Делаю внешнюю обработку, а в частности печатную форму. Вот код:

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

   РезультирующийДокумент = Новый ТабличныйДокумент;
   РезультирующийДокумент = ПечатьТекущегоДокументаНаСервере(ДокументПечати, РезультирующийДокумент);
   РезультирующийДокумент.Показать("Акт на списание материальных ценностей");
   РезультирующийДокумент.ТолькоПросмотр = Истина;
   РезультирующийДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;

   РезультирующийДокумент.ПолеСверху = 2;
   РезультирующийДокумент.ПолеСлева = 2;
   РезультирующийДокумент.ПолеСнизу = 2;
   РезультирующийДокумент.ПолеСправа = 2;
   РезультирующийДокумент.Показать("Акт на списание материальных ценностей");
КонецПроцедуры




&НаСервере
Функция ПечатьТекущегоДокументаНаСервере(ДокументПечати, ТабДок)
      ТекущаяСтрока = ТаблицаДокументов[ДокументПечати];
      МояТаблицаЗначений = Новый ТаблицаЗначений;
      РезультирующийДокумент = ТабДок;
   ПараметрПечати = "";
//РезультирующийДокумент = Новый ТабличныйДокумент;
   Если ЗначениеЗаполнено(ДатаОсмотра) = Ложь Тогда Сообщить("Дата осмотра не указана...");
      Возврат РезультирующийДокумент;
   КонецЕсли;
      ТаблицаДокументов2 = ДанныеФормыВЗначение(ТаблицаДокументов,ТИП("ТаблицаЗначений"));
   Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
   ОбластьПустаяСтрока = Макет.ПолучитьОбласть("ПустаяСтрока");
     Если Не ЗначениеЗаполнено(ПараметрПечати) Тогда
      СписокДокументовПечати = ТаблицаДокументов2.Скопировать();
      ЗаполнитьЗначенияСвойств(СписокДокументовПечати.Добавить(), ТекущаяСтрока);
   Иначе
      СписокДокументовПечати = ТаблицаДокументов.Скопировать();
   КонецЕсли;
   
   Для Каждого ДокументПечати Из СписокДокументовПечати Цикл
      Таб = Новый ТабличныйДокумент;
      // Заполнение шапки
      ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
      ПарШапки = ОбластьШапка.Параметры;
      ПарШапки.ДатаСоставления = Формат(ДатаСоставления, "ДЛФ=DD");
      ПарШапки.Организация = Организация.ПолноеНаименование();
      ПарШапки.СтруктурноеПодразделение = СтруктурноеПодразделение;
      ПарШапки.Модель = ДокументПечати.ТС.Наименование;
      Склад =   ПолучитьСкладНаСервере();
        ТаблицаОтветственных = РегистрыСведений.ОтветственныеЛица.СрезПоследних(, новый Структура ("СтруктурнаяЕдиница", Склад));
      Если ТаблицаОтветственных.Количество() = 0  Тогда
         Сообщить("Складу не назначен ответственный...");
         Возврат РезультирующийДокумент;
      Иначе
         ФизЛицо = ТаблицаОтветственных[0].ФизическоеЛицо;
      КонецЕсли;
      ПарШапки.МОЛ = Врег(ФизЛицо);
      ПарШапки.ПредседательКомиссии = ЭтаФорма.ПредседетельКомиссии;
      ЧленыКомиссии = "" + ЭтаФорма.Бухгалтер2Категории + ", " + ЭтаФорма.ЗамНАчальникаПоБлагоутройству ;//+ ", " + ЭтаФорма.ЗамНачПоИнфраструктуре;
      ПарШапки.ЧленыКомиссии = ЧленыКомиссии;
      ПарШапки.ДатаОсмотра = Формат(ДатаОсмотра, "ДЛФ=DD");
      ПарШапки.ПодотчетноеЛицо = СклонитьФИО(ФизЛицо.Наименование);
      ПарШапки.ГосНомер = ПолучитьГосНомер(ДокументПечати.ТС);
      Таб.Вывести(ОбластьШапка);
      ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
      Таб.Вывести(ОбластьШапкаТаблицы);
      ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаТаблицы");
      
      
      ЗапросНом = Новый Запрос;
      ЗапросНом.УстановитьПараметр("СписокДок",ДокументПечати.Документ);
      ЗапросНом.Текст = "ВЫБРАТЬ
                        |   уатПартииТоваровНаСкладах.Период,
                        |   уатПартииТоваровНаСкладах.Регистратор,
                        |   уатПартииТоваровНаСкладах.НомерСтроки,
                        |   уатПартииТоваровНаСкладах.Активность,
                        |   уатПартииТоваровНаСкладах.ВидДвижения,
                        |   уатПартииТоваровНаСкладах.Номенклатура,
                        |   уатПартииТоваровНаСкладах.Склад,
                        |   уатПартииТоваровНаСкладах.Партия,
                        |   уатПартииТоваровНаСкладах.Количество,
                        |   уатПартииТоваровНаСкладах.Стоимость,
                        |   уатПартииТоваровНаСкладах.МоментВремени,
                        |   уатПартииТоваровНаСкладах.Регистратор.ВидОбслуживания КАК ВидОбслуживания
                        |ИЗ
                        |   РегистрНакопления.уатПартииТоваровНаСкладах КАК уатПартииТоваровНаСкладах
                        |ГДЕ
                        |   уатПартииТоваровНаСкладах.Регистратор В(&СписокДок)";
      
      ТабДвижений = ЗапросНом.Выполнить().Выгрузить();
      пТабНом = ЗапросНом.Выполнить().Выгрузить();
      пТабНом.Свернуть("Номенклатура, ВидОбслуживания", "Количество, Стоимость");
      

      КоличествоМатериалов = пТабНом.Количество();
      ПерваяСтраница =  16;
      ВтораяСтраница = 37;
      Подвал = 11;
      КоличествоПустыхСтрок = 0;
      // Определим количество пустых строк
      Если КоличествоМатериалов <> ПерваяСтраница тогда
         Разница = КоличествоМатериалов - ПерваяСтраница;
         Если Разница < 0 тогда
            КоличествоПустыхСтрок = Разница * (-1);
         Иначе
            Для Сч = 1 По 100 Цикл
               Приращение = Сч * ВтораяСтраница;
               Если Приращение >= Разница Тогда
                  КоличествоПустыхСтрок = Приращение - Разница;
                  Прервать;
               КонецЕсли;
            КонецЦикла;
         КонецЕсли;
      КонецЕсли;
      ЕстьЗаполнениеНаСледующейСтранице = Ложь;
      Если КоличествоПустыхСтрок >= Подвал тогда
         КоличествоПустыхСтрок = КоличествоПустыхСтрок - Подвал;
      Иначе
         ЕстьЗаполнениеНаСледующейСтранице = Истина;
      КонецЕсли;
      НомерВыведеннойСтроки = 0;
      ЕстьПерваяСтраница = ложь;
      НомерСтраницы = 1;
      СтрокаИтого=0;
      Для каждого СтрокаДокумента Из птабНом Цикл
         Если Не ЕстьПерваяСтраница Тогда
            Если НомерВыведеннойСтроки = ПерваяСтраница Тогда
               НомерСтраницы = НомерСтраницы + 1;
               Таб.Вывести(ОбластьШапкаТаблицы);
               ЕстьПерваяСтраница = Истина;
               НомерВыведеннойСтроки = 0;
            КонецЕсли;
         КонецЕсли;
         Если НомерВыведеннойСтроки <> 0 Тогда
            Остаток = НомерВыведеннойСтроки % ВтораяСтраница;
            Если Остаток = 0 Тогда
               НомерСтраницы = НомерСтраницы + 1;
               Таб.Вывести(ОбластьШапкаТаблицы);
            КонецЕсли;
         КонецЕсли;
         ПарСтрока = ОбластьСтрока.Параметры;
         ПарСтрока.НоменклатурныйНомер = СтрокаДокумента.Номенклатура.Артикул;
         ПарСтрока.Наименование = СтрокаДокумента.Номенклатура.Наименование;
         ////ПарСтрока.ЕдиницаИзмерения = СтрокаДокумента.Номенклатура.БазоваяЕдиницаИзмерения;
         ПарСтрока.Количество = СтрокаДокумента.Количество;
//         ПарСтрока.Сумма = РассчитатьСуммуСписания(СтрокаДокумента, ТабДвижений);// Доработать. Взять из документа Выдача расх. материалов. Создание печатной формы.
            ПарСтрока.Сумма = СтрокаДокумента.Стоимость;
         ПарСтрока.ВидОбслуживания = СтрокаДокумента.ВидОбслуживания;

         СтрокаИтого = ПарСтрока.Сумма + СтрокаИтого;
         Таб.Вывести(ОбластьСтрока);
         НомерВыведеннойСтроки = НомерВыведеннойСтроки + 1;
      КонецЦикла;
      
      Если КоличествоПустыхСтрок > 0 Тогда
         Для Сч = 1 По КоличествоПустыхСтрок Цикл
            Таб.Вывести(ОбластьПустаяСтрока);   
         КонецЦикла;
      КонецЕсли;

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


Выдает ошибку {Форма.Форма.Форма(284)}: Ошибка при вызове метода контекста (ПечатьТекущегоДокументаНаСервере)
   РезультирующийДокумент = ПечатьТекущегоДокументаНаСервере(ДокументПечати, РезультирующийДокумент);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
   форма: Элемент
   имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'СтрокаТаблицыЗначений'

Я так понял, что проблема в Переменной "РезультирующийДокумент". Проверил в отладчике, она имеет тип "ТабличныйДокумент". Не понятно, в чем ошибка. Подскажите пожалуйста! Заранее спасибо!

vitasw

Неправильно поняли. Проблема ПечатьТекущегоДокументаНаСервере(ДокументПечати, РезультирующийДокумент);

ПростоБосс

Цитата: GanG031 от 07 июн 2016, 10:05ДокументПечати = Элементы.ТаблицаДокументов.ТекущаяСтрока;
Вот где собака порылась. Получаешь из таблицы документов строку, которая наверняка имеет вид совсем даже не "Строка". И пытаешься передать ее на серверную сторону:
Цитата: GanG031 от 07 июн 2016, 10:05РезультирующийДокумент = ПечатьТекущегоДокументаНаСервере(ДокументПечати, РезультирующийДокумент);
Уж тогда передавай номер строки, что-ли... Ну, типа: ДокументПечати = Элементы.ТаблицаДокументов.ТекущиеДанные.НомерСтроки. А уж на серверной части по номеру строки, который на 1 больше, чем индекс таблицы значений найдешь свою строку.


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск