Хранение модулей во внешних обработках. Меняем код без обновления конфигурации


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

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

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

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

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

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

Предусмотрен режим отладки (который должен быть доступен только разработчику), позволяющий отлаживать код подключаемых обработок.

Практическое применение данного механизма:

1. При добавлении нового функционала без возможности полноценного тестирования. В этом случае тестирование и отладка выполняется уже "на котиках" и часто бывает необходимость исправить ошибку "прямо сейчас".

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

3. В распределенной базе отпадает необходимость обновления в каждом узле. Изменения кода придут с обменом.

4. Когда заказчик сам не знает что хочет и каждый час просит что-то добавить или убрать. Появляется возможность неограниченное количество раз за день вносить изменения и демонстрировать результат.

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

и т.д.

Тестировалось на платформе 8.3.12.1685

19 Comments

  1. dsdred

    БСП: Дополнительные обработки и отчеты?

    Reply
  2. tjurikov_ivan

    А чем не устраивают расширения?

    Reply
  3. arslanov.rr

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

    Reply
  4. arslanov.rr

    (1) Не совсем. Я показал лишь основу, которую можно расширить для своих задач. БСП намного сложнее и объемнее

    Reply
  5. AnderWonder

    Код внешних обработок из файла загружается один раз при входе в систему или при каждом вызове процедуры/функции?

    Reply
  6. acsent

    код внешних обработок работает медленнее чем в конфигурации

    на итс есть сравнение

    Reply
  7. andrvyst

    https://its.1c.ru/db/metod8dev/content/5940/hdoc/_top/%D0%B2%D0%BD%D0%B5%D1­%88%D0%BD%D0%B8%D0%B5%20%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE­%D1%82%D0%BA%D0%B8

    Reply
  8. arslanov.rr

    (5) при каждом вызове. Поэтому любые ее изменения применяются сразу без необходимости перезапуска

    Reply
  9. arslanov.rr

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

    Reply
  10. AnderWonder

    (8) т.е. при каждом вызове будет выполнятся сначала чтение файла, затем компиляция модуля? ИМХО, весьма специфическое применение только возможно для такого варианта.

    Reply
  11. davdykin

    (7)Спасибо, не знал, что внешние обработки увеличивают в 1,5 раза время выполнения ). А так этот способ хорош, для низконагруженных механизмов, на распределенной базе, не надо делать постоянные обновления РИБа. Есть правда у этого способа серьезный минус, если вы привыкли быстро что-то искать по кодам модулей объектов (допустим текст ошибки или определение функции), то тут получается засада ))

    Reply
  12. arslanov.rr

    (10) решение предназначено не для увеличения производительности, а для повышения качества разработки на этапе внедрения. Очень неприятно когда до ночи что-то пишешь, встраиваешь в конфу, а с утра вылетает «поле объекта не обнаружено» и рабочий процесс встаёт. Во многих организациях час простоя может быть больше годовой годовой зарплаты и в этот момент уже не имеет значения 0.1 секунды выполняется ваш код или 0.15 из-за внешней обработки. На практике пользователь не видит никакой разницы по времени между выполнением кода из внешней обработки и из конфигурации (модули около 1,5-2 тысяч строк, клиент-серверный вариант). Не претендую на идеальность решения, но многих твой подход может избавить от лишних нервов и штрафов

    Reply
  13. arslanov.rr

    (11) согласен ) Ещё нельзя как в истории хранилища посмотреть разницу между обработками в режиме предприятия. Приходится выгружать несколько обработок и сравнивать в конфигураторе

    Reply
  14. Spartan

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

    Reply
  15. arslanov.rr

    (14) можете подсказать или скинуть ссылку на то, каким образом это делается?

    Reply
  16. SlavaKron

    (12) Можно использовать модуль с повторным использованием для получения ВнешнейОбработки. В качестве параметра передавать хеш файла или версию элемента справочника. У меня так реализованы внешние формы объектов.

    Reply
  17. Spartan

    (15) Запросто, смотрите скрин.

    Reply
  18. arslanov.rr

    (17) Это да, но меня интересовал вопрос можно ли это сделать в режиме предприятия, чтобы сравнивать 2 обработки, которые лежат в элементе справочника ) Похоже стандартных средств для этого нет

    Reply
  19. Spartan

    (18) Вот здесь посмотрите + комментарии и переходы по ссылкам. Возможно будет полезно.

    Reply

Leave a Comment

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