В процессе разработки в среде 1С:Предприятие 8 (например, в УПП или других конфигурациях) часто возникает необходимость использовать программный код, который уже написан внутри модуля документа. Вместо того чтобы дублировать код в обработку или другой объект, правильнее будет вызвать существующий метод. В этой статье мы подробно разберем, как это сделать, какие существуют ограничения и как оптимизировать этот процесс.
Для того чтобы процедура или функция, написанная в модуле документа, стала доступна «снаружи» (из обработки, другого документа или общего модуля), она обязательно должна быть объявлена с ключевым словом Экспорт. Разберем по шагам, как получить доступ к такому методу.
Предположим, в модуле документа РеализацияТоваровУслуг есть следующая процедура:
Процедура РассчитатьСкидкиПокупателя() Экспорт
// Логика расчета
Сообщить("Скидки рассчитаны!");
КонецПроцедуры
Чтобы вызвать её из внешней обработки, нам сначала необходимо получить сам объект документа. Важно понимать разницу: ссылка на документ (ДокументСсылка) не предоставляет доступа к методам модуля объекта. Нам нужно преобразовать ссылку в объект (ДокументОбъект).
Рассмотрим пример кода для вызова:
// 1. Получаем ссылку на документ (например, из реквизита на форме)
СсылкаНаДокумент = Объект.ДокументСсылка;
// 2. Получаем объект документа
ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();
// 3. Вызываем экспортную процедуру через точку
ДокОбъект.РассчитатьСкидкиПокупателя();
Проанализируем ситуацию: при выполнении метода ПолучитьОбъект() система считывает все данные документа из базы данных (включая все табличные части) и создает в оперативной памяти «тяжелую» структуру. Если ваша процедура не требует данных самого документа (например, это просто общая математическая функция), такой подход будет крайне неэффективным с точки зрения производительности.
Если логика процедуры не привязана к конкретным данным экземпляра документа (к его реквизитам в памяти), то правильнее размещать такие методы в модуле менеджера. Это значительно ускоряет работу системы.
Выясним преимущество: для обращения к модулю менеджера не нужно создавать объект. Достаточно обратиться к метаданным. Рассмотрим пример:
// В модуле менеджера документа РеализацияТоваровУслуг
Функция ПолучитьТекстЗаголовка() Экспорт
Возврат "Продажа товаров";
КонецФункции
// Вызов из любого места системы:
Заголовок = Документы.РеализацияТоваровУслуг.ПолучитьТекстЗаголовка();
Этот метод работает быстрее и потребляет меньше ресурсов, так как системе не приходится блокировать запись в базе и выкачивать данные табличных частей.
Иногда требуется вызвать процедуру, которая отвечает за визуальное отображение или специфическое поведение интерфейса, находящуюся в модуле формы. Здесь логика доступа меняется.
Разберем по шагам, как обратиться к методу формы:
Экспорт.Посмотрим на пример кода:
// Получаем форму документа
ФормаДокумента = СсылкаНаДокумент.ПолучитьФорму("ФормаДокумента");
// Если нужно, чтобы форма открылась пользователю
ФормаДокумента.Открыть();
// Вызываем экспортный метод формы
ФормаДокумента.ОбновитьЦветаСтрок();
Важный нюанс: если документ уже открыт у пользователя на экране, и вы программно вызываете ПолучитьФорму(), система может создать новый экземпляр формы в памяти, который не связан с тем, что видит пользователь. Для взаимодействия с уже открытыми формами используются другие механизмы (например, оповещения или поиск в глобальном списке открытых окон).
Если вы понимаете, что процедуру из документа приходится копировать в обработку или часто вызывать из разных мест, это явный сигнал к тому, что код нужно перенести в общий модуль. Это соответствует стандартам разработки «1С».
Рассмотрим, как правильно организовать такой вызов:
РаботаСДокументамиСервер).
// В общем модуле
Процедура РассчитатьСпецифику(ОбъектДокумента) Экспорт
// Работаем с данными переданного объекта
Если ОбъектДокумента.СуммаДокумента > 1000 Тогда
// Логика
КонецЕсли;
КонецПроцедуры
Теперь эту процедуру можно вызвать и из модуля документа, и из любой внешней обработки, передав туда ДокументОбъект.
Помимо процедур и функций, через точку можно обращаться и к переменным. Если в начале модуля объекта или модуля формы объявлена переменная с ключевым словом Экспорт, вы можете считывать и записывать её значение напрямую.
// В модуле документа
Перем ТекущийСтатусДоставки Экспорт;
// В обработке
ДокОбъект = Ссылка.ПолучитьОбъект();
ДокОбъект.ТекущийСтатусДоставки = "В пути";
ДокОбъект.Записать();
Проанализируем важные ограничения, с которыми можно столкнуться:
Экспорт, вызвать её через точку невозможно. В этом случае код придется либо менять (добавлять экспорт), либо копировать в свою разработку.&НаКлиенте нельзя вызвать из серверного кода.ПолучитьОбъект() — это нагрузка на сервер и базу данных. Всегда задавайтесь вопросом: можно ли решить задачу через запрос или через модуль менеджера?Таким образом, мы выяснили, что обращаться к процедурам документа можно и нужно, если это оправдано архитектурой. Главное — соблюдать правила экспортности методов и следить за тем, в каком контексте (форма, объект или менеджер) находится нужная вам логика.