1С 8.3 Вызов процедур или функций из модуля объекта в модуле формы — Программист 1С Минск. Автоматизация бизнеса.
1С 8.3 Вызов процедур или функций из модуля объекта в модуле формы

&НаСервере
Процедура Вызов_из_модуля_объекта ()
// сперва получаем объект:
ДокОбъект = РеквизитФормыВЗначение ( «Объект» );
ДокОбъект . ПроцедураМодуляОбъектаЭкспортная ();
//.
// примечание:
// если у разных объектов, например: два документа и надо в форму одного документа вызвать процедуру из другого документа,
// то в этом случаи надо процедуру помещать в модуль менеджера и вызывать ее как Документы.НазваниеДокумента.НазваниеПроцедуры
// соответственно все вызовы на сервере
Как в Модуле Формы вызвать процедуру из Модуля Объекта?
(17)
2. Модуль менеджера объекта предназначен для размещения "статической" функциональности, которая логически неразрывно связана с объектом метаданных, но не зависит от состояния конкретного экземпляра объекта данных. Это могут быть процедуры и функции:
относящиеся не к одному, а сразу к некоторой совокупности объектов. Например, это функции для вывода на печать списка объектов; функции, возвращающие информацию, общую для всех экземпляров объекта метаданных; процедуры обновления данных информационной базы, которые связаны с объектом метаданных; и т.п.
которые работают с объектом, записанным в ИБ. В таких функциях входным параметром является ссылка на объект. Например, это функции для получения печатной формы по ссылке на объект, процедуры формирования движений по ссылке на объект и т.п.
Для выполнения функций модуля менеджера объекта не должен требоваться экземпляр объекта данных (СправочникОбъект, ДокументОбъект и т.п.).
>Проще говоря методы для расширения функционала менеджера объекта
щито? сам себя расширяет? ловите его
(26) так учись, читая буквари. где сначала учат про упр. приложение и обычное
если оно управляемое то в в (13) написана хрень и делать надо (8), убрав бредни типа "#Если Клиент Тогда"
И я бы не стал писать док.флаг = истина,
Я бы написал:
если док.флаг тогда
(Разумеется если он булево)
(32) а если не булево? Тогда бы
>читать одно, понимать и применять на практике — другое.
метод научного тыка удлиняет путь в понимании 1с. это уже не 7.7
//в модуле формы
&НаКлиенте
Процедура МояПроцедураКлиент()
//все в том же модуле формы
&НаСервере
Процедура МояПроцедураСервер()
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.МояПроцедураВМодулеОбъекта();
ЗначениеВРеквизитФормы(ОбработкаОбъект,"Объект")
// Процедура в модуле объекта
&НаСервере
Процедура МояПроцедураВМодулеОбъекта() Экспорт
Такая рыба, что рыбее не бывает.
(46) Смотрел. И ни в одной из них не видел методов работающих с одним экземпляром объекта. Просто общих процедур тоже не заметил, все относятся именно к этому. эм. Хотел написать "классу", но у нас же не ООП. К этому виду объектов.
Все экспортные процедуры модуля менеджера так или иначе относятся к расширении функционала менеджера объектов этого вида.
Само название этого модуля в терминологии 1с вам ни о чем не говорит, нет? Может у вас есть примеры, где используется не так, как я описываю?
(47) видимо уже исходный посыл потерялся.
смотрим всю переписку. что было написано в (0)
> Есть процедура [skip].
> Ее необходимо вызвать в определенный момент из модуля формы.
в (3)
> Потому что не нужно такое делать. Для этого есть модуль менеджера
в (9) ваш вывод:
> Модуль менеджера не для этого
С чего сделан такой вывод? Как следует из приведенной цитаты, что из модуля формы объекта нельзя использовать процедуры из модуля менеджера?
2. какие типовые смотрели, какие документы? нигде не вызываются процедуры модуля менеджера?
поищите комментарий // ПРОГРАММНЫЙ ИНТЕРФЕЙС
либо #Область ПрограммныйИнтерфейс
а про ООП задвигать не надо, цитата из (47)
> . но у нас же не ООП
Объект и коллекция, его имитирующая, две большие разницы. Для них даже гипотетически трудно представить общий класс, чтобы в нем разместить какие-то функции заполнения, например.
Т.е. в прынцыпе-ООП, такие функции должны размещаться в модуле объекта. Но в 1С оптимальнее делать через модуль менеджера, что есть, конечно, чистой воды утинная типизация. Можно начать с того, что коллекция на форме может тупо не содержать всех полей настоящего объекта.
(32), (34)
А если не булево, то в условии будет проверка на пустое значение:
Если Док.Контрагент Тогда
Если Док.Флаг Тогда
(55) Если Док.Флаг Тогда
здесь отсутствует проверка на Неопределено и на Null. То есть дополнительно всякой херней придется заниматься.
А Если Док.Флаг = Истина Тогда
проверяет только, было присваивание в истину или не было, что и нужно в 95% случаев. То есть программе по барабану, Док.Флаг = Неопределено или Ложь. Тогда применяем этот вариант.
bool? flag = true;
if (flag.GetValueOrDefault())
<
//.
>
(59) 1. На создание экземпляра объекта и обратное преобразование тратится время.
2. После обратного преобразования нужно заново заполнять реквизиты формы, добавленные в объект — если добавил колонку с остатком, к примеру, в табличную часть — после преобразования она очистится.
В модуле ОБЪЕКТА должны быть только те процедуры, которые использует ОБЪЕКТ. В управляемой форме у вас объекта нет.
(60) Ясно. Замер производительности стало быть вы не проводили.
> 1. На создание экземпляра объекта и обратное преобразование тратится время.
> 2. После обратного преобразования нужно заново заполнять реквизиты формы, добавленные в объект — если добавил колонку с остатком, к примеру, в табличную часть — после преобразования она очистится.
Вы разработчик платформы, чтобы знать такие интимные подробности? Откуда вам знать как и что платформа делает с вашими объектами? Может экземпляр всегда существует, а структура в форме является всего лишь оберткой поверх него, вы об этом не думали, нет?
> В модуле ОБЪЕКТА должны быть только те процедуры, которые использует ОБЪЕКТ.
Ну так и размещайте эти методы в модуле объекта, а не используйте модуль менеджера как его замену ПАТАМУШТА ЗЛЫЕ АДИНЭСНИКИ ПЕРДЕЛАЛИ ВСЕ НИ ДАЮТ МИНЕ ИСПОЛЬЗОВАТЬ АБЪЕКТ БЕЗ ДАПАЛНИТЕЛЬНЫХ СТРОЧЕК.
(65) зачем так нервничать уважаемый?
chudishe — мне тут на собеседовании задвинули, что описанный в (8) метод работы самый правильный. Пришлось культурно объяснить, где я видал их понимание распределения процедур/функций по модулям 1С и отправиться на другую фирму.
Модуль объекта (в методике 8) — контекстный вызов сервера +конвертация Форма-Объект +работа самой процедуры +конвертация Объект-Форма +возможно, какие-то действия с формой.
Модуль менеджера — внеконтекстный вызов сервера для работы процедуры/функции +возможно, какие-то действия с формой
Как думаешь что быстрее?
Defender aka LINN прав использовать метод (8) нужно в крайнем случае, когда дешевле преобразовать Форма-Объект, чем извращаться с процедурами в менеджере объекта, например, когда требуется возможность сложного преобразования объекта из разных мест конфигурации, но и тут вопрос, возможно, лучше разместить данную процедуру/функцию в общем модуле.
(66) Это оптимизаторство уровня получения внутреннего значения функцией ЗначениеВСтрокуВнутр() а работа с этой билебердой. Это нарушение методики работы с объектами, нарушении логики приложения.
Я веду к тому, что возможные затраты на вызов преобразования не стоят того, чтобы нарушать логику работы и парадигму программирования.
Я, конечно, не знаю про какую конкретно задачу Вы спрашивали своего собеседуемого, возможно в том конкретном случае Вы были правы.
(65) Платформа для вас — черная коробка, и никакая документация не даст вам полного представления о внутреннем её устройстве.
> Не ваши впечатляющие 1.5 года
Я смотрю уверенность в том, сколько я работаю с 1с у вас такая же как и в знаниях о платформе. PROTIP: То что я зарегистрирован на этом форуме 1.5 года, не значит, что я начал 1с заниматься 1.5 года назад.
> РАЗНЫЕ типы данных
И чо?
> 2 инструкции на месте ни единой не нуждаются в замере производительности
Откуда такая уверенность в том, во сколько инструкций скомпилируется ваш код?
1С. Запуск из модуля формы процедуры модуля объекта.
Обычно работа с процедурами из модуля объекта ведется при срабатывании событий объекта (Запись, Проведение, Отмена проведения и пр.).
Но иногда возникает необходимость запустить процедуру модуля объекта из модуля формы.
Для того чтобы это осуществить нужно на сервере получить объект и вызвать его процедуру:
&НаСервере
Процедура Пример()
ОбъектЗначение = РеквФормВЗнач(«Объект»);
ОбъектЗначение.ПроцедураМодуляОбъекта();
КонецПроцедуры
Для отчетов заменяем «Объект» на «Отчет»:
&НаСервере
Процедура Пример()
ОбъектЗначение = РеквФормВЗнач(«Отчет»);
ОбъектЗначение.ПроцедураМодуляОбъекта();
КонецПроцедуры
Как вызвать процедуру или функцию из модуля объекта на управляемой форме
В конфигурации существует документ РеализацияТовара с табличной частью, одним из реквизитов которой является СуммаНДС. При изменении ставки НДС в документе сумма НДС должна пересчитываться. Процедура пересчета НДС находится в модуле объекта нашего документа.
Содержание самой процедуры пересчета рассматривать в рамках данной статьи не будем.
Итак, чтобы вызвать процедуру из модуля объекта на управляемой форме нужно выполнить следующие действия:
-
Сделать вызываемую процедуру экспортируемой (то есть доступной не только из самого модуля объекта, но и из других модулей)