Печать через обработку заполнения табличной части

1. monopolij 28.11.17 00:57 Сейчас в теме
Добрый день.
Стоит задача - через внешнюю обработку к документу системы ERP (последний релиз) создать договор в справочнике, новая ссылка должна проставиться на реквизите формы. После чего должна сформироваться печатная форма по новому элементу.
Делаем через внешнюю обработку ТЧ, получаем такой код:
Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();

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

// Интерфейс для выполнения команд обработки.
Процедура ВыполнитьКоманду(ИмяКоманды, ОбъектыНазначения, ПараметрыВыполнения) Экспорт
    
    ПараметрыРегистрации = СведенияОВнешнейОбработке();
    ПараметрыРегистрации.Команды.Колонки.Идентификатор.Имя = "ИмяКоманды";
    ЭтаКоманда = ПараметрыРегистрации.Команды.Найти(ИмяКоманды, "ИмяКоманды");
    Если ЭтаКоманда = Неопределено Тогда
        ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
            НСтр("ru = 'Команда ""%1"" не поддерживается обработкой ""%2""'"),
            ИмяКоманды,
            Метаданные().Представление()
        );
    КонецЕсли;
    
    Если ИмяКоманды = "СформироватьСчетДоговора" Тогда
        СформироватьСчетДоговора(ОбъектыНазначения, ПараметрыВыполнения, ЭтаКоманда);
    КонецЕсли;
    
    // Имитация длительной операции для клиент-серверного режима.
    Если НЕ ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
        ДатаОкончания = ТекущаяДата() + 4;
        Пока ДатаОкончания > ТекущаяДата() Цикл
            
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры

Процедура СформироватьСчетДоговора(ОбъектыНазначения, ПараметрыВыполнения, ЭтаКоманда)
    
    //УстановитьБезопасныйРежим(ЛОжь);

    Для Каждого ЭлементОбъектНазначения Из ОбъектыНазначения  Цикл
        
        ОбъектНазначения = ЭлементОбъектНазначения.ПолучитьОбъект();
        
        СтрокаСообщ = ПроверкаЗаполнения(ОбъектНазначения);
        
        Если  ЗначениеЗаполнено(СтрокаСообщ) тогда
            
            Сообщить(СтрокаСообщ);
            
            Продолжить;
            
        Конецесли;
        
        НужныйДоговорСсылка = ЗаписьНовогоДоговораКонтрагента(ОбъектНазначения);
        
        Если ЗначениеЗаполнено(НужныйДоговорСсылка) тогда
            
            ОбъектНазначения.Договор = НужныйДоговорСсылка;
            
            ОбъектНазначения.Записать();
            
        КонецЕсли;
        
    КонецЦикла;
    

КонецПроцедуры
Показать


В процедуре ЗаписьНовогоДоговораКонтрагента создается новый элемент и формируется ПФ в виде табличного документа. Вопрос, как вывести данный табличный документ на экран пользователю?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. artkor 286 28.11.17 01:10 Сейчас в теме
Если Вам нужно взаимодействовать с пользователем из обработки - то нужно для обработки создать основную форму, в ней располагается "дежурная" клиентская процедура, которая выполняет команду:

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт

        // создание договора, установка элемента в реквизит формы "ВладелецФормы.Объект.Договор = ..."
        // формирование табличного документа не сервере, показ формы на клиенте
        
    
КонецПроцедуры

Показать
3. monopolij 28.11.17 09:09 Сейчас в теме
(2)а как мне выполнить данную команду не открывая формы?
8. user623969_dusa 28.11.17 13:17 Сейчас в теме
(3) через механизм навигационных ссылок можно открывать формы других объектов
4. monopolij 28.11.17 09:30 Сейчас в теме
напрашивается какая-то модификация процедуры СведенияОВнешнейОбработке() в модуле обработки, с тем, что бы открытия формы не было, но программный код можно было запустить вашу команду ВыполнитьКоманду, что вы написали.
5. artkor 286 28.11.17 10:17 Сейчас в теме
(4) Чтобы вывести макет обязательно нужен вызов клиента, метод "макет.Паказать()" только на клиенте работает, имхо в Вашей задаче без формы обработки никак не обойтись
6. user633533_encantado 12 28.11.17 10:27 Сейчас в теме
Вы собираетесь проставлять реквизит в форму, значит вам нужна открытая форма, а значит нужен клиент. Задача решается стандартными методами.
Создается обработка по заполнению объекта, перед заполнением нужного реквизиты формы формируется объект и печатная форма.
7. monopolij 28.11.17 13:10 Сейчас в теме
(6) можете подсказать с кодом, как это правильнее?
9. dandykry 12 28.11.17 16:32 Сейчас в теме
......................
   Если ИмяКоманды = "СформироватьСчетДоговора" Тогда
      <b>Коллекция = Неопределено;</b>
      СформироватьСчетДоговора(ОбъектыНазначения, ПараметрыВыполнения, ЭтаКоманда, <b>Коллекция </b>);
      Если Коллекция.Количество() >0 Тогда
                     УправлениеПечатьюКлиент.ПечатьДокументов(Коллекция,Неопределено,ЭтаФорма);
       КонецЕсли;


    КонецЕсли;

..............................


Процедура СформироватьСчетДоговора(ОбъектыНазначения, ПараметрыВыполнения, ЭтаКоманда, Коллекция)
    
    //УстановитьБезопасныйРежим(ЛОжь);

    Для Каждого ЭлементОбъектНазначения Из ОбъектыНазначения  Цикл
        
        ОбъектНазначения = ЭлементОбъектНазначения.ПолучитьОбъект();
        
        СтрокаСообщ = ПроверкаЗаполнения(ОбъектНазначения);
        
        Если  ЗначениеЗаполнено(СтрокаСообщ) тогда
            
            Сообщить(СтрокаСообщ);
            
            Продолжить;
            
        Конецесли;
        
        НужныйДоговорСсылка = ЗаписьНовогоДоговораКонтрагента(ОбъектНазначения ,Коллекция);.
Показать


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

///////////////

 Если ЗначениеЗаполнено(НужныйДоговорСсылка) тогда
            
            ОбъектНазначения.Договор = НужныйДоговорСсылка;
            
            ОбъектНазначения.Записать();
            
        КонецЕсли;
        
    КонецЦикла;
    

КонецПроцедуры
Показать
10. user633533_encantado 12 28.11.17 16:37 Сейчас в теме
(9)
ОбъектНазначения
Это ссылка ,а не объект. Даже если это был бы объект, нужный элемент не появится на реквизите формы, с который работает пользователь. Однозначно код не тот, надо плясать от клиента.
11. dandykry 12 28.11.17 16:39 Сейчас в теме
(10) ОбщегоНазначения это общий модуль. Ну и у разработчика так переменная называется, что не хорошо.
13. user633533_encantado 12 28.11.17 16:41 Сейчас в теме
(11) Моя твоя не понимать: при чем тут модуль "ОбщегоНазначения".

Я про ЭТО: "ОбъектНазначения.Договор = НужныйДоговорСсылка;" - однозначно ошибка будет.
12. dandykry 12 28.11.17 16:41 Сейчас в теме
(10) Я ошибся насчет модуля. А он нет. У него это объет, насколько я понимаю.. ОбъектНазначения = ЭлементОбъектНазначения.ПолучитьОбъект();
14. user633533_encantado 12 28.11.17 16:42 Сейчас в теме
(12) Все это не важно, человеку нужно элемент на форме заполнить, а у вас сервер везде.
15. dandykry 12 28.11.17 16:44 Сейчас в теме
(14) Насчет этого я не смотрел, но очевидно, что не совсем правильно. Я показал, как Табличный документ красиво вывести, а именно ответил на вопрос, который ставился, и не лез дальше,
16. user633533_encantado 12 28.11.17 16:51 Сейчас в теме
(15) Тут вообще подход другой должен быть:


ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();

В открытой форме ловить ее владельца, это и будет форма заполняемого документа. Затем на сервере создает договор, заполняем на клиенте реквизит формы.
А затем уже выводим наш новый договор на печать.

Писать код я не буду, я это только за деньги делаю )
17. dandykry 12 28.11.17 16:57 Сейчас в теме
(16) Так то оно верно, но вопрос у человека был другой.

Если автор последует вашему совету, то лучше ему предусмотреть возможность вызова команды из формы списка, потому что владелец будет другой. Отменить ее или поругаться.
18. user633533_encantado 12 28.11.17 17:01 Сейчас в теме
(17) Обработка заполнения объекта в форме списка ?
20. user633533_encantado 12 28.11.17 17:28 Сейчас в теме
(19) Да, но если не предполагается, то просто:
Прикрепленные файлы:
21. dandykry 12 29.11.17 07:55 Сейчас в теме
(20) об этом я и говорил
" Отменить ее или поругаться"
.

По его коду больше похоже, что из списка заполняется. Получается объект, заполняется, записывается....и т д.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот