Как программно изменить или «переписать» исходный код модулей в 1С:Предприятие 8

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Использование механизма расширений конфигурации

На сегодняшний день наиболее правильным и безопасным способом изменения типового или существующего кода является использование Расширений. Это специальный механизм, который позволяет перехватывать управление, дополнять или полностью замещать логику процедур и функций, не снимая основную конфигурацию с поддержки.

Рассмотрим подробнее основные аннотации, которые позволяют управлять кодом:

  1. &Вместо — полностью замещает процедуру или функцию. Внутри можно вызвать оригинальный метод, используя ПродолжитьВызов().
  2. &Перед — позволяет выполнить ваш код до начала работы оригинального алгоритма.
  3. &После — ваш код выполнится сразу после завершения основной процедуры.
  4. &ИзменениеИКонтроль — позволяет точечно менять фрагменты кода внутри больших функций, контролируя целостность структуры.

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

Автоматизация правок через выгрузку конфигурации в XML

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

  1. Выгрузим конфигурацию в файлы формата XML и текстовые документы с помощью параметров командной строки: /DumpConfigToFiles.
  2. Используем внешний скрипт (например, на Python или самой 1С через ТекстовыйДокумент) для обхода всех файлов в каталоге.
  3. Произведем программную замену нужных строк в файлах модулей (файлы с расширением .bsl).
  4. Загрузим измененные файлы обратно в конфигурацию через /LoadConfigFromFiles.
  5. Выполним обновление конфигурации базы данных.

Этот способ позволяет реализовать сколь угодно сложную логику «переписывания» кода, включая регулярные выражения и структурный анализ текста.

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

Если вам не нужно менять сам текст модуля в конфигураторе, а требуется лишь выполнить произвольный алгоритм «на лету», в 1С существуют операторы Выполнить и Вычислить. Разберем разницу между ними.

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


КодДляВыполнения = "
|Если Склад.Тип = Перечисления.ТипыСкладов.Оптовый Тогда
|    Скидка = 10;
|Иначе
|    Скидка = 5;
|КонецЕсли;";
Выполнить(КодДляВыполнения);

Оператор Вычислить используется для получения значения выражения. Например:

Результат = Вычислить("Справочники.Номенклатура.НайтиПоКоду(""001"")");

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

Динамическая генерация внешних обработок

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

Пример реализации такой схемы:


ТекстМодуля = "
|Процедура ВыполнитьДействие() Экспорт
|    Сообщить(""Код выполнен динамически!"");
|КонецПроцедуры";

ОбъектТекст = Новый ТекстовыйДокумент;
ОбъектТекст.УстановитьТекст(ТекстМодуля);
ПутьКФайлу = КаталогВременныхФайлов() + "DynamicHandler.epf";
// Здесь должен быть код формирования двоичных данных обработки, 
// обычно используется шаблон пустой обработки, в которую вставляется текст модуля.
// ...
Обработка = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
Обработка.ВыполнитьДействие();

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

Механизм переопределяемых модулей в БСП

В современных конфигурациях, построенных на базе Библиотеки Стандартных Подсистем (БСП), предусмотрены специальные модули с суффиксом Переопределяемый (например, ОбщегоНазначенияПереопределяемый). Архитектура системы спроектирована так, что в ключевых точках типового кода вызываются процедуры из этих модулей. Программист может «вклиниться» в работу системы, просто добавив свой код в эти заранее подготовленные места, что исключает необходимость править основной код платформы.

Ограничения и особенности компиляции

Проанализируем причину, по которой нельзя просто «подправить» текст модуля в оперативной памяти во время работы пользователя. Платформа 1С работает по принципу прекомпиляции:

Важное предостережение: Прямая запись в таблицу Config через SQL-запросы крайне опасна. Это может привести к повреждению структуры конфигурации и полной неработоспособности базы данных. Все изменения должны производиться только через штатные механизмы (Конфигуратор, расширения или COM-соединение).

Резюме по методам решения

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

← На главную