8.х ЗУП Внешние печатные формы ЗУП 3.1 клиент - серверный вариант

Тема в разделе ""1С:Зарплата и управление персоналом ЗУП"", создана пользователем Виктор13245234, 13 сен 2016.

  1. TopicStarter Overlay
    Виктор13245234
    Offline

    Виктор13245234 Опытный в 1С

    Регистрация:
    17 мар 2015
    Сообщения:
    179
    Симпатии:
    3
    Баллы:
    29
    Всем здраствуйте! Работаю в ЗУП 3.1 последнего релиза. Недавно перешли с файлового варианта на клиент - сервер. Имеются печатные формы внешние в Word. Их пришлось переделать, так как заполнение происходит на клиенте. По команде на форме все заполняется корректно. Вопрос: Как реализовать внешнюю печатную форму на клиент - серверном варианте? Насколько я знаю, печать внешней печатной формы выполняется по наличию процедуры печать в модуле обработки и в нее передаются данные из серверной процедуры, но сейчас мы заполняем на клиенте. Или как по - другому можно встроить печатную форму? Заранее спасибо!
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Решение одно:
    • либо формировать сам документ Word на клиенте, тогда Word должен быть установлен на каждой клиентской машине.
    • либо формировать сам документ Word на сервере, тогда Word должен быть установлен на сервере и правильно настроен DCOM.
  3. TopicStarter Overlay
    Виктор13245234
    Offline

    Виктор13245234 Опытный в 1С

    Регистрация:
    17 мар 2015
    Сообщения:
    179
    Симпатии:
    3
    Баллы:
    29
    • "либо формировать сам документ Word на клиенте, тогда Word должен быть установлен на каждом клиентской машине." так и реализовано. ПО кнопке на форме печать происходит. ПРоблема в том, как сделать печатную форму внешнюю в клиент - сервере?
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Разобраться с тем, какие процедуры и функции должны работать на стороне сервера, какие - на стороне клиента. Быть может придется немного переделать код.

    В основном все тоже самое, что и в файловом варианте.
    Если есть какие-то конкретные ошибки и вы не знаете как их устранить, то озвучивайте - поможем.
  5. TopicStarter Overlay
    Виктор13245234
    Offline

    Виктор13245234 Опытный в 1С

    Регистрация:
    17 мар 2015
    Сообщения:
    179
    Симпатии:
    3
    Баллы:
    29
    Суть в чем: Внешняя обработка работала по следующему принципу: в модуле обработки была процедура печать, в нее передавалась процедура, которая заполняла вордовский документ. КОгда перешли на клиент - сервер, внешняя обработка перестала работать, так как макет Active document нужно заполнять на клиенте. А процедура Печать находится в модуле обработки. Насколько я знаю, с клиента на сервер мы не можем передать данные. ВОт и не знаю что делать. Вот весь код заполнения:
    Код:
    &НаСервере
    Функция ПолучитьШаблонМакетаАдрес()
    Этот = РеквизитФормыВЗначение("Объект");
    Макет = Этот.ПолучитьМакет("Договор");
    Адрес = ПоместитьВоВременноеХранилище(Макет);
    Возврат Адрес;
    КонецФункции
    &НаСервере
    Функция ПолучитьТЗСДанными()
        Запрос = Новый Запрос;
       
        // Установим параметры запроса
        Запрос.УстановитьПараметр("СправочникСсылка", Объект.СсылкаНаОбъект);
        Запрос.УстановитьПараметр("Оклад", Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("Тарифная ставка (часовая)"));
        Запрос.УстановитьПараметр("Вид",Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица);
        Запрос.Текст = "ВЫБРАТЬ
                       |    ПРЕДСТАВЛЕНИЕ(Сотрудники.Ссылка) КАК СОТРУДНИК,
                       |    ПРЕДСТАВЛЕНИЕ(Сотрудники.ФизическоеЛицо.ДатаРождения) КАК ДатаРождения,
                       |    ПРЕДСТАВЛЕНИЕ(Сотрудники.ФизическоеЛицо.ИНН) КАК ИНН,
                       |    ПРЕДСТАВЛЕНИЕ(Сотрудники.ФизическоеЛицо.СтраховойНомерПФР) КАК ПФР,
                       |    ПРЕДСТАВЛЕНИЕ(Сотрудники.ФизическоеЛицо.МестоРождения) КАК МестоРождения,
                       |    ПРЕДСТАВЛЕНИЕ(ПриемНаРаботу.ТрудовойДоговорНомер) КАК НомерДок,
                       |    ПРЕДСТАВЛЕНИЕ(ПриемНаРаботу.ТрудовойДоговорДата) КАК ДатаДок,
                       |    ПРЕДСТАВЛЕНИЕ(ПриемНаРаботу.Должность) КАК Должность,
                       |    ПРЕДСТАВЛЕНИЕ(ПриемНаРаботу.Подразделение.Ссылка) КАК Подразделение,
                       |    ПРЕДСТАВЛЕНИЕ(ДокументыФизическихЛиц.Физлицо) КАК ФИзЛицо,
                       |    ПРЕДСТАВЛЕНИЕ(ДокументыФизическихЛиц.Серия) КАК Серия,
                       |    ПРЕДСТАВЛЕНИЕ(ДокументыФизическихЛиц.Номер) КАК Номер,
                       |    ПРЕДСТАВЛЕНИЕ(ДокументыФизическихЛиц.ДатаВыдачи) КАК ДатаВыдачи,
                       |    ПРЕДСТАВЛЕНИЕ(ДокументыФизическихЛиц.СрокДействия) КАК СрокДействия,
                       |    ПРЕДСТАВЛЕНИЕ(ДокументыФизическихЛиц.КемВыдан) КАК КемВыдан,
                       |    ПРЕДСТАВЛЕНИЕ(ДокументыФизическихЛиц.КодПодразделения) КАК КодПОдразделения,
                       |    ПРЕДСТАВЛЕНИЕ(ПриемНаРаботу.Ссылка) КАК Ссылка,
                       |    ПРЕДСТАВЛЕНИЕ(ФизическиеЛицаКонтактнаяИнформация.Представление) КАК Адрес,
                       |    ПРЕДСТАВЛЕНИЕ(ТекущаяТарифнаяСтавкаСотрудников.ТекущаяТарифнаяСтавка) КАК ЗначениеТарифа
                       |ИЗ
                       |    РегистрСведений.ДокументыФизическихЛиц КАК ДокументыФизическихЛиц
                       |        ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
                       |            ПОЛНОЕ СОЕДИНЕНИЕ Документ.ПриемНаРаботу КАК ПриемНаРаботу
                       |            ПО (ПриемНаРаботу.Сотрудник = Сотрудники.Ссылка)
                       |            ПОЛНОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.КонтактнаяИнформация КАК ФизическиеЛицаКонтактнаяИнформация
                       |            ПО Сотрудники.ФизическоеЛицо = ФизическиеЛицаКонтактнаяИнформация.Ссылка
                       |            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТекущаяТарифнаяСтавкаСотрудников КАК ТекущаяТарифнаяСтавкаСотрудников
                       |            ПО Сотрудники.Ссылка = ТекущаяТарифнаяСтавкаСотрудников.Сотрудник.Ссылка
                       |        ПО ДокументыФизическихЛиц.Физлицо = Сотрудники.ФизическоеЛицо
                       |ГДЕ
                       |    Сотрудники.Ссылка = &СправочникСсылка
                       |    И ФизическиеЛицаКонтактнаяИнформация.Вид = &Вид";
    
       
           
        Выборка =  Запрос.Выполнить().Выбрать();
       
        Если Выборка.Следующий() Тогда
        NomDog = Выборка.НомерДок;
        //П = Найти(Выборка.ДатаДок," ");
        а = Выборка.ДатаДок;
        Если НЕ а = "01.01.0001 0:00:00" ТОГДА
        Дата = Дата(Сред(а,7,4)+Сред(а,4,2)+Сред(а,1,2)+"000000");
        День = Формат(Дата, "ДФ=«дд»");
        Месяц = Формат(Дата, "ДФ=МММM");
        Год = Формат(Дата, "ДФ=гггг");
        Если Месяц = "Март" ИЛИ Месяц = "Август" Тогда
            МесяцРП = НРег(Месяц+"а");
        КонецЕсли;
            ь = Найти(Месяц,"ь");
            Если ь>0 Тогда
            МесяцРП =Нрег( Лев(Месяц,ь-1)+"я");
        КонецЕсли;
        Если ь = 0 И Месяц = "Май" тогда
            МесяцРП =Нрег( Лев(Месяц,2)+"я");
            КонецЕсли;   
        DataDog = День+" "+Месяцрп+" "+Год+" г.";
    КонецЕсли;
    //КонецЕсли;
        //DataDog = Формат(DataDog, "ДЛФ=ДД");
        Sotr = Выборка.Сотрудник;;
        Пробел = Найти(Sotr, " ");
        Sotr1 = Лев(Sotr,Пробел);
        Doljn = Выборка.Должность;
        Podr = Выборка.Подразделение;
        Oklad =Выборка.ЗначениеТарифа+" /" + ЧислоПрописью(Выборка.ЗначениеТарифа,,"рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2")+"/";
        //Oklad = Выборка.ЗначениеТарифа;
        PercentNorth = "50";
        DMBorn = Лев(Выборка.ДатаРождения,10) +" г,"+" "+Прав(Выборка.МестоРождения,СтрДлина(Выборка.МестоРождения)-2);
        Дата = Лев(Выборка.ДатаВыдачи,10);
        Pasp =" "+Выборка.Серия+ " "+ Выборка.Номер+" "+Дата+ " "+Выборка.КемВыдан;
        Строка = Выборка.Адрес;
        Adress = Выборка.Адрес;
        NomPFR = Выборка.ПФР;
        INN = Выборка.ИНН;
        //Sotr2 =  Выборка.Сотрудник;
        СтрЗам = СтрЗаменить(Выборка.Сотрудник," ",Символы.ПС);
        Фамилия = СтрПолучитьСтроку(СтрЗАм,1);
        Имя = СтрПолучитьСтроку(СтрЗам,2);
        Отчество = СтрПолучитьСтроку(СтрЗам,3);
        ИнициалИмя = Лев(Имя,1);
        ИнициалОтчество = Лев(Отчество,1);
        Sotr4 = Фамилия+" "+ИнициалИмя+"."+ИнициалОтчество+".";
        Sotr2 = Фамилия+" "+ИнициалИмя+"."+ИнициалОтчество+".";       
    КонецЕсли;
    МассивЗначений = Новый Структура;
    МассивЗначений.Вставить("NomDog",NomDog);
    МассивЗначений.Вставить("DataDog",DataDog);
    МассивЗначений.Вставить("Sotr",Sotr);
    МассивЗначений.Вставить("Sotr2",Sotr2);
    МассивЗначений.Вставить("Sotr4",Sotr4);
    МассивЗначений.Вставить("Doljn",Doljn);
    МассивЗначений.Вставить("Podr",Podr);
    МассивЗначений.Вставить("Oklad",Oklad);
    МассивЗначений.Вставить("Doljn",Doljn);
    МассивЗначений.Вставить("PercentNorth",PercentNorth);
    МассивЗначений.Вставить("DMBorn",DMBorn);
    МассивЗначений.Вставить("Pasp",Pasp);
    МассивЗначений.Вставить("Adress",Adress);
    МассивЗначений.Вставить("NomPFR",NomPFR);
    МассивЗначений.Вставить("INN",INN);
    МассивЗначений.Вставить("NomDog",NomDog);
    Возврат МассивЗначений;   
        КонецФункции
    
    
    &НаКлиенте
    Процедура Печать(Команда)
        ТЗ= ПолучитьТЗСДанными();
        Адрес = ПолучитьШаблонМакетаАдрес();
    Шаблон = ПолучитьИзВременногоХранилища(Адрес);
    ИмяВременногоФайлаDoc = ПолучитьИмяВременногоФайла("Doc"); // например был помещен XML
    Шаблон.Записать(ИмяВременногоФайлаDoc);
    Попытка
    MSWord = Шаблон.Получить();
            Документ=MSWord.Application.Documents(1);
            Документ.Activate();
            Замена = Документ.Content.Find;
            Замена.Execute("NomDog", , , , , , , , ,ТЗ.NomDog);
            Замена = Документ.Content.Find;
            Замена.Execute("DataDog", , , , , , , , ,ТЗ.DataDog);
            Замена = Документ.Content.Find;
            Замена.Execute("Sotr", , , , , , , , ,ТЗ.Sotr);
            Замена = Документ.Content.Find;
            Замена.Execute("Sotr1", , , , , , , , ,ТЗ.Sotr);
            Замена = Документ.Content.Find;
            Замена.Execute("Sotr2", , , , , , , , ,ТЗ.Sotr2);
            Замена = Документ.Content.Find;
            Замена.Execute("Sotr3", , , , , , , , ,ТЗ.Sotr);
            Замена = Документ.Content.Find;
            Замена.Execute("Sotr4", , , , , , , , ,ТЗ.Sotr4);
            Замена = Документ.Content.Find;
            Замена.Execute("Doljn", , , , , , , , ,ТЗ.Doljn);
            Замена = Документ.Content.Find;
            Замена.Execute("Podr", , , , , , , , ,ТЗ.Podr);
            Замена = Документ.Content.Find;
            Замена.Execute("Oklad", , , , , , , , ,ТЗ.Oklad);
            Замена = Документ.Content.Find;
            Замена.Execute("PercentNorth", , , , , , , , ,ТЗ.PercentNorth);
            Замена = Документ.Content.Find;
            Замена.Execute("DMBorn", , , , , , , , ,ТЗ.DMBorn);
            Замена = Документ.Content.Find;
            Замена.Execute("Pasp", , , , , , , , ,ТЗ.Pasp);
            Замена = Документ.Content.Find;
            Замена.Execute("Adress", , , , , , , , ,ТЗ.Adress);
            Замена = Документ.Content.Find;
            Замена.Execute("NomPFR", , , , , , , , ,ТЗ.NomPFR);
            Замена = Документ.Content.Find;
            Замена.Execute("INN", , , , , , , , ,ТЗ.INN);
            Замена = Документ.Content.Find;
            Замена.Execute("NomDog1", , , , , , , , ,ТЗ.NomDog);
            Замена = Документ.Content.Find;
            Замена.Execute("DataDog1", , , , , , , , ,ТЗ.DataDog);
            Замена = Документ.Content.Find;
            Замена.Execute("DataDog2", , , , , , , , ,ТЗ.DataDog);
            MSWord.Application.Visible=Истина;
            MsWord.Activate();
            Исключение
            Сообщить(ОписаниеОшибки());
            MSWord.Application.Quit();
        КонецПопытки;
       
    КонецПроцедуры
    
    
  6. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Вот как раз с клиента можно вызвать серверную процедуру/функцию, но наоборот, с сервера дернуть клиента не получится.
  7. TopicStarter Overlay
    Виктор13245234
    Offline

    Виктор13245234 Опытный в 1С

    Регистрация:
    17 мар 2015
    Сообщения:
    179
    Симпатии:
    3
    Баллы:
    29
    Ну да, ошибся. с сервера нельзя дернуть клиента. И как быть?
  8. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Механизм создания внешних печатных форм описан в документации к БСП(Библиотека стандартных подсистем).
    Судя по коду, вам необходимо перетащить все процедуры в модуль формы, расставив правильно контектс выполнения, добавить реквизит формы типа ТаблицаЗначений и создать в нем реквизиты.

    В эту ТЗ загружать данные запроса и уже по этой ТЗ заполнять документ WORD.

    Модуль обработки использовать можно, но только в том случае, если печатная форма может быть использована в регламентном задании, например. Если такой необходимости нет, то делайте все в форме обработки печатной формы.
    Последнее редактирование: 13 сен 2016
  9. TopicStarter Overlay
    Виктор13245234
    Offline

    Виктор13245234 Опытный в 1С

    Регистрация:
    17 мар 2015
    Сообщения:
    179
    Симпатии:
    3
    Баллы:
    29
    "В эту ТЗ загружать данные запроса и уже по этой ТЗ заполнять документ WORD" в WORD в клиент - серверном варианте происходит НА КЛИЕНТЕ. ВОт в чем тема
  10. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Да я понимаю, что на клиенте, я пока не понимаю, в чем именно сложности.
  11. TopicStarter Overlay
    Виктор13245234
    Offline

    Виктор13245234 Опытный в 1С

    Регистрация:
    17 мар 2015
    Сообщения:
    179
    Симпатии:
    3
    Баллы:
    29
    воспользовался вот этим способом. http://infostart.ru/public/98261// Все красиво заполняется, только шрифт меняется в документе после заполнения параметров(хотя в макете шрифт нормальный). Макет - двоичные данные. Никто не сталкивался с таким?
  12. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Это и есть вордовский шаблон. Можете загрузить туда свой, но код придется переписывать.
  13. TopicStarter Overlay
    Виктор13245234
    Offline

    Виктор13245234 Опытный в 1С

    Регистрация:
    17 мар 2015
    Сообщения:
    179
    Симпатии:
    3
    Баллы:
    29
    До этого я реализовывал через макет Active document, а тут через Двоичные данные. Так и сделал, шрифт меняется только. Скидываю результат обработки и макет

    Вложения:

Поделиться этой страницей