Создание акта сверки для Управления торговлей с факсимиле

Публикация № 1000071

Программирование - Практика программирования

Акт сверки факсимиле логотип разработка ВПФ

2
Создание обработки на основании встроенной печатной формы для формирования акта сверки взаиморасчётов с факсимиле.

Доброго времени суток.

Решил описать ещё раз создание внешней печатной формы. Покороче, по делу. Необходимо в стандартный акт сверки взаиморасчётов "Управления торговлей 11.4" добавить факсимиле.

   Имеем на входе конфигурацию Управление торговлей, редакция 11 (11.4.6.207), на платформе 1С:Предприятие 8.3 (8.3.13.1513)

   Создаём внешнюю обработку:

   Сохраняем её на диск. Делаем всё, как учили, с той лишь только оговоркой, что печать не требует дополнительной обработки конфигурации, а выполняется непосредственно из модуля менеджера данного документа. Макет, однако, необходимо скопировать.

   Далее сделаем то, без чего мы далеко не уедем, сформируем вот такую штуковину:

Функция СведенияОВнешнейОбработке() экспорт
    ПараметрыРегистрации = Новый Структура;
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.СверкаВзаиморасчетов"); //Указываем документ к которому делаем внешнюю печ. форму
    ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма"); //может быть - ПечатнаяФорма, ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов... 
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", "Акт сверки с факсимиле"); //имя под которым обработка будет зарегестрирована в справочнике внешних обработок
    ПараметрыРегистрации.Вставить("БезопасныйРежим", ЛОЖЬ);
    ПараметрыРегистрации.Вставить("Версия", "1.0"); 
    ПараметрыРегистрации.Вставить("Информация", "Заказная ВПФ"); 
    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    ДобавитьКоманду(ТаблицаКоманд, "Акт сверки с факсимиле", "АктСверкиВзаимныхРасчетов", "ВызовСерверногоМетода", Истина, "ПечатьMXL");
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
    Возврат ПараметрыРегистрации;
КонецФункции

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

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление; 
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры

   То есть добавляем две необходимые функции и одну процедуру. Дальше делаем всё по накатанной. Модифицируем процедуру "Печать":

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	ПараметрыПечати = Новый Структура();
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "АктСверкиВзаимныхРасчетов") Тогда
		
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм,
			"АктСверкиВзаимныхРасчетов",
			НСтр("ru='Акт сверки взаимных расчетов'"),
			СформироватьПечатнуюФормуАктСверкиВзаимныхРасчетов(МассивОбъектов, ОбъектыПечати));
	КонецЕсли;
	
	ФормированиеПечатныхФорм.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, МассивОбъектов, КоллекцияПечатныхФорм);
	
КонецПроцедуры

   И останется только в Функции СформироватьПечатнуюФормуАктСверкиВзаимныхРасчетов заменить макет с штатного на наш. Предварительно переименовав его в обработке:

Макет = ПолучитьМакет("АктСверкиВзаимныхРасчетовФаксимиле");

   После этого на печать выводится именно наш макет.

   Теперь я решил прибраться, то есть убрать ненужные процедуры и функции. Вот список:

Процедура ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры) Экспорт
Функция ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании) Экспорт
Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт
Процедура ЗаполнитьИменаРеквизитовПоХозяйственнойОперации(СтруктураПараметров, МассивВсехРеквизитов, МассивРеквизитовОперации) Экспорт
Функция СформироватьПечатнуюФормуАктСДаннымиКонтрагента(МассивОбъектов, ОбъектыПечати)

   Больше решил не убирать. Не мешается, и ладно.

   Теперь нужно присобачить факсимиле. Нужно его откуда-то взять. Конечно же из старой доброй обработки ПечатьСчетовНаОплату.

   Там есть вот такая штуковина:

Процедура ВывестиФаксимилеВТабличныйДокумент(Макет, ОбластьМакета, Организация, ПараметрыПечати = Неопределено) Экспорт
	
	ОтображатьФаксимиле = Ложь;
	Если ПараметрыПечати <> Неопределено И ПараметрыПечати.Свойство("ОтображатьФаксимиле") Тогда
		ОтображатьФаксимиле = ПараметрыПечати.ОтображатьФаксимиле;
	КонецЕсли;
	
	Если НЕ ОтображатьФаксимиле Тогда
		Возврат
	КонецЕсли;
	
	ФайлКартинки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Организация, "ФайлФаксимильнаяПечать");
	
	Если ОтображатьФаксимиле И НЕ ЗначениеЗаполнено(ФайлКартинки) Тогда
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru ='Факсимиле для организации не указано. 
			|Укажите файл с факсимиле в карточке организации, раздел ""Настройка печати"".'"));
	КонецЕсли;
	
	Если Не ОбщегоНазначенияУТКлиентСервер.ЕстьРеквизитОбъекта(ОбластьМакета.Рисунки, "Факсимиле") Тогда
		// Картинки Факсимиле в этой области макета нет.
		
		Если Макет.Области.Найти("ОбластьФаксимиле") <> Неопределено Тогда
			
			// Проверить картинку факсимиле в области "ОбластьФаксимиле"
			ОбластьМакетаФаксимиле = Макет.ПолучитьОбласть("ОбластьФаксимиле");
			Если ОбщегоНазначенияУТКлиентСервер.ЕстьРеквизитОбъекта(ОбластьМакетаФаксимиле.Рисунки, "Факсимиле")
				И ЗначениеЗаполнено(ФайлКартинки) Тогда
				
				ОбластьМакета = ОбластьМакетаФаксимиле;
			Иначе
				Возврат;
			КонецЕсли;
		Иначе
			Возврат;
		КонецЕсли;
		
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(ФайлКартинки) Тогда
		ОбластьМакета.Рисунки.Удалить(ОбластьМакета.Рисунки.Факсимиле);
		Возврат;
	КонецЕсли;
	
	ДвоичныеДанныеФайла = РаботаСФайлами.ДвоичныеДанныеФайла(ФайлКартинки);
	
	Если ТипЗнч(ДвоичныеДанныеФайла) = Тип("Картинка") Тогда
		Картинка = ДвоичныеДанныеФайла;
	ИначеЕсли ТипЗнч(ДвоичныеДанныеФайла) = Тип("ДвоичныеДанные") Тогда
		Картинка = Новый Картинка(ДвоичныеДанныеФайла);
	Иначе
		Картинка = Новый Картинка;
	КонецЕсли; 
	
	ОбластьМакета.Рисунки.Факсимиле.Картинка = Картинка;
	
КонецПроцедуры

  Ещё в макет нужно добавить область "ОбластьФаксимиле" и заставить её работать.

   Пишу по порядку, что делаю. Ну понятно, скопировал вышеуказанную область. Затем в процедуру ДобавитьКомандыПечати(КомандыПечати) необходимо добавить вот такой параметр:

КомандаПечати.ДополнительныеПараметры.Вставить("ОтображатьФаксимиле", Истина);

   И, наконец, в функцию СформироватьПечатнуюФормуАктСверкиВзаимныхРасчетов(МассивОбъектов, ОбъектыПечати) нужно добавить код:

ФормированиеПечатныхФорм.ВывестиФаксимилеВТабличныйДокумент(Макет, ОбластьМакета, ДанныеДокумента.Организация, Новый Структура("ОтображатьФаксимиле", Истина));

   Так и сделал. Собрался уже хлопать в ладоши, но не тут то было. Подгрузил очередной раз внешнюю печатную форму, попытался распечатать акт сверки, но получил вот такое сообщение:

   Огорчению моему не было предела. Пришлось закомментировать строчку ФормированиеПечатныхФорм.ВывестиФаксимилеВТабличныйДокумент... и попытаться разобрать вышеописанную процедуру на цитаты.

   В принципе, ничего сверхестественного она не делает, проверяет необходимые значения, берёт факсимиле, соответствующий данной организации и шлёпает его в указанную область макета. Время было уже позднее, я подумал, "Утро вечера мудренее", плюнул на всё это, выключил компьютер и лёг спать. Но про обработку всё думал. Потом решил мыслить логически. В штатной конфигурации она же работает, внешняя печатная форма опять же взята из штатной конфигурации, значит ларчик-то должен как то просто открываться. Вспоминаются ребусы из спичек: переложите одну спичку так, чтобы из нуля получилось сто. И О ЧУДО!!!!! Всего лишь переставил строчку из одного места в другое и ВСЁ ЗАРАБОТАЛО!!! От перестановки мест слагаемых сумма иногда кардинально меняется.

   Вышеуказанную строчку всего лишь нужно было переместить на три строчки вниз!

   Всю функцию выкладывать не буду, а только фрагмент, куда нужно вставить вызов штатной процедуры:

		// ПОДПИСИ
		
		ОбластьМакета = Макет.ПолучитьОбласть("Подписи");
		
		
		ОбластьМакета.Параметры.Заполнить(ДанныеДокумента);
		ОбластьМакета.Параметры.ПредставлениеОрганизации = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОбОрганизации, 
												  			  "ПолноеНаименование,ИНН,ЮридическийАдрес");
		
		ОбластьМакета.Параметры.КонтрагентНаименование   = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОКонтрагенте, 
												  			  "ПолноеНаименование,ИНН,ЮридическийАдрес");
		ФормированиеПечатныхФорм.ВывестиФаксимилеВТабличныйДокумент(Макет, ОбластьМакета, ДанныеДокумента.Организация, Новый Структура("ОтображатьФаксимиле", Истина));
		ТабличныйДокумент.Вывести(ОбластьМакета);
		
		// ПРИЛОЖЕНИЕ
		Если ДанныеДокумента.РасшифровкаПоЗаказам Тогда
			
			ТаблицаОстатков = ОстаткиРасчетов(ДанныеДокумента);
			
			Если ТаблицаОстатков <> Неопределено Тогда
				
				ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
				
				ТекстЗаголовкаПриложения = ОбщегоНазначенияУТКлиентСервер.СформироватьЗаголовокДокумента(ДанныеДокумента,
					НСтр("ru='к акту сверки взаимных расчетов'"));
				
				ОбластьМакета = Макет.ПолучитьОбласть("ЗаголовокПриложение");
				ОбластьМакета.Параметры.ТекстЗаголовкаПриложения = ТекстЗаголовкаПриложения;
				ОбластьМакета.Параметры.КонецПериодаСверки = Формат(ДанныеДокумента.КонецПериода, "ДЛФ=ДД");
				ТабличныйДокумент.Вывести(ОбластьМакета);
				
				МассивВалют = ОбщегоНазначенияУТ.УдалитьПовторяющиесяЭлементыМассива(ТаблицаОстатков.ВыгрузитьКолонку("ВалютаВзаиморасчетов"));
				Если ДанныеДокумента.РасшифровкаПоПартнерам Тогда
					МассивПартнеров = ОбщегоНазначенияУТ.УдалитьПовторяющиесяЭлементыМассива(ТаблицаОстатков.ВыгрузитьКолонку("Партнер"));
				КонецЕсли; 
				
				ПараметрыТаблицыЗадолженностей = Новый Структура;
				ПараметрыТаблицыЗадолженностей.Вставить("ДанныеДокумента", ДанныеДокумента);
				ПараметрыТаблицыЗадолженностей.Вставить("ТаблицаОстатков", ТаблицаОстатков);
				ПараметрыТаблицыЗадолженностей.Вставить("СтруктураПредставленийУчастников", СтруктураПредставленийУчастников);
				ПараметрыТаблицыЗадолженностей.Вставить("МассивВалют", МассивВалют);
				ПараметрыТаблицыЗадолженностей.Вставить("Макет", Макет);
				ПараметрыТаблицыЗадолженностей.Вставить("ВыводитьПодвал", Ложь);
				
				Если ДанныеДокумента.РасшифровкаПоПартнерам Тогда
					Для Каждого Партнер Из МассивПартнеров Цикл
						ТабличныйДокумент.Вывести(ВывестиТаблицуЗадолженности(ПараметрыТаблицыЗадолженностей, Партнер));
					КонецЦикла; 
				Иначе
					ТабличныйДокумент.Вывести(ВывестиТаблицуЗадолженности(ПараметрыТаблицыЗадолженностей));
				КонецЕсли;	
				
				ОбластьМакета = Макет.ПолучитьОбласть("Подписи");
				ОбластьМакета.Параметры.Заполнить(ДанныеДокумента);
				ОбластьМакета.Параметры.ПредставлениеОрганизации = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОбОрганизации, 
														  			  "ПолноеНаименование,ИНН,ЮридическийАдрес");
				
				ОбластьМакета.Параметры.КонтрагентНаименование   = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОКонтрагенте, 
														  			  "ПолноеНаименование,ИНН,ЮридическийАдрес");
				ФормированиеПечатныхФорм.ВывестиФаксимилеВТабличныйДокумент(Макет, ОбластьМакета, ДанныеДокумента.Организация, Новый Структура("ОтображатьФаксимиле", Истина));
				ТабличныйДокумент.Вывести(ОбластьМакета);
				
			КонецЕсли; 
			
		КонецЕсли;
		
		УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, ДанныеДокумента.ДокументСсылка);
		
	КонецЦикла;

	ТабличныйДокумент.АвтоМасштаб = Истина;
	
	Если ПривилегированныйРежим() Тогда
		УстановитьПривилегированныйРежим(Ложь);
	КонецЕсли;

	Возврат ТабличныйДокумент;
	
КонецФункции // СформироватьПечатнуюФормуАктСверкиВзаимныхРасчетов(МассивОбъектов, ОбъектыПечати)

   На всякий случай вставил её дважды, в ПОДПИСИ и в ПРИЛОЖЕНИЕ. Но это ещё не всё. Область факсимиле взята из счёта. Она закрывает все подписи, и нашей организации, и контрагента. Поэтому макет придётся немного модифицировать. Наткунлся на очередной трабл. И закралась мысль, почему 1С сама не делает факсимиле в акте сверки. Оказалось, что области макета "Подписи" и "ОбластьФаксимиле" как то очень сложно между собой взаимодействуют. Убил часа три, пытаясь вывести информацию о контрагенте. Плюнул, оставил пустые подписи.

   Ну вот вроде бы и всё. У меня всё получилось.

2

См. также

Специальные предложения

Избранное Подписка Сортировка: Древо
В этой теме еще нет сообщений.
Оставьте свое сообщение