Модули в 1с

Модули в 1с

Модули – объекты методичных, в которых содержится программный код и определяющие поведение приложения.

В Платформе существует достаточно большое количество видов модулей, каждый из которых имеет свое предназначение и особенности.

Виды модулей

Модули бывают:

  • Общими.
  • Принадлежащие отдельным объектам.
  • Модули состоят из процедур и функций.

Отдельным объектам метаданных принадлежат:

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

Общие модули

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

Пример общего модуля 1с

  • Вы создадите один или несколько общих модулей УчетНДС<…>:
    • УчетНДССервер
    • УчетНДСКлиент
    • РаботаСТабличнымиЧастямиКлиент
    • РаботаСТабличнымиЧастямиСервер
  • Реализуете нужное поведение там.
  • А из отдельных документов будете просто вызывать код общих модулей.
  • Возможно, даже захотите создать подсистемы УчетНДС и РботаСТабличнымиЧастями и собрать эти модули в них.

Свойства общих модулей

Как у любых объектов метаданных, у модулей есть свойства:

Свойства общего модуля 1с
Свойства общего модуля 1с
  • Имя — по нему программист обращается к модулю в коде, например, УчетНДС.СуммаНДС().
  • Синоним — Ни на что не влияет, существует просто потому что есть у всех объектов.
  • Комментарий — как правило, не заполняется, но программист может оставить там какую-то информацию.

Отдельные флажки управляют доступностью модуля:

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

Отдельно разберем свойства Привилегированный и Повторное использование возвращаемых значений

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

Глобальные модули

  • Обычно к коду модуля обращаются, указав имя модуля и, после то􏰈ки, имя процедуры или функции:
вызов функции из общего модуля
вызов функции из общего модуля
  • Иногда код нужен настолько часто, что программист не хочет каждый раз писать имя модуля.
    • Тогда его размещают в глобальном общем модуле.
    • Злоупотреблять этим не следует:
      • Объявив процедуру или функцию в глобальном модуле, вы лишаетесь возможности объявить одноименный объект в других частях конфигурации.
  • Вторая причина использования — это обработчики ожидания.
    • Например, приложению нужно время от времени проверять уведомления о новых задачах или письмах.
    • В этом случае создается глобальный обработчик ожидания и размещается в глобальном общем модуле.
  • Глобальным модулям дается суффикс Глобальный, например, ОбщегоНазначенияГлобальный.

Клиентские модули

  • Клиентские модули исполняются в клиентском приложении:
    • в тонком клиенте;
    • в толстом клиенте;
    • в веб-клиенте (т.е. в браузере);
    • в мобильном клиенте.
  • Отвечают, как правило, за взаимодействие с пользователем и за операции, требующие обращение к компьютеру пользователя.
    • Например, к файлам или к сертификату электронной подписи.

Примеры клиентского общего модуля:

  • Код, вызываемый перед закрытием любой формы.
    • Показывает вопрос пользователю.
    • Предупреждает пользователя о чем-то.
  • Код, открывающий общую форму.
    • Например, форму вопроса или ввода многострочного комментария.
  • Клиентским модулям дается суффикс Клиент, например, ОбщегоНазначенияКлиент.

Серверные модули

  • Модули с флажком Сервер исполняются на сервере (при работе в клиент-серверном режиме) или, в файловом режиме — на клиенте.
  • Отвесают, как правило, за бизнес-логику и за взаимодействие с СУБД
    • В трехзвенной архитектуре обращение к СУБД с клиента запрещено.
Клиент-серверной взаимодействие 1с
Клиент-серверной взаимодействие 1с

Пример серверного общего модуля:

  • Код, получащиий из БД данные указанного объекта.
    • Например, реквизиты контрагента.
  • Код, сохраняющий в БД пользовательскую настройку.
  • Код, реализующий сходную бизнес-логику для многих объектов- потребителей, например:
    • Учет взаиморасчетов;
    • Учет НДС;
    • Учет остатков товаров.

Если есть выбор, лучше придерживаться принципа:

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

  • Серверным модулям дается суффикс Сервер, например, ОбщегоНазначенияСервер.
  • Модули с общим кодом, исполняемым где угодно, имеют оба флажка и суффикс КлиентСервер (СтроковыеФункцииКлиентСервер).

Вызов сервера

  • Код серверных общих модулей недоступен с клиента.
  • Представьте, что вам нужно создать общий код:
    • Вызываемый на клиенте перед записью любого справочника.
    • Проверяющий уникальность.
    • Выдающий предупреждение.
  • Этот код должен вызвать серверный модуль, который обратится к БД в поисках дубликатов, но серверный модуль вызвать с клиента нельзя!
  • Вам понадобится интерфейсный модуль с флажком «Вызов сервера«.
  • Рекомендуется размещать в таких модулях код, который только вызывает серверный модуль, но ничего не делает сам.
  • Грубейшая архитектурная ошибка — установка флажка «Вызов сервера» на все серверные модули по принципу «а вдруг понадобится».
  • Таким модулям дается суффикс ВызовСервера, например, ОбщегоНазначенияВызовСервера.

Повторно используемые значения

  • Часто из общего модуля возвращается значение, которые нужны часто или требуют затратных операций, например:
    • Получение популярных настроек программы;
    • Обращение к БД с тяжелым запросом;
    • Соединение с удаленным веб-сервисом.
  • Такой код можно вынести в общий модуль с повторным использованием возвращаемых значений.
  • После первого вызова значение сохранится в памяти, и повторные вызовы будут быстрыми.

Значения можно сохранять:

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

Модуль приложения

  • Модуль приложения принадлежит самой конфигурации
  • Открывается от корня дерева метаданных
  • Отвечает за поведение приложения в целом.

Там можно определить, в частности, что будет происходить:

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

Модуль сеанса

  •  Модуль сеанса тоже принадлежит самой конфигурации.
  • «»Дописать»»

Модули форм

  •  «»Дописать»»
  • Отвечает за взаимодействие с пользователем и поведение форм.
  • Модули форм — смешанные:
    • В них размещен и код, выполняющийся на клиенте, и код, выполняющийся на сервере.
  • Например, в форме контрагента может быть:
    • Клиентский код, срабатавающий перед записью контрагента и задающий вопрос:
      • «Хотите ли вы записать контрагента без ИНН?»
    • Серверный код, срабатывающий при записи контрагента и помещающий в БД информацию о его контактных лицах.
  • В отличие от общих модулей, клиентский код формы может вызывать серверный код формы.
    • И постоянно этим занимается.
    • Злоупотреблять этим не следует: серверные вызовы дороги.
  • Само собой, клиентский код формы может вызывать клиентские общие модули, а серверный — серверные.

Директивы компиляции

  • Чтобы сообщить платформе, где будет размещен код смешанных модулей, используют директивы компиляции:
    • &НаКлиенте
    • &НаСервере
  • Они влияют на код, находящийся после них.
Директивы компиляции &НаКлиенте &НаСервере
Директивы компиляции &НаКлиенте &НаСервере

Инструкции препроцессора

  • Инструкции препроцессора позволяют разметить код так, чтобы исключить его выполнение в недопустимом контексте.
  • Например, при работе в веб-клиенте браузер не дает приложениям свободно работать с файлами.
  • Код, который время от времени сохраняет пользовательские данные в файл на клиентской машине, придется обрамить инструкцией:
1с  Инструкции препроцессора ВебКлиент
1с Инструкции препроцессора ВебКлиент

Модули объектов

  • Модули объектов отвечают за поведение отдельных экземпляров объектов.
  • Значения реквизитов самого объекта доступны непосредственно в коде модуля.
    • Например, «Наименование» — это наименование именно данного контрагента.
  • В модуле справочника Контрагенты можно реализовать код, который будет:
    • Заполнять нового контрагента при создании.
    • Проверять правильность заполнения перед записью.
    • Записывать дополнительные сведения в базу данных вместе с самим контрагентом.
  • Для этого в модулях объектов создают обработчики событий.

События модулей объектов

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

Модули менеджеров

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

События модулей менеджеров

  • ОбработкаПолученияПредставления — событие, срабатывающее, когда платформа формирует для нас представление объекта.
    • В обработчике можно его переопределить, например, собрав полное наименование «на лету», из наименования и других реквизитов.
  • ОбработкаПолученияДанныхВыбора — событие, срабатывающее, когда пользователь ищет объект, вводя часть его наименования в поле ввода.
    • В обработчике можно, например, реализовать поиск не только по наименованию, но и по другим реквизитам: по email, по ИНН и т.д.

Дополнительные материалы:

  1. Программные модули на ИТС — Ссылка
  2. Модули в Платформе 1С:Предприятие 8.3 (бесплатная статья по Программированию в 1С 8.3) из цикла статей «Первые шаги в разработке на 1С» — ссылка
  3. Другие мои статьи для начинающих программистов — Для начинающих программистов 1с

Опубликовано

в

от

Комментарии

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