При разработке на платформе 1С:Предприятие 8.3 часто возникает ситуация, когда необходимо создать несколько внешних обработок, использующих идентичные алгоритмы. Дублирование кода (Copy-Paste) — это плохая практика, ведущая к сложностям при поддержке и обновлении функционала. Желание вынести общие функции в отдельный файл («библиотеку») абсолютно логично. Рассмотрим подробнее, как это можно реализовать, не внося изменений в основную конфигурацию базы данных.
Наиболее популярный и простой способ — создание отдельной внешней обработки (файла .epf), которая будет выступать в роли библиотеки. В этом методе мы не используем формы обработки, а используем только её программный модуль.
Шаг 1. Создание библиотеки
Разберем, как подготовить файл-библиотеку. Создадим новую внешнюю обработку и назовем её, например, БиблиотекаФункций.epf. Перейдем в Модуль объекта этой обработки. Это критически важный момент: функции должны располагаться именно в модуле объекта, чтобы к ним можно было обратиться после программного создания экземпляра обработки без открытия интерфейсных окон.
В модуле объекта напишем наши функции, обязательно добавляя ключевое слово Экспорт:
Функция РассчитатьСуммуНДС(Сумма, Ставка) Экспорт
Результат = Сумма * Ставка / 100;
Возврат Результат;
КонецФункции
Процедура ВывестиСообщениеПользователю(Текст) Экспорт
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = Текст;
Сообщение.Сообщить();
КонецПроцедуры
Шаг 2. Вызов функций из другой обработки
Теперь выясним, как вызвать эти функции из вашей основной обработки. Для этого нам понадобится метод ВнешниеОбработки.Создать(). Проанализируем пример кода:
// Укажите путь к файлу библиотеки на диске
ПутьКБиблиотеке = "C:\1C_Scripts\БиблиотекаФункций.epf";
// Создаем объект внешней обработки
Библиотека = ВнешниеОбработки.Создать(ПутьКБиблиотеке, Ложь);
// Вызываем экспортную функцию
СуммаНДС = Библиотека.РассчитатьСуммуНДС(1000, 20);
// Вызываем экспортную процедуру
Библиотека.ВывестиСообщениеПользователю("Расчет окончен. НДС: " + СуммаНДС);
Обратите внимание на второй параметр метода Создать() — БезопасныйРежим. Если передать Истина, возможности кода внутри библиотеки могут быть ограничены платформой (например, запрещена работа с файловой системой).
Если в вашей конфигурации используется Библиотека стандартных подсистем (БСП), то внешние обработки обычно хранятся не на диске, а непосредственно в базе данных (в справочнике ДополнительныеОтчетыИОбработки). Рассмотрим, как работать в этой ситуации.
В типовых решениях (например, 1С:ERP, УТ 11, БП 3.0) есть специальный программный интерфейс для работы с такими объектами. Вместо прямого указания пути к файлу мы будем использовать ссылку на элемент справочника.
// Предположим, мы нашли ссылку на нашу обработку-библиотеку по наименованию
СсылкаНаБиблиотеку = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("БиблиотекаОбщихФункций");
// Используем метод БСП для получения объекта
ОбъектБиблиотеки = ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(СсылкаНаБиблиотеку);
// Теперь можно вызывать функции
ОбъектБиблиотеки.МояОбщаяПроцедура();
Этот способ гораздо надежнее, так как исключает зависимость от файловой структуры конкретного компьютера или сервера.
В языке 1С нет прямой поддержки вставки кода из внешних файлов через #include, как в C++ или PHP. Однако мы можем имитировать это поведение. Посмотрим на пример ситуации, когда код функций хранится в обычном текстовом файле.
Разберем алгоритм по шагам:
Выполнить() для исполнения этого кода.
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать("C:\1C_Scripts\MyLibrary.txt");
КодБиблиотеки = ТекстовыйДокумент.ПолучитьТекст();
// Выполняем код, который определит функции в текущем контексте
Выполнить(КодБиблиотеки);
// Теперь функции из файла доступны для вызова в этом же методе
Результат = МояФункцияИзФайла();
Важное ограничение: функции, объявленные внутри Выполнить(), будут доступны только в пределах того метода (процедуры или функции), где был вызван этот оператор. Это не совсем удобно для глобальной библиотеки, но отлично подходит для динамической подгрузки алгоритмов.
Проанализируем ситуацию: метод ВнешниеОбработки.Создать() — это достаточно тяжелая операция. Платформа должна считать файл, проверить его структуру и инициализировать объект. Если вы вызываете библиотеку внутри цикла (например, при обработке тысяч строк документа), производительность системы значительно снизится.
Рекомендуем использовать кэширование объекта библиотеки. Посмотрим, как это реализовать в рамках модуля формы внешней обработки:
&НаКлиенте
Перем КэшБиблиотеки; // Глобальная переменная модуля формы
&НаКлиенте
Функция ПолучитьБиблиотеку()
Если КэшБиблиотеки = Неопределено Тогда
// Инициализируем один раз
Путь = "C:\Lib.epf";
КэшБиблиотеки = ВнешниеОбработки.Создать(Путь, Ложь);
КонецЕсли;
Возврат КэшБиблиотеки;
КонецФункции
&НаКлиенте
Процедура ВыполнитьДействие()
Библиотека = ПолучитьБиблиотеку();
Библиотека.НужнаяФункция();
КонецПроцедуры
При использовании внешних файлов необходимо четко понимать, в каком контексте исполняется код. Рассмотрим основные нюансы:
НаСервере, то путь C:\MyFiles\lib.epf будет искаться на сервере, где запущена служба 1С:Предприятие. Серверный пользователь может не иметь прав на эту папку.ПоместитьВоВременноеХранилище на клиенте, а на сервере создавать объект из этого хранилища методом ВнешниеОбработки.Создать(АдресВХранилище).Создать() может быть запрещен или ограничен. В таких случаях единственным вариантом остается использование расширений конфигурации (если режим совместимости позволяет).Подводя итог, можно сказать, что механизм внешних обработок является мощным инструментом для создания модульных систем в 1С. Вынесение логики в отдельную «библиотечную» обработку позволяет соблюдать принципы DRY (Don't Repeat Yourself) даже в условиях, когда изменять основную конфигурацию запрещено регламентом или техническими ограничениями.