Имя: Пароль:
1C
 
Создание внешней печатной формы в WORD (УФ)
,
0 LeoKeyn
 
19.12.17
17:00
Здравствуйте. Печатную форму и заполнение ее вроде создал и все вроде как работает как надо, но вот только как ее добавить на форму в конфу. Почитал, что то наваял, на всякий случай дам полный код и ошибку:

Функция СведенияОВнешнейОбработке()

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


КонецФункции // СведенияОВнешнейОбработке()

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

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

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

Функция ВывестиПечать() Экспорт
    
    ФизЛицо = СсылкаНаОбъект.ФизическоеЛицо;
    Для каждого Строка из ФизЛицо.КонтактнаяИнформация Цикл
        
        Если Строка.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес И Строка.Вид = Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица Тогда
            АдресПрописки = Строка.Представление;
        ИначеЕсли Строка.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес И Строка.Вид = Справочники.ВидыКонтактнойИнформации.АдресМестаПроживанияФизическиеЛица Тогда
            АдресПроживания = Строка.Представление;    
        КонецЕсли;
            
    КонецЦикла;
    Документ = РегистрыСведений.ДокументыФизическихЛиц.СоздатьНаборЗаписей();
    Документ.Отбор.ФизЛицо.Значение = Справочники.ФизическиеЛица.НайтиПоНаименованию(ФизЛицо);
    Документ.Отбор.ФизЛицо.Использование = Истина;
    Документ.Прочитать();
    Если НЕ Документ.Количество() = 0 Тогда
    ВидДокумента = Документ[0].ВидДокумента.Наименование;
    СерияДокумента = Документ[0].Серия;
    НомерДокумента = Документ[0].Номер;
    
    КемДатаВыдачи = Документ[0].КемВыдан + " от " + Формат(Документ[0].ДатаВыдачи,"ДФ='дд ММММ гггг'");
    КонецЕсли;
    ДокументНачисление = СсылкаНаОбъект.Начисления[0].Начисление;
            ВидРасчета = ДокументНачисление.КраткоеНаименование;
            ПериодРасчета = ДокументНачисление.ПериодРасчетаБазовыхНачислений;
    
    
    Если СсылкаНаОбъект.ГрафикРаботы = Справочники.ГрафикиРаботыСотрудников.НайтиПоНаименованию("Пятидневка 40") Тогда
        РежимРаботы = "продолжительностью 8 часов в день с понедельника по пятницу (с 9-00 до 18-00) с перерывом один час на обед (с 13-00 до 14-00), при пятидневной рабочей неделе с двумя выходными днями (суббота, воскресенье)";
    ИначеЕсли СсылкаНаОбъект.ГрафикРаботы = Справочники.ГрафикиРаботыСотрудников.НайтиПоНаименованию("Шестидневка") Тогда
        РежимРаботы = "продолжительностью 7 часов в день с понедельника по пятницу (с 9-00 до 17-00) и 5 часов в день в субботу (с 9-00 до 15-00) с перерывом один час на обед (с 13-00 до 14-00), при шестидневной рабочей неделе с одним выходным днем (воскресенье)";
    ИначеЕсли Найти(СсылкаНаОбъект.ГрафикиРаботыСотрудников.Наименование, "вахта") <> 0    Тогда
    Иначе РежимРаботы = "__________________НЕОБХОДИМО ЗАПОЛНИТЬ________________________";    
    КонецЕсли;
    
    Гражданство = РегистрыСведений.ГражданствоФизическихЛиц.СоздатьНаборЗаписей();
    Гражданство.Отбор.ФизическоеЛицо.Значение = Справочники.ФизическиеЛица.НайтиПоНаименованию(ФизЛицо);
    Гражданство.Отбор.ФизическоеЛицо.Использование = Истина;
    Гражданство.Прочитать();
    Если НЕ Гражданство.Количество() = 0 Тогда
    ГражданствоФизЛица = Гражданство[0].Страна.Наименование;
    КонецЕсли;    
    Табельный = СсылкаНаОбъект.Сотрудник.Код;      
    НомерДоговора = СсылкаНаОбъект.ТрудовойДоговорНомер;
    ДатаДоговора = СсылкаНаОбъект.ТрудовойДоговорДата;
    ДатаНачалаТД = СсылкаНаОбъект.ДатаПриема;
    ИспытательныйСрок = СсылкаНаОбъект.ДлительностьИспытательногоСрока;
    ДатаОкончанияТД = СсылкаНаОбъект.ДатаЗавершенияТрудовогоДоговора;
    Должность = СсылкаНаОбъект.Должность;
    ПодразделениеОтдел = СсылкаНаОбъект.Подразделение;
    
    Макет = "ТД";
    Договор=ПолучитьМакет(Макет);
    
        
             //Получить объект из макета.
    MSWord = Договор.Получить();
    Попытка
            Документ = MSWord.Application.Documents(1);
            // Получить объект, который будем использовать для поиска и замены.
            Замена = Документ.Content.Find;
            Замена.Execute("<НомерТД>", Ложь, Истина, Ложь, Ложь, , Истина, , Ложь, НомерДокументаБезНулей(СсылкаНаОбъект.ТрудовойДоговорНомер), 2);
    //        Замена = Документ.Content.Find;
    //        Замена.Execute("<ФИО>", Ложь, Истина, Ложь, Ложь, , Истина, , Ложь, СсылкаНаОбъект.ФизическоеЛицо.ФИО, 2);
    //        Замена = Документ.Content.Find;
    //        Замена.Execute("<ДатаНачалаКаз>", Ложь, Истина, Ложь, Ложь, , Истина, , Ложь,  Формат(ДатаНачала,"Л=kk_KZ; ДЛФ=DD"), 2);
    //        Замена = Документ.Content.Find;
            Замена.Execute("<ДатаНачалаТД>", Ложь, Истина, Ложь, Ложь, , Истина, , Ложь,  Формат(ДатаДоговора,"Л=ru_RU; ДЛФ=DD"), 2);
            Замена = Документ.Content.Find;
    //        Замена.Execute("<ДатаОкончанияКаз>", Ложь, Истина, Ложь, Ложь, , Истина, , Ложь,  Формат(ДатаОкончания,"Л=kk_KZ; ДЛФ=DD"), 2);
    //        Замена = Документ.Content.Find;
    //        Замена.Execute("<ДатаОкончания>", Ложь, Истина, Ложь, Ложь, , Истина, , Ложь,  Формат(ДатаОкончания,"Л=ru_RU; ДЛФ=DD"), 2);
    //        Замена = Документ.Content.Find;
    //        Замена.Execute("<Должность>", Ложь, Истина, Ложь, Ложь, , Истина, , Ложь,  СсылкаНаОбъект.Должность.Наименование, 2);
    //        Замена = Документ.Content.Find;
    //        Замена.Execute("<График>", Ложь, Истина, Ложь, Ложь, , Истина, , Ложь,  РежимРаботы, 2);
    //        Замена = Документ.Content.Find;
    //        Замена.Execute("<Оклад>", Ложь, Истина, Ложь, Ложь, , Истина, , Ложь,  СсылкаНаОбъект.ОсновныеНачисления[0].Показатель1, 2);
    //        Замена = Документ.Content.Find;
    //        Замена.Execute("<ОкладПрописью>", Ложь, Истина, Ложь, Ложь, , Истина, , Ложь,  ЧислоПрописью(СсылкаНаОбъект.ОсновныеНачисления[0].Показатель1, "Л=ru_Ru;ДП=Истина", "тенге, тенге, тенге, м, тиын, тыин, тыин, м, 2"), 2);
    //        Замена = Документ.Content.Find;
    //        Замена.Execute("<ОкладПрописьюКаз>", Ложь, Истина, Ложь, Ложь, , Истина, , Ложь,  ЧислоПрописью(СсылкаНаОбъект.ОсновныеНачисления[0].Показатель1, "Л=kk_KZ;ДП=Истина", "тенге, тенге, тенге, м, тиын, тыин, тыин, м, 2"), 2);
    //        Замена = Документ.Content.Find;
    //        Замена.Execute("<ИНН>", Ложь, Истина, Ложь, Ложь, , Истина, , Ложь,  Число(СсылкаНаОбъект.ФизЛицо.ИдентификационныйКодЛичности), 2);
    //        //Замена = Документ.Content.Find;
    //        //Замена.Execute("<Удостоверение>", Ложь, Истина, Ложь, Ложь, , Истина, , Ложь,  НомерУдостоверения, 2);
    //        //Замена = Документ.Content.Find;
    //        //Замена.Execute("<Выдан>", Ложь, Истина, Ложь, Ложь, , Истина, , Ложь,  ДатаВыдачи, 2);        
    //        //Замена = Документ.Content.Find;
    //        //Замена.Execute("<Адрес>", Ложь, Истина, Ложь, Ложь, , Истина, , Ложь,  АдресФактический, 2);


                                                                                      
            MSWord.Application.Visible = Истина;
            MSWord.Activate();

        Исключение
            // Если произойдет ошибка, выводятся данные об ошибке, и объект закрывается.
            Сообщение = Новый СообщениеПользователю();
            Сообщение.Текст = ОписаниеОшибки();
            Сообщение.Сообщить();    
            MSWord.Application.Quit();
        КонецПопытки;
        
        
    
КонецФункции
    
Функция НомерДокументаБезНулей(НомерДокумента)

Ошибка:

{ОбщийМодуль.СтандартныеПодсистемыКлиент.Модуль(117)}: Ошибка при вызове метода контекста (ОткрытьФорму)
    ОткрытьФорму("ОбщаяФорма.Вопрос", Параметры,,,,,ОписаниеОповещенияОЗавершении);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'val':
    форма: Элемент
    имя: {http://v8.1c.ru/8.2/mngsrv/ws}val
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'КодВозвратаДиалога'

Помогите пожалуйста с регистрацией формы, а то мозг скоро потечет, зачем они так усложнили все, раньше ведь просто было. Заранее спасибо тем, кто поможет!
1 nordbox
 
19.12.17
17:04
Ты про директивы
&НаСервере
&НаКлиенте
и их использование слышал?
2 LeoKeyn
 
19.12.17
17:05
(1) Если я правильно понимаю они используются в модуле формы, а это модуль объекта, или я что то не так понял?
3 LeoKeyn
 
19.12.17
17:23
Ни в курсе ни кто? :-) или вечер? :-)
4 nordbox
 
19.12.17
17:24
(2)>> ОткрытьФорму("ОбщаяФорма.Вопрос", Параметры,,,,,ОписаниеОповещенияОЗавершении);
Отсутствует отображение для типа 'КодВозвратаДиалога'
5 LeoKeyn
 
19.12.17
17:25
(4) только что с этим делать, ошибка вылезает из основного модуля. Не пойму, я что то не так отправляю или в коде конфы ошибка
6 nordbox
 
19.12.17
17:26
Где у тебя этот кусок?
7 nordbox
 
19.12.17
17:27
Ты показал
>>Функция НомерДокументаБезНулей(НомерДокумента)

Ошибка:

{ОбщийМодуль.СтандартныеПодсистемыКлиент.Модуль(117)}: Ошибка при вызове метода контекста (ОткрытьФорму)
    ОткрытьФорму("ОбщаяФорма.Вопрос", Параметры,,,,,ОписаниеОповещенияОЗавершении);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:

Остальное где?
8 LeoKeyn
 
19.12.17
17:31
(7) Эта функция в данный момент не используется. Ошибка возникает, когда я пытаюсь добавить ВПФ в конфигурацию, а не исполнить код
9 LeoKeyn
 
19.12.17
17:32
"Дополнительная обработка (Создание)" сюда
10 nordbox
 
19.12.17
17:37
http://catalog.mista.ru/public/286059/
Вот тут думаю найдешь ответ
11 LeoKeyn
 
19.12.17
17:39
(10) отсюда и делал)
12 nordbox
 
19.12.17
17:39
(8)>>Эта функция в данный момент не используется.
Ну а почему ты вызываешь ее??
13 nordbox
 
19.12.17
17:40
Где у тебя эта строка?
14 nordbox
 
19.12.17
17:40
ОткрытьФорму("ОбщаяФорма.Вопрос", Параметры,,,,,ОписаниеОповещенияОЗавершении);
15 LeoKeyn
 
19.12.17
17:41
(14) Открыть форму вызывает конфа, при подключении ВПФ. Она не моя, это пройедура ОбщегоМодуля
16 nordbox
 
19.12.17
17:44
А что и где у тебя возвращает Функция ВывестиПечать()
17 LeoKeyn
 
19.12.17
17:45
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "ПечатьТД", "Трудовой договор", ВывестиПечать());
18 nordbox
 
19.12.17
17:46
(17) Внутри функции Возврат
где?
19 LeoKeyn
 
19.12.17
17:47
(18) Так а мне возврат ненужен, она просто откроет ворд. Через форму работает
20 nordbox
 
19.12.17
17:48
)))) Дык это вообще то Функция которая должна что то вернуть
Это процедура тупо выполняет что сказали )
21 nordbox
 
19.12.17
17:56
Ты напиши НЕ Функция ВывестиПечать()
а Процедура ВывестиПечать()
22 nordbox
 
19.12.17
17:59
И в конце тоже поправь НЕ КонецФункции
а КонецПроцедуры
23 nordbox
 
19.12.17
18:00
На всякий случай почитай
http://howknow1c.ru/jazyk-1s/funkcii-1s-i-procedury-1s.html
24 LeoKeyn
 
21.12.17
09:03
(21) {ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта(46,110)}: Обращение к процедуре как к функции (ВывестиПечать)
    УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "ПечатьТД", "Трудовой договор", <<?>>ВывестиПечать());  (Проверка: Сервер)
25 LeoKeyn
 
21.12.17
09:04
Ничего пока так и не вышло, может еще кто идейки кинет? :-)
26 regniws
 
21.12.17
09:13
ВывестиПечать процедура
27 nordbox
 
21.12.17
09:19
(26) я ему уже объяснял
(24) ты чо такой нудный как ёжик с причёской ??? ))
зайди в Общие модули  УправлениеПечатью
открой, найди там
ВывестиТабличныйДокументВКоллекцию(.....
и смотри какие параметры надо
тебе ясно 1с сказала
ПечатьТД", "Трудовой договор", <<?>>ВывестиПечать());  
чего то много или не хватает )) смотри и читай
28 LeoKeyn
 
21.12.17
10:56
(27) Он ругается на ВывестиПечать из-за того, что я пытаюсь вызвать процедуру как функцию :-) после того как исправил ее на процедуру. Да я нудный :-) хочется понять и сделать :-)
29 nordbox
 
21.12.17
11:49
(28) Тогда делай функцию
только правильно делай )
30 LeoKeyn
 
21.12.17
11:58
(29) Так вот что не правильно тут, и она вообще не при чем, до нее ДЕЛО НЕ ДОХОДИТ! проблема в подключении к конфе, она еще ничего не выполняет
31 nordbox
 
21.12.17
12:08
32 Мимохожий Однако
 
21.12.17
12:09
ОФФ:Чем больше клюв, тем меньше мозга.((
33 LeoKeyn
 
21.12.17
16:45
http://catalog.mista.ru/public/445207/?detail=Y
Нашел то, что мне нужно, жаль он не расписал :-(
34 LeoKeyn
 
21.12.17
16:46
(32) Извиняйте, просто мозг уже плывет. Ошибка при подключении была тупой не сделал Функции и Процедуры Экспортными. Теперь проблемы после
35 LeoKeyn
 
21.12.17
16:47
Везде описано как сделать печатную форму, а как это переделать в печатную форму на вывод в ворд пока докумекать никак
36 LeoKeyn
 
21.12.17
16:48
Теперь она вроде и подвязалась но вот только функция по заполнению данных не отрабатывает, просто не заполненный макет открывает
37 LeoKeyn
 
22.12.17
17:23
Наконец все сделал и получилось, спасибо всем за терпение и помощь!
Закон Брукера: Даже маленькая практика стоит большой теории.