загрузка...
Дата публикации: 20.05.2021 12:21:03 |
десь буду собирать наработки по управляемым формам
Заполнение макета ворд
//в модуле объекта
функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Справочник.ДоговорыКонтрагентов"); //Указываем документ к которому делаем внешнюю печ. форму
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма"); //может быть - ПечатнаяФорма, ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов...
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "Договор в ворд"); //имя под которым обработка будет зарегестрирована в справочнике внешних обработок
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("Информация", "Договор в ворд");
ТаблицаКоманд = ПолучитьТаблицуКоманд();
//ДобавитьКоманду(ТаблицаКоманд, "Договор в Ворд", "ДоговорВВорд", "ВызовСерверногоМетода", Истина, "ПечатьMXL");
ДобавитьКоманду(ТаблицаКоманд, "Договор в Ворд", "ДоговорВВорд", "ОткрытиеФормы", Истина, "ПечатьMXL");
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));//как будет выглядеть описание печ.формы для пользователя
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); //имя макета печ.формы
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); //ВызовСерверногоМетода
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
//в модуле формы
&НаСервере
Функция ПолучитьМакетСервер(ИмяМакета)
Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет(ИмяМакета);
Возврат Макет;
КонецФункции
&НаСервере
Функция ФормированиеДоговораПоШаблону()
ИмяМакета = "Макет";
если Парыгин = Истина Тогда ИмяМакета = "Макет1"; КонецЕсли;
АктивныйДокумент = ПолучитьМакетСервер(ИмяМакета);
УИД = Новый УникальныйИдентификатор();
Адрес = ПоместитьВоВременноеХранилище(АктивныйДокумент, УИД);
Возврат Адрес;
КонецФункции
&НаКлиенте
Процедура ЗаменитьЗначениеДокумента(Док,Знач СтрИсходная,Знач СтрЗамены)Экспорт
СтрокаИсходная =" ";
СтрокаЗамены =" ";
Если НЕ ЗначениеЗаполнено(СтрИсходная) Тогда
Возврат;
ИначеЕсли ТипЗнч(СтрИсходная)<>Тип("Строка") Тогда
Попытка
СтрокаИсходная = Строка(СтрИсходная);
Исключение
Сообщить("Не удалось привести значение к строке");
СтрокаИсходная = " ";
КонецПопытки;
КонецЕсли;
Если СтрокаИсходная=" " Тогда
СтрокаИсходная = СтрИсходная;
КонецЕсли;
//Если НЕ ЗначениеЗаполнено(СтрЗамены) Тогда
// Возврат Ложь;
Если ТипЗнч(СтрЗамены)<>Тип("Строка") Тогда
Попытка
СтрокаЗамены = Строка(СтрЗамены);
Исключение
Сообщить("Не удалось привести значение к строке");
СтрокаЗамены =" ";
КонецПопытки;
КонецЕсли;
Если СтрокаЗамены =" " Тогда
СтрокаЗамены = СтрЗамены;
КонецЕсли;
//параметры
//1. Текст, который заменяется
//2. Текст для поиска чувствителен к регистру
//3. Искать только указанный текст как есть. Не включать в найденное куски с частями текста для поиска
//4. Имеет групповой символ, например "*строка" - все слова, которые имеют окончание "строка"
//5. Искать синонимы
//6. Искать все формы слов: например, take, took, taken
//7. Искать с начала к концу документа
//8. Wrap. Controls what happens if the search begins at a point other than the beginning of the document
//and the end of the document is reached.
//This argument also controls what happens if there is a selection or range and the search text is not found
//in the selection or range. Can be one of the WdFindWrap constants.
//9. Format
//11. 1-заменить первое найденное, 2-заменить все найденные, 3-не заменять
РезультатПопыткиЗамены = Неопределено;
Попытка
РезультатПопыткиЗамены = Док.Content.Find.Execute("[" + СтрокаИсходная + "]", Ложь, Истина, Ложь, Ложь, Ложь, Истина, , Ложь, СтрокаЗамены, 2);
Исключение
РезультатПопыткиЗамены = Ложь;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура СобратьМакет()
Данные = Объект.ТаблицаРеквизитов;
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("doc");
ИмяДоговора = ИмяВременногоФайла;
Адрес = ФормированиеДоговораПоШаблону();// положить макет во временное хранилище на сервере и получить адрес на клиент
Если Адрес = Неопределено Тогда
Возврат;
КонецЕсли;
Макет = ПолучитьИзВременногоХранилища(Адрес); //получить макет из временного хранилища
Макет.Записать(ИмяВременногоФайла); //создать документ на основе макета в TEMP клиента
Word = Новый COMОбъект("Word.Application");//создаем COMОбъект
Документ = Word.Documents.Open(ИмяВременногоФайла);//подключаем макет к созданному COMОбъект
Попытка
ДокументЗаполнение = Документ.Application.Documents(1);
// Получить объект, который будем использовать для поиска и замены.
Для Каждого ЭлементДанных Из Данные Цикл
ЗаменитьЗначениеДокумента(ДокументЗаполнение,ЭлементДанных.Наименование,ЭлементДанных.Значение);
КонецЦикла;
i=0;
Для каждого стрДок из Работы цикл
если стрДок.нужно тогда
i=i+1;
ДокументЗаполнение.Tables(1).Rows.Add();
ДокументЗаполнение.Tables(1).Rows(i).Cells(1).Range.Text = "√ "+i+") "+стрДок.Наименование;
КонецЕсли;
КонецЦикла;
Word.Application.Visible = Истина;//установить видимость документа
Word.Activate();//открыть документ пользователю
Исключение
// Если произойдет ошибка, выводятся данные об ошибке, и объект закрывается.
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = ОписаниеОшибки();
Сообщение.Сообщить();
Word.Application.Quit();
КонецПопытки;
КонецПроцедуры // СобратьМакет()
Заполнение ТЧ формы запросом
&НаСервере
Процедура ПриОткрытииНаСервере()
// Вставить содержимое обработчика.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДоговорыКонтрагентов.Владелец КАК Контрагент,
| ДоговорыКонтрагентов.Ссылка КАК Договор,
| ДоговорыКонтрагентовДополнительныеРеквизиты.Значение КАК Адрес,
| ДоговорыКонтрагентовДополнительныеРеквизиты1.Значение КАК ПутьКПапке,
| ДоговорыКонтрагентовДополнительныеРеквизиты2.Значение КАК Ответственный,
| ДоговорыКонтрагентов.Дата КАК Дата,
| ДоговорыКонтрагентов.Номер КАК Номер
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов.ДополнительныеРеквизиты КАК ДоговорыКонтрагентовДополнительныеРеквизиты
| ПО (ДоговорыКонтрагентовДополнительныеРеквизиты.Ссылка = ДоговорыКонтрагентов.Ссылка)
| И (ДоговорыКонтрагентовДополнительныеРеквизиты.Свойство.Имя = &Наименование)
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов.ДополнительныеРеквизиты КАК ДоговорыКонтрагентовДополнительныеРеквизиты1
| ПО (ДоговорыКонтрагентовДополнительныеРеквизиты1.Ссылка = ДоговорыКонтрагентов.Ссылка)
| И (ДоговорыКонтрагентовДополнительныеРеквизиты1.Свойство.Имя = &Наименование1)
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов.ДополнительныеРеквизиты КАК ДоговорыКонтрагентовДополнительныеРеквизиты2
| ПО (ДоговорыКонтрагентовДополнительныеРеквизиты2.Ссылка = ДоговорыКонтрагентов.Ссылка)
| И (ДоговорыКонтрагентовДополнительныеРеквизиты2.Свойство.Имя = &Наименование2)
|ГДЕ
| НЕ ДоговорыКонтрагентовДополнительныеРеквизиты.Значение = """"
| И ДоговорыКонтрагентов.ПометкаУдаления = ЛОЖЬ";
Запрос.УстановитьПараметр("Наименование", "АдресныйКлассификатор");
Запрос.УстановитьПараметр("Наименование1", "Path");
Запрос.УстановитьПараметр("Наименование2", "Ответственный");
ЖурналДоговоров.Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры
Разбор ФИО из строки
&НаКлиенте
Функция ФИО(ПолнИмя) Экспорт
ВозМас = Новый Массив;
ПервПроб = Найти(ПолнИмя," ");
Если ПервПроб=0 Тогда
Возврат ПолнИмя;
Иначе
Фамилия = Лев(ПолнИмя,ПервПроб);
ИО = Сред(ПолнИмя,ПервПроб+1);
ИО = СокрЛ(ИО);
ВторПроб = Найти(ИО," ");
Имя = Лев(ИО,ВторПроб+1);
Отчество = Сред(ИО,ВторПроб+1);
ВозМас.Добавить(Фамилия);
ВозМас.Добавить(Имя);
ВозМас.Добавить(Отчество);
Возврат ВозМас;
КонецЕсли;
КонецФункции
Запись доп.реквизита
мНовыйРеквизит = дог.ДополнительныеРеквизиты.Добавить();
свойстворек=ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя","КонтЛицКонтрДог");
мНовыйРеквизит.Свойство = свойстворек;
мНовыйРеквизит.Значение = ЛицоКонтрагента;
Назад в раздел