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

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

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

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

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

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

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

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

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

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

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

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

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

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

ФормированиеПечатныхФорм.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, МассивОбъектов, КоллекцияПечатныхФорм);

КонецПроцедуры

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

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

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

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

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

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

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

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

Процедура ВывестиФаксимилеВТабличныйДокумент(Макет, ОбластьМакета, Организация, ПараметрыПечати = Неопределено) Экспорт

ОтображатьФаксимиле = Ложь;
Если ПараметрыПечати <> Неопределено И ПараметрыПечати.Свойство("ОтображатьФаксимиле") Тогда
ОтображатьФаксимиле = ПараметрыПечати.ОтображатьФаксимиле;
КонецЕсли;

Если НЕ ОтображатьФаксимиле Тогда
Возврат
КонецЕсли;

ФайлКартинки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Организация, "ФайлФаксимильнаяПечать");

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

Если Не ОбщегоНазначенияУТКлиентСервер.ЕстьРеквизитОбъекта(ОбластьМакета.Рисунки, "Факсимиле") Тогда
// Картинки Факсимиле в этой области макета нет.

Если Макет.Области.Найти("ОбластьФаксимиле") <> Неопределено Тогда

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

ОбластьМакета = ОбластьМакетаФаксимиле;
Иначе
Возврат;
КонецЕсли;
Иначе
Возврат;
КонецЕсли;

КонецЕсли;

Если Не ЗначениеЗаполнено(ФайлКартинки) Тогда
ОбластьМакета.Рисунки.Удалить(ОбластьМакета.Рисунки.Факсимиле);
Возврат;
КонецЕсли;

ДвоичныеДанныеФайла = РаботаСФайлами.ДвоичныеДанныеФайла(ФайлКартинки);

Если ТипЗнч(ДвоичныеДанныеФайла) = Тип("Картинка") Тогда
Картинка = ДвоичныеДанныеФайла;
ИначеЕсли ТипЗнч(ДвоичныеДанныеФайла) = Тип("ДвоичныеДанные") Тогда
Картинка = Новый Картинка(ДвоичныеДанныеФайла);
Иначе
Картинка = Новый Картинка;
КонецЕсли;

ОбластьМакета.Рисунки.Факсимиле.Картинка = Картинка;

КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

  // ПОДПИСИ

ОбластьМакета = Макет.ПолучитьОбласть("Подписи");


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

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

// ПРИЛОЖЕНИЕ
Если ДанныеДокумента.РасшифровкаПоЗаказам Тогда

ТаблицаОстатков = ОстаткиРасчетов(ДанныеДокумента);

Если ТаблицаОстатков <> Неопределено Тогда

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

ТекстЗаголовкаПриложения = ОбщегоНазначенияУТКлиентСервер.СформироватьЗаголовокДокумента(ДанныеДокумента,
НСтр("ru='к акту сверки взаимных расчетов'"));

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

МассивВалют = ОбщегоНазначенияУТ.УдалитьПовторяющиесяЭлементыМассива(ТаблицаОстатков.ВыгрузитьКолонку("ВалютаВзаиморасчетов"));
Если ДанныеДокумента.РасшифровкаПоПартнерам Тогда
МассивПартнеров = ОбщегоНазначенияУТ.УдалитьПовторяющиесяЭлементыМассива(ТаблицаОстатков.ВыгрузитьКолонку("Партнер"));
КонецЕсли;

ПараметрыТаблицыЗадолженностей = Новый Структура;
ПараметрыТаблицыЗадолженностей.Вставить("ДанныеДокумента", ДанныеДокумента);
ПараметрыТаблицыЗадолженностей.Вставить("ТаблицаОстатков", ТаблицаОстатков);
ПараметрыТаблицыЗадолженностей.Вставить("СтруктураПредставленийУчастников", СтруктураПредставленийУчастников);
ПараметрыТаблицыЗадолженностей.Вставить("МассивВалют", МассивВалют);
ПараметрыТаблицыЗадолженностей.Вставить("Макет", Макет);
ПараметрыТаблицыЗадолженностей.Вставить("ВыводитьПодвал", Ложь);

Если ДанныеДокумента.РасшифровкаПоПартнерам Тогда
Для Каждого Партнер Из МассивПартнеров Цикл
ТабличныйДокумент.Вывести(ВывестиТаблицуЗадолженности(ПараметрыТаблицыЗадолженностей, Партнер));
КонецЦикла;
Иначе
ТабличныйДокумент.Вывести(ВывестиТаблицуЗадолженности(ПараметрыТаблицыЗадолженностей));
КонецЕсли;

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

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

КонецЕсли;

КонецЕсли;

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

КонецЦикла;

ТабличныйДокумент.АвтоМасштаб = Истина;

Если ПривилегированныйРежим() Тогда
УстановитьПривилегированныйРежим(Ложь);
КонецЕсли;

Возврат ТабличныйДокумент;

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

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

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

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *