1с как вызвать функцию из общего модуля
Перейти к содержимому

1с как вызвать функцию из общего модуля

  • автор:

1с как вызвать функцию из общего модуля

(10) Тогда подскажите пожалуйста как обойти это и решить мою проблему другим способом.

Есть функция, в кот. происходят следующие обращения:
mForm=Справочники[«имяСправочника»].ПолучитьФорму(«ФормаЭлемента»);

. получаем точно так же описание элементов формы.

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

А вот из Обработки удалось.

В итоге, эти данные нужны в Общем модуле.

Как бы их туда вытащить?

какие данные?

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

(14) он хочет не из модуля объекта
(12) А что потом собираешься делать со всеми этими «описаниями элементов формы»?

(16) (14) Хочется описание форм получить по веб-сервису. (он может для этого дергать какую-то ф-цию общего модуля)
Определяю у общего модуля признак «клиент» — теперь веб-сервис не видит этот модуль, ругается «переменная не определена».

Подскажите пож, как быть?

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

Общие модули в 1С 8.3

Анна Викулина

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

Создание общего модуля в 1С

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

Общие модули

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

  • «Глобальный». Данный флаг ставится, если модуль предназначен для хранения процедур и функций, которые должны вызываться без указания имени модуля. Естественно, они должны быть экспортными, а их имена уникальными в разрезе всего глобального контекста. По использованию они не будут отличаться от стандартных функций платформы;
  • «Клиент». Зависит от настроек системы и регламентирует, могут ли процедуры модуля выполняться на стороне клиента;
  • «Сервер». Помечаются общие модули, в составе которых планируется помещать алгоритмы для выполнения на сервере;
  • «Внешнее соединение». Процедуры модуля с активацией этого свойства смогут выполняться через подключение внешнего источника;
  • «Вызов сервера». Отвечает за разрешения процедурам из модуля вызывать сервер, выполняясь на клиенте;
  • «Привилегированный». Активация этой настройки позволит при работе кода процедур модуля не проверять права доступа. Вызвать общий модуль с такой настройкой можно только на сервере. Настройки «Клиент» и «Внешнее соединение» будут сброшены;
  • «Повторное использование». Может принимать значения: «Не использовать», «На время сеанса», «На время вызова». При многократном вызове одной процедуры система может использовать рассчитанные ранее данные в рамках процедуры (вызов) или жизни всего сеанса (запуска 1С). Стоит быть очень осторожным с этой настройкой, так как из-за неправильного использования таких модулей могут возникать ошибки.

Свойства

Бывают ситуации, когда требуется создать общий модуль с вызовами процедуры на сервере и клиенте с отличиями в алгоритме. Для разграничения кода используются директивы препроцессора с проверкой. В результате для серверного вызова это будет один код, а для клиентского – другой.

 Процедура АлгоритмСерверКлиент() Экспорт #Если ТонкийКлиент Тогда // код выполняется, если вызов процедуры пришел с клиента ПоказатьОповещениеПользователя("На клиенте"); ИначеЕсли Сервер Тогда // код выполняется, если вызов процедуры пришел с сервера ПеременнаяСервер = "Серверный вызов"; #КонецЕсли КонецПроцедуры 

Пример переноса кода в общий модуль 1С

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

 &НаКлиенте Процедура ТоварыЦенаПриИзменении(Элемент) ПересчетСуммы(); КонецПроцедуры &НаКлиенте Процедура ТоварыКоличествоПриИзменении(Элемент) ПересчетСуммы(); КонецПроцедуры &НаКлиенте Процедура ПересчетСуммы() СтрокаТЧ = Элементы.Товары.ТекущиеДанные; СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена; КонецПроцедуры 

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

Написание кода

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

Меняем вызовы процедуры

 Процедура РассчитатьСтроку(СтрокаТабличнойЧасти) Экспорт СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена; КонецПроцедуры 
 &НаКлиенте Процедура ТоварыЦенаПриИзменении(Элемент) //вызов процедуры из общего модуля РасчетыВСистеме.РассчитатьСтроку(Элементы.Товары.ТекущиеДанные); //ПересчетСуммы(); КонецПроцедуры &НаКлиенте Процедура ТоварыКоличествоПриИзменении(Элемент) //вызов процедуры из общего модуля РасчетыВСистеме.РассчитатьСтроку(Элементы.Товары.ТекущиеДанные); //ПересчетСуммы(); КонецПроцедуры &НаКлиенте Процедура ПересчетСуммы() СтрокаТЧ = Элементы.Товары.ТекущиеДанные; СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена; КонецПроцедуры 

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

При разработке общих модулей следует учитывать общепринятые правила по их созданию:

  • Помещать в отдельный общий модуль процедуры и функции, относящиеся к сходному функционалу;
  • В наименовании модуля отражать его принадлежность к контексту (Клиент, Сервер) и избегать общих слов (обработчики, процедуры и т.д.);
  • Разделять внутреннюю серверную логику приложения и клиентскую для интерфейса;
  • Будьте внимательны, создавая глобальный общий модуль. Отсутствие необходимости обращаться к процедуре через имя модуля может привести к путанице, особенно, если систему поддерживает несколько групп разработчиков.

Правильно созданные модули помогут вам намного быстрее ориентироваться в структуре конфигурации и делать доработки. Если вы видите возможность сделать полезную функцию универсальной и вынести ее в общий модуль, то сделайте это. В будущем вы и ваши коллеги будете благодарны за это решение.

Вызов функции из общего модуля

Есть общий модуль, в свойствах ключ настройки только Сервер
Как вызвать функцию из данного модуля в процедуру с директивой на клиенте
&НаКлиенте
Процедура ПриОткрытии()
ПроизвольныйМодуль.Произвольная()
КонецПроцедуры

По теме из базы знаний

  • Замена вызовов методов общих модулей во внешних обработках/отчетах
  • Обработка «Вызовы общих модулей» (8.2)
  • Поиск неиспользуемых экспортных методов (процедур и функций) общих модулей
  • Если хочется функционального программирования с функциями высшего порядка и map, filter, reduce
  • Универсальный HTTP-сервис в стиле удаленного вызова процедур (RPC)

Найденные решения

2. alex-l19041 8 12.04.19 17:26 Сейчас в теме

(1) из &НаКлиенте вызываете &НаСервере
а затем ПроизвольныйМодуль.Произвольная()

memb3r; oleg-x; + 2 – Ответить

Остальные ответы

  • Дата
  • Дата
  • Рейтинг всех уровней
  • Рейтинг 1-го уровня
  • Древо развёрнутое
  • Древо свернутое

Свернуть все

2. alex-l19041 8 12.04.19 17:26 Сейчас в теме

(1) из &НаКлиенте вызываете &НаСервере
а затем ПроизвольныйМодуль.Произвольная()

memb3r; oleg-x; + 2 – Ответить

3. user1200515 12.04.19 17:33 Сейчас в теме

(2)Сделала так, все работает, спасибо)
&НаКлиенте
Процедура ПриОткрытии()
Промежуточная()
КонецПроцедуры

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

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

Содержание самой процедуры пересчета рассматривать в рамках данной статьи не будем.

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

    Сделать вызываемую процедуру экспортируемой (то есть доступной не только из самого модуля объекта, но и из других модулей)

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

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