Общие модули 1С — объект метаданных конфигурации 1С 8.3, который хранит в себе программный код, который часто вызывается в конфигурации. Функцию/процедуру можно вызвать из любого места конфигурации (если она экспортная).
Как использовать общий модуль
Хороший тон — поместить процедуру или функцию в общий модуль, если она вызывается в более чем одном месте. Во-первых, если процедура корректируется, её надо править только в одном месте. Во-вторых, этим достигается больший порядок в коде.
Типичный пример общего модуля — обработка проведения по какому-то регистру, получение количества разницы рабочих дней, пересчет курсов валют, пересчет количества/цены/суммы в табличной части и другие функции.
Свойства общих модулей
Одно из основных особенностей общих модулей от других модулей — нельзя объявлять общие переменные.
Рассмотрим подробнее палитру свойств общего модуля:
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1.1. Общие модули создаются для реализации процедур и функций, объединенных по некоторому признаку. Как правило, в один общий модуль помещаются процедуры и функции одной подсистемы конфигурации (продажи, закупки) или процедуры и функции сходного функционального назначения (работа со строками, общего назначения).
1.2. При разработке общих модулей следует выбирать один из четырех контекстов выполнения кода:
Тип общего модуля
Пример наименования
Вызов сервера
Сервер
Внешнее соединение
Клиент (обычное приложение)
Клиент (управляемое приложение)
1.
Серверный
ОбщегоНазначения (или ОбщегоНазначенияСервер)
2.1. Серверные общие модули предназначены для размещения серверных процедур и функций, не доступных для использования из клиентского кода. В них реализуется вся внутренняя серверная бизнес-логика приложения. Для корректной работы конфигурации в режимах внешнего соединения, управляемого и обычного приложений, серверные процедуры и функции следует размещать в общих модулях с признаками:
2.2. Серверные общие модули для вызова с клиента содержат серверные процедуры и функции, доступные для использования из клиентского кода. Они составляют клиентский программный интерфейс сервера приложения. Такие процедуры и функции размещаются в общих модулях с признаком:
2.3. Клиентские общие модули содержат клиентскую бизнес-логику (функциональность, определенную только для клиента) и имеют признаки:
Исключение составляют случаи, когда клиентские процедуры и функции должны быть доступны только в режиме управляемого приложения (только в режиме обычного приложения или только в режиме внешнего соединения). В таких случаях, допустима иная комбинация двух этих признаков.
2.4. Для того чтобы избежать дублирования кода, рекомендуется создавать клиент-серверные общие модули с теми процедурами и функциями, содержание которых одинаково на сервере и на клиенте. Такие процедуры и функции размещаются в общих модулях с признаками:
В то же время, как только возникает необходимость ветвить код в клиент-серверных общих модулях на серверный и клиентский, то не следует использовать для этого инструкции препроцессора. Вместо этого, функциональность, различную для клиента и для сервера, рекомендуется реализовывать по общим правилам в модулях соответствующего типа – см. пп. 2.1 и 2.3. Такое явное разделение клиентской и серверной бизнес-логики продиктовано соображениями повышения модульности прикладного решения, упрощения контроля со стороны разработчика над клиент-серверным взаимодействием и снижением риска ошибок из-за принципиальных отличий требований к разработке клиентского и серверного кода (необходимость минимизации кода, выполняемого на клиенте, разной доступностью объектов и типов платформы и др.). При этом нужно иметь в виду неизбежное увеличение числа общих модулей в конфигурации.
Особым случаем смешанных клиент-серверных модулей являются модули форм и команд, которые специально предназначены для реализации серверной и клиентской бизнес-логики в одном модуле.
3.1. Имена общих модулей рекомендуется строить по общим правилам именования объектов метаданных. Название общего модуля должно совпадать с названием подсистемы или отдельного механизма, процедуры и функции которой он реализует. Рекомендуется избегать в названиях общих модулей таких общих слов как «Процедуры», «Функции», «Обработчики», «Модуль», «Функциональность» и т.п. и применять их только в исключительных случаях, когда они более полно раскрывают назначение модуля.
Для того чтобы различать общие модули одной подсистемы, которые созданы для реализации процедур и функций, выполняемых в разных контекстах, рекомендуется задавать им постфиксы, описанные ранее в пп. 2.1-2.4.
3.2. Дополнительно к общим модулям могут быть добавлены уточняющие постфиксы.
С помощью свойств общих модулей и инструкций препроцессора можно организовать выполнение различных методов общих модулей в нужном контексте. Каждое свойство общего модуля отвечает за возможность компиляции (и исполнения) общего модуля в том или ином контексте. Доступны следующие свойства, отвечающие за контекст, в котором доступны методы общего модуля: ● Клиент (обычное приложение) – методы общего модуля будут доступны для толстого клиента в режиме обычного приложения; ● Клиент (управляемое приложение) – методы общего модуля будут доступны для тонкого клиента, веб-клиента, а также для толстого клиента в режиме управляемого приложения; ● Сервер – методы общего модуля будут доступны на сервере; ● Внешнее соединение – методы общего модуля будут доступны во внешнем соединении. Если устанавливаются одновременно несколько свойств, то это означает, что методы общего модуля будут доступны в нескольких контекстах. Если у общего модуля установлено свойство Сервер и еще какое-либо свойство, то это означает, что общий модуль будет доступен одновременно на сервере и в выбранном клиенте. При этом необходимо понимать, что фактически это будет несколько вариантов скомпилированного кода (по числу выбранных клиентов и собственно для сервера). При этом если метод, расположенный в таком общем модуле, вызывается со стороны клиента, то будет использована клиентская копия общего модуля, а если с сервера – серверная. В этом случае с помощью директив препроцессора (подробнее см. здесь) можно «оградить» сервер от того кода, который на нем не может исполняться. Рассмотрим пример. В общем модуле (который может исполняться на тонком клиенте и на сервере) есть метод, который имеет несколько различное поведение на стороне тонкого клиента и на стороне сервера. Посмотрим, как это можно сделать:
Процедура МетодОбщегоМодуля() Экспорт // Тут размещается различный важный код #Если ТонкийКлиент Тогда // Покажем предупреждение ПоказатьОповещениеПользователя (“На клиенте”); #КонецЕсли КонецПроцедуры Тогда на стороне сервера код приобретет следующий вид: Процедура МетодОбщегоМодуля() Экспорт // Тут размещается различный важный код КонецПроцедуры А на стороне тонкого клиента код будет иметь следующий вид: Процедура МетодОбщегоМодуля() Экспорт // Тут размещается различный важный код // Покажем предупреждение ПоказатьОповещениеПользователя(“На клиенте”); КонецПроцедуры
Для передачи управления с клиента на сервер существует несколько способов: ● вызвать метод серверного общего модуля; ● в модуле формы или команды вызвать метод, который предваряется директивами компиляции &НаСервере, &НаСервереБезКонтекста
Повторное использование возвращаемых значений
Если общий модуль не является глобальным, то становится доступно свойство Повторное использование возвращаемых значений. Это свойство может принимать следующие значения: ● Не использовать – повторное использование возвращаемых значений для функций этого общего модуля не используется. ● На время вызова и На время сеанса – для общего модуля используется метод определения повторного использования данных. Суть этого метода заключается в том, что в ходе выполнения кода система запоминает параметры и результат работы функций после первого вызова функции. При повторном вызове функции с такими же параметрами, происходит возврат запомненного значения (из первого вызова) без выполнения самой функции. Если функция во время своего выполнения меняет значения параметров, то повторный вызов функции не будет это делать. Можно выделить следующие особенности сохранения результатов вызова: ● если функция выполняется на сервере и вызывается из серверного кода, то значения параметров и результат вызова запоминаются для текущего сеанса на стороне сервера; ● если функция выполняется на толстом или тонком клиенте, то значения параметров и результатов вызова запоминаются на стороне клиента; ● если функция выполняется на стороне сервера, а вызывается из клиентского кода, то значения параметров вызова запоминаются и на стороне клиента, и на стороне сервера (для текущего сеанса). Сохраненные значения удаляются: ● если свойство установлено в значение На время вызова: ● на стороне сервера – при возврате управления с сервера; ● на стороне клиента – при завершении работы процедуры или функции встроенного языка верхнего уровня (вызванной системой из интерфейса, а не из другой процедуры или функции встроенного языка); ● если свойство общего модуля установлено в значение На время сеанса: ● на стороне сервера – при окончании сеанса; ● на стороне клиента – при закрытии клиентского приложения. Сохраненные значения будут удалены: ● на сервере, в толстом клиенте, во внешнем соединении, в тонком клиенте и в веб-клиенте с обычной скоростью соединения – через 20 минут после вычисления сохраняемого значения или через 6 минут после последнего использования; ● в тонком клиенте и веб-клиенте с низкой скоростью соединения – через 20 минут после вычисления сохраняемого значения; ● при нехватке оперативной памяти в рабочем процессе сервера; ● при перезапуске рабочего процесса; ● при переключении клиента на другой рабочий процесс. После удаления значений вызов экспортируемой функции выполняется как при первом вызове. На выполнение процедур данное свойство общих модулей не влияет – процедуры выполняются всегда.
Если у общего модуля установлено повторное использование возвращаемых значений, то на типы параметров экспортируемых функции накладывается ряд ограничений. Типы параметров могут быть только: ● Примитивными типами ( Неопределено, NULL, Булево, Число, Строка, Дата ). ● Любыми ссылками на объекты базы данных. ● Структурами со значениями свойств вышеперечисленных типов. В этом случае идентичность параметров контролируется «по содержимому» структур. Если экспортируемая функция возвращает какой-либо объект, то фактически возвращается ссылка на объект, хранимый в кеше. Если после получения этой ссылки произойдет изменение состояния объекта, то последующий вызов той же самой функции приведет к возврату ссылки на уже измененный объект без фактического выполнения функции. Такое поведение будет наблюдаться до удаления сохраненного значения (по любой причине). Другими словами – изменение состояния объекта, полученного в результате вызова функции из общего модуля с повторным использованием возвращаемых значений, не является основанием для фактического вызова функции. Также следует помнить, что кеш возвращаемых объектов индифферентен к состоянию привелигированного режима в момент вызова функции с повторным использованием возвращаемых значений. Эта особенность может привести к следующей особенности поведения: ● Фактическое выполнение вызова функции с повторным использованием возвращаемых значений (первый вызов) выполнялось при включенном привелигированном режиме. ● При выполнении функции был получен объект, который не может быть получен с отключенным привелигированным режимом. ● Последующие вызовы функции выполнялись без установки привелигированного режима. ● Однако, до момента очистки кеша возвращаемых объектов или повторного фактического вызова, функция будет возвращать формально недоступный объект. ● Также верно и обратное поведение, когда первый вызов выполняется без установки привелигированного режима, а в привелигированном режиме не возвращается объект, который мог быть получен в привелигированном режиме.
Общий модуль нужен для того, чтобы вынести код процедуры или функции в одно место, откуда в дальнейшем его можно будет вызывать. Например, есть процедура для расчета суммы строки:
Если в конфигурации есть несколько видов документов с табличной частью, то данную процедуру придется расположить в модуле формы каждого вида документа. Если в дальнейшем потребуется внести изменения в эту процедуру, то придется сделать это несколько раз, в модуле формы каждого вида документа.
В этом случае целесообразно вынести данную процедуру в общий модуль, добавить ключевое слово Экспорт, чтобы данная процедура была доступна из других модулей и вызывать ее из модуля формы:
Вызов общего модуля
Вызов общего модуля выполняется через имя общего модуля. После имени общего модуля нужно указать точку, а потом имя метода. Метод должен быть экспортным, иначе при вызове возникнет ошибка «Метод объекта не обнаружен».
Для примера добавим в конфигурацию новый общий модуль. Общие модули расположены в узле Общие — Общие модули:
В свойствах общего модуля установим флаг Клиент:
В самом модуле добавим следующий код:
В модуле обработки вызовем оба метода общего модуля:
Вызов метода ТестОдин отработает корректно, а при вызове метода ТестДва возникнет ошибка «Метод объекта не обнаружен», потому что у процедуры нет ключевого слова Экспорт.
Переменные в общем модуле могут быть только внутри методов. Нельзя создать переменную, доступную во всем модуле или через свойства модуля.
Клиентский общий модуль
Если в свойствах общего модуля установлен только флаг Клиент, то к методам такого модуля можно будет обращаться только на клиенте. Из самого общего модуля можно выполнять вызов экспортных методов модуля приложения.
Серверный общий модуль
Если установлен только флаг Сервер, то к методам такого модуля можно будет обращаться только на сервер.
Вызов сервера
При установленных двух флагах Сервер и Вызов сервера к методам модуля можно обращаться как на клиенте, так и на сервере. Но само выполнение методов будет выполнено на сервере.
Клиент-серверный общий модуль
У такого общего модуля в свойствах нужно установить и флаг Клиент и флаг Сервер.
Чтобы при компиляции такого общего модуля не было ошибок нужно с помощью инструкций препроцессора разделить процедуры на клиентские и серверные:
Вызывать серверные методы общего модуля можно только на сервере:
Глобальный общий модуль
Если в свойствах модуля поставить флаг Глобальный, то для вызова методов общего модуля не нужно указывать имя общего модуля.
Глобальные общие модули будут скомпилированы при запуске конфигурации.
Привилегированный общий модуль
Общий модуль с таким флагом всегда выполняется без проверки прав доступа. Такой общий модуль может быть только серверным.
Повторное использование возвращаемых значений
Использование данного свойства позволяет сохранять в кеше параметры и результат функций. Работает только для функций в неглобальных общих модулях.
При первом вызове такой функции она будет выполнена как обычно. После выполнения значения параметров и результат будут сохранены в кеше. Если снова обратиться к такой функции с теми же значениями параметров, то результат будет сразу взят из кеша, без выполнения тела функции.
Есть два варианта повторного использования возвращаемых значений:
Кешированный результат выполнения может быть удален в нескольких случаях:
Если выполнить вызов функции общего модуля с повторным использованием возвращаемых значений из самого общего модуля и не указать до имени функции имя общего модуля, то функция будет выполнена как в первый раз.
Для сохранения в кеше и повторного использования можно использовать параметры следующих типов:
Программные модули платформы 1С: предназначение и свойства
Понятие программного модуля 1С
Программный модуль 1С представляет собой текст на встроенном языке 1С:Предприятия, расположенный в определенном месте конфигурации.
Виды программных модулей:
Открыть общий модуль 1С:
Открыть модуль объекта 1С:
Открыть модуль формы 1С:
Разделы программного модуля
Любой программный модуль, за исключением общих модулей, состоит из следующих разделов:
Внимание! Только раздел процедур и функций есть:
Методические рекомендации по наполнению (структуре) программных модулей 1С.
Контекст программного модуля
Контекст — в 1С:Предприятии 8 обозначает окружение модуля, т. е. доступность для него переменных, объектов, свойств, методов и событий.
Правила видимости экспортируемых переменных, процедур и функций различных модулей 1С:
Выполняться модули 1С могут (в общем случае):
Модуль приложения 1С
Модуль приложения 1С предназначен для объявления глобальных переменных, а также обработки событий:
Модуль приложения содержит обработчики, позволяющие перехватить и обработать внешние события от оборудования (например, события от торгового или фискального оборудования).
ВАЖНО! В модуле приложения отслеживается именно интерактивный запуск системы (т.е. когда создается окно программы); он не будет работать, если запуск программы 1С осуществляется, например, в режиме com-соединения, так как в этом случае окно программы не создается.
Процедуры, функции и переменные модуля приложения могут быть описаны как экспортные. Все переменные и методы, которые помечены как экспортные будут доступны в любом модуле конфигурации, работающем на стороне клиента. Однако для описания общих алгоритмов рекомендуется использовать «Общие модули», что позволит снизить время компиляции модуля и, соответственно, время запуска приложения.
Расширить контекст модуля приложения можно за счет методов общих модулей, для которых установлено свойство «Вызов сервера».
Виды модуля приложения:
ВАЖНО! Если приложение работает и в режиме управляемого приложения, и в режиме обычного приложения, то необходимо описывать процедуры-обработчики как для модуля управляемого приложения, так и для модуля обычного приложения.
Модуль управляемого приложения можно открыть:
Модуль обычного приложения можно открыть:
Обработка модуля приложения 1С
В модуле приложения можно размещать стандартные разделы модуля:
Список событий, которые можно обрабатывать, для управляемого и обычного приложения одинаков. Но кроме произвольных процедур и функций в модуле могут быть расположены специальные обработчики событий. Список доступных обработчиков можно посмотреть, если при открытом модуле вызвать список процедур и функций текущего модуля. В раскрывшемся окне «Процедуры и функции» отображаются:
Когда выполняется обработчик события “перед”, считается, что действие еще не совершено. Когда выполняется обработчик события “при” – действие уже совершено.
ВАЖНО! Процедуры-обработчики событий, расположенные в модуле приложения, модуле внешнего соединения, модуле прикладного объекта должны называться точно так, как называются соответствующие события. (подробнее)
В модуле Обычного приложения подобных ограничений нет, так как данный модуль будет компилироваться при загрузке Толстого клиента. В Толстом клиенте доступны практически все типы данных.
Модуль внешнего соединения
Модуль внешнего соединения срабатывает, когда запуск приложения происходит в режиме com-соединения и предназначен для обработки событий:
Как и в модуле приложения, здесь доступны разделы описания переменных, методов и раздел основной программы. Процедуры, функции и глобальные переменные, определенные в модуле внешнего соединения с ключевым словом «Экспорт» становятся, как и в случае модуля приложения, частью глобального контекста.
Отличие модуля внешнего соединения от модуля приложения:
Сам процесс внешнего соединения – это процесс неинтерактивный. В этом режиме происходит программная работа с информационной базой и не происходит открытия окна приложения, что накладывает определенные ограничения на использование методов, предназначенных для интерактивной работы. В этом режиме нельзя использовать вызовы диалоговых форм, предупреждающих сообщений и т.п. Они просто не сработают.
ВАЖНО! Процедуры-обработчики событий, расположенные в модуле приложения, модуле внешнего соединения, модуле прикладного объекта должны называться точно так, как называются соответствующие события. (подробнее)
Модуль сеанса
Особенности модуля сеанса:
Событие УстановкаПараметровСеанса >, единственное для этого модуля, выполняется самым первым (даже раньше события модуля приложения ПередНачаломРаботыСистемы >).
ВАЖНО! Не стоит располагать в модуле сеанса код, не связанный напрямую с инициализацией параметров сеанса:
Общие модули
Общие модули содержат программный код (процедуры и функции), который вызывается из других мест конфигурации (используемый в других программных модулях), и может принадлежать всей конфигурации.
Модуль формы 1C
Модуль формы 1C предназначен для обработки:
Модуль формы компилируется:
В модуле формы доступны разделы описания переменных и методов, а также раздел основной программы.
К стандартным событиям формы можно обратиться:
Особенности управляемых форм:
Модуль объекта
Модуль объекта 1С предназначен, в общем случае, для обработки событий объектов (например, события записи и удаления объектов, событие проведения документов и т.д.).
Некоторые события модуля объекта дублируют события модуля формы (например, события связанные с записью). Однако следует понимать: