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

15.04.20

Разработка - Инструментарий разработчика

Подсистема позволяет описать модель данных объекта, где описана зависимость между реквизитами, и затем использовать эту модель в разных сценариях работы с объектом. Версия платформы: 8.3.6 и выше. С небольшими доработками будет работать на 8.2.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование SM По подписке [?] Купить один файл
Модель объекта. Версия от 14.04.2020
.cf 48,09Kb
3
3
1 SM
Скачать Купить за 1 850 руб.

Назначение подсистемы

Подсистема решает следующие задачи:

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

Состав подсистемы

  • ОбщийМодуль.РаботаСМоделямиГлобальный
    • процедуры области Интерфейс_Внешний предназначены для вызова из любого места основного приложения
    • процедуры области Интерфейс_Модель предназначены для вызова из модуля модели

Внедрение подсистемы

Для описания зависимостей используются следующие объекты метаданных

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

Процедура ПриВыполненииОбработчиковСтроки(КонтекстИзменений, ДанныеСтроки) Экспорт
КонецПроцедуры
#КонецОбласти
  • Модуль формы прикладного объекта. В формы прикладного объекта, который будет использовать подсистему должен быть добавлен следующий фрагмент кода
#Область Интерфейс_МодульМодели
&НаКлиенте
Функция Модель_ОбработатьДействия(КонтекстИзменений) Экспорт
	Возврат Модель_ОбработатьДействияСервер(КонтекстИзменений);
КонецФункции

&НаСервере
Функция Модель_ОбработатьДействияСервер(КонтекстИзменений)
	Возврат глМодель_ОбработатьДействия(КонтекстИзменений, ЭтаФорма);
КонецФункции
#КонецОбласти

Также, перед первым использованием модели в форме необходимо сделать вызов процедуры глМодель_ПриЧтенииСозданииНаСервер

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
		глМодель_ПриЧтенииСозданииНаСервере(ЭтаФорма, Параметры.ОбъектКопирования);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
	глМодель_ПриЧтенииСозданииНаСервере(ЭтаФорма, ТекущийОбъект);
КонецПроцедуры

либо, если если используется процедура ПриЧтенииСозданииНаСервере

&НаСервере
Процедура ПриЧтенииСозданииНаСервере(ОбъектСсылка)
	глМодель_ПриЧтенииСозданииНаСервере(ЭтаФорма, ОбъектСсылка);
КонецПроцедуры

Основные элементы подсистемы

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

Обработчики

Зависимость между реквизитами шапки объекта описывается добавлением в процедуру ПриВыполненииОбработчиков модуля модели следующего фрагмента кода:

Если глМодель_ВыполнятьОбработчик(КонтекстИзменений, <результирующие поля>, <исходные поля>) Тогда
  <реализация обработчика>
КонецЕсли;

Зависимость меду реквизитами табличной части объекта добавлением в процедуру ПриВыполненииОбработчиковСтроки модуля модели следующего фрагмента кода:

Если глМодель_ВыполнятьОбработчикСтроки(КонтекстИзменений, ДанныеСтроки, <результирующие поля>, <исходные поля>) Тогда
  <реализация обработчика>
КонецЕсли;

<результирующие поля> - строка со списоком реквизитов разделенных запятыми, которые изменяются при изменении зависимых полей <исходные поля> - строка со списком реквизитов и свойств разделенных запятыми, от которых зависят результирующие поля. свойства указываются в квадратных скобках - [Свойство1],[Свойство2] и т.п.

Например для определения зависимостей Сумма = Количество * Цена и Цена = Сумма / Количество для строки табличной части необходимо добавить следующий фрагмент:

Если глМодель_ВыполнятьОбработчикСтроки(КонтекстИзменений, ДанныеСтроки, "Сумма", "Количество,Цена") Тогда
	ДанныеСтроки.Сумма = ДанныеСтроки.Количество * ДанныеСтроки.Цена;
КонецЕсли;
Если глМодель_ВыполнятьОбработчикСтроки(КонтекстИзменений, ДанныеСтроки, "Цена", "Сумма,Количество") Тогда
	ДанныеСтроки.Цена = ДанныеСтроки.Сумма / ДанныеСтроки.Количество;
КонецЕсли;

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

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

Действия

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

Для реквизитов шапки обработчик описывается добавлением в процедуре ПриВыполненииОбработчиков следующего фрагмента кода:

глМодель_ВыполнятьДействие(КонтекстИзменений, <имя действия>, <исходные реквизиты>);

Для реквизитов табличной части обработчик описывается добавлением в процедуре ПриВыполненииОбработчиковСтроки следующего фрагмента кода:

глМодель_ВыполнятьДействиеСтроки(КонтекстИзменений, ДанныеСтроки, <имя действия>, <исходные реквизиты>);

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

Если глМодель_ВыполнятьДействие(КонтекстИзменений, "ОбновитьИтог", "Товары") Тогда
	глМодель_УстановитьПараметрДействия(КонтекстИзменений, "ИмяТаблицы", "Товары");
КонецЕсли;

 

Дополнительные реквизиты

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

Процедура Модель_ПриИнициализации(КонтекстИзменений) Экспорт
	КонтекстТаблицы = глМодель_ДобавитьРеквизит(КонтекстИзменений, "НоменклатураДляПроверки", Новый ОписаниеТипов("ТаблицаЗначений"));
	глМодель_ДобавитьРеквизит(КонтекстТаблицы, "Пометка", Новый ОписаниеТипов("Булево"));
	глМодель_ДобавитьРеквизит(КонтекстТаблицы, "Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
КонецПроцедуры

По умолчанию дополнительные реквизиты создаются без необходимости хранения. Если при создании дополнительного реквизита указан способ хранения "вместе с объектом", необходимо в модуле менеджера реализовать функционал чтения и записи

Процедура Модель_ПриЧтении(КонтекстИзменений, ОбъектСсылка, ПослеЗаписи) Экспорт
КонецПроцедуры

Процедура Модель_ПередЗаписью(КонтекстИзменений, Объект) Экспорт
КонецПроцедуры

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

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	глМодель_ПередЗаписьюНаСервере(ЭтаФорма, ТекущийОбъект);
КонецПроцедуры

Если при создании дополнительного реквизита указан способ хранения "отдельно от объекта", необходимо в модуле менеджера реализовать функционал чтения и записи

Процедура Модель_ПриЧтении(КонтекстИзменений, ОбъектСсылка, ПослеЗаписи) Экспорт
КонецПроцедуры

Процедура Модель_ПриЗаписи(КонтекстИзменений, Ссылка) Экспорт
КонецПроцедуры

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

&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	глМодель_ПриЗаписиНаСервере(ТекущийОбъект);
КонецПроцедуры

Если модель содержит дополнительные реквизиты табличных частей, которые должны повторно считываться после записи объекта, в модуль формы необходимо добавить

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
	глМодель_ПослеЗаписиНаСервере(ЭтаФорма, ТекущийОбъект);
КонецПроцедуры

Свойства

Свойства представляют собой производные от реквизитов поля, которые могут использоваться как для оптимизации расчетов, так и для использования в условных оформлениях управляемых форм

Для использования свойств объекта для модели требуется установить опцию Свойства, а в модуле менеджера должна быть определена процедура, в которой реализуется заполнение свойств

Процедура Модель_ПриУстановкеСвойств(КонтекстИзменений, ИменаСвойств) Экспорт
КонецПроцедуры

Свойство шапки описывается добавлением в процедуру ПриВыполненииОбработчиков модуля модели следующего фрагмента кода:

глМодель_ОбновлятьСвойства(КонтекстИзменений, <имена свойств>, <исходные поля>);

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

Процедура Модель_ПриУстановкеСвойствСтроки(КонтекстИзменений, ДанныеСтроки, ИменаСвойств) Экспорт
КонецПроцедуры

Свойства табличной части описываются добавлением в процедуру ПриВыполненииОбработчиковСтроки следующего фрагмента кода

глМодель_ОбновлятьСвойстваСтроки(КонтекстИзменений, ДанныеСтроки, <имена свойств>, <исходные поля>);

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

Если модель содержит свойства табличных частей, которые должны повторно вычисляться после записи объекта, в модуль формы необходимо добавить

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
	глМодель_ПослеЗаписиНаСервере(ЭтаФорма, ТекущийОбъект);
КонецПроцедуры

 

Виртуальные реквизиты

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

 
Если глМодель_ВыполнятьОбработчикСтроки(КонтекстИзменений, ДанныеСтроки, "Поставщик", "Номенклатура,{Склад}") Тогда
	ДанныеСтроки.Поставщик = ПолучитьПоставщика(ДанныеСтроки.Номенклатура, глМодель_Данные(КонтекстИзменений).Склад);
КонецЕсли;

Соответственно в исходном обработчике достаточно зарегистрировать изменение виртуального реквизита

Если глМодель_ВыполнятьОбработчик(КонтекстИзменений, "Склад") Тогда
	Для Каждого СтрокаТаблицы Из глМодель_Данные(КонтекстИзменений).Товары Цикл
		глМодель_ПриИзмененииРеквизитовСтроки(КонтекстИзменений, СтрокаТаблицы, "{Склад}"
	КонецЦикла
КонецЕсли;

 

Использование подсистемы

Интерактивная работа в управляемой форме

Во все обработчики изменения реквизитов элементов формы, которые влияют на данные должен быть добавлен следующий вызов:

глМодель_ПриИзмененииРеквизитов(ЭтаФорма, Элемент.Имя);

или

глМодель_ПриИзмененииРеквизитовСтроки(ЭтаФорма, глМодель_ТекущиеДанные(Элемент), глМодель_ИмяРеквизита(Элемент));

Для табличной части необходимо также указывать обработчики ПриОконченииРедактирования и ПослеУдаления, например

&НаКлиенте
Процедура ТоварыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	Если РедактированиеСтрокиОтменено(Элемент, НоваяСтрока, ОтменаРедактирования) Тогда
		Возврат;
	КонецЕсли;
	
	глМодель_ПриИзмененииРеквизитов(ЭтаФорма, Элемент.Имя, СтруктураТекущиеЗначения, Элемент.ТекущиеДанные);
КонецПроцедуры

&НаКлиенте
Процедура ТоварыПослеУдаления(Элемент)
	глМодель_ПриИзмененииРеквизитов(ЭтаФорма, Элемент.Имя, СтруктураТекущиеЗначения);
КонецПроцедуры

Пакетный режим изменений

Если при работе с моделью объекта предполагаются множественные изменения, рекомендуется вызвать процедуру начала работы с объектом, а при завершении работы вызвать процедуру окончения работы Для использовании модели при работе с прикладным объектом следует придерживаться следующих правил:

  • Изменять значения реквизитов с помощью вызова функций модели.
  • Изменять все известные реквизиты за один вызов, вместо того, чтобы изменять их по отдельности. Это позволит избежать выполнения лишних обработчиков и действий
ДокументОбъект = глМодель_НачатьИзменения(Документы.Приход.СоздатьДокумент());
	
РеквизитыШапки = Новый Структура;
РеквизитыШапки.Вставить("Дата", ТекущаяДата());
глМодель_ИзменитьРеквизиты(ДокументОбъект, РеквизитыШапки);
	
РеквизитыСтроки = Новый Структура("Номенклатура,Количество");
Для Каждого СтрокаТаблицы Из Объект.Товары Цикл
	ЗаполнитьЗначенияСвойств(РеквизитыСтроки, СтрокаТаблицы);
	
	НоваяСтрока = ДокументОбъект.Товары.Добавить();
	глМодель_ИзменитьРеквизитыСтроки(ДокументОбъект, НоваяСтрока, РеквизитыСтроки);
КонецЦикла;
	
глМодель_ЗавершитьИзмененияИЗаписать(ДокументОбъект);

 

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    141506    777    391    

804

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 руб.

06.10.2023    11763    31    6    

62

Инструментарий разработчика Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

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

5400 руб.

17.05.2024    14443    36    29    

81

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 руб.

10.11.2023    7406    27    4    

51

SALE! %

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2880 руб.

14.01.2013    182215    1105    0    

876

Инструментарий разработчика Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    101261    243    97    

304

Инструментарий разработчика Перенос данных 1C Программист Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы. Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение для 1С, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    24580    17    15    

34

Инструментарий разработчика Программист Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    19535    7    8    

42
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Evil Beaver 8171 13.01.20 09:31 Сейчас в теме
Мне кажется, это нечто интересное, но я не понял что это. Можете привести прикладной пример использования? Для чего некий "я" мог бы это скачать и использовать? В какой задаче?
gonnahard; +1 Ответить
3. vadim1980 131 13.01.20 11:20 Сейчас в теме
(1) Например в конфигурации на базе ERP 2 от компании 1С при любом изменении реквизитов составляется упорядоченный список действий, которые должны выполняться после изменения. Данная разработка позволяет инкапсулировать все эти зависимости в отдельном модуле, изменять реквизиты объекта с помощью отдельных методов и все зависимые реквизиты будут изменяться автоматически.
Внутри разработки есть пример использования.
5. vadim1980 131 17.04.20 14:39 Сейчас в теме
(1) Написал развернутый ответ по вашему вопросу
https://infostart.ru/public/1225391/
2. пользователь 13.01.20 11:17
Сообщение было скрыто модератором.
...
4. Светлый ум 407 04.02.20 09:35 Сейчас в теме
Код открыт - расписали хорошо +1
(не хватает картинок того что на выходе)
Оставьте свое сообщение