В процессе разработки на платформе 1С:Предприятие часто возникает задача динамического изменения бизнес-логики. Иногда это требуется для автоматизации внесения правок в сотни модулей, иногда — для реализации гибких настроек, которые невозможно предусмотреть заранее. В этой статье мы разберем, можно ли «переписать» код одного модуля из другого, какие инструменты для этого существуют и какие ограничения накладывает платформа.
На сегодняшний день наиболее правильным и безопасным способом изменения типового или существующего кода является использование Расширений. Это специальный механизм, который позволяет перехватывать управление, дополнять или полностью замещать логику процедур и функций, не снимая основную конфигурацию с поддержки.
Рассмотрим подробнее основные аннотации, которые позволяют управлять кодом:
ПродолжитьВызов().Этот метод является приоритетным, так как он поддерживается платформой штатно, не нарушает целостность базы данных и позволяет легко откатить изменения, просто отключив расширение.
Если задача стоит в массовом поиске и замене фрагментов кода во всей конфигурации (на манер СтрЗаменить), то наиболее эффективным путем будет использование механизма выгрузки/загрузки файлов. Проанализируем этот алгоритм по шагам:
/DumpConfigToFiles.ТекстовыйДокумент) для обхода всех файлов в каталоге./LoadConfigFromFiles.Этот способ позволяет реализовать сколь угодно сложную логику «переписывания» кода, включая регулярные выражения и структурный анализ текста.
Если вам не нужно менять сам текст модуля в конфигураторе, а требуется лишь выполнить произвольный алгоритм «на лету», в 1С существуют операторы Выполнить и Вычислить. Разберем разницу между ними.
Оператор Выполнить предназначен для исполнения фрагмента кода, состоящего из одной или нескольких инструкций. Посмотрим на пример:
КодДляВыполнения = "
|Если Склад.Тип = Перечисления.ТипыСкладов.Оптовый Тогда
| Скидка = 10;
|Иначе
| Скидка = 5;
|КонецЕсли;";
Выполнить(КодДляВыполнения);
Оператор Вычислить используется для получения значения выражения. Например:
Результат = Вычислить("Справочники.Номенклатура.НайтиПоКоду(""001"")");
Важно помнить, что эти методы работают медленнее скомпилированного кода и могут быть заблокированы в безопасном режиме или профилями безопасности на сервере 1С.
Один из самых продвинутых методов подмены логики без изменения основной конфигурации — это программное создание внешней обработки. Выясним, как это работает. Мы можем программно сформировать текст модуля объекта внешней обработки, сохранить его в файл .epf и тут же подключить его в систему.
Пример реализации такой схемы:
ТекстМодуля = "
|Процедура ВыполнитьДействие() Экспорт
| Сообщить(""Код выполнен динамически!"");
|КонецПроцедуры";
ОбъектТекст = Новый ТекстовыйДокумент;
ОбъектТекст.УстановитьТекст(ТекстМодуля);
ПутьКФайлу = КаталогВременныхФайлов() + "DynamicHandler.epf";
// Здесь должен быть код формирования двоичных данных обработки,
// обычно используется шаблон пустой обработки, в которую вставляется текст модуля.
// ...
Обработка = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
Обработка.ВыполнитьДействие();
Такой подход часто используется в универсальных инструментах разработчика для временного исполнения сложных алгоритмов, требующих контекста серверного вызова.
В современных конфигурациях, построенных на базе Библиотеки Стандартных Подсистем (БСП), предусмотрены специальные модули с суффиксом Переопределяемый (например, ОбщегоНазначенияПереопределяемый). Архитектура системы спроектирована так, что в ключевых точках типового кода вызываются процедуры из этих модулей. Программист может «вклиниться» в работу системы, просто добавив свой код в эти заранее подготовленные места, что исключает необходимость править основной код платформы.
Проанализируем причину, по которой нельзя просто «подправить» текст модуля в оперативной памяти во время работы пользователя. Платформа 1С работает по принципу прекомпиляции:
Config в SQL), где хранится текст модулей, не приведет к немедленному изменению поведения системы, так как сервер будет продолжать использовать старый байт-код из своего кэша.Важное предостережение: Прямая запись в таблицу Config через SQL-запросы крайне опасна. Это может привести к повреждению структуры конфигурации и полной неработоспособности базы данных. Все изменения должны производиться только через штатные механизмы (Конфигуратор, расширения или COM-соединение).
Если ваша цель — изменить логику в рамках внедрения, используйте расширения. Если вам нужно автоматизировать процесс правки кода в сотнях баз, рассмотрите вариант с выгрузкой в XML. Для динамического исполнения небольших фрагментов кода идеально подходят операторы Выполнить и Вычислить. Выбор конкретного инструмента зависит от поставленной задачи, но всегда стоит помнить о производительности и безопасности системы.