Замена текстов модулей внешних обработок




Иногда возникает необходимость заменить вызовы процедур или функций во внешних обработках на новые. Если количество обработок мало, то сложностей, как правило, не возникает, но что делать, если их сотни? Предлагаю свой вариант решения проблемы.

Введение.

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

К сожалению, 1С не предоставила удобного инструмента для подобных случаев: фактически, доступна лишь глобальная замена, пользоваться которой — при наличии у вас большого числа обработок — то еще мучение.

Недавний релиз ЗУП, в котором произошла массовая миграция процедур и функций из модуля ОбщегоНазначения в модуль ОбщегоНазначенияЗК, заставил меня задуматься об автоматизации процесса и в результате была написана обработка, позволяющая по  словарю замен выполнить все требуемые действия.

Благодарности.

Обработка основана на V8Unpack (//infostart.ru/public/15695/), автору которого выражаю мою искреннюю благодарность.

История версий.

 Версия 1.1 от 20.11.2013 г — изменен алгоритм замены в текстах модулей, добавлена поддержка управляемых форм. Добавлена возможность помещать в папку результата только измененные обработки.

 Версия 1.2 от 29.11.2013 г — добавлена возможность замены текстов без учета регистра. Исправлены выявленные проблемы.

Пошаговая инструкция.

1. Выгрузка внешних обработок

На данном этапе производится выгрузка обработок из справочника «Внешние обработки» в каталог для их дальнейшей обработки.

В случае, если у вас уже есть каталог с обработками, то можете сразу переходить к шагу №2.

Для выгрузки обработок из базы, следует воспользоваться  кнопкой «Выгрузить» на панели действий формы.

Предварительно, требуется указать путь для сохранения внешних обработок (в разделе «Путь к внешним обработкам»). После выгрузки, система выдаст предупреждение об окончании процесса.

Внимание! Данный шаг доступен только для тех конфигураций, где есть справочник «Внешние обработки»; во всех остальных конфигурациях  выгрузка будет невозможна.

Алгоритм выгрузки позаимствован из обработки с ИТС «КонвертацияВнешнихОбработок».

 выгрузка обработок

2. Выбор внешних обработок

На этом шаге, в разделе «Путь к внешним обработкам«, требуется указать каталог с файлами внешних обработок (способ конвертации «Все файлы из каталога»), либо выбрать конкретную обработку для проведения замены текстов (способ конвертации «Выбранный файл»)

3. Заполнение словаря замен

Для того, чтобы система знала, что и на что необходимо заменить в текстах модулей внешних обработок, в разделе «Словарь замен» требуется указать необходимое количество заменяемых строк и их новых значений.

Словарь также можно сохранить в файл/прочитать из файла (текстовый формат) для дальнейшего использования.

 словарь замен

 4. Замена строк

На данном этапе в модулях выбранных на шаге №2 внешних обработок производится замена подстрок, согласно словарю замен.

Для начала процесса, требуется указать путь для сохранения измененных внешних обработок (в разделе «Путь для сохранения результатов работы обработки») и нажать кнопку «Замена текстов» на панели действий формы.

После окончания процесса, система выдаст предупреждение.

Внимание! Обработки в исходном каталоге не изменяются, результат сохраняется в отдельный каталог!

 Замена текстов

 5. Проверка результата (опционально)

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

Проверка запускается при нажатии на кнопку «Проверить» на панели действий формы; анализируются обработки в каталоге, указанном в разделе  «Путь для сохранения результатов работы обработки» 

Сразу скажу, что никакого глубокого анализа нет: производится простая попытка создать экземпляр внешней обработки из изменного файла, а возникающие ошибки выводятся в окно сообщений.

6. Загрузка внешних обработок в ИБ.

На данном этапе производится загрузка измененных обработок из каталога, указанного в разделе  «Путь для сохранения результатов работы обработки» в справочник «Внешние обработки».

Для загрузки обработок в базу, следует воспользоваться  кнопкой «Загрузить» на панели действий формы.

После загрузки, система выдаст предупреждение об окончании процесса.

Внимание! Данный шаг доступен только для тех конфигураций, где есть справочник «Внешние обработки»; во всех остальных конфигурациях  загрузка будет невозможна!

Алгоритм загрузки позаимствован из обработки с ИТС «КонвертацияВнешнихОбработок».

Загрузка

Заключение.

Надеюсь, обработка окажется полезной в нелегкой работе разработчиков 1С.

Спасибо за внимание.

21 Comments

  1. Поручик

    (0) Такое впечатление, будто я уже видел работу на инфостарте.

    Reply
  2. TrinitronHome

    я тоже читал что-то похожее на эту тему

    Reply
  3. Гость
  4. nreisende

    (1)(2) Когда доступен такой мощный инструмент, как v8unpack — написать подобную обработку не представляет какой-то запредельной сложности — было бы желание, поэтому не исключаю, что кроме моей, есть другие похожие работы. Более того, был бы очень удивлен, если бы никто на это не сподобился. Мою публикацию можно рассматривать, как один из возможных вариантов решения озвученной задачи.

    (3) По указанной ссылке, автор предлагает с помощью глобальной замены вручную обрабатывать каждую строку таблицы замен. Кому как, а мне жалко своего времени: ведь мало того, что процесс завязан на ручной ввод, он еще и длительный по времени (кто заменял — поймет). С помощью моей обработки все можно сделать автоматически, что, поверьте, гораздо веселее (например, для ЗУПа словарь замен составлял несколько десятков позиций, обработок в базе у меня было около 300 — попробуйте вручную все заменить, убьете полдня, а то и больше).

    Reply
  5. MaxS

    Поставил плюс, возьму для примера с чего оттолкнутся.

    С управляемыми формами работает? Текст модулей УФ меняет?

    Reply
  6. help1Ckr

    хорошая идея.Можно использовать для упрощения создания ВПФ

    Reply
  7. serega3333

    отличная вещь, когда-то тоже задумывался на этот счет, спасибо!

    Reply
  8. serg1983

    а для управляемого приложения есть такая же обработка, мне код интересен

    Reply
  9. nreisende

    (5)(8) С управляемыми формами пока не работает. Постараюсь сделать в ближайшее время и обновить публикацию.

    Reply
  10. Evil Beaver

    Делаю тот же функционал, но на базе http://infostart.ru/public/176775/. Подпишусь на тему. Если функционал будет востребован, продолжу, если нет — брошу

    Reply
  11. Evil Beaver

    Хаха! Вот же оно http://infostart.ru/public/182699/. Все что нужно, да еще и типовыми средствами.

    Reply
  12. nreisende

    (11) см. мой комментарий в посте (4), обращенный к (3).

    Reply
  13. Evil Beaver

    (12) да-да, безусловно для групповой замены типовые средства не подходят. Просто я про них вообще не знал, вот и обрадовался. Мне редко бывает нужно менять сразу много всего во внешних файлах.

    Ну и еще, как вариант, есть скрипты типа AutoIt, которые записывают нужные клики и типовыми средствами стопицот раз прогоняют нужную замену 😉

    Reply
  14. Pawlick

    Вопрос:

    а возможно ли с помощью этой утилиты заменить во внешней обработке макет?

    Reply
  15. Pawlick

    Или удалить его?

    Reply
  16. nreisende

    Добавил поддержку управляемых форм.

    (14) Pawlick, нет, изменить или удалить макет с помощью этой обработки нельзя. Рекомендую ознакомится с инструментами типа v8unpack для подобных целей.

    Reply
  17. Nordgreen

    подписался.

    Reply
  18. 7OH

    Спасибо. Приспособил к своей разработке ВЫПОЛНИТЬ. Теперь могу делать Выполнить() с отладкой.

    Reply
  19. Sabfir

    Жаль, что с помощью обработки нельзя заменить тип реквизита обработки и тип элементов на форме.

    Очень было бы полезно доработать это.

    Reply
  20. irreal

    Хорошая вещь, особенно когда у тебя несколько баз и франчи наплодили в них целый зверинец этого зла. Единственное, файлы могут также лежать в табчасти Принадлежность справочника (в УПП, по крайней мере, есть такая). Поэтому слегка дописал, выгрузка:

     // {CORRECTION 04.12.2015 12:35:45 Лазарев: файлы могут храниться в табчасти справочника
    // current:
    Если НЕ Метаданные.Справочники.ВнешниеОбработки.ТабличныеЧасти.Найти(«Принадлежность») = Неопределено Тогда
    Запрос.Текст =
    «ВЫБРАТЬ
    | Шапки.Ссылка,
    | Шапки.ВидОбработки,
    | ВЫБОР
    |  КОГДА Шапки.ВидОбработки = ЗНАЧЕНИЕ(Перечисление.ВидыДополнительныхВнешнихОбработок.Отчет)
    |   ТОГДА «».erf»»
    |  ИНАЧЕ «».epf»»
    | КОНЕЦ КАК Расширение,
    | Табчасти.НомерСтроки,
    | Табчасти.ХранилищеВнешнейОбработки
    |ИЗ
    | Справочник.ВнешниеОбработки.Принадлежность КАК Табчасти
    |  ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВнешниеОбработки КАК Шапки
    |  ПО Табчасти.Ссылка = Шапки.Ссылка»;
    
    Если Не ПустаяСтрока(ТекстГде) Тогда
    Запрос.Текст = Запрос.Текст + »
    |ГДЕ » + ТекстГде;
    КонецЕсли;
    
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
    
    ДвоичныеДанные = Выборка.ХранилищеВнешнейОбработки.Получить();
    Если ДвоичныеДанные = Неопределено Тогда
    Продолжить;
    КонецЕсли;
    ИмяФайла = ПутьКФайлу + «» + Выборка.Ссылка.УникальныйИдентификатор() + «$» + Формат(Выборка.НомерСтроки,»ЧГ=0″) + Выборка.Расширение;
    ДвоичныеДанные.Записать(ИмяФайла);
    
    КонецЦикла;
    
    КонецЕсли;
    // }CORRECTION 04.12.2015 12:35:45 Лазарев.
    

    Показать

    Загрузка:

       // {CORRECTION 04.12.2015 12:47:45 Лазарев:
    // current:
    ФайлИмяБезРасширения = СокрЛП(Файл.ИмяБезРасширения);
    поз = Найти(ФайлИмяБезРасширения,»$»);
    Если поз Тогда
    Ссылка = Справочники.ВнешниеОбработки.ПолучитьСсылку(Новый УникальныйИдентификатор(Лев(ФайлИмяБезРасширения, поз-1)));
    НомерСтроки = Число(Прав(ФайлИмяБезРасширения, СтрДлина(ФайлИмяБезРасширения) — поз));
    Ссылка = Справочники.ВнешниеОбработки.ПолучитьСсылку(Новый УникальныйИдентификатор(Файл.ИмяБезРасширения));
    Если Не ПустаяСтрока(Ссылка.ВерсияДанных) Тогда
    Обработка = Ссылка.ПолучитьОбъект();
    Обработка.Принадлежность[НомерСтроки-1].ХранилищеВнешнейОбработки = Новый ХранилищеЗначения(Новый ДвоичныеДанные(Файл.ПолноеИмя));
    Обработка.Записать();
    ЗагруженХотябыОдинФайл = Истина;
    Иначе
    Сообщить(«Ошибка загрузки файла (объект не найден): «+Файл.ПолноеИмя, СтатусСообщения.Важное);
    КонецЕсли;
    Продолжить;
    КонецЕсли;
    // }CORRECTION 04.12.2015 12:47:45 Лазарев.

    Показать

    Reply
  21. toypaul

    Управляемые формы некорректно разбирает. И на больших УФ к тому же еще и думает долго…

    Reply

Leave a Comment

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