Можно ли обратиться к документу и использовать его процедуры: подробное руководство

Программист 1С v8.3 (Обычные формы)
← На главную

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

Использование экспортных процедур в модуле объекта

Для того чтобы процедура или функция, написанная в модуле документа, стала доступна «снаружи» (из обработки, другого документа или общего модуля), она обязательно должна быть объявлена с ключевым словом Экспорт. Разберем по шагам, как получить доступ к такому методу.

Предположим, в модуле документа РеализацияТоваровУслуг есть следующая процедура:


Процедура РассчитатьСкидкиПокупателя() Экспорт
    // Логика расчета
    Сообщить("Скидки рассчитаны!");
КонецПроцедуры

Чтобы вызвать её из внешней обработки, нам сначала необходимо получить сам объект документа. Важно понимать разницу: ссылка на документ (ДокументСсылка) не предоставляет доступа к методам модуля объекта. Нам нужно преобразовать ссылку в объект (ДокументОбъект).

Рассмотрим пример кода для вызова:


// 1. Получаем ссылку на документ (например, из реквизита на форме)
СсылкаНаДокумент = Объект.ДокументСсылка;

// 2. Получаем объект документа
ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();

// 3. Вызываем экспортную процедуру через точку
ДокОбъект.РассчитатьСкидкиПокупателя();

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

Вызов процедур из модуля менеджера

Если логика процедуры не привязана к конкретным данным экземпляра документа (к его реквизитам в памяти), то правильнее размещать такие методы в модуле менеджера. Это значительно ускоряет работу системы.

Выясним преимущество: для обращения к модулю менеджера не нужно создавать объект. Достаточно обратиться к метаданным. Рассмотрим пример:


// В модуле менеджера документа РеализацияТоваровУслуг
Функция ПолучитьТекстЗаголовка() Экспорт
    Возврат "Продажа товаров";
КонецФункции

// Вызов из любого места системы:
Заголовок = Документы.РеализацияТоваровУслуг.ПолучитьТекстЗаголовка();

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

Работа с процедурами модуля формы

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

Разберем по шагам, как обратиться к методу формы:

  1. Процедура в форме должна иметь признак Экспорт.
  2. Необходимо получить экземпляр формы.
  3. Вызвать метод через точку от переменной формы.

Посмотрим на пример кода:


// Получаем форму документа
ФормаДокумента = СсылкаНаДокумент.ПолучитьФорму("ФормаДокумента");

// Если нужно, чтобы форма открылась пользователю
ФормаДокумента.Открыть();

// Вызываем экспортный метод формы
ФормаДокумента.ОбновитьЦветаСтрок();

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

Когда стоит выносить код в общие модули

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

Рассмотрим, как правильно организовать такой вызов:

  1. Создаем общий модуль (например, РаботаСДокументамиСервер).
  2. Устанавливаем флаги «Сервер» и «Вызов сервера».
  3. Помещаем туда процедуру, передавая в качестве параметра сам объект или ссылку.

// В общем модуле
Процедура РассчитатьСпецифику(ОбъектДокумента) Экспорт
    // Работаем с данными переданного объекта
    Если ОбъектДокумента.СуммаДокумента > 1000 Тогда
        // Логика
    КонецЕсли;
КонецПроцедуры

Теперь эту процедуру можно вызвать и из модуля документа, и из любой внешней обработки, передав туда ДокументОбъект.

Доступ к переменным модуля

Помимо процедур и функций, через точку можно обращаться и к переменным. Если в начале модуля объекта или модуля формы объявлена переменная с ключевым словом Экспорт, вы можете считывать и записывать её значение напрямую.


// В модуле документа
Перем ТекущийСтатусДоставки Экспорт;

// В обработке
ДокОбъект = Ссылка.ПолучитьОбъект();
ДокОбъект.ТекущийСтатусДоставки = "В пути";
ДокОбъект.Записать();

Технические ограничения и контекст выполнения

Проанализируем важные ограничения, с которыми можно столкнуться:

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

← На главную