Разработка модулей на платформе 1С:Предприятие 8.3


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

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

    • осуществляет обработку интерактивного запуска и завершения Толстого клиента в режиме Обычного приложения, в котором присутствует обычный командный интерфейс в виде Главного меню
    • компилируется и как Клиент и как Сервер

Модуль управляемого приложения

  • обработка интерактивного запуска и завершения
    • Тонкого клиента
    • Толстого клиента
    • Управляемого приложения
    • Веб-клиента
  • обработка перехвата внешних событий
  • целиком компилируется на стороне Клиента (подразумевает и не требует директивы &НаКлиенте)

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

Модуль инициализирует значения глобальных переменных, служащих параметрами сеанса

  • модуль используется при любом режиме запуска
  • при старте приложения событие УстановкаПараметровСеанса вызывается самым первым
    • события в модуле приложения вызываются позже и могут выполнить Отказ в дальнейшем запуске приложения
    • событие УстановкаПараметровСеанса может возникать во время сеанса повторно
    • при первом вызове события УстановкаПараметровСеанса количество элементов в массиве параметров сеанса равно нулю
  • целиком компилируется &НаСервере
  • модуль работает в привилегированном режиме без контроля доступа
  • модуль определяет только процедуры и функции и не может содержать раздел переменных и программы
  • ?параметры сеанса доступны в любом месте конфигурации

Модуль внешнего соединения

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

Общий модуль

Общие модули содержат общие алгоритмы, которые могут вызываться из других модулей.

  • доступен только раздел описания процедур и функций (нельзя описывать переменные и программы).
  • режимы компиляции определяются опциями общего модуля
    • не требуется указывать директивы компиляции вначале процедур и функций, и хотя они не вызывают ошибок компиляции, использование директив &НаСервереБезКонтекста и &НаКлиентеНаСервереБезКонтекста сделает процедуру или функцию недоступной для любых серверных вызовов.
    • управлять компиляцией отдельных фрагментов модуля следует инструкциями препроцессора #ЕСЛИ #ИНАЧЕ #КОНЕЦЕСЛИ

Опции Общего модуля

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

Вызов метода общего модуля

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

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

Модуль объекта

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

  • присутствует у Справочников, Документов, Отчетов, Обработок, ПВХ
    • отсутствует у Констант, Перечислений, Журналов, Внешних источников данных
    • у Регистров аналогичную роль выполняет Модуль Записи
  • компилируется только на Сервере
  • доступ к реквизитам объекта в модуле объекта реализуется конструкция ЭтотОбъект.<реквизит>
  • может содержать раздел основной программы, который является для объекта конструктором по умолчанию
  • может содержать раздел описания переменных
    • переменные объявленные как Экспорт доступны у объекта как реквизиты <объект>.<Переменная>, но в отличие от реквизита она не сохраняется при записи
  • может описывать произвольные процедуры и функции
    • процедуры и функции описанные как Экспорт доступны у объекта как методы <объект>.<Процедура>(<параметры>)
      • по неизвестной причине доступ к переменным и методам у Обработок не действует
  • определенные как Экспорт переменные, процедуры и функции включаются в контекстную подсказку в редакторе любого модуля конфигурации

Примеры

Пример описания переменной, конструктора объекта, экспортной функции и пример вызова:

Модуль менеджера

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

  • присутствует у Справочников, Документов, Журналов, Перечислений, Отчетов, Обработок, ПВХ, Регистров, Бизнес-процессов, Задач
    • отсутствует у Внешних источников данных
  • компилируется на Сервере, с Клиентом пока непонятно
  • не может иметь ни раздел описания переменных, ни раздел основной программы
  • Экспортные процедуры и функции из модуля менеджера могут вызываться как статические методы <семейство>.<имя>.<Метод>()
    • доступность обеспечивается только из модулей на Сервере
  • вызываются вне контекста объекта, соответственно не получают этого контекста (не могут использовать ЭтотОбъект)
    • могут при необходимости получить объект или ссылку в параметре вызова
  • определенные как Экспорт переменные, процедуры и функции включаются в контекстную подсказку в редакторе любого модуля конфигурации

Примеры

Пример описания статической экспортной функции и ее вызов из другого модуля , где эти типы доступны (на Сервере). :

Модуль менеджера значения

Основное назначение модуля — обрабатывать события записи константы.

Модуль формы

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

  • компиляция по умолчанию выполняется на Сервере, но отдельные фрагменты модуля могут устанавливать другую область компиляции директивами компиляции
  • НаКлиенте
    • реквизиты объекта формы доступны через Объект.<Реквизит>
    • реквизиты формы доступны непосредственно по имени <Реквизит>
    • элементы формы доступны через Элементы.<Элемент>
    • статические переменные существуют только на время обработки события формы, а затем удаляются
  • НаСервере
    • реквизиты объекта формы доступны через Объект.<Реквизит>
    • реквизиты формы доступны непосредственно по имени <Реквизит>
    • элементы формы на Сервере недоступны
    • статические переменные существуют только на время вызова метода на Сервере, а затем удаляются
  • НаСервереБезКонтекста реквизиты недоступны
  • реквизиты на Клиенте и на Сервере являются сходными, но не эквивалентными
    • данные реквизитов при каждом вызове НаКлиенте->НаСервере и возврате НаСервере->НаКлиенте все (целиком в полном объеме) проходят через XDTO сериализацию
    • доступные методы реквизитов на Клиенте и на Сервере отличаются

Модуль набора записей

///

Модуль команды

///

Разделы модулей

  • объявления переменных (кроме общих модулей)
  • процедур и функций
  • основной программы (кроме общих модулей)
Раздел: …Объявления
Переменных
…Процедур и функций …Основной
программы
Вид Модуля &СБК &КСБК
Модуль обычного приложения + + + + + +
Модуль управляемого приложения + + ? +
Модуль сеанса + + ? +
Модуль внешнего соединения + + ? +
Общий модуль ?
Модуль формы + + + + + +
Модуль объекта + + +
Модуль менеджера +
Модуль набора записей + ? +
Модулеь менеджера значения + ? +
Модуль команды + ? +

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

Пять директив определяют область исполнения функций и процедур. Их следует применять только в коде модулей управляемых форм и в коде модулей команд, в остальных модулях рекомендуется применять инструкции препроцессора.

Директива Реквизиты формы Объекты бд
&НаСервереНаКлиенте + +
&НаКлиенте +
&НаСервере (по умолчанию) + +
&НаСервереБезКонтекста +
&НаКлиентеНаСервереБезКонтекста
  • директива должна предшествовать каждому определению в модуле
  • по умолчанию действует директива &НаСервере
  • директива &НаСервереБезКонтекста имеет смысл только в формах (чей контекст директива подразумевает)
  • определение в общем модуле с директивой &НаСервере в общем модуле имеет
  • директива &НаСервереНаКлиенте применяется только в коде модулей команд
  • приведенный в таблице порядок директив соответствует иерархии доступности, так функции и процедуры определенные с некоторой директивой имеют доступ к процедурам и функциям определенным с той же директивой, либо с любой директивой следующей ниже, но не имеют доступа к определенным с предшествующей директивой
    • определениям с директивой &НаКлиенте доступны все определения на Клиенте и все определения на Сервере, для которых предусмотрен серверный вызов
    • определениям с директивой &НаКлиентеНаСервереБезКонтекста доступны определения только с такой же директивой

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

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

Предусмотрены четыре инструкции

  • #Если <Логическое выражение> Тогда
  • #ИначеЕсли <Логическое выражение> Тогда
  • #Иначе
  • #КонецЕсли

где:

  • <Логическое выражение> = [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора>]…]
  • <Символ препроцессора> = {НаКлиенте | НаСервере | ТолстыйКлиентОбычноеПриложение | ТолстыйКлиентУправляемоеПриложение | Клиент | Сервер | ВнешнееСоединение }
    <Булева операция> = {И | ИЛИ}

Области

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

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

  • #Область <имя области>
  • #КонецОбласти

Особенности:

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

///

Аннотации расширения модулей

Три аннотации позволяют определить перехват порядка вызова типовых методов новыми методами.

  • &Перед — перехватчик будет выполнен до того, как начнётся выполнение типового метода.
  • &После — перехватчик будет выполнен после того, как выполнится типовой метод.
  • &Вместо — реализует возможность полного перекрытия типового метода (типовой метод вообще не будет выполнен)
    • в методе-перехватчике в произвольном месте можно вызвать типовой метод вызовом ПродолжитьВызов().

Источник: Расширение модулей //wonderland.v8.1c.ru

Передача параметров и возвращаемых значений

Для характеристики типов значений в 1С используется понятие мутабельность (от англ. Mutable — изменчивый), которое нуждается в разъяснении. Немутабельными типами являются простые типы (Число, Строка, Дата, Булево, Цвет, Ссылка), для которых определены пустые значения. Мутабельными типами являются сложные типы (Структура, Массив, СписокЗначений, ТаблицаЗначений, ДеревоЗначений, Объект, Форма и т.п.), свойства которых могут быть изменены после создания, а проверка на пустое значение лишена смысла.

!!!

  • Попытка передачи мутабельного значения — это попытка передачи объекта на сервер(клиент), данные которого могут быть изменены на клиенте(сервере). Попытка передачи мутабельного значения с клиента на сервер, с сервера на клиент 1С:Предприятия возникает только в клиент-серверной версии (SQL).
  • Передача параметров функции (процедуре), выполняемой на сервере достаточно тонкий вопрос. Это в первую очередь связано с необходимостью передачи их между процессом сервера приложений и клиента. При переходе управления с клиентской части на серверную все передаваемые параметры сериализуются, передаются на сервер, где «распаковываются» и используются. При переходе с серверной части на клиентскую – обратный процесс. Здесь необходимо отметить, что данная схема корректно обрабатывает передачу параметров по ссылке и по значению. При передаче параметров действуют следующие отграничения:
    • Передавать между клиентом и сервером (в обе стороны) можно только немутабельные значения (т.е. значения которых не могут изменяться): примитивные типы, ссылки, универсальные коллекции, значения системных перечислений, хранилище значения. При попытке передать что-либо другое – аварийное завершение клиентского приложения (даже, если передавать некорректный параметр пытается сервер).
    • Не рекомендуется при передаче параметров передавать большие объёмы данных (например, строки более 1 миллиона символов), это может негативно сказаться на производительности сервера.
    • Передача в любом направлении ссылок на данные преобразует ссылки в копии данных, так при передаче структур и массивов других взаимосвязанных ссылками структур будет получена структура похожая по содержанию на исходную, но ссылочная связанность в ней будет потеряна и связные изменения выполняться не будет.
      • Описанное разрушение ссылочной целостности происходит в реквизитах управляемой формы при первом же вызове метода &НаСервере!
    • Нельзя передавать параметры, содержащие циклическую ссылку, причем как с сервера на клиент, так и обратно. При попытке передать такой параметр – аварийное завершение клиентского приложения (даже если передавать некорректный параметр пытается сервер).
    • Не рекомендуется передавать очень сложные коллекции данных. При попытке передачи параметра с очень большим уровнем вложения происходит аварийное завершение сервера.
  • Передача из модуля формы объекта Объект в процедуру НаСервере через возвращаемый параметр завершится ошибкой «Нельзя изменять поле, содержащее объект данных формы« в момент возврата при завершении, т.к. платформа будет пытаться возвратить сам Объект, даже если никакие изменения в него внесены не были.
    • если процедуре необходимо передать измененные в форме данные Объекта, то этот параметр процедуры должен быть декларирован как передаваемый по значению
    • иначе процедуре следует передавать ссылку Объект.Ссылка.

!!!

Предопределенные Объекты конфигурации

ЭтаФорма

  • Используется в модуле формы в процедурах &НаКлиенте и &НаСервере для обращения к элементам формы и реквизитам
  • Пример обращения к элементу формы через объект Элементы: ЭтаФорма.Элементы.НомерВерсии.Заголовок = ‘My God!’;
  • Пример обращения к реквизиту формы: ЭтаФорма.ТекстОбъявления=’Hello!’;
  • В модуле формы ключевое слово ЭтаФорма необязательно и допускается: Элементы.НомерВерсии.Заголовок = ‘My God!’;
  • Описанные выше способы применимы только к простым типам
  • Для сложных типов (ТаблицаЗначений, ДеревоЗначений) обращение приводит к объекту типа ДанныеФормыКоллекция
  • Для получения значения объекта формы сложного типа применяется метод: <переменная>=РеквизитФормыВЗначение(<ИмяРеквизита>);
  • Для установки значения объекта формы сложного типа применяется: ЗначениеВРеквизитФормы(<Значение>, <ИмяРеквизита>);
  • Функции РеквизитФормыВЗначение() и ЗначениеВРеквизитФормы() доступны только на Сервере.

Объект

  • Указывает на объект прикладных данных в открытой форме, например: Объект.Ссылка;
  • Полный формат: ЭтаФорма.Объект.Ссылка;

ЭтотОбъект

  • Указывает на объект формы для доступа к реквизитам формы
  • Допускает только чтение
  • Доступен для Сервер, Толстый клиент, Внешнее соединение

Запись

В модуле записи регистра…

Элементы

В модуле формы коллекция Элементы содержит все элементы формы

  • Элементы.<имя элемента>
  • Элементы(«<имя элемента>»)
  • получить значение элемента ни свойством, ни методом нельзя

Функции

  • ЗначениеЗаполнено(<Значение>)
  • ПредопределенноеЗначение(<ИмяПредопределенногоЗначения>)  применимо к Справочник, Перечисления…
  • ЗначениеВДанныеФормы(<Значение>, <Объект>)
  • ДАТАВРЕМЯ(<год>,<месяц>,<число>, <час>,<минута>, <секунда>)
  • РАЗНОСТЬДАТ(<начало>,<конец>, {СЕКУНДА,МИНУТА,ЧАС,ДЕНЬ,МЕСЯЦ,КВАРТАЛ,ГОД}) — для вычисления разности между датами в указанных единицах без округления (неожиданные «парадоксы»: между первой и последней минутой одного часа 0 часов; между первой минутой часа и предыдущей минутой 1 час; между первым и последним днем года 364 дня, 11 месяцев, 3 квартала, 0 годов; между 31 декабря и Новым годом 1 день, 1 месяц, 1 квартал, 1 год) /its.1c.ru

Формы

Правильное программное открытие форм в управляемом приложении //infostart.ru/public/236382/

  • Простейший способ открывать форму существующего объекта:

  • Пример открытия формы существующего объекта ИБ:

  • Соответственно отсутствие значения у ‘Ключ’ указывает на то, что объект еще не был сохранен в ИБ:

  • Открытие модальной формы выбора для интерактивного выбора произвольного типа:

.

Дополнения

ДополнительныеСвойства

В случаях, когда в объекте необходимо сохранить какие-то данные на период нахождения объекта в памяти, вместо объявления переменной в модуле объекта можно воспользоваться структурой объекта ДополнительныеСвойства, как проиллюстрировано в примере:

 

Примеры кода

Определение типа запуска приложения используя инструкции препроцессора

Свободный поиск объекта по GUID

Источники

  • ИТС
    • Правила создания общих модулей //its.1c.ru
    • Структура модуля (управляемого, мобильного, обычного приложения) //its.1c.ru
    • Требования оформления Тексты модулей на //its.1c.ru
    • Использование аннотаций компиляции и инструкций препроцессора //its.1c.ru
  • Модули в Платформе 1С:Предприятие 8.3 на //курсы-по-1с.рф
  • Как работает серверный вызов в 1С на //курсы-по-1с.рф
  • Попытка передачи мутабельного значения на //infostart.ru

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