Функция заполнения документа word по шаблону. Аналог функции CRM_ЗаменитьШаблонВВордеНаТекст

В организации ключи от CRM постоянно отваливались. Может это были проблемы сервака или самих ключей, но встала задача выполнения работниками тех же функций и без ключей защиты.

Основным функционалом, которым мы пользовались являлась печать договоров и коммерческих предложений из 1С в Word.

В crm это было реализована таким образом: создавался макет договора в формате doc – docx, и сохранялся на диске. Затем в коде получали этот договор, сохраняли на диске под другим именем и уже в этой копии заменялся текст на необходимый. Например, чтобы вставить в макет номер договора у нас нужно было вставить в этот макет текст вида {Номер}.  Обязанности по замене в crm выполняла функция CRM_ЗаменитьШаблонВВордеНаТекст, в которую передавался объект Word. Код этой функции зашит в ключ защиты, что и вызывало такие проблемы.

 

Предлагаю аналог функции «CRM_ЗаменитьШаблонВВордеНаТекст», выполняемый без ключа защиты

////////////////////////////////////////////////////////////////////////////////
//
// Функция ЗаменитьШаблонВВордеНаТекст
//
// Описание:
//  Ищет, заданный текст в Word Документе. Если текст найден возвращает Истина.
//  Также, если передавать Параметр везде, то и выполняет замену найденного текста
// Параметры (название, тип, дифференцированное значение)
//  Ворд - comobject Word,
//  ТекстНайти - тип Строка, текст для поиска в документе
//  ТекстЗаменить - тип Строка, текст, на который будет заменятся ТекстНайти,
//  Везде - тип Булево (Если не передается, принимает значение Неопределено),
//  указывает где следует производить замену
// ОСНОВНЫЕ ПАРАМЕТРЫ ПЕРЕДАВАЕМЫЕ В ОБЪЕКТ FIND
//  УчитыватьРегистр - Тип Булево.
//  ИскатьЦелоеСлово - Тип Булево.
//  ИспользоватьДопЗнаки - Тип Булево.
//  ИскатьКакЗвучит - Тип Булево.
// Возвращаемое значение: Истина ИЛИ Ложь
Функция ЗаменитьШаблонВВордеНаТекст(Ворд, Знач ТекстНайти, ОбластьПоиска = Неопределено, Знач ТекстЗаменить = "", Везде = Неопределено,
УчитыватьРегистр = Ложь, ИскатьЦелоеСлово = Истина, ИспользоватьДопЗнаки = Ложь, ИскатьКакЗвучит = Ложь)

//Колво раз, сколько нужно заменять текст в документе
Если Везде = Неопределено Тогда
Колво = 0; //ни разу
ИначеЕсли Везде Тогда
Колво = 2;//Все
Иначе
Колво = 1;//1 раз
КонецЕсли;
Если ОбластьПоиска = Неопределено Тогда
ОбластьПоиска = Ворд.ActiveDocument.Content;
КонецЕсли;
//Если Текст больше 255 знаков,
//то вводим его методом печати, а не вставкой
Если СтрДлина(ТекстЗаменить) > 255 И Колво > 0 Тогда
ОбластьПоиска.Select();
ОбластьПоиска = Ворд.Selection;
Find   = ОбластьПоиска.Find;
Найден   = Ложь;
Попытка
Пока Find.Execute(ТекстНайти, УчитыватьРегистр, ИскатьЦелоеСлово, ИспользоватьДопЗнаки, ИскатьКакЗвучит) Цикл
//Печатаем текст замены, если найден
Ворд.Selection.TypeText(ТекстЗаменить);
Найден = Истина;
Если Колво = 1 Тогда
Прервать
КонецЕсли;
КонецЦикла;
Возврат Найден;
Исключение
Возврат Ложь;
КонецПопытки;
Иначе
Если Колво = 1 Тогда
ОбластьПоиска.Select();
ОбластьПоиска = Ворд.Selection;
КонецЕсли;

Find = ОбластьПоиска.Find;
//Убираем форматирование, чтобы оно не влияло на поиск
Find.ClearFormatting();

//Параметры объекта Find
//1 - ТекстПоиска, тип Строка - по умолчанию "", можно использовать для поиска специальные символы:
// "#k8SjZc9Dxkp" - для поиска параграфов, "#k8SjZc9Dxkt" - сиволы табуляции
//2- УчитыватьРегистр, тип Булево - по умолчанию Ложь
//3 - ИскатьЦелоеСлово, тип Булево - по умолчанию Истина
//4 - ИспользоватьДопЗнаки - использует подстановочные знаки - по умолчанию Ложь
//5 - ИскатьКакЗвучит - Ищет слова похожие по звучанию - по умолчанию Ложь
//6 - НаправлениеВперед - Указывет направаление поиска вперед - по умолчанию Ложь
//9 - ИскатьФорматирование - Указывает необходимо ли искать по форматированию - по умолчанию Ложь
//10 - ТекстЗаменить - Текст для замены
//11 - Колво - указыавет, сколько раз произоводить замену: 2 - во всем документе, 1 - только первый найденный, 0 - нигде
Попытка
Возврат Find.Execute(ТекстНайти,УчитыватьРегистр,ИскатьЦелоеСлово,ИспользоватьДопЗнаки, ИскатьКакЗвучит,,,,,ТекстЗаменить,Колво)
Исключение
Возврат Ложь;
КонецПопытки;
КонецЕсли;
КонецФункции

P.S. Пишите свои замечания по улучшению кода


Мои работы:

Общее

Перенос данных XML с Анализом и выборочной загрузкой.

Универсальный редактор таблиц и движения документа (LITE) (Обычная Форма)

Универсальный редактор таблиц и движения документа (PRO) (Обычная Форма)

Универсальный редактор Таблиц и Движений документов (Управляемая форма)

Запуск 1С под другим пользователем без пароля.

 

Управление торговлей 11

Установка цен в УТ11. Произвольный запрос к данным ИБ

 

ЗУП 2.5

Скрываем неиспользуемые виды расчета

Резервы отпусков в Документе «Отражение Зарплаты в Регламентированном Учете» (Оценочные Обязательства)

 

Комплексная И УПП

Форма работы с сотрудниками, как из зуп 2.5

 

9 Comments

  1. script
    Функция CRM_ЗаменитьШаблонВВордеНаТекст(глКомпонента, Ворд, Знач ШаблонВВорде, Знач ТекстЗамены, Везде = Истина) Экспорт
    Попытка
    Если Везде Тогда
    Везде = 1;
    КонецЕсли;
    
    НетОшибок = Истина;
    
    Selection = Ворд.ActiveDocument.Content;
    //Selection.Find.ClearFormatting();
    //Selection.Find.Replacement.ClearFormatting();
    //
    //Selection.Find.Forward = True;
    //Selection.Find.Wrap = wdFindContinue;
    //
    //Selection.Find.Format = False;
    //Selection.Find.MatchCase = False;
    //Selection.Find.MatchWholeWord = False;
    //Selection.Find.MatchWildcards = False;
    //Selection.Find.MatchSoundsLike = False;
    //Selection.Find.MatchAllWordForms = False;
    //
    //Selection.Find.Text = «»;
    //Selection.Find.Replacement.Text = «»;
    
    wdReplaceNone = 00000000; // не заменять
    wdReplaceOne  = 00000001; // заменять одно вхождение/по порядку
    wdReplaceAll  = 00000002; // заменить все вхождения
    
    // Начало табличной части
    Если (ШаблонВВорде = «{НачалоТаблицыОбязательныйПрефикс}») Тогда
    
    ПоискИЗамена = Selection.Find;
    ПоискИЗамена.Forward = -1;
    ПоискИЗамена.Text = ШаблонВВорде;
    ПоискИЗамена.Replacement.Text = «»;
    ПоискИЗамена.Execute(, , , , , , , , , ,wdReplaceOne);
    
    Если ПоискИЗамена.Found Тогда
    
    Таблица = ПоискИЗамена.Parent;
    Таблица.Select();
    
    Иначе
    
    НетОшибок = Ложь;
    
    Если Константы.script_ВключитьРежимОтладки.Получить() Тогда
    Сообщить(ОписаниеОшибки());
    КонецЕсли;
    
    КонецЕсли;
    
    Иначе
    
    Если Везде = 1 Тогда
    
    ПоискИЗамена = Selection.Find;
    ПоискИЗамена.Forward = Истина;
    ПоискИЗамена.ClearFormatting();
    ПоискИЗамена.Replacement.ClearFormatting();
    
    ПоискИЗамена.Text             = ШаблонВВорде;
    ПоискИЗамена.Replacement.Text = ТекстЗамены;
    ПоискИЗамена.Execute(, , , , , , , , , ,wdReplaceAll);
    
    Иначе
    
    ПоискИЗамена                  = Selection.Find;
    ПоискИЗамена.ClearFormatting();
    ПоискИЗамена.Forward          = -1;
    ПоискИЗамена.Wrap             = 1;
    ПоискИЗамена.Text             = ШаблонВВорде;
    ПоискИЗамена.Replacement.Text = ТекстЗамены;
    ПоискИЗамена.Execute(, , , , , ,1 ,1 , , ,wdReplaceOne);
    Если ПоискИЗамена.Found Тогда
    
    Таблица = ПоискИЗамена.Parent;
    Таблица.Select();
    
    Иначе
    
    НетОшибок = Ложь;
    
    Если Константы.script_ВключитьРежимОтладки.Получить() Тогда
    Сообщить(ОписаниеОшибки());
    КонецЕсли;
    
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    
    КонецЕсли;
    // — {SCRIPT}
    
    Исключение КонецПопытки;
    
    Возврат Истина;
    
    КонецФункции
    

    Показать

    Reply
  2. script
    Функция CRM_ЗаменитьШаблонВOpenOfficeНаТекст(глКомпонента, Параметры, ТегиКолонок) Экспорт
    Попытка
    Если ТегиКолонок Тогда
    
    Для Каждого Тег Из Параметры.ТаблицаТегов Цикл //заполнение строк номенклатуры и итогов по разделам
    Результат = CRM_ПолучитьРезультатВыполненияДействия(Тег.Действие, Параметры.СтрокаМассива, Параметры.Параметры);
    
    СтруктураПараметров = Новый Структура;
    СтруктураПараметров.Вставить(«ОбъектOpenOffice» , Параметры.Параметры.ОбъектВорд);
    СтруктураПараметров.Вставить(«СтрокаПоиска»  , Тег.Представление);
    СтруктураПараметров.Вставить(«СтрокаЗамены»  , CRM_ОбработатьСтрокуЗамены(Результат));
    
    CRM_ЗаменитьШаблонВOpenOfficeНаТекст(глКомпонента, СтруктураПараметров, Ложь);
    
    КонецЦикла;
    
    Иначе
    
    OpenOffice = Параметры.ОбъектOpenOffice;
    Replace               = OpenOffice.CreateReplaceDescriptor();
    Replace.SearchString  = Параметры.СтрокаПоиска;
    Replace.ReplaceString = CRM_ОбработатьСтрокуЗамены(Параметры.СтрокаЗамены);
    
    OpenOffice.ReplaceAll(Replace);
    
    КонецЕсли;
    
    Возврат Истина;
    
    Исключение
    
    Сообщить(ОписаниеОшибки());
    Возврат Ложь;
    
    КонецПопытки
    
    КонецФункции
    
    

    Показать

    Reply
  3. karpik666

    (1) script, это откуда такое счастье? Это ваш код или это закрытый модуль? 🙂

    Reply
  4. h00k

    (0) ОМГ, а остальные защищенные процедуры и функции не нужны?!

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

    П.С.: Полное отключение защиты — 5 минут, производится изменением пары строк в конфигурации и его гораздо проще поддерживать чем «дописанные» процедуры. Но гораздо правильнее сначала научиться настраивать ключи защиты, так-как защита у рарус не самая «глючная» и если возникли такие сложности, то это говорит, скорее всего, о «кривой» настройке сервера…

    Reply
  5. karpik666

    (3) h00k, конфигурации уже 8 лет, не обновлялась и столько же ключам, может действительно виноват сервак, но им занимался другой человек, еще был конфликт из за Ос, когда на сервер поставили Windows 2012. Про строчки знаю, которые нужно закомментировать, и бизнес процессы работают и без ключа, а вот доп функции нет, так как код зашит в ключ защиты 🙁

    Reply
  6. karpik666

    (3) h00k, большинство функций не нужны были, хотя нужно было еще штрихкод вставлять, но эту проблему решили наподобии этого кода.

    Reply
  7. karpik666

    (3) h00k, поводом отказаться от защиты crm это еще то, что с ней конфигурация запускается капец как долго, пока пройдут все проверки=)

    Reply
  8. h00k

    (5)

    Про строчки знаю, которые нужно закомментировать,

    Просто закомментировать — это не решение, это потеря основного функционала.

    поводом отказаться от защиты crm это еще то, что с ней конфигурация запускается капец как долго, пока пройдут все проверки=)

    На правильно настроенной системе проверка файлов защиты в 1.4 занимает пару секунд, а в 2.0 и того быстрее.

    А по поводу отключения защиты, я могу вспомнить лишь один случай, когда это имело смысл — необходимо было заставить црм 1.4 работать на линукс.

    Reply
  9. script

    Отключать защиту приходится при серьезной доработке црм.

    Я собираюсь, начать публиковать цикл статей о том, чего так не хватает в црм 1.4, и как это реализовать. И в некоторых случаях, без обхода защищенных функций, просто не обойтись.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *