Имя: Пароль:
1C
1С v8
вызов внешней обработки из справочника
,
0 JuixyJes
 
19.02.21
16:39
Доброго дня, снова врываюсь в мисту с тупыми вопросами. Могу ли я вызвать внешнюю обработку из справоника?
1 zak555
 
19.02.21
16:40
Привет.
да, можно
2 dka80
 
19.02.21
16:41
справа красная буква Я
3 Garykom
 
гуру
19.02.21
16:43
(1) не всегда
4 JuixyJes
 
19.02.21
16:55
В общем и целом, может я что-то не так делаю. Но у меня сделана печатная форма, макетом которой является word документ (active document). и заполнение в модуле обработки. Могу ли я такую печатную форму использовать как внешнюю печатную форму? Если да, то как???
5 JuixyJes
 
19.02.21
18:06
Вобщем сделать я сделала, но проблема возникла, ч не понимаю почему это так выглядит.... https://prnt.sc/100z54p
6 JuixyJes
 
19.02.21
18:06
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, МассивОбъектов) Экспорт //Здесь МассивОбъектов и есть ссылка или ссылки на документ или справочник, в который добавлена обработка  
    Для Каждого Элемент Из МассивОбъектов Цикл
        СобратьМакет(Элемент);
    КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ПолучитьДанные()
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ВидыЗанятостиСотрудников.ВидЗанятости КАК ВидЗанятости,
    |    ДокументыФизическихЛицСрезПоследних.Представление КАК ПаспортныеДанные,
    |    ПриемНаРаботу.Сотрудник КАК Сотрудник,
    |    ПриемНаРаботу.Должность КАК Должность,
    |    ПриемНаРаботу.ТрудовойДоговорНомер КАК ТрудовойДоговорНомер,
    |    ПриемНаРаботу.ТрудовойДоговорДата КАК ТрудовойДоговорДата,
    |    ПриемНаРаботу.Сотрудник.ФизическоеЛицо.ДатаРождения КАК СотрудникФизическоеЛицоДатаРождения,
    |    ПриемНаРаботу.Сотрудник.ФизическоеЛицо.ИНН КАК СотрудникФизическоеЛицоИНН,
    |    ПриемНаРаботу.Сотрудник.ФизическоеЛицо.Фамилия КАК СотрудникФизическоеЛицоФамилия,
    |    ПриемНаРаботу.Сотрудник.ФизическоеЛицо.Инициалы КАК СотрудникФизическоеЛицоИнициалы,
    |    ПриемНаРаботу.Сотрудник.ФизическоеЛицо.СтраховойНомерПФР КАК СотрудникФизическоеЛицоСтраховойНомерПФР,
    |    ВложенныйЗапрос.КонтактнаяИнформация КАК КонтактнаяИнформация,
    |    ВложенныйЗапрос.Вид КАК Вид,
    |    ПриемНаРаботу.ДолжностьПоШтатномуРасписанию.ОкладТариф КАК Оклад
    |ИЗ
    |    Документ.ПриемНаРаботу КАК ПриемНаРаботу
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ВидыЗанятостиСотрудников КАК ВидыЗанятостиСотрудников
    |        ПО (ВидыЗанятостиСотрудников.Сотрудник = ПриемНаРаботу.Сотрудник)
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДокументыФизическихЛиц.СрезПоследних КАК ДокументыФизическихЛицСрезПоследних
    |        ПО ПриемНаРаботу.Сотрудник.ФизическоеЛицо = ДокументыФизическихЛицСрезПоследних.Физлицо
    |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |            ВидыКонтактнойИнформации.Ссылка КАК Вид,
    |            ФизическиеЛицаКонтактнаяИнформация.Представление КАК КонтактнаяИнформация,
    |            ФизическиеЛицаКонтактнаяИнформация.ЗначенияПолей КАК ЗначенияПолей,
    |            ФизическиеЛицаКонтактнаяИнформация.Ссылка КАК ФизическоеЛицо
    |        ИЗ
    |            Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
    |                ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.КонтактнаяИнформация КАК ФизическиеЛицаКонтактнаяИнформация
    |                ПО (ФизическиеЛицаКонтактнаяИнформация.Вид = ВидыКонтактнойИнформации.Ссылка)
    |                    И (ВидыКонтактнойИнформации.Родитель = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.СправочникФизическиеЛица))) КАК ВложенныйЗапрос
    |        ПО ПриемНаРаботу.ФизическоеЛицо = ВложенныйЗапрос.ФизическоеЛицо
    |ГДЕ
    |    ПриемНаРаботу.Сотрудник = &Сотрудник";
    
    Запрос.УстановитьПараметр("Сотрудник", Объект.СсылкаНаОбъект);
    
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    
    Возврат РезультатЗапроса
КонецФункции // ПолучитьДанные()

Функция ПолучитьЗначениеСправочника()
    
    Возврат Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица;
    
КонецФункции // ПолучитьЗначениеСправочника()

Функция ПолучитьЗначениеПеречисления()
    
    Возврат Перечисления.ВидыЗанятости.ОсновноеМестоРаботы;
    
КонецФункции // ПолучитьЗначениеСправочника()


&НаКлиенте
Процедура СобратьМакет(СсылкаНаОбъект)
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("doc");
    Адрес = ФормированиеДоговораПоШаблону();//положить макет во временное хранилище на сервере и получить адрес на клиент
    Если Адрес = Неопределено Тогда
        Возврат;
    КонецЕсли;
    Макет = ПолучитьИзВременногоХранилища(Адрес); //получить макет из временного хранилища
    Макет.Записать(ИмяВременногоФайла);//создать документ на основе макета в TEMP клиента
        Word = Новый COMОбъект("Word.Application");//создаем COMОбъект
        Word.Visible = 1;
        Документ = Word.Documents.Open(ИмяВременногоФайла);//подключаем макет к созданному COMОбъект
    //открываем и активируем документ
    СсылкаМакет = Word.Application.Documents(1);
        
    РезультатЗапроса = ПолучитьДанные();
    
    Для каждого Параметр Из  СсылкаМакет.Fields Цикл
        ПолноеИмяПоля = Параметр.Code.Text;
        Если (Найти(ПолноеИмяПоля, " MERGEFIELD") = 1) Тогда
            ПозицияСлеша = Найти(ПолноеИмяПоля, "\*");
            КороткоеИмяПоля = СокрЛП(Сред(ПолноеИмяПоля, 12, ПозицияСлеша - 12));
            
            ЗначениеПоля = "";        
            
            Если КороткоеИмяПоля = "НомерДоговора" Тогда
                ЗначениеПоля = РезультатЗапроса[0].ТрудовойДоговорНомер;
            ИначеЕсли КороткоеИмяПоля = "ДатаДоговора" Тогда
                ЗначениеПоля = Формат(РезультатЗапроса[0].ТрудовойДоговорДата, "ДФ='dd MMMM yyyy'") + " года";
            ИначеЕсли КороткоеИмяПоля = "Организация" Тогда
                ЗначениеПоля = РезультатЗапроса[0].Сотрудник.ГоловнаяОрганизация.НаименованиеПолное;
            ИначеЕсли КороткоеИмяПоля = "ОрганизацияСокр" Тогда
                ЗначениеПоля = РезультатЗапроса[0].Сотрудник.ГоловнаяОрганизация.НаименованиеСокращенное;
            ИначеЕсли КороткоеИмяПоля = "Работник" Тогда
                Для каждого Строка Из РезультатЗапроса Цикл
                    
                    Если Строка.Вид = ПолучитьЗначениеСправочника() Тогда
                        ЗначениеПоля = Строка(РезультатЗапроса[0].Сотрудник) + " " + Строка(РезультатЗапроса[0].ПаспортныеДанные) + " зарегистрирован: " + Строка(Строка.КонтактнаяИнформация);
                        Прервать;
                    КонецЕсли;
                    
                КонецЦикла;
                
            ИначеЕсли КороткоеИмяПоля = "Должность" Тогда
                ЗначениеПоля =  РезультатЗапроса[0].Должность.Наименование;                     
            ИначеЕсли КороткоеИмяПоля = "МестоРаботы" Тогда
                ЗначениеПоля = "ЗАПОЛНИТЬ ВРУЧНУЮ";                     
            ИначеЕсли КороткоеИмяПоля = "ПостРабота" Тогда
                Для каждого Строка Из РезультатЗапроса Цикл
                    
                    Если Строка.ВидЗанятости = ПолучитьЗначениеПеречисления() Тогда
                        ЗначениеПоля = "основной";
                        Прервать;
                    КонецЕсли;
                    
                КонецЦикла;
                
            ИначеЕсли КороткоеИмяПоля = "Оклад" Тогда
                ЗначениеПоля = РезультатЗапроса[0].Оклад;
            ИначеЕсли КороткоеИмяПоля = "ОкладСтрокой" Тогда
                ПараметрыПредметаИсчисления = " , , , , , , , , 0";
                ЗначениеПоля = ЧислоПрописью(РезультатЗапроса[0].Оклад,,ПараметрыПредметаИсчисления);
            ИначеЕсли КороткоеИмяПоля = "ОкладЧислоПослеЗапятой" Тогда
                ЗначениеПоля = "00";
            ИначеЕсли КороткоеИмяПоля = "ФИОРаботника" Тогда
                ЗначениеПоля =  Строка(РезультатЗапроса[0].Сотрудник);                     
            ИначеЕсли КороткоеИмяПоля = "ДатаРождения" Тогда
                ЗначениеПоля = Формат(РезультатЗапроса[0].СотрудникФизическоеЛицоДатаРождения, "ДФ=dd.MM.yyyy") + " г.р.";                     
            ИначеЕсли КороткоеИмяПоля = "ПаспортныеДанные" Тогда
                ЗначениеПоля = Строка(РезультатЗапроса[0].ПаспортныеДанные);                     
            ИначеЕсли КороткоеИмяПоля = "АдресРегистрации" Тогда
                Для каждого Строка Из РезультатЗапроса Цикл
                    
                    Если Строка.Вид = ПолучитьЗначениеСправочника() Тогда
                        ЗначениеПоля = Строка(Строка.КонтактнаяИнформация);
                        Прервать;
                    КонецЕсли;
                    
                КонецЦикла;                   
            ИначеЕсли КороткоеИмяПоля = "ИННРаботника" Тогда
                ЗначениеПоля = Строка(РезультатЗапроса[0].СотрудникФизическоеЛицоИНН);  
            ИначеЕсли КороткоеИмяПоля = "СНИЛСРаботника" Тогда
                ЗначениеПоля = Строка(РезультатЗапроса[0].СотрудникФизическоеЛицоСтраховойНомерПФР);                        
            ИначеЕсли КороткоеИмяПоля = "ИнициалыРаботника" Тогда
                ЗначениеПоля = Строка(РезультатЗапроса[0].СотрудникФизическоеЛицоФамилия) + " " + Строка(РезультатЗапроса[0].СотрудникФизическоеЛицоИнициалы);                        
            КонецЕсли;
            
            Если ЗначениеПоля <> "" Тогда
                Параметр.Select();
                СсылкаМакет.Application.Selection.TypeText(ЗначениеПоля);
            КонецЕсли;            
        КонецЕсли;
        
    КонецЦикла;    
    //включаем видимость приложения
    СсылкаМакет.Activate();
    СсылкаМакет.Application.Visible = Истина;
    
    
КонецПроцедуры

&НаСервере
Функция ФормированиеДоговораПоШаблону()
    
    ИмяМакета = "Макет";
    АктивныйДокумент = ПолучитьМакетСервер(ИмяМакета);
    
    УИД = Новый УникальныйИдентификатор();
    Адрес = ПоместитьВоВременноеХранилище(АктивныйДокумент, УИД);
    
    Возврат Адрес;
    
    
КонецФункции

&НаСервере
Функция ПолучитьМакетСервер(ИмяМакета)
    
    Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет(ИмяМакета);
    Возврат Макет;
    
КонецФункции // ПолучитьМакетСервер(ИмяМакета)()
7 JuixyJes
 
19.02.21
18:06
Вот код, что лежит в форме и заполняет вроде из макета
8 Мимохожий Однако
 
19.02.21
18:24
Что показывает отладчик при заполнении макета?
9 JuixyJes
 
20.02.21
09:04
(8)  Ничего... Почему-то при наведении мышки во время отладки пишет, что это СОМОбъект, но как только я пытаюсь его в табло занести все исчезает
10 JuixyJes
 
20.02.21
09:16
Так, поняла, ком объекты долго прогружаются, но есть все равно проблема, шаблон то нормальный, но почему то он не видит его так как должен и выводит срань из (5)
11 dka80
 
20.02.21
09:17
Документ = Word.Documents.Open(ИмяВременногоФайла)
СсылкаМакет = Word.Application.Documents(1);
СсылкаМакет.Activate();
    СсылкаМакет.Application.Visible = Истина;

Вот так выводит твой макет в правильном виде?
12 JuixyJes
 
20.02.21
09:55
(11) нет, макет не правильно грузит
13 JuixyJes
 
20.02.21
10:10
Это вроде бы и видно. Но не ясно почему так
Независимо от того, куда вы едете — это в гору и против ветра!