Как реализовать общую библиотеку функций во внешних файлах 1С без изменения конфигурации?

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

При разработке на платформе 1С:Предприятие 8.3 часто возникает ситуация, когда необходимо создать несколько внешних обработок, использующих идентичные алгоритмы. Дублирование кода (Copy-Paste) — это плохая практика, ведущая к сложностям при поддержке и обновлении функционала. Желание вынести общие функции в отдельный файл («библиотеку») абсолютно логично. Рассмотрим подробнее, как это можно реализовать, не внося изменений в основную конфигурацию базы данных.

Метод 1. Внешняя обработка как контейнер функций

Наиболее популярный и простой способ — создание отдельной внешней обработки (файла .epf), которая будет выступать в роли библиотеки. В этом методе мы не используем формы обработки, а используем только её программный модуль.

Шаг 1. Создание библиотеки

Разберем, как подготовить файл-библиотеку. Создадим новую внешнюю обработку и назовем её, например, БиблиотекаФункций.epf. Перейдем в Модуль объекта этой обработки. Это критически важный момент: функции должны располагаться именно в модуле объекта, чтобы к ним можно было обратиться после программного создания экземпляра обработки без открытия интерфейсных окон.

В модуле объекта напишем наши функции, обязательно добавляя ключевое слово Экспорт:


Функция РассчитатьСуммуНДС(Сумма, Ставка) Экспорт
    Результат = Сумма * Ставка / 100;
    Возврат Результат;
КонецФункции

Процедура ВывестиСообщениеПользователю(Текст) Экспорт
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = Текст;
    Сообщение.Сообщить();
КонецПроцедуры

Шаг 2. Вызов функций из другой обработки

Теперь выясним, как вызвать эти функции из вашей основной обработки. Для этого нам понадобится метод ВнешниеОбработки.Создать(). Проанализируем пример кода:


// Укажите путь к файлу библиотеки на диске
ПутьКБиблиотеке = "C:\1C_Scripts\БиблиотекаФункций.epf";

// Создаем объект внешней обработки
Библиотека = ВнешниеОбработки.Создать(ПутьКБиблиотеке, Ложь);

// Вызываем экспортную функцию
СуммаНДС = Библиотека.РассчитатьСуммуНДС(1000, 20);

// Вызываем экспортную процедуру
Библиотека.ВывестиСообщениеПользователю("Расчет окончен. НДС: " + СуммаНДС);

Обратите внимание на второй параметр метода Создать() — БезопасныйРежим. Если передать Истина, возможности кода внутри библиотеки могут быть ограничены платформой (например, запрещена работа с файловой системой).

Метод 2. Интеграция с подсистемой «Дополнительные отчеты и обработки» (БСП)

Если в вашей конфигурации используется Библиотека стандартных подсистем (БСП), то внешние обработки обычно хранятся не на диске, а непосредственно в базе данных (в справочнике ДополнительныеОтчетыИОбработки). Рассмотрим, как работать в этой ситуации.

В типовых решениях (например, 1С:ERP, УТ 11, БП 3.0) есть специальный программный интерфейс для работы с такими объектами. Вместо прямого указания пути к файлу мы будем использовать ссылку на элемент справочника.


// Предположим, мы нашли ссылку на нашу обработку-библиотеку по наименованию
СсылкаНаБиблиотеку = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("БиблиотекаОбщихФункций");

// Используем метод БСП для получения объекта
ОбъектБиблиотеки = ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(СсылкаНаБиблиотеку);

// Теперь можно вызывать функции
ОбъектБиблиотеки.МояОбщаяПроцедура();

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

Метод 3. Имитация директивы Include через «Выполнить()»

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

Разберем алгоритм по шагам:

  1. Прочитать содержимое текстового файла в строковую переменную.
  2. Использовать встроенную функцию Выполнить() для исполнения этого кода.

ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать("C:\1C_Scripts\MyLibrary.txt");
КодБиблиотеки = ТекстовыйДокумент.ПолучитьТекст();

// Выполняем код, который определит функции в текущем контексте
Выполнить(КодБиблиотеки);

// Теперь функции из файла доступны для вызова в этом же методе
Результат = МояФункцияИзФайла();

Важное ограничение: функции, объявленные внутри Выполнить(), будут доступны только в пределах того метода (процедуры или функции), где был вызван этот оператор. Это не совсем удобно для глобальной библиотеки, но отлично подходит для динамической подгрузки алгоритмов.

Оптимизация производительности и кэширование

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

Рекомендуем использовать кэширование объекта библиотеки. Посмотрим, как это реализовать в рамках модуля формы внешней обработки:


&НаКлиенте
Перем КэшБиблиотеки; // Глобальная переменная модуля формы

&НаКлиенте
Функция ПолучитьБиблиотеку()
    Если КэшБиблиотеки = Неопределено Тогда
        // Инициализируем один раз
        Путь = "C:\Lib.epf";
        КэшБиблиотеки = ВнешниеОбработки.Создать(Путь, Ложь);
    КонецЕсли;
    Возврат КэшБиблиотеки;
КонецФункции

&НаКлиенте
Процедура ВыполнитьДействие()
    Библиотека = ПолучитьБиблиотеку();
    Библиотека.НужнаяФункция();
КонецПроцедуры

Особенности работы на сервере и клиенте

При использовании внешних файлов необходимо четко понимать, в каком контексте исполняется код. Рассмотрим основные нюансы:

Подводя итог, можно сказать, что механизм внешних обработок является мощным инструментом для создания модульных систем в 1С. Вынесение логики в отдельную «библиотечную» обработку позволяет соблюдать принципы DRY (Don't Repeat Yourself) даже в условиях, когда изменять основную конфигурацию запрещено регламентом или техническими ограничениями.

← На главную