Как обратиться к коду в модуле объекта из модуля формы в 1С?

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

При разработке конфигураций на платформе 1С часто возникает задача переиспользования логики расчета, которая уже реализована в Модуле объекта. Начинающие разработчики часто сталкиваются с ошибкой «Переменная не определена», пытаясь напрямую вызвать локальную переменную или процедуру. Давайте разберем, почему это происходит и как правильно организовать архитектуру взаимодействия между модулями.

Понимание областей видимости модулей

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

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

Реализация расчета себестоимости

Рассмотрим, как правильно организовать функцию для получения себестоимости. Для того чтобы метод был доступен вне Модуля объекта, объявим его как экспортную функцию:


&НаСервере
Функция ПолучитьСтоимость(Номенклатура) Экспорт
    Стоимость = 0;
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	СтоимостьОстаток.СтоимостьОстаток КАК Сумма,
        |	ЕСТЬNULL(КоличествоОстаток.КоличествоОстаток, 0) КАК Кво
        |ИЗ
        |	РегистрНакопления.СтоимостьМатериалов.Остатки(, Товар = &Номенклатура) КАК СтоимостьОстаток
        |	ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(, Товар = &Номенклатура) КАК КоличествоОстаток
        |	ПО СтоимостьОстаток.Товар = КоличествоОстаток.Товар";
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() И Выборка.Кво <> 0 Тогда
        Стоимость = Выборка.Сумма / Выборка.Кво;
    КонецЕсли;
    
    Возврат Стоимость;
КонецФункции

Вызов серверной логики из модуля формы

Чтобы воспользоваться данным методом из формы, мы должны понимать, где именно мы находимся. В управляемых формах вызов серверных функций из Модуля формы осуществляется через прямое обращение к методам объекта или через Общие модули. Рассмотрим вариант вызова через метод РеквизитФормыВЗначение, хотя помните, что это ресурсоемкая операция:


&НаКлиенте
Процедура ПереченьНоменклатурыПриИзменении(Элемент)
    ТекущиеДанные = Элементы.ПереченьНоменклатуры.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        ТекущиеДанные.Стоимость = ВычислитьСтоимостьНаСервере(ТекущиеДанные.Номенклатура);
    КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ВычислитьСтоимостьНаСервере(Номенклатура)
    ОбъектНаФорме = РеквизитФормыВЗначение("Объект");
    Возврат ОбъектНаФорме.ПолучитьСтоимость(Номенклатура);
КонецФункции

Рекомендации по архитектуре

Хотя вызов РеквизитФормыВЗначение работает, он не всегда является оптимальным решением с точки зрения производительности, так как каждый раз создается объект документа целиком. Рассмотрим более профессиональные подходы:

  1. Общие модули: Это «золотой стандарт» разработки в 1С. Вынесите функцию расчета в Общий модуль с установленным флагом «Вызов сервера». Это позволит обращаться к расчету из любой точки системы без создания лишних объектов.
  2. Блокировки данных: Помните, что расчет себестоимости через Запрос к остаткам в режиме проведения документа должен сопровождаться блокировками данных, чтобы избежать «грязного чтения» и ошибок при одновременной работе нескольких пользователей.
  3. Актуальность данных: Расчет, выполненный на форме, является лишь справочным. Данные в регистрах могут меняться, поэтому не используйте этот результат как «истину в последней инстанции» для проведения документа, если не реализован механизм пересчета при записи.

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

← На главную