Как из модуля объекта обратиться к форме 1с
Перейти к содержимому

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

  • автор:

Шаблон кода: Как в 1С обратиться к элементу формы

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

Шаблон кода:

мМойДокумент = ЭтотОбъект.Ссылка.ПолучитьФорму(«ФормаДокумента»); // получаем форму документа
НашаПеременная = мМойДокумент.ЭлементыФормы.Дата.Значение; // передаем значение переменной

Для того чтобы обратиться к элементу формы из модуля формы документа:

Шаблон кода:

УПРАВЛЯЕМЫЕ ФОРМЫ

Для того чтобы обратиться к элементу формы из модуля формы документа:

Для того чтобы программно установить значение поля в табличной части документа в :

В данном случае при изменении поля ТекущаяДата происходит автозаполнение поля ОстатокОплаченыхДней.

Еще один пример — заполнение полей табличной части формы при начале редактирования:

Процедура ТабличнаяЧасть1ПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
ТекущаяДата = Формат (ТекущаяДата (), «ДФ=dd.MM.yyyy» );
Если НоваяСтрока И Не Копирование Тогда
Элемент.ТекущиеДанные.ТекущаяДата = ТекущаяДата;
Элемент.ТекущиеДанные.Комментарий = «наш комментарий»;
КонецЕсли;
КонецПроцедуры

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

Процедура ПриОткрытии(Отказ)
Реквизит1 = ПодсчетИтогаКассы();
КонецПроцедуры

Использование модуля объекта, модуля менеджера объекта и общих модулей

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

Методическая рекомендация (полезный совет)

1. Модуль объекта предназначен для реализации поведения отдельного экземпляра объекта ( СправочникОбъект , ДокументОбъект и т.п.). В модуле объекта размещаются процедуры и функции, которые работают с данными объекта ( ЭтотОбъект и переменные модуля объекта), в том числе когда он еще не записан в информационную базу.

Например, в модуле объекта могут размещаться:

  • обработчики событий объекта
  • процедуры заполнения экземпляра объекта.

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

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

  • относящиеся не к одному, а сразу к некоторой совокупности объектов. Например, это функции для вывода на печать списка объектов; функции, возвращающие информацию, общую для всех экземпляров объекта метаданных; процедуры обновления данных информационной базы, которые связаны с объектом метаданных; и т.п.
  • которые работают с объектом, записанным в ИБ. В таких функциях входным параметром является ссылка на объект. Например, это функции для получения печатной формы по ссылке на объект, процедуры формирования движений по ссылке на объект и т.п.

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

3. Если функциональность невозможно однозначно отнести к тому или иному объекту метаданных, то она является логически общей для нескольких объектов. В этом случае ее следует размещать в общем модуле .

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

При открытии формы нужно проверить новый ли документ.
На 8.1 было бы вот так:
//модуль формы
&НаКлиенте
Процедура ПриОткрытии(Отказ)
НовыйДокумент()
КонецПроцедуры

а что, так не работает?
Говорит что функция НовыйДокумент() не найдена
(0) Могу тебя расстроить, но в 8.1 было бы не так.
А в 8.2 проверять надо Параметры.Ключ
Defender aka LINN можно подробнее
(0) Соболезную, но это невозможно. Да и объясни сначала, зачем тебе это?

Блин, подло вру. Из модуля объект невозможно обратиться к модулю формы, а вот наоборот — вполне. В общем смотри: создал в модуле объекта документа функцию Получение, затем залез в модуль формы, вызвал сервер и пишу так:

естественно функция Получение объявлена с ключевым словом экспорт.

Если модуль формы и модуль объекта одного и того же документа, тогда достаточно:

Necessitudo, если документ еще не записан, то на него нет ссылки и Объект.Ссылка.ПолучитьОбъект() не работает. Нужно вызвать функцию из модуля объекта при открытии формы нового документа

Как из управляемой формы вызвать процедуру модуля объекта

Напрямую обратиться к процедурам модуля объекта из формы не получится. Связано это с тем, что прикладных объектов на клиенте нет, они существуют только на сервере. На клиенте доступны только специальные типы для отображения данных.

Общая схема вызова серверной процедуры/функции состоит из нескольких этапов:

  1. Вызов контекстной серверной процедуры формы;
  2. Преобразование основного реквизита формы в прикладной объект;
  3. Вызов экспортной процедуры/функции модуля объекта;
  4. Обратное преобразование прикладного объекта в реквизит формы.

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

Процедура модуля объекта документа для применения скидки:

Процедура ПрименитьСкидку ( ПроцентСкидки ) Экспорт
Для каждого СтрокаТЧ Из Товары Цикл
СтрокаТЧ . Цена = СтрокаТЧ . Цена — СтрокаТЧ . Цена / 100 * ПроцентСкидки ;
КонецЦикла;
КонецПроцедуры

Внимание!

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

На форме документа расположим кнопку, вызывающую серверную процедуру:
&НаКлиенте
Процедура ПересчитатьЦены ( Команда )

// Этап 1. Вызов серверной процедуры
ПересчитатьЦеныНаСервре ();

&НаСервере
Процедура ПересчитатьЦеныНаСервре ()

// Этап 2. Преобразование основного реквизита формы в прикладной объект
ДокументОбъект = РеквизитФормыВЗначение ( «Объект» );
// Этап 3. Вызов процедуры модуля объекта
ДокументОбъект . ПрименитьСкидку ( 5 );
// Этап 4. Обратное преобразование прикладного объекта в реквизит формы
ЗначениеВРеквизитФормы(ДокументОбъект , «Объект» );

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *