Модули – объекты методичных, в которых содержится программный код и определяющие поведение приложения.
В Платформе существует достаточно большое количество видов модулей, каждый из которых имеет свое предназначение и особенности.
Виды модулей
Модули бывают:
- Общими.
- Принадлежащие отдельным объектам.
- Модули состоят из процедур и функций.
Отдельным объектам метаданных принадлежат:
- Модули форм, описывающие поведение экранных форм.
- Модули объектов, описывающие поведение отдельных экземпляров объектов. Например, поведение конкретного товара из справочника номенклатура.
- Модули менеджеров, описывающие поведение целого класса объектов. Например, всех контрагентов из справочника контагенты.
- Модули самой конфигурации.
Общие модули
- Общие модули находятся в ветке дерева метаданных Общие.
- Содержат код, необходимый разным объектам конфигурации.
- Например, если во многих документах нужен код, рассчитывающий сумму и НДС, не нужно копировать его в каждый документ:
- Рискуя совершить ошибки.
- Затрудняя последующее изменение.
Пример общего модуля 1с
- Вы создадите один или несколько общих модулей УчетНДС<…>:
- УчетНДССервер
- УчетНДСКлиент
- РаботаСТабличнымиЧастямиКлиент
- РаботаСТабличнымиЧастямиСервер
- …
- Реализуете нужное поведение там.
- А из отдельных документов будете просто вызывать код общих модулей.
- Возможно, даже захотите создать подсистемы УчетНДС и РботаСТабличнымиЧастями и собрать эти модули в них.
Свойства общих модулей
Как у любых объектов метаданных, у модулей есть свойства:
- Имя — по нему программист обращается к модулю в коде, например, УчетНДС.СуммаНДС().
- Синоним — Ни на что не влияет, существует просто потому что есть у всех объектов.
- Комментарий — как правило, не заполняется, но программист может оставить там какую-то информацию.
Отдельные флажки управляют доступностью модуля:
- Глобальный — код в таких модулях можно вызывать, не указывая имя модуля. Загружается в память при старте 1с.
- Сервер — код будет доступен на сервере.
- Клиент — код будет доступен на клиенте.
- Внешнее соединение — код будет доступен для подключения извне.
- Вызов сервера — код будет доступен на клиенте, но работать будет на сервере.
Отдельно разберем свойства Привилегированный и Повторное использование возвращаемых значений
- Флажок Привилегированный означает, что исполнение кода будет игнорировать права доступа.
- Поле ввода Повторное использование возвращаемых значений позволяет включить кэширование результатов операций модуля.
Глобальные модули
- Обычно к коду модуля обращаются, указав имя модуля и, после токи, имя процедуры или функции:
- Иногда код нужен настолько часто, что программист не хочет каждый раз писать имя модуля.
- Тогда его размещают в глобальном общем модуле.
- Злоупотреблять этим не следует:
- Объявив процедуру или функцию в глобальном модуле, вы лишаетесь возможности объявить одноименный объект в других частях конфигурации.
- Вторая причина использования — это обработчики ожидания.
- Например, приложению нужно время от времени проверять уведомления о новых задачах или письмах.
- В этом случае создается глобальный обработчик ожидания и размещается в глобальном общем модуле.
- Глобальным модулям дается суффикс Глобальный, например, ОбщегоНазначенияГлобальный.
Клиентские модули
- Клиентские модули исполняются в клиентском приложении:
- в тонком клиенте;
- в толстом клиенте;
- в веб-клиенте (т.е. в браузере);
- в мобильном клиенте.
- Отвечают, как правило, за взаимодействие с пользователем и за операции, требующие обращение к компьютеру пользователя.
- Например, к файлам или к сертификату электронной подписи.
Примеры клиентского общего модуля:
- Код, вызываемый перед закрытием любой формы.
- Показывает вопрос пользователю.
- Предупреждает пользователя о чем-то.
- Код, открывающий общую форму.
- Например, форму вопроса или ввода многострочного комментария.
- Клиентским модулям дается суффикс Клиент, например, ОбщегоНазначенияКлиент.
Серверные модули
- Модули с флажком Сервер исполняются на сервере (при работе в клиент-серверном режиме) или, в файловом режиме — на клиенте.
- Отвесают, как правило, за бизнес-логику и за взаимодействие с СУБД
- В трехзвенной архитектуре обращение к СУБД с клиента запрещено.
Пример серверного общего модуля:
- Код, получащиий из БД данные указанного объекта.
- Например, реквизиты контрагента.
- Код, сохраняющий в БД пользовательскую настройку.
- Код, реализующий сходную бизнес-логику для многих объектов- потребителей, например:
- Учет взаиморасчетов;
- Учет НДС;
- Учет остатков товаров.
Если есть выбор, лучше придерживаться принципа:
Все, что может выполняться на сервере и не является немедленной реакцией на действия пользователя, должно размещаться на сервере.
- Серверным модулям дается суффикс Сервер, например, ОбщегоНазначенияСервер.
- Модули с общим кодом, исполняемым где угодно, имеют оба флажка и суффикс КлиентСервер (СтроковыеФункцииКлиентСервер).
Вызов сервера
- Код серверных общих модулей недоступен с клиента.
- Представьте, что вам нужно создать общий код:
- Вызываемый на клиенте перед записью любого справочника.
- Проверяющий уникальность.
- Выдающий предупреждение.
- Этот код должен вызвать серверный модуль, который обратится к БД в поисках дубликатов, но серверный модуль вызвать с клиента нельзя!
- Вам понадобится интерфейсный модуль с флажком «Вызов сервера«.
- Рекомендуется размещать в таких модулях код, который только вызывает серверный модуль, но ничего не делает сам.
- Грубейшая архитектурная ошибка — установка флажка «Вызов сервера» на все серверные модули по принципу «а вдруг понадобится».
- Таким модулям дается суффикс ВызовСервера, например, ОбщегоНазначенияВызовСервера.
Повторно используемые значения
- Часто из общего модуля возвращается значение, которые нужны часто или требуют затратных операций, например:
- Получение популярных настроек программы;
- Обращение к БД с тяжелым запросом;
- Соединение с удаленным веб-сервисом.
- Такой код можно вынести в общий модуль с повторным использованием возвращаемых значений.
- После первого вызова значение сохранится в памяти, и повторные вызовы будут быстрыми.
Значения можно сохранять:
- На время пользовательского сеанса (реально — на 20 минут);
- На время вызова
- Т.е. пока работает код, инициированный пользовательским действием или иным событием.
- Не делайте повторно используемые модули «на всякий случай».
- Вынесению кода в такой модуль должен предшествовать замер.
- Делать оптимизацию заранее — лучший способ испортить архитектуру программы.
- Таким модулям дается суффикс ПовтИсп, например, ОбщегоНазначенияПовтИсп.
Модуль приложения
- Модуль приложения принадлежит самой конфигурации
- Открывается от корня дерева метаданных
- Отвечает за поведение приложения в целом.
Там можно определить, в частности, что будет происходить:
- Перед запуском и при запуске.
- По внешнему событию.
- Например, при срабатывании сканера штрихкода.
- Перед выходом из программы.
- Конечно, это клиентский модуль.
Модуль сеанса
- Модуль сеанса тоже принадлежит самой конфигурации.
- «»Дописать»»
Модули форм
- «»Дописать»»
- Отвечает за взаимодействие с пользователем и поведение форм.
- Модули форм — смешанные:
- В них размещен и код, выполняющийся на клиенте, и код, выполняющийся на сервере.
- Например, в форме контрагента может быть:
- Клиентский код, срабатавающий перед записью контрагента и задающий вопрос:
- «Хотите ли вы записать контрагента без ИНН?»
- Серверный код, срабатывающий при записи контрагента и помещающий в БД информацию о его контактных лицах.
- Клиентский код, срабатавающий перед записью контрагента и задающий вопрос:
- В отличие от общих модулей, клиентский код формы может вызывать серверный код формы.
- И постоянно этим занимается.
- Злоупотреблять этим не следует: серверные вызовы дороги.
- Само собой, клиентский код формы может вызывать клиентские общие модули, а серверный — серверные.
Директивы компиляции
- Чтобы сообщить платформе, где будет размещен код смешанных модулей, используют директивы компиляции:
- &НаКлиенте
- &НаСервере
- Они влияют на код, находящийся после них.
Инструкции препроцессора
- Инструкции препроцессора позволяют разметить код так, чтобы исключить его выполнение в недопустимом контексте.
- Например, при работе в веб-клиенте браузер не дает приложениям свободно работать с файлами.
- Код, который время от времени сохраняет пользовательские данные в файл на клиентской машине, придется обрамить инструкцией:
Модули объектов
- Модули объектов отвечают за поведение отдельных экземпляров объектов.
- Значения реквизитов самого объекта доступны непосредственно в коде модуля.
- Например, «Наименование» — это наименование именно данного контрагента.
- В модуле справочника Контрагенты можно реализовать код, который будет:
- Заполнять нового контрагента при создании.
- Проверять правильность заполнения перед записью.
- Записывать дополнительные сведения в базу данных вместе с самим контрагентом.
- Для этого в модулях объектов создают обработчики событий.
События модулей объектов
- ОбработкаЗаполнения — событие, срабатывающее при создании нового объекта.
- В обработчике можно заполнить объект по умолчанию.
- Например, задать вид контрагента «Юридическое лицо».
- ОбработкаПроверкиЗаполнения — событие, срабатывающее перед записью.
- В обработчике можно отказаться от записи, если объект не заполнен (скажем, не введен КПП для юридического лица) или заполнен неверно.
- ПередЗаписью
- В обработчике можно дополнить или изменить записываемые данные.
- Например, собрать полное наименование контрагента из краткого и организационно-правовой формы.
- ПриЗаписи
- В обработчике можно, например, записать вместе с контрагентом связанные с ним данные.
Модули менеджеров
- Модули менеджеров определяют поведение класса однородных объектов.
- Скажем, в модуле менеджера справочника Контрагенты мы разместим код, имеющий дело не с отдельным контрагентом, а с любым, произвольным.
- При необходимости обрабатывать конкретных контрагентов их нужно передавать модулю менеджера.
- Напрямую, как в модуле объекта, реквизиты объектов недоступны.
События модулей менеджеров
- ОбработкаПолученияПредставления — событие, срабатывающее, когда платформа формирует для нас представление объекта.
- В обработчике можно его переопределить, например, собрав полное наименование «на лету», из наименования и других реквизитов.
- ОбработкаПолученияДанныхВыбора — событие, срабатывающее, когда пользователь ищет объект, вводя часть его наименования в поле ввода.
- В обработчике можно, например, реализовать поиск не только по наименованию, но и по другим реквизитам: по email, по ИНН и т.д.
Дополнительные материалы:
- Программные модули на ИТС — Ссылка
- Модули в Платформе 1С:Предприятие 8.3 (бесплатная статья по Программированию в 1С 8.3) из цикла статей «Первые шаги в разработке на 1С» — ссылка
- Другие мои статьи для начинающих программистов — Для начинающих программистов 1с
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.