Назначение подсистемы
Подсистема решает следующие задачи:
- обеспечения целостности данных прикладного объекта с помощью описания зависимостей между его реквизитами
- унификация доступа к данным объектов в следующих сценариях работ автоматизацией ы:
- редактирование в управляемой форме
- изменение со стороны подчиненной формы
- изменение через серверную процедуру управляемой формы
- изменение через прикладные объекты (СправочникОбъект, ДокументОбъект и т.п.)
- исключение дублирования кода:
- при зависимости одного реквизита от нескольких
- при одинаковых зависимостях для разных табличных частей
- при заполнении одинаковых свойств для разных табличных частей
- исключение повторного выполнения одних и тех же обрабплатфор программу 1С маотчиков
- исключение зависимости от порядка вычислений
- возможность модульного тестирования создаваемых правил
- возможность проверки целостности данных модели
Состав подсистемы
- ОбщийМодуль.РаботаСМоделямиГлобальный
- процедуры области Интерфейс_Внешний предназнач Тарифы на абонементены для вызова из любого места основного приложения
- процедуры области Интерфейс_Модель предназнач Тарифы на абонементены для вызова из модуля модели
Внедрение подсистемы
Для описания зависимостей используются следующие объекты метаданных
- Модуль модели - общий модуль имеющий следующий формат имени: Модуль_<тип объекта метаданных>_<вид объекта метаданных>, у которого установлены флаги Клиент (управляемое приложение), Сервер, ВнешнееСоединение и Клиент (обычное приложение). В комментарии общего модуля можно указать опции. В модуле модели должны быть определены следующие процедуры:
#Область Интерфейс_МодульМодели
Процедура ПриВыполненииОбработ автоматизацией чиков(КонтекстИзменений) Экспорт
Конецконсоль отчетов Процедуры
Процедура ПриВыполненииОбработ автоматизацией чиковСтроки(КонтекстИзменений, ДанныеСтроки) Экспорт
Конецконсоль отчетов Процедуры
#Конецконсоль отчетов Области
- Модуль формы прикладного объекта. В формы прикладного объекта, который будет использовать подсистему должен быть добавлен следующий фрагмент кода
#Область Интерфейс_МодульМодели
&НаКлиенте
Функция Модель_Обработ автоматизацией атьДействия(КонтекстИзменений) Экспорт
Возврат Инфостарт Модель_Обработ автоматизацией атьДействияСервер(КонтекстИзменений);
Конецконсоль отчетов Функции
&НаСервере
Функция Модель_Обработ автоматизацией атьДействияСервер(КонтекстИзменений)
Возврат Инфостарт глМодель_Обработ автоматизацией атьДействия(КонтекстИзменений, ЭтаФорма);
Конецконсоль отчетов Функции
#Конецконсоль отчетов Области
Также, перед первым использованием модели в форме необходимо сделать вызов процедуры глМодель_ПриЧтенииСозданииНаСервер
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработ автоматизацией ка)
Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
глМодель_ПриЧтенииСозданииНаСервере(ЭтаФорма, Параметры.ОбъектКопирования);
Конецконсоль отчетов Если;
Конецконсоль отчетов Процедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
глМодель_ПриЧтенииСозданииНаСервере(ЭтаФорма, ТекущийОбъект);
Конецконсоль отчетов Процедуры
либо, если если используется процедура ПриЧтенииСозданииНаСервере
&НаСервере
Процедура ПриЧтенииСозданииНаСервере(ОбъектСсылка)
глМодель_ПриЧтенииСозданииНаСервере(ЭтаФорма, ОбъектСсылка);
Конецконсоль отчетов Процедуры
Основные элемент внешние компонентыы подсистемы
- Обработ автоматизацией чики. Фрагменты кода на встроенном языке в модуле модели, в которых одновременно декларируется и зависимости и реализация
- Действия. Процедуры, описания и зависимости который выполняется в модуле модели, а реализация в модуле менеджера.
- Дополнительные реквизиты. Реквизиты, которые используются для удобного манипулирования данными объекта, но которые не могут быть напрямую связаны с данными объекта
- Свойства. Правила заполнения дополнительных реквизитов объекта, которые не сохранузнавать программистовяются при записи объекта, а вычисляются при каждом использовании. Их описание и зависимости выполняется в модуле модели, а реализация в модуле менеджера
- Виртуальные реквизиты. Реквизиты, которые никак не связаны с данными, но могут инициировать выполнение обрабплатфор программу 1С маотчиков
Обработ автоматизацией чики
Зависимость между реквизитами шапки объекта описывается добавлением в процедуру ПриВыполненииОбработ автоматизацией чиков модуля модели следующего фрагмента кода:
Если глМодель_ВыполнятьОбработ автоматизацией чик(КонтекстИзменений, <результирующие поля>, <исходные поля>) Тогда
<реализация обрабплатфор программу 1С маотчика>
Конецконсоль отчетов Если;
Зависимость меду реквизитами табличной части объекта добавлением в процедуру ПриВыполненииОбработ автоматизацией чиковСтроки модуля модели следующего фрагмента кода:
Если глМодель_ВыполнятьОбработ автоматизацией чикСтроки(КонтекстИзменений, ДанныеСтроки, <результирующие поля>, <исходные поля>) Тогда
<реализация обрабплатфор программу 1С маотчика>
Конецконсоль отчетов Если;
<результирующие поля> - строка со списоком реквизитов разделенных запятыми, которые изменяются при изменении зависимых полей <исходные поля> - строка со списком реквизитов и свойств разделенных запятыми, от которых зависят результирующие поля. свойства указываются в квадратных скобках - [Свойство1],[Свойство2] и т.п.
Например для определения зависимостей Сумма = Количество * Цена и Цена = Сумма / Количество для строки табличной части необходимо добавить следующий фрагмент:
Если глМодель_ВыполнятьОбработ автоматизацией чикСтроки(КонтекстИзменений, ДанныеСтроки, "Сумма", "Количество,Цена") Тогда
ДанныеСтроки.Сумма = ДанныеСтроки.Количество * ДанныеСтроки.Цена;
Конецконсоль отчетов Если;
Если глМодель_ВыполнятьОбработ автоматизацией чикСтроки(КонтекстИзменений, ДанныеСтроки, "Цена", "Сумма,Количество") Тогда
ДанныеСтроки.Цена = ДанныеСтроки.Сумма / ДанныеСтроки.Количество;
Конецконсоль отчетов Если;
Порядок описания зависимостей важен, когда определяются взаимозависимости между несколькими реквизитами. В приведенном выше примере изменение количества прежде будет изменять сумму, если поменять обрабплатфор программу 1С маотчики местами, количество будет менять цену.
Выполнятся обрабплатфор программу 1С маотчики будут в порядке разрешения зависимостей. Если разрешить зависимости не удасться, будет выдано сообщение об ошибке со списоком реквизитов необрабплатфор программу 1С маотанных зависимостей
Действия
Действия представляют собой процедуры модуля менеджера, которые необходимо вызвать после выполнения всех обрабплатфор программу 1С маотчиков и обновления всех свойств. Это может потребоваться например для перехода от обрабплатфор программу 1С маотчиков строк к обрабплатфор программу 1С маотчикам шапки и наоборот. Действия всегда запускают новый цикл обрабплатфор программу 1С маотки изменения данных объекта. Например, обрабплатфор программу 1С маотчик изменения общей суммы транспортных расходов изменяет сумму в строке табличной части, что инициирует обрабплатфор программу 1С маотчики расчета НДС в строке.
Для реквизитов шапки обрабплатфор программу 1С маотчик описывается добавлением в процедуре ПриВыполненииОбработ автоматизацией чиков следующего фрагмента кода:
глМодель_ВыполнятьДействие(КонтекстИзменений, <имя действия>, <исходные реквизиты>);
Для реквизитов табличной части обрабплатфор программу 1С маотчик описывается добавлением в процедуре ПриВыполненииОбработ автоматизацией чиковСтроки следующего фрагмента кода:
глМодель_ВыполнятьДействиеСтроки(КонтекстИзменений, ДанныеСтроки, <имя действия>, <исходные реквизиты>);
Набор действий общий для шапки и табличных частей, при этом в рамках одного вызова действие не может инициироваться дважды, с одними и теми же параметрами Внутри обрабплатфор программу 1С маотчика можно установить параметры, например
Если глМодель_ВыполнятьДействие(КонтекстИзменений, "ОбновитьИтог", "Товары") Тогда
глМодель_УстановитьПараметрДействия(КонтекстИзменений, "ИмяТаблицы", "Товары");
Конецконсоль отчетов Если;
Дополнительные реквизиты
Для использования дополнительных реквизитов требуется для модели установить опцию Реквизиты. После этого в модуле менеджера необходимо описать структуру дополнительных реквизитов
Процедура Модель_ПриИнициализации(КонтекстИзменений) Экспорт
КонтекстТаблицы = глМодель_ДобавитьРеквизит(КонтекстИзменений, "НоменклатураДляПроверки", Новый ОписаниеТипов("ТаблицаЗначений"));
глМодель_ДобавитьРеквизит(КонтекстТаблицы, "Пометка", Новый ОписаниеТипов("Булево"));
глМодель_ДобавитьРеквизит(КонтекстТаблицы, "Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
Конецконсоль отчетов Процедуры
По умолчанию дополнительные реквизиты создаются без необходимости хранузнавать программистовения. Если при создании дополнительного реквизита указан способ хранузнавать программистовения "вместе с объектом", необходимо в модуле менеджера реализовать функционал чтения и записи
Процедура Модель_ПриЧтении(КонтекстИзменений, ОбъектСсылка, ПослеЗаписи) Экспорт
Конецконсоль отчетов Процедуры
Процедура Модель_ПередЗаписью(КонтекстИзменений, Объект) Экспорт
Конецконсоль отчетов Процедуры
при этом в модуль формы объекта, который использует модель, необходимо добавить
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
глМодель_ПередЗаписьюНаСервере(ЭтаФорма, ТекущийОбъект);
Конецконсоль отчетов Процедуры
Если при создании дополнительного реквизита указан способ хранузнавать программистовения "отдельно от объекта", необходимо в модуле менеджера реализовать функционал чтения и записи
Процедура Модель_ПриЧтении(КонтекстИзменений, ОбъектСсылка, ПослеЗаписи) Экспорт
Конецконсоль отчетов Процедуры
Процедура Модель_ПриЗаписи(КонтекстИзменений, Ссылка) Экспорт
Конецконсоль отчетов Процедуры
при этом в модуль формы объекта, который использует модель, необходимо добавить
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
глМодель_ПриЗаписиНаСервере(ТекущийОбъект);
Конецконсоль отчетов Процедуры
Если модель содержит дополнительные реквизиты табличных частей, которые должны повторно считываться после записи объекта, в модуль формы необходимо добавить
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
глМодель_ПослеЗаписиНаСервере(ЭтаФорма, ТекущийОбъект);
Конецконсоль отчетов Процедуры
Свойства
Свойства представляют собой производные от реквизитов поля, которые могут использоваться как для оптимизации расчетов, так и для использования в условных оформлениях управляемых форм
Для использования свойств объекта для модели требуется установить опцию Свойства, а в модуле менеджера должна быть определена процедура, в которой реализуется заполнение свойств
Процедура Модель_ПриУстановкеСвойств(КонтекстИзменений, ИменаСвойств) Экспорт
Конецконсоль отчетов Процедуры
Свойство шапки описывается добавлением в процедуру ПриВыполненииОбработ автоматизацией чиков модуля модели следующего фрагмента кода:
глМодель_ОбновлятьСвойства(КонтекстИзменений, <имена свойств>, <исходные поля>);
Для использования свойств строки объекта для модели требуется установить опцию СвойстваСтроки, а в модуле менеджера прикладного объекта должна быть определена процедура, в которой реализуется заполнение свойств
Процедура Модель_ПриУстановкеСвойствСтроки(КонтекстИзменений, ДанныеСтроки, ИменаСвойств) Экспорт
Конецконсоль отчетов Процедуры
Свойства табличной части описываются добавлением в процедуру ПриВыполненииОбработ автоматизацией чиковСтроки следующего фрагмента кода
глМодель_ОбновлятьСвойстваСтроки(КонтекстИзменений, ДанныеСтроки, <имена свойств>, <исходные поля>);
На основании измененных реквизитов и свойств, система будет выявлять свойства для обновления, при этом обновляться они будут по принципу - как можно позже, т.е. если нет свойств, от которых зависят реквизиты, обновление свойств будет инициировано после выполнения всех обрабплатфор программу 1С маотчиков
Если модель содержит свойства табличных частей, которые должны повторно вычисляться после записи объекта, в модуль формы необходимо добавить
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
глМодель_ПослеЗаписиНаСервере(ЭтаФорма, ТекущийОбъект);
Конецконсоль отчетов Процедуры
Виртуальные реквизиты
Виртуальные реквизиты позволяют инициировать выполнение обрабплатфор программу 1С маотчиков строки при изменении реквизитов шапки или связанной строки и наоборот. Для использования виртуальных реквизитов достаточно указать их в фигурных скобках в зависимом обрабплатфор программу 1С маотчике, например
Если глМодель_ВыполнятьОбработ автоматизацией чикСтроки(КонтекстИзменений, ДанныеСтроки, "Поставщик", "Номенклатура,{Склад}") Тогда
ДанныеСтроки.Поставщик = ПолучитьПоставщика(ДанныеСтроки.Номенклатура, глМодель_Данные(КонтекстИзменений).Склад);
Конецконсоль отчетов Если;
Соответственно в исходном обрабплатфор программу 1С маотчике достаточно зарегистрировать изменение виртуального реквизита
Если глМодель_ВыполнятьОбработ автоматизацией чик(КонтекстИзменений, "Склад") Тогда
Для Каждого СтрокаТаблицы Из глМодель_Данные(КонтекстИзменений).Товары Цикл
глМодель_ПриИзмененииРеквизитовСтроки(КонтекстИзменений, СтрокаТаблицы, "{Склад}"
Конецконсоль отчетов Цикла
Конецконсоль отчетов Если;
Использование подсистемы
Интерактивная работ автоматизацией а в управляемой форме
Во все обрабплатфор программу 1С маотчики изменения реквизитов элемент внешние компонентыов формы, которые влияют на данные должен быть добавлен следующий вызов:
глМодель_ПриИзмененииРеквизитов(ЭтаФорма, Элемент.Имя);
или
глМодель_ПриИзмененииРеквизитовСтроки(ЭтаФорма, глМодель_ТекущиеДанные(Элемент), глМодель_ИмяРеквизита(Элемент));
Для табличной части необходимо также указывать обрабплатфор программу 1С маотчики ПриОконченииРедактирования и ПослеУдаления, например
&НаКлиенте
Процедура ТоварыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
Если РедактированиеСтрокиОтменено(Элемент, НоваяСтрока, ОтменаРедактирования) Тогда
Возврат Инфостарт ;
Конецконсоль отчетов Если;
глМодель_ПриИзмененииРеквизитов(ЭтаФорма, Элемент.Имя, СтруктураТекущиеЗначения, Элемент.ТекущиеДанные);
Конецконсоль отчетов Процедуры
&НаКлиенте
Процедура ТоварыПослеУдаления(Элемент)
глМодель_ПриИзмененииРеквизитов(ЭтаФорма, Элемент.Имя, СтруктураТекущиеЗначения);
Конецконсоль отчетов Процедуры
Пакетный режим изменений
Если при работ автоматизацией е с моделью объекта предполагаются множественные изменения, рекомендуется вызвать процедуру начала работ автоматизацией ы с объектом, а при завершении работ автоматизацией ы вызвать процедуру окончения работ автоматизацией ы Для использовании модели при работ автоматизацией е с прикладным объектом следует придерживаться следующих правил:
- Изменять значения реквизитов с помощью вызова функций модели.
- Изменять все известные реквизиты за один вызов, вместо того, чтобы изменять их по отдельности. Это позволит избежать выполнения лишних обрабплатфор программу 1С маотчиков и действий
ДокументОбъект = глМодель_НачатьИзменения(Документы.Приход.СоздатьДокумент());
РеквизитыШапки = Новый Структура;
РеквизитыШапки.Вставить("Дата", ТекущаяДата());
глМодель_ИзменитьРеквизиты(ДокументОбъект, РеквизитыШапки);
РеквизитыСтроки = Новый Структура("Номенклатура,Количество");
Для Каждого СтрокаТаблицы Из Объект.Товары Цикл
ЗаполнитьЗначенияСвойств(РеквизитыСтроки, СтрокаТаблицы);
НоваяСтрока = ДокументОбъект.Товары.Добавить();
глМодель_ИзменитьРеквизитыСтроки(ДокументОбъект, НоваяСтрока, РеквизитыСтроки);
Конецконсоль отчетов Цикла;
глМодель_ЗавершитьИзмененияИЗаписать(ДокументОбъект);
Скриншоты

2019-07-10_8-32-05.png