Модули в 1С (7 из 100 дней)
Понятие модули
Модуль - это объект метаданных, содержащий программный код и определяющий поведение приложения
Можно сказать, что модуль - это отдельный файл, в котором располагается текст алгоритма. В модуле размещаются код и алгоритмы поведения программы, а все, что написано в модуле, является СОДЕРЖИМЫМ МОДУЛЯ.
Модуль может быть пустым, как может быть пустым текстовый файл.
Зачем нужны модули?
Изначально система не знает, что от неё хотят, для этого программист наполняет программу кодом и создает алгоритм работы. Именно в модулях программист пишет алгоритм для работы системы.
Модули бывают двух видов: общие модули и специальные модули объектов метаданных (Говорили про это на 3-ем дне из 100 (https://dzen.ru/a/an2ccMSmQxrrc1dK))
- Общие модули - это модули, в которых размещается код, который потенциально может быть использован различными объектами.
Пример:
Если во многих документах нужен код, рассчитывающий НДС, не нужно копировать его в каждый документ, ведь есть риск совершить ошибки и затрудняет последующие изменения.
Модули объектов метаданных - это программные модули в платформе 1С:Предприятие, которые привязаны к конкретным объектам метаданных.
К ним относятся модули:
- Модули форм (Описывают поведение экранных форм)
- Модули объектов (Описывают поведение отдельных экземпляров объектов)
- Модули менеджеров (Описывают поведение целого класса объектов)
- Модули конфигурации
Где найти модули в программе:
- Общие модули располагаются в отдельной ветке дерева конфигурации
- Модули объектов метаданных открываются через контекстное меню объекта конфигурации
- Модули формы открываются через редактор формы
Общие модули
Как мы уже говорили выше, "общий модуль" - это универсальный объект метаданных, который потенциально может быть использован различными объектами.
Расположение и свойства общий модулей:
- Общие модули расположены в ветке метаданных "Общие"
- Можно создавать неограниченное количество общих модулей
- Каждый общий модуль должен отвечать за ОДНУ функциональность программы
- Достаточно один раз описать алгоритм в общем модуле и вызывать его из других мест
Основные свойства общего модуля:
- Имя - по нему обращаются к модулю в коде. Пишут по правилам формирования идентификаторов. Например, УчётНДС, СуммаНДС ()
- Синоним - существует для общности, пользователи его не видят
- Комментарий - не заполняется. Виден другим разработчиком в конфигураторе
Давайте создадим наш первый общий модуль:
1. В дереве конфигуратора выберем "Общий модуль" и создадим его
2. Также создадим новый документ с четырьмя реквизитами (Слагаемое1, Слагаемое2, Множитель, Результат) с типом данных "Число" и создадим новую обработку с теми же реквизитами
3. Теперь в документе создаем новую форму с нашими данными и добавляем новую команду (Рассчитать) со следующим кодом
4. Проворачиваем тоже самое в обработке.
Давайте убедимся, что все работает
Но к нам должна была прийти мысль - "Зачем мы сделали два раза один и тот же код?"
Для этого как раз и нужен общий модуль, который мы будем вызывать:
1. В созданном общем модуле задаем имя "РаботаСФормой" и ставим галочку только на пункте "Клиент"
2. Пропишем следующий код (Мы создаем функцию, в которую будем передавать три наши параметра; Для использования этой функции пропишем "Экспорт"; Для вывода конечного результат пропишем "Возврат Показатель")
3. Теперь обратимся к нашему модулю и созданной функции через код наших объектов (Документ и Обработка) и пропишем следующий код
Убедимся, что все работает
Теперь при необходимости изменения логики работы алгоритма нам не нужно будет делать двойную работу, а нужно лишь будет изменить работы общего модуля.
Глобальный модуль
Если у общего модуля установлен флажок "Глобальный", использование (Вызов) такого модуля отличается принципиально
- К общему модулю обращаются по имени, а к его алгоритму через точку:
- Если код нужен часто, вы захотите вызывать его без имени модуля:
- Алгоритмы глобальных модулей доступны напрямую и во всех частях программы
ВАЖНО
Ведь объявив процедуру или функцию в глобальном модуле, вы лишаетесь возможности объявить одноимённый объект в других частях конфигурации, так как это имя уже будет занято.
Например, установим флажок на глобальном модуле, и создадим в форме новую команду с таким же именем "РассчитатьПоказатель".
При запуске платформы увидим следующую ошибку:
Серверные и клиентский модули
1. Серверные модули
- Серверный модуль выполняется на сервере - большом мощном компьютере, связанном с базой данных
- Отмечен флажком "Сервер"
- Используется для сложных расчетов и работы с данными
- Имя модуля по стандарту имеет суффикс "Сервер" или его нет вовсе (РаботаСФайламиСервер; ЦифроваяПодписьСервер)
Только из серверного модуля есть доступ к данным базы и можно возвращать результаты обработки на клиентский компьютер.
Клиенты зачастую сильно ограничены в вычислительно мощности, поэтому сложные расчеты принято выполнять на стороне сервера.
Если задача не требует выполнения непосредственно на устройстве конкретного пользователя, код должен быть серверным.
2. Клиентские модули
- Клиентский модуль выполняется на компьютере, за которым сидит человек.
- У него в свойствах включен флажок "Клиент"
- Говорят "модуль выполняется на клиенте"
- Имя модуля по стандарту обязательно имеет суффикс "Клиент" (РаботаСФайламиКлиент; ЦифроваяПодписьКлиент)
Модуль нужно выполнять на клиенте, когда требуется непосредственно компьютер пользователя, то есть не нужно обращение к серверу:
- Показать сообщение на экране
- Прочитать файл с диска компьютера пользователя
- Открыть окно рабочего места
Модули с общим кодом, исполняемым где угодно, имеют оба флажка и суффикс "КлиентСервер". Например, СтроковыеФункцииКлиентСервер.
Посмотрим на практике:
1. Изменим имя нашего модуля, работающего на стороне клиента, на "РаботаСФормойКлиент", платформа автоматически изменит имя во всех функциях, где мы его использовали
2. Создадим новый общий модуль с именем "РаботаСФормойСервер", установив флажок на "Сервер" и общий модуль с именем "РаботаСФормойКлиентСервер", установив флажок на "Клиент" и "Сервер"
Чтобы быстро узнать какие объекты работают с разными модулями, вызовем "Синтаксис-помощник" и узнаем о нужном объекте в разделе "Доступность":
Модуль с флагом "Вызов Сервера"
Для организации взаимодействия между клиентом и сервером мы можем использовать специальные модули с флагом "Вызов Сервер"
- В общем случае клиентские модули не видят модули серверные
- Сервер точечно в явном виде "разрешает" вызывать свои компоненты с клиента
- Модули вида "Вызов сервера" предназначены для взаимодействия сервера с клиентами
- Клиент может вызывать сервер и выполнить алгоритм на сервере
Давай разберемся на практике:
Предположим, что мы хотим выводить пользователю сообщение, где будет указано следующее обращение "Здраствуйте, вы работаете с "Организацией" в данный момент", где данные о названии "Организация" будет хранится на сервере.
- Создадим константу "НазваниеОрганизации" строчного типа данных и с длинной в 150 символов
- В предприятии сформируем нашу константу с именем "Путь в 1С с нуля"
- В нашем общем модуле пропишем следующую процедуру:
- Обратимся к нашей процедуру через форму документа, для этого создадим новую команду "Приветствие" со следующим кодом.
- Проверим, как отображается наше сообщение
Теперь сделаем так, чтобы выводилось наше название введенное в константу:
- В общем модуле "РаботаСФормойСервер" пропишем следующий код
- Создадим новый общий модуль "РаботаСФормойВызовСервера" с установленным флажком "Вызов Сервера" и пропишем следующий код
- В нашем клиентском модуле изменим код
- Запустим платформу и увидим наши изменения
Привилегированный режим
- Привилегированный режим применяют, когда код нужно выполнить в обход всех установленных ограничений прав доступа
- В общем модуле можно установить флажок "привилегированный"
- В этом случае код будет выполнен, даже если пользователь не имеет права на работы с объектом метаданных
Простым языком мы можем давать возможность модулю работать в обход установленных ограничениях в ролях, однако лучше этим не злоупотреблять, ведь это огромная брешь в безопасности.
Повторно используемые значения
- Для сложных расчётов, которые выполняются долго и могут повторяться может на некоторый промежуток времени сохранить результат
- Если этот результат затребовать в нескольких местах программы, он не будет рассчитываться заново, а будет взят из специального хранилища - кеша
- Кешируется - повторное значение не вычисляется, а используется посчитанный ранее результат
Модули с повторным использованием значений нужны в небольшом спектре задач, когда это оправдано по времени:
- Кешировать рекомендуется только тяжелые расчёты, которые нужны чаще, чем длится время расчёта
- Хранение результатов в кеше требует памяти
- Если кеш очень большой, тратится время на поиск нужного результат в нём
Таким модулям принято давать суффикс "ПовтИсп", например, "ОбщегоНазначенияПовтИсп"
Модули приложения, объектов, форм
Модуль приложения - это клиентский модуль, выполняется только на стороне клиента, не имеет доступа к базе данных
Модуль приложения:
- Принадлежит самой конфигурации
- Открывается от корня дерева метаданных
- Отвечает за поведение окна приложения в целом
В модуле приложения можно определить, что будет происходить:
- Перед запуском и при запуске
- По внешнему событию, например, при срабатывании сканера штрихкода
- Перед выходом из программы
Модуль сеанса:
- Принадлежит самой конфигурации
- Работает на сервере
- Отвечает за начало сеанса работы пользователя на сервере
- Запускается и отрабатывает до начала работы пользователя в базе, непосредственно перед запуском модуля приложения
Общая схема запуска приложения:
1. Пользователь запускает приложение
2. Пользователь авторизуется в базе данных
3. На сервере отрабатывает модуль сеанса, который ничего не знает о том, что запускается: он просто понимает, что кто-то зашел в базу и подготавливает для пользователя сеанс работы
4. После запуска сеанса на стороне клиента запускается модуль приложения, в котором может быть выполнен код уже непосредственно на компьютере пользователя: проверка формата запуска (вида клиента) вывод приветственных сообщений
Модуль приложения
Давайте разберем модуль приложения (Разработаем приветствие при запуске платформы)
1. Откроем модуль приложения в конфигурации
2. Пропишем следующий код и воспользуемся нашей функцией, созданной в общем модуле "РаботаСФормойКлиент"
3. Запустим платформу и увидим наше сообщение
Тот код, что мы реализовали - некорректен и так делать не стоит.
Модули объектов
- Модули объектов отвечают за поведение отдельных экземпляров объектов
- В модулях объектов доступны данные объектов, и программист может контролировать, как объект работает
- В модуле справочника "Контрагенты" можно реализовать код, который будет:
1. Заполнять нового контрагента при создании
2. Проверять правильность заполнения перед записью
3. Записывать дополнительные сведения в БД вместе с самим контрагентом
- Для этого в модулях объектов создают обработчики событий
Самые типичные события объектов:
- ПередЗаписью - срабатывает перед записью объекта в базу данных.
- В обработчике можно дополнить или изменить записываем данные
- Например, собрать полное наименование контрагента из краткого и организационно-правовой формы
- ПриЗаписи - объект записан в базу данных, но сама операция работы с данными (транзакция) не завершена
- Например, в обработчике можно вместе с контрагентом записать связанные с ним данные
- ОбработкаЗаполнения - событие, срабатывающее при создании нового объекта.
- В обработчике можно заполнить объект по умолчанию
- Например, задать вид контрагента "Юридическое лицо"
- ПриКопировании - событие, срабатывающее при создании копии объекта
- Например, можно установить новое значение поля "Автор" и новое значение поля "Дата создания"
Давайте разбираться на примере (Создадим справочник, где пол сотрудника уже будет предопределен)
1. Создадим новый справочник "Сотрудники" и перечисление "Пол" с данными "мужской" и "женский", внеся их в справочник
2. Перейдем в модуль объекта "Справочника" и пропишем следующий код
3. Запустим платформу и создадим нового сотрудника (Увидим, что значение предопределенно)
Модули менеджеров
Модули менеджеров определяют поведение класса однородных объектов.
Если представить справочник в виде таблицы:
- Модуль объекта описывает логику работы одной строки этой таблицы
- Модуль менеджера описывает события, связанные со всей таблицей в целом
События модуля менеджера:
- ОбработкаПолучениеПредставления - событие, срабатывающее, когда платформы формирует представление объекта
В обработчике можно переопределить его, например, собрав полное наименование на лету, из наименования и других реквизитов
- ОбработкаПолученияДанныхВыбора - событие, срабатывающее, когда пользователь ищет объект, вводя часть его наименования в поле ввода
В обработчике можно реализовать поиск не только по наименованию, но и по другим реквизитам: по email, по ИНН
Давайте разбираться на примере:
1. Создадим три новых реквизита: реквизит "ТабельныйНомер" для нашего справочника, реквизит "Сотрудник" с ссылочным типом данных на справочник сотрудники для документов (Не забудьте добавить в форму) и точно такой же реквизит "Наименование" для обработки
2. Запустим платформу и увидим, что все работает корректно
3. Пропишем следующий код в модуле менеджера для справочника
4. Запустим платформы и увидим, что теперь у нас отображается наименование сотрудника и его табельный номер при обращении
Модули форм
- Форма - это экранный объект, в который пользователь вносит данные
- На форма размещены поля ввода, флажки, табличные части, кнопки, картинки, подсказки
- Поведение всех этих элементов, реакцию на нажатие кнопок и ввод текста описывают в модуле формы
- События в модуле формы могут быть связаны как с самой формой, так и с элементами формы
Модули формы являются смешанными, так как в них размещен код, который выполняется и на стороне клиента, и на стороне сервера
Чтобы сообщить платформе, где будет размещен код смешанных модулей, используют директивы компиляции: &НаКлиенте, &НаСервере
Давайте разберем на примере:
1. Создадим новый реквизит в документе "ДатаПоследнейЗаписи" с типом "Дата"
2. Добавим наш реквизит в форму и пропишем следующий код в модуле
3. Запустим платформу и увидим, что при записи нового документа устанавливается текущая дата
Стоит понимать, что этот код отработает только при работе с ФОРМОЙ, а не при работе с нашим объектом "Документы", поэтому создадим примерно такой же код для нашего объекта
Теперь наш реквизит дата меняется, как и на форме, так и в самом объекте при обновлении
Давайте рассмотрим ещё один пример (Предположим, мы хотим, чтобы основываясь на отчестве "Владимировна, Алексеевна" был автоматический выбор пола)
1. Создадим в нашем справочнике форму и присвоим нашему объекту "Наименование" событие "ПриИзменении"
2. Пропишем следующий код
3. Запустим платформу и напишем женское отчество, увидим, что пол автоматически поменялся
На этом все, встретимся с вами уже завтра!