Вконтакте Facebook Twitter Лента RSS

Как открыть общий модуль 1с 8.3. Правила создания общих модулей

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

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

В каждом документе написан один и тот же код для расчёта суммы.

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

Вот сегодня перенесем его в общий модуль, а из документа будем вызывать его.

Создаём общий модуль для расчета суммы

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

Так же обязательно поставьте в окне свойств галочки напротив Клиент(Управляемое приложение) и Сервер.

Теперь нужно немного изменить код в модуле формы документов. Слева в конфигурации ищем документ Приход товара разворачиваем окна до окна Формы кликаем два раза на Форма Документа и в открывшемся окне формы снизу переходим на вкладку Модуль. У нас есть вот такой код

Эта процедура работает при изменение Количества в табличной части документа Приход товара и подсчитывает сумму.

&НаКлиенте



КонецПроцедуры

А это процедура начинает работать при изменении Цены в табличной части документа Приход товара и рассчитывает сумму.

&НаКлиенте

СтрокаТабличнойЧасти = Элементы.Материалы.ТекущиеДанные;
СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена;
КонецПроцедуры

Заменяем его на этот

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

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

Как вы заметили меняется только одна строчка на первый взгляд может показаться что одну строчку заменили на другую. Но не забывайте, что это пример. На самом деле количество кода может быть намного больше если вы, например, производили расчёты по сложной формуле в этом случае код заметно сократиться.

Тоже самое делаем для документа Отпуск товара со склада, запускаем и проверяем работоспособность кода. Вот мы с вами и сделали первый общий модуль надеюсь кому-то пригодится моя статья.

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

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

Каждый отдельный программный модуль воспринимается системой как единое целое, поэтому все его процедуры и функции принадлежат единому контексту.

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

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

Принято различать два контекста:

Глобальный контекст задачи;

Локальный контекст выполнения конкретного модуля.

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

Глобальный контекст составляют:

Значения системных атрибутов, общесистемные процедуры и функции;

Значения заданных в Конфигураторе констант, перечислений, регистров, видов расчета, групп видов расчета;

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

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

Локальный контекст любого программного модуля (кроме глобального) определяется тем местом в дереве метаданных, где расположен модуль. Важно обратить внимание на то, что каждый вид модуля (см. таблицу 3.1 ниже) предназначен для настройки, условно говоря, своего набора действий объекта в ответ на некоторые предопределенные события. Например, на рис. 3.1 был изображен модуль формы документа. Он обычно используется для вывода табличного представления документа на печать, организации взаимодействия формы документа с пользователем (т.е. обработки щелчков по кнопкам, обработки ввода новых строк в табличную часть документа и т.д.). Модуль проведения документа настраивает совершенно другие аспекты его работы. Он в общем случае предназначен для осуществления движений по счетам, регистрам учета и т.д.

Локальный контекст «виден» только определенному программному модулю и устанавливает для модуля набор непосредственно доступных ему значений агрегатных типов данных, а также их методов и атрибутов. Однако имеется возможность передачи контекста модуля как объекта в виде параметра при вызове процедур и функций. Контекст модуля определяет тот набор методов, которые являются доступными только в данном контексте. Например, на рис. 3.1 был дан краткий фрагмент модуля формы, в котором описывается процедура, выполняемая при открытии окна отдельно взятого документа. Другие модули работают с иными контекстами и выполняют иные функции.

Приведем таблицу, в которой перечислим все виды программных модулей, а кроме того, такие важнейшие их атрибуты, как расположение в дереве метаданных и момент выполнения (запуска), затем кратко проанализируем таблицу и охарактеризуем контекст каждого из них.

Таблица 3.1 – Виды программных модулей 1С: Предприятие


Продолжение таблицы 3.1

Наименование модуля Расположение Запуск
Модуль формы элемента справочника Метаданные ® Справочник ® Форма Запускается при открытии формы элемента справочника
Модуль формы документа Метаданные ® Документ ®Форма Запускается при открытии формы документа
Модуль документа Метаданные ® Документ ® Модуль документа Запускается при проведении документа, при удалении проведенного документа из журнала, при снятии проведения, при выполнении архивации записей журнала расчетов, порожденных этим документом
Модуль формы журнала документов Метаданные ® Журнал документов ® Форма Запускается при открытии формы журнала документов
Модуль формы журнала расчетов Метаданные ® Журнал расчетов ® Форма Запускается при вызове формы журнала расчетов
Модуль формы списка счетов (плана счетов) Метаданные ® План счетов Запускается при вызове формы списка счетов
Модуль формы счета Метаданные ® Планы счетов ® Форма счета Запускается при открытии формы счета
Модуль формы журнала операций Метаданные ® Журнал операций ® Форма
Модуль формы операции Метаданные ® Операция Запускается при вызове формы журнала операций
Модуль формы журнала проводок Метаданные ® Журнал проводок ® Форма Запускается, при вызове формы журнала проводок
Модуль формы отчета Метаданные ® Отчет ® Форма Запускается при открытии диалоговой формы подготовки отчета
Модуль формы обработки Метаданные ® Обработка ® Форма Запускается при открытии диалоговой формы обработки
Модуль вида расчета Метаданные ® Вид расчета ® Модуль вида расчета Запускается при расчете соответствующих записей журнала расчетов

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

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

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

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

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

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

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

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

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

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

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

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

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


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


Процедура РассчитатьСтроку(СтрокаТабличнойЧасти) Экспорт СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена; КонецПроцедуры

Фрагмент 1

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

Фрагмент 2

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

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

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

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

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

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

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

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

Функция НоваяФункция () Экспорт

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



Пер= Объект. НоваяФункция() ;

Аналогично можно создавать новые переменные, которые могут быть использованы из различных объектов конфигурации.

Перем НоваяПеременная Экспорт

ЭлементСправочника= Справочники. Номенклатура. НайтиПоКоду("000000001" ) ;
Объект= ЭлементСправочника. ПолучитьОбъект() ;
Объект. НоваяПеременная= ) ;

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

Модуль менеджера имеет все те же возможности, разница лишь в том, что для его использования не нужно получать конкретный объект, модуль менеджера позволяет работать со всей коллекцией объектов определенного типа.

Процедура НоваяПроцедура () Экспорт

ЭлементСправочника= Справочники. Номенклатура. НоваяПроцедура() ;

Или для переменной:

Перем НоваяПеременная Экспорт

ЭлементСправочника= Справочники. Номенклатура. НоваяПеременная;

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

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

Функция ПечатьДокумента (Ссылка) Экспорт
//В эту функцию необходимо передать ссылку на конкретный документ
Возврат ТабДок;
КонецФункции

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

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

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

С точки зрения производительности гораздо лучше использовать модуль менеджера, когда это возможно. В нашем примере решение задачи будет выглядеть следующим образом.
Функция ПечатьНаСервере()
Возврат Документы. НашДокумент. ПечатьДокумента(МассивСсылок) ;
КонецФункции

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

Так когда же использовать модуль объекта, а когда модуль менеджера?

Все зависит от задачи. Если для ее выполнения достаточно ссылки на объект (например задача печати), то лучше использовать модуль менеджера. Если же стоит задача изменения данных, например заполнения документа, то необходимо его получить и использовать модуль объекта.

Здравствуйте.
В данном посту рассмотрим модуль приложения, его предназначение и место компиляции.

Модуль приложения 1С предназначен в основном для того чтобы поймать момент запуска приложения и момент завершения работы.
Здесь же находятся обработчики, которые позволяют перехватить внешнее событие от оборудования.

События модуля управляемого приложения срабатывают при запуске Тонкого клиента, Веб-клиента и Толстого клиента управляемого приложения.
В модуле управляемого приложения отслеживается интерактивный запуск системы.

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

Рассмотрим список обработчиков, который можно вызвать, нажав (Ctrl+Alt+P ).
ПередНачаломРаботыСистемы — действие ещё не произошло (происходит запуск 1С Предприятия 8.2 но само приложение ещё не появилось на экране). Если параметр «Отказ» выставить в значение «Истина» то приложение попросту не запустится. ПриНачалеРаботыСистемы — действие уже совершилось (параметра «отказ» нет). ПередЗавершениемРаботыСистемы — приложение ещё никуда не исчезло (есть параметр «отказ»).
ПриЗавершенииРаботыСистемы — интерактивное окно уже закрылось.

Загляните в синтакс-помощник и почитайте подробней о событиях управляемого и обычного приложения.

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

Модуль обычного приложения

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

События модуля обычного приложения срабатывают при запуске толстого клиента обычного приложения.
Все что было сказано для модуля управляемого приложения справедливо и для модуля обычного приложения.

События Перед… и При… .

Отличие процедур ПередНачаломРаботыСистемы(Отказ) и ПриНачалеРаботыСистемы()

ПередНачаломРаботыСистемы(Отказ) — действие еще не свершилось и мы можем отказаться от его выполнения.
ПриНачалеРаботыСистемы() — действие уже свершилось, и отказаться от запуска приложения или выхода из него мы не можем.

Вот и все, спасибо за внимание с вами был .

Пожалуйста, оставляйте комментарии, мне важно ваше мнение.

Постовой : Оформление медицинских справок за 10 минут. Чтоб оформить справку в ГАЙ надо потратить пару дней, но есть вариант справка на права купить . Возможно и доставка справки также прилагается копия лицензий

P.S. А мне нравится Jamala (Джамала) — You’re Made of Love

© 2024 Вопросы и ответы