Модель состояния для MVC

Публикация № 1675534 05.07.22

Разработка - Работа с интерфейсом

MVC элементы формы топологическая сортировка граф зависимостей приоритетная очередь

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

Модель состояния для MVC


Оглавление

Введение

Ретроспектива

Истоки и предпосылки нового решения

MVC и модель состояния

Концепция

Цикл расчета параметров

Цикл расчета состояния формы

Хранилище состояния

Модель данных

DSL для Модели состояния

Модель объекта и модель формы

Работа с параметрами состояния

Объект и контекст

Топологический порядок расчета

Нарушение порядка расчета

Изменение топологии расчета

Окончание расчета

Расчет параметров

Топологическая зависимость параметров

Выражение результата расчета

Расчет параметров ссылочного типа

Параметризация свойств параметров

Параметризация свойств связей

Расчет элементов формы

Зависимости элементов формы от параметров

Функция состояния

Выражение для заданного свойства

Параметры связей

Обработка события «ПриИзменении»

Работа с формой

Переключение контекста клиент/сервер

История выбора и проверка значения

Проверка заполнения и очистка данных

Слабая связь

Обработчики событий формы

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

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

Модель формы

Примеры

Модель заявки на расходование ДС: внешние и внутренние расчеты

Отображение валют

Заключение

Поставка

 

Введение

Ретроспектива

Решение задачи реализации шаблона MVC на 1С – весьма не тривиальная задача оказалась для меня. Здесь нужно было пройти определенный путь от 37. «похожее пробовал, но отказался: слишком сложный код у меня получался», до – да, это действительно работает. И секрет здесь в том, что нужно пробовать снова и снова, пока не будет найдено решение :)

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

Программирование интерфейсов в 1С или паттерн MVC для 1С (2012 год)

Выделение единой функции отображения УстановитьВидимостьДоступность, все события ПриИзменении транслировать в объект.

Шаблон MVC для управляемого интерфейса (2018 год) 

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

Управление состоянием формы через конечный автомат (2018 год)

Декларативное описание зависимостей элементов формы от параметров. Параметры могут ссылаться как на реквизиты объекта/формы, так и на значения в хранилище значений параметров.

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

Управление состоянием для шаблона MVC и работы с данными объекта (2020 год)

Решение, в котором объединены два предыдущих: для расчета реквизитов объекта и для расчета состояния формы. Теперь используется одна база параметров для объекта и формы. В контексте модуля используются только та часть параметров, которая относится к объекту, в контексте формы к параметрам объекта добавляются параметры формы.

Модель состояния (актуальное решение)

В этом решении добавлена параметризация свойств как самих параметров, так и элементов формы. Такая возможность позволяет описать не только зависимости между параметрами, но и определять значения свойств декларативным образом. Например можно задать значение свойства Видимость для элемента формы через выражение с использованием значений других параметров. Изменение же значения параметра, используемого в выражении свойства автоматически инициирует пересчет заданного свойства. Аналогично можно описать свойства самих параметров, такие как: Использование, ПроверкаЗаполнения и т.д.

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

Истоки и предпосылки нового решения

Как видно, тема реализации паттерна MVC на платформе 1С меня интересует уже достаточно давно. Вначале я полагал, что для MVC в платформе уже все есть и для соответствия принципам шаблона необходима лишь определенная дисциплина в архитектуре кода (см. комментарий к первой статье 14. "порядок должен быть :)"). На практике оказалось, что архитектура, которая держится лишь на одной дисциплине, очень быстро начинает "плыть". Сложность получаемой архитектуры не позволяла эффективно сопровождать такую систему. Лучшая иллюстрация проблемы в комментариях к первой статье: 6. "MVC плохо применима в 1С", 35. "Процедура [отрисовки] разрастается в монстра".

К той же самой первой статье были и предложения по усовершенствованию решения, суть которых заключалась в реализации функции прорисовки для каждого элемента отдельно (см. 34. «В качестве параметра можно передавать элемент формы» , 35. «выполнять полную "перерисовку" тогда, когда требуется смена видимости одного элемента не практично») и использования автоматного программирования (см. 35. "я за автомат управления видом"). Эти идеи были реализованы в следующих решениях: реализация расчета зависимостей в объекте (см. "Шаблон MVC для управляемого интерфейса") и автомат для управления формой (см. "Управление состоянием формы через конечный автомат"). В поддержку правильности выбранного направления был комментарий к статье: 20. "Сложные формы ВСЕГДА делаются на конечных автоматах".

Для полноценной реализации MVC оставалось соединить эти два решения в одно. Такое решение было представлено в статье "Управление состоянием для шаблона MVC и работы с данными объекта". Тогда это была многообещающая реализация паттерна MVC: управление моделью и формой на основе декларативного описания связей. Несмотря на то, что изначально пример прилагался, последующие публикации должны были показать на более простых примерах как на практике можно решать проблему изменения состояния объекта и синхронизации этого состояния с отображением на форме (см. "Звездный рейтинг ***", "Рендеринг элементов управляемого интерфейса").

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

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

Вторая проблема: обеспечение чистоты данных, когда неиспользуемые реквизиты должны быть очищены (см. "Работа с данными заполнения"). Чистота данных влияет на алгоритмы и реализация MVC здесь не исключение.

Третья проблема: излишняя сложность. Большинство комментариев к последней статье были про сложность понимания и работы с подсистемой.

В новой версии подсистемы для этих проблем есть свои решения.

MVC и модель состояния

Концепция

За основу реализации подсистемы принят шаблон MVC. В контексте MVC код разделен на слои реализации: контроллер, модель объекта и модель формы.

Область контроллера – это область МодельСостояния в форме. Основная задача контроллера – подготовить список измененных параметров. Далее эти параметры передаются в модель объекта. Здесь происходит расчет по модели. И наконец, рассчитанные параметры передаются в модель формы для расчета её состояния.

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

 

Рисунок 1. Диаграмма последовательности MVC

 

Цикл расчета параметров

Параметры, переданные в модель объекта, рассчитываются согласно определенному в модели порядку. Каждый параметр обрабатывается в цикле дважды: вначале определяется значение параметра, в следующий цикл по очереди – выполняется обработчик ПриИзменении.

В случае необходимости изменения контекста клиента на контекст сервера расчет прерывается, происходит переключение контекста и расчет продолжается.

 

Рисунок 2. Цикл расчета параметров состояния

 

Цикл расчета состояния формы

Результат расчета параметров передается в модель формы. Здесь формируется список элементов и их свойств, состояния которых зависят от рассчитанных параметров (см. раздел «Зависимости элементов формы от параметров»).

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

 

Рисунок 3. Цикл расчета элементов формы

 

Хранилище состояния

Подобно конфигурации 1С, метаданные модели где-то нужно сохранять. Для работы подсистемы необходимо хранить описание связей, настройки элементов формы, параметры состояния и их значения. Эти данные должны быть одинаково доступны как на клиенте, так и на сервере, т.е. к тому же должны синхронизироваться.

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

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

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

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

Модель данных

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

 

Рисунок 4. Модель данных

 

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

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

Элементы формы - это те же элементы, перечень которых можно получить из формы. Для каждого элемента формы вида Поле ввода определяется связанный параметр состояния. Также за элементом можно определить функцию состояния. Свойства элемента могут параметризироваться, а их значения могут определяться выражением или функцией состояния.

DSL для Модели состояния

Martinfowler.com/dsl.html 

https://russianblogs.com/article/13071310656/

habr.com/ru/post/239361/

https://www.jetbrains.com/ru-ru/mps/concepts/domain-specific-languages/

https://youtu.be/1BkElnlTBb4

Долго я шел к осознанию того, что DSL реально позволяет упростить задачу работы с подсистемой. Первое упоминание такой реализации (я так понимаю, что решение не выложено в общий доступ) было в комментарии 37. "Реализовали свой небольшой уо" [имеется в виду язык условного оформления] к статье "Управление состоянием формы через конечный автомат". Тогда я посчитал этот путь слишком сложным - для этого требуется разработать свой интерпретатор!

Однако успех нескольких решений с использованием текучего интерфейса убедил меня в выгодности создания DSL под конкретную задачу. Удивительно, но сложные задачи оказывается можно решать не только чисто алгоритмическим упрощением и абстракциями, но и посредством предметного языка. Такой язык может быть только декларативным, так как в противном случае мы просто получим набор инструкций для выполнения на компьютере и это уже не будет спецификой предметной области. Реализация абстрактного массива в одном из моих решений не имеет отложенного исполнения, однако она все-таки находится в области декларативного программирования (см. АТД Массив). Ничего не мешает мне в будущем добавить туда и отложенное исполнение, однако уже существующие алгоритмы с использованием АТД массивов не придется менять - в этом суть декларативного описания: описывается что нужно сделать, но не как. Еще одна очень удобная особенность декларативного подхода заключается в том, что при добавлении нового описания вам не потребуется искать место вставки своего кода в существующем алгоритме или как то его изменять для этого - вы просто добавляете новое описание и все! Другие примеры смотрите в моих решениях: Модель запроса, Модель распределения.

В текущем решении использован мой опыт по созданию библиотеки работы со схемой запроса. Недостатки такого решения в излишней избыточности кодирования и необходимости использовать переменные для хранения промежуточных результатов. Обратите внимание на то, что перечисленные недостатки являются принципиальными ограничениями для императивного программирования. Создание DSL под задачу реализации MVC на 1С позволяет убрать эти недостатки. Код с использованием DSL становится выразительным и компактным. Выразительным потому, что отражает цели исполнения предметной области MVC, а компактным потому, что не содержит инструкций исполнения. Последнее очень важно, так как встроенный язык 1С итак не поддерживает абстракции и достаточно беден для выражения алгоритмических решений, то это приводит к очень большому количеству кода. Сокрытие внутренней реализации движка DSL позволяет сосредоточится на задачах предметной области, не погружаясь в ограничения среды исполнения.

Для работы с настройкой подсистемы MVC был разработан DSL для Модели состояния.

Формальное описание DSL

[ПараметрСостояния][НаКлиенте]
    [Использование[
        [ИмяПараметра]|[Параметр]
            {Параметр}
            [Выражение]
        ]
    ]
    [Параметр][Слабая]
        [Использование[
            [ИмяПараметра]|[Параметр]
                {Параметр}
                [Выражение]
            ]
        ]
    {Параметр}
    [Выражение]

[ЭлементФормы][НаКлиенте]
    [Свойство(ИмяСвойства)]
        [Параметр]
        {Параметр}
        [Выражение]
    {Свойство}
    [Параметр]
    {Параметр}
    [ФункцияСостояния]

Модель объекта и модель формы

https://www.martinfowler.com/articles/languageWorkbench.html

DSL для модели состояния позволяет лишь описать модель. Работа с компонентами предметной области различается в зависимости от контекста. В одном случае необходимо построить модель, описать структуру, создать хранилище данных - т.е. по сути описывать метаданные. В другом случае те же самые компоненты (параметры, элементы формы) уже нужны в другом контексте - необходимо работать  с ними как с данными объекта.

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

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

Использование для решения задач предметных областей DSL языков - это следующий уровень программирования. Фулер назвал его языко-ориентированным программированием. В приведенном эссе на эту тему Фулер говорит о различных задачах такого программирования: выделение абстракций и конфигураций. Как и в этом решении Модель объекта - для абстракция, а Модель состояния - это конфигурация.

Работа с параметрами состояния

Объект и контекст

Концептуально данные объекта отличаются от данных контекста тем, что объект задан в конфигураторе и его реквизиты сохраняются в базе данных. Данные контекста декларируются в контексте: в форме - в реквизитах, в модуле - в переменных.  Данные контекста тоже могут где-то сохранятся, однако это не будет работать автоматически. Для сохранения данных контекста потребуется написать код.

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

В контексте формы путь к данным объекта обязательно включает имя реквизита формы, в котором содержится объект, обычно это - "Объект". В контексте модуля объекта такого пути нет. Однако описание модели состояния при этом не должно быть различным, иначе потеряется смысл паттерна MVC: модель объекта не должна зависеть от интерфейса.

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

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

Для контекстных данных также возникает задача их инициализации или чтения перед началом работы с объектом. А при сохранении объекта нужно также реализовать сохранение данных контекста.

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

Топологический порядок расчета

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

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

Нарушение порядка расчета

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

Так нарушение порядка расчета в системе не предусмотрено, однако это можно реализовать через собственный обработчик события ПриИзменении.

Изменение топологии расчета

Другая ситуация возможна, когда топология расчета определяется некоторым состоянием объекта. Такая ситуация обрабатывается подсистемой. Для описания таких изменений необходимо задать условия существования связей (признак связи параметра - Использование).

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

    МодельСостояния.ПараметрСостояния("СчетКонтрагента")
        .Параметр("Отбор.Владелец", "Контрагент")
            .Использование()
                .Параметр("ЭтоВнутренняяОперация")
                .Выражение("НЕ Параметры.ЭтоВнутренняяОперация")
        .Параметр("Отбор.Владелец", "Организация")
            .Использование()
                .Параметр("ЭтоВнутренняяОперация")
                .Выражение("Параметры.ЭтоВнутренняяОперация")
    ;

 

Окончание расчета

Начальной точкой расчета модели являются измененные параметры. При расчете от начальных параметров точкой остановки могут быть условия:

  • следующий параметр не изменился

  • расчет следующего параметра невозможен из-за незаполненного обязательного параметра

  • был достигнут последний параметр последовательности расчетов.

Расчет параметров

Топологическая зависимость параметров

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

В DSL связи параметров задаются неявным образом через указание параметров, которые определяются значение зависимого параметра. Связи параметров определяются:

  • От параметров, определяющих значение текущего параметра

  • От параметров, определяющих значени параметризированных свойств параметров

  • От параметров, определяющих значения параметризированные свойств зависимостей между параметрами (связей)

Описание параметра ДоговорКонтрагента с зависимостями от параметров Организация, Контрагент

    МодельСостояния.ПараметрСостояния("ДоговорКонтрагента")
        .Использование("ЭтоВнешняяОперация")
        .Параметр("Отбор.Организация", "Организация")
        .Параметр("Отбор.Владелец", "Контрагент")
    ;

Выражение результата расчета

Обычно под расчетом параметра понимается некоторая формула. Например, Сумма = Цена * Количество. Такая формула задается выражением расчета.

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

Итак, в общем виде для описания параметра состояния необходимо задать его имя, входящие параметры и выражение для вычисления значения.

Пример задания выражения для параметра состояния «ЭтоВнутренняяОперация»

    МодельСостояния.ПараметрСостояния("ЭтоВнутренняяОперация")
        .Параметр("ТипОперации")
        .Выражение("(Ложь
        | ИЛИ Параметры.ТипОперации = ПредопределенноеЗначение('Перечисление._ДемоТипыОперацийБюжетирование.ПеремещениеМеждуМестамиХраненияСредств')
        | ИЛИ Параметры.ТипОперации = ПредопределенноеЗначение('Перечисление._ДемоТипыОперацийБюжетирование.КонвертацияВалюты')
        |)")
    ;

Расчет параметров ссылочного типа

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

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

Пример задания параметров связи для параметра состояния «ДоговорКонтрагента»

    МодельСостояния.ПараметрСостояния("ДоговорКонтрагента")
        .Параметр("Отбор.Организация", "Организация")
        .Параметр("Отбор.Владелец", "Контрагент")
    ;

 

Параметризация свойств параметров

Такие свойства параметров, как Использование, ПроверкаЗаполнения, ЗаполнятьПоУмолчанию – можно параметризировать. Например, использование параметра Контрагент и Договор контрагента имеет смысл только для внешних операций по заявке на движение денежных средств. Тогда для внутренних операций эти параметры должны быть исключены, а их значения должны быть очищены.

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

Параметризация свойства связи "Использование" через выражение (неявная)

    МодельСостояния.ПараметрСостояния("Контрагент")
        .Использование()
            .Параметр("ЭтоВнутренняяОперация")
            .Выражение("НЕ Параметры.ЭтоВнутренняяОперация")
    ;

 

Параметризация свойства связей "Использование" через параметр

    МодельСостояния.ПараметрСостояния("Контрагент")
        .Использование("ЭтоВнешняяОперация")
    ;

 

Параметризация свойств связей

Помимо параметризации свойств самих параметров, в подсистеме существует также возможность параметризировать связи в зависимостях параметров.

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

Параметризация свойства связей "Использование" через выражение

    ;//  Счет контрагента имеет двойное подчинение: для внутренней операции - владелец Организация, для внешней - Контрагент
    МодельСостояния.ПараметрСостояния("СчетКонтрагента")
        .Параметр("Отбор.Владелец", "Организация")
            .Использование()
                .Параметр("ЭтоВнутренняяОперация")
                .Выражение("Параметры.ЭтоВнутренняяОперация")
        .Параметр("Отбор.Владелец", "Контрагент")
            .Использование()
                .Параметр("ЭтоВнутренняяОперация")
                .Выражение("НЕ Параметры.ЭтоВнутренняяОперация")
    ;

 

Параметризация свойства связей "Использование" через параметр

    ;//  Счет контрагента имеет двойное подчинение: для внутренней операции - владелец Организация, для внешней - Контрагент
    МодельСостояния.ПараметрСостояния("СчетКонтрагента")
        .Параметр("Отбор.Владелец", "Организация")
            .Использование("ЭтоВнутренняяОперация")
        .Параметр("Отбор.Владелец", "Контрагент")
            .Использование("ЭтоВнешняяОперация")
    ;

Расчет элементов формы

Зависимости элементов формы от параметров

Элементы формы могут зависеть от параметров следующим образом:

  • По параметрам функции состояния

  • По выражению для заданного свойства

  • По настройке параметров связей

Функция состояния

Понятие функции состояния уже было рассмотрено в предыдущих моих публикациях (см. Управление состоянием формы через конечный автомат, Управление состоянием для шаблона MVC и работы с данными объекта). Здесь лишь дам краткое описание идеи.

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

  1. очень ограниченный список свойств элементов, поддерживаемый для настройки

  2. не все свойства из этого списка реально поддерживаются платформой для элементов, хотя ошибок нет

  3. механизм явно заточен под оформление строк таблиц

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

  1. выделение главной функции по отображению

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

  3. реализация главной функции под настройку переданного списка элементов

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

  5. выделение для каждого элемента формы отдельной функции

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

На данный момент это уже устаревший вариант настройки элементов, однако он остается в подсистеме «Модель состояния» как универсальный механизм или для обратной совместимости :). Использовать функцию состояния имеет смысл для сложной настройки элементов, когда использование выражений для отдельных свойств нецелесообразно или более громоздко.

Описание элемента ЭтаФорма через использование функции состояния

    МодельСостояния.ЭлементФормы()
        .Параметр("Дата")
        .Параметр("Номер")
        .Параметр("Проведен")
        .Параметр("ПометкаУдаления")
        .Параметр("ЭтоНовый")
        .ФункцияСостояния()
    ;

 

Функция состояния для элемента ЭтаФорма в модуле модели состояния

Функция СвойстваЭлементаЭтаФорма(Свойства, Параметры) Экспорт
    Свойства.Вставить("Заголовок", СтрШаблон("Заявка на операцию %1 от %2. %3", Параметры.Номер, Параметры.Дата, 
            ?(Параметры.Проведен, "Проведен", 
                ?(Параметры.ПометкаУдаления, "Помечен на удаление", 
                    ?(Параметры.ЭтоНовый, "Новый", "Записан")
                )
            )
        )
    );
    Возврат Истина;
КонецФункции

Выражение для заданного свойства

Следующий способ настройки элементов, реализованный в «Модели состояния» – задание выражения для значений свойств элементов.

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

Еще можно провести аналогию с платформенным механизмом условного оформления. В УО используются условия и значения под эти условия. Результат по условному оформлению является сложением вычисленных условий и соответствующих значений свойств элемента. Если выделить одно свойство, то его значение будет определяться условием и сопоставленным значением. В подсистеме «Модель состояния» условие используется в выражении, а его результат используется для значения свойства.

Выражение для свойства «Заголовок» элемента ЭтаФорма

    МодельСостояния.ЭлементФормы()
        .Свойство("Заголовок")
            .Параметр("Дата")
            .Параметр("Номер")
            .Параметр("Проведен")
            .Параметр("ПометкаУдаления")
            .Параметр("ЭтоНовый")
            .Выражение("СтрШаблон('Заявка на операцию %1 от %2. %3', Параметры.Номер, Параметры.Дата, 
            |    ?(Параметры.Проведен, 'Проведен', 
            |        ?(Параметры.ПометкаУдаления, 'Помечен на удаление', 
            |            ?(Параметры.ЭтоНовый, 'Новый', 'Записан')
            |        )
            |    )
            |)
            |")
    ;

Параметры связей

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

Обычно такое “переключение” связей должно приводить к изменению состава параметров связей элементов. В первых моих решениях такое изменение параметров связей происходило при изменении структуры связей, причем пересчитывались параметры связей для всех элементов. В последнем решении уже использовалась настройка связей непосредственно перед началом выбора. Оба решения обладают недостатками. В первом - это нерациональный пересчет всей формы в контексте сервера, а во втором - возникает конфликт с платформенным механизмом хранения истории выбора.

В подсистеме “Модель состояния” пересчет параметров связей элемента происходит в зависимости от параметров состояния, которые непосредственно влияют на структуру связей этого элемента. Т.е. если изменилось значение параметра, определяющего значение параметризированного свойства другого параметра или связи зависимостей, то подсистема найдет по зависимому параметру все связанные с ним элементы формы (элементы ввода) и обновит у них состав параметров выбора и связей выбора.

Обработка события «ПриИзменении»

Может показаться, что событие «ПриИзменении» должно сработать сразу после изменения параметра. Однако здесь стоит задуматься о том, для чего вообще можно применять это событие.

Существующая система расчета параметров не позволяет нарушать порядок расчета. Если все-таки такое нарушение потребуется, то реализовать его можно через использования обработчика в событии «ПриИзменении».

Для нагладности возьмем пример с заполнением заявки на расход. Скажем в заявке требуется выбрать договор и валюту расчетов. Два этих параметра связаны: договор определяет валюту расчетов, а валюта должна соответствовать договору. В модели такая связь может быть описана только в одну сторону, например от договора к валюте. Если пользователь вначале выберет валюту, то было бы удобно, что система сама подберет договор. Последнее однако невозможно из-за нарушения порядка расчета. Однако такое ограничение легко обходится собственной реализацией обработчика события «ПриИзменении» для параметра «ВалютаРасчетов» (см. раздел Слабая связь).

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

Если в обработчике «ПриИзменении» меняются значения других параметров, то возникает необходимость в выполнении обработчиков события уже для них. Момент возникновения события для измененных параметров должен быть встроен в общую последовательность расчета – именно так можно обеспечить транзакционную целостность всех параметров перед выполнением обработчиков события для каждого параметра.

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

И наконец, при полном расчете модели объекта все параметры будут расчитаны согласно последовательности расчета и для измененных параметров будут вызваны обработчики «ПриИзменении». Именно в этом и суть взаимодействия трех частей паттерна MVC: измененные параметры передаются в модель, затем втраиваются в общую последовательность расчета, изменяются и возможно порождают другие изменения, затем по окончании расчета рассчитанные параметры уже будут источником изменений в представлении (форме).

Работа с формой

Переключение контекста клиент/сервер

Вопрос контекста расчета актуален только в реализации модели MVC. Конечно самым оптимальным вариантом расчета является расчет на стороне клиента. В этом случае не будет потерь времени на синхронизацию клиента и сервера, что очень критично при интерактивной работе пользователя. Однако здесь таится не мало подводных камней в виде неявных вызовов контекста сервера, поэтому, определяя расчет на клиенте, необходимо все же также убедится в отсутствии неявных вызовов сервера. Неявные вызовы сервера могут приводить к значительно большей деградации производительности, чем просто один серверный вызов. Так получается за счет неконтролируемой генерации большого количество таких вызовов платформой.

Часть параметров может быть рассчитана в контексте клиента, а часть - в контексте сервера. Например формулу суммы от цены и количества можно рассчитать на клиенте, а вот получить значение договора - нет.

Конечно трудно представить форму, в которой расчет всех параметров можно реализовать на клиенте. Если хотя бы один параметр требует контекста сервера, то получается любой расчет будет требовать контекста сервера? Если иметь в виду полный расчет, то так оно и будет. Однако у расчета есть начало (измененные параметры) и окончание – рассчитанные параметры (см. Выше «Окончание расчета»). Если в процессе расчета не встретился ни один параметр требующий контекста сервера, то весь расчет будет завершен в контексте клиента.

Аналогично часть элементов формы может быть отрендерена в контексте клиента, а часть - только на сервере. В отличии от параметров состояния, множество элементов, которые будут отрендерены, определяется сразу на входе. Ведь перед рендерингом модель уже рассчитана и известны все измененные параметры. Поэтому определение контекста выполнения рендеринга определяется наличием хотя бы одного зависимого элемента, для которого требуется контекст сервера.

История выбора и проверка значения

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

Дело в том, что история работает только по тем параметрам связей, которые являются реквизитами отбираемого значения (механизм истории работает только для ссылочных значений). Но связи могут быть не только по реквизитам. При использовании подсистемы Работа с данными выбора можно в связях использовать любые параметры.

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

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

Проверка заполнения и очистка данных

В подсистеме заложен механизм проверки и очистки данных. Для каждого параметра эти признаки параметризируются.

Слабая связь

Признак слабой связи параметров – это техническое решение для возможности снятия ограничения выбора из интерфейса.

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

Этот признак связи позволит пользователю сделать выбор без учета ограничений, накладываемой этой связью на выбор значения.

Однако использование слабой связи подразумевает существование собственного обработчика события ПриИзменении в форме. В этом обработчике необходимо реализовать код по заполнению связанного реквизита и выполнить передачу измененных реквизитов в подсистему модели состояния (см. пример в демо базе).

Обработчики событий формы

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

Событие формы

Обработчик

ПриСозданииНаСервере

-

ПриЧтенииНаСервере

ПриЧтенииВМоделиОбъектаНаСервере

ПослеЗаписиНаСервере

ПослеЗаписиВМоделиОбъектаНаСервере

НачалоВыбора%ИмяЭлемента%

НачалоВыбора

ПриАктивизацииСтроки%ИмяЭлемента%

ПриАктивизацииСтроки

ПриИзменении%ИмяЭлемента%

ПриИзменении

Таблица 1. Обработчики событий формы

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

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

Модель состояния для объекта должны быть проинициализирована перед использованием. Местом инициализации может быть любой модуль. Использование для этой цели модуля менеджера объекта – вполне практичный вариант.

В модуле менеджера объекта можно расположить код построения модели состояния. Пусть это будет функция МодельСостояния. Пример такой функции можно найти в демо базе для документа _ДемоЗаявкаНаОперацию. Тогда перед началом использования подсистемы нужно будет вызвать эту функцию.

 
 Конструктор модели состояния в модуле менеджера

 

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

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

 

Модель формы

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

  1. Добавить обязательные функции из области МодельСостояния

  2. В процедуре ПриСозданииНаСервере выполнить инициализацию модели состояния для объекта

  3. Добавить в модель параметры и настройку элементов формы

  4. Применить модель к форме

  5. Обновить форму (рендеринг)

 
 Создание и применение модели в обработчике ПриСозданииНаСервере

Примеры

Модель заявки на расходование ДС: внешние / внутренние расчеты

В качестве примера рассмотрим реализацию работы с документом «Демо: Заявка на операцию». Документ можно найти в пользовательском режиме в разделе «Демо: Модель состояния».

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

Справочник банковских счетов имеет двойное подчинение: организации или контрагенту. Для внутренней операции это подчинение организации.

Для внутренней операции также действует правило: нет отражения по движениям операции.

Итого для интерфейса получаются следующие настройки для внешней операции:

  1. есть закладка Аналитики операции
  2. счет контрагента подчиняется контрагенту
  3. доступны для заполнения реквизиты контрагента: договор контрагента, контрагент расчетов, договор расчетов
  4. пересчет значений реквизитов: Счет контрагента

Для внутренней операции будут следующие настройки:

  1. нет закладок
  2. счет контрагента подчинен организации
  3. реквизиты контрагента скрыты
  4. пересчет значений реквизитов: Счет контрагента
  5. очистка реквизитов: Контрагент, Договор контрагента, Контрагент расчетов, Договор расчетов

С точки зрения настройки интерфейса здесь интересны только пункты 1 и 3. Пункт 2 и 5 – это не совсем про интерфейс. Изменение подчинения – это задача модели, но интерфейс здесь тоже участвует. При смене подчинения в элементе, связанном с реквизитом Счет контрагента должны измениться настройки параметров связей. Для внешней операции это связь Отбор.Владелец = Объект.Контрагент, а для внутренней – Отбор.Владелец = Объект.Организация. Вот так задано условие для смены владельца в модели:

    ;//  Счет контрагента имеет двойное подчинение: для внутренней операции - владелец Организация, для внешней - Контрагент
    МодельСостояния.ПараметрСостояния("СчетКонтрагента")
        .Использование()
            .Параметр("ФормаОплаты")
            .Выражение("Параметры.ФормаОплаты = ПредопределенноеЗначение('Перечисление._ДемоВидыДенежныхСредств.Безналичные')")
        .Параметр("Отбор.Владелец", "Организация")
            .Использование("ЭтоВнутренняяОперация")
        .Параметр("Отбор.Владелец", "Контрагент")
            .Использование("ЭтоВнешняяОперация")
    ;

Там же, в описании модели состояния, очистка данных моделируется через параметризацию признака Использование:

    МодельСостояния.ПараметрСостояния("ДоговорКонтрагента")
        .Использование("ЭтоВнешняяОперация")
        .Параметр("Отбор.Организация", "Организация")
        .Параметр("Отбор.Владелец", "Контрагент")
    ;

Непосредственно управление интерфейсом задается на уровне настройки элементов формы. Видимость элементов задается в зависимости от вида операции вот так:

    ;//  Управление отображением страниц через свойства: ОтображениеСтраниц, ТекущаяСтраница
    МодельСостояния.ЭлементФормы("Страницы")
        .Свойство("ОтображениеСтраниц")
            .Параметр("ЭтоВнешняяОперация")
            .Выражение("?(Параметры.ЭтоВнешняяОперация, ОтображениеСтраницФормы.ЗакладкиСверху, ОтображениеСтраницФормы.Нет)")
        .Свойство("ТекущаяСтраница")
            .Параметр("ЭтоВнешняяОперация")
            .Выражение("?(Параметры.ЭтоВнешняяОперация, Неопределено, 'СтраницаОсновныеРеквизиты')")
    ;//  Переключение видимости групп для внутренней операции и внешней
    МодельСостояния.ЭлементФормы("ГруппаКонвертацияРасчетов")
        .Свойство("Видимость")
            .Параметр("ЭтоВнутренняяОперация")
            .Выражение("Параметры.ЭтоВнутренняяОперация")
    ;
    МодельСостояния.ЭлементФормы("ГруппаРеквизитыКонтрагента")
        .Свойство("Видимость")
            .Параметр("ЭтоВнутренняяОперация")
            .Выражение("НЕ Параметры.ЭтоВнутренняяОперация")
    ;

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

Внешняя операция

 

Внутренняя операция

 

Отображение валют

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

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

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

    МодельСостояния.ЭлементФормы("ВалютаВзаиморасчетов")
        .Свойство("ТолькоПросмотр")
            .Параметр("ДоговорРасчетов")
            .Выражение("ЗначениеЗаполнено(Параметры.ДоговорРасчетов)")
        .Свойство("ПоложениеЗаголовка")
            .Параметр("ВалютаВзаиморасчетов")
            .Параметр("ВалютаДокумента")
            .Выражение("?(Параметры.ВалютаВзаиморасчетов = Параметры.ВалютаДокумента, ПоложениеЗаголовкаЭлементаФормы.Авто, ПоложениеЗаголовкаЭлементаФормы.Нет)")
    ;
    МодельСостояния.ЭлементФормы("СуммаВзаиморасчетов")
        .Свойство("Видимость")
            .Параметр("ВалютаВзаиморасчетов")
            .Параметр("ВалютаДокумента")
            .Выражение("Параметры.ВалютаВзаиморасчетов <> Параметры.ВалютаДокумента")
    ;
    МодельСостояния.ЭлементФормы("ДвиженияОперацииСуммаВзаиморасчетов").НаКлиенте()
        .Свойство("Заголовок")
            .Параметр("ВалютаВзаиморасчетов")
            .Выражение("?(ЗначениеЗаполнено(Параметры.ВалютаВзаиморасчетов), СтрШаблон('Сумма расчетов, %1', Параметры.ВалютаВзаиморасчетов), 'Сумма расчетов')")
        .Свойство("Видимость")
            .Параметр("ВалютаВзаиморасчетов")
            .Параметр("ВалютаДокумента")
            .Выражение("Параметры.ВалютаВзаиморасчетов <> Параметры.ВалютаДокумента")
    ;
    МодельСостояния.ЭлементФормы("ДвиженияОперацииСумма").НаКлиенте()
        .Свойство("Заголовок")
            .Параметр("ВалютаДокумента")
            .Выражение("?(ЗначениеЗаполнено(Параметры.ВалютаДокумента), СтрШаблон('Сумма платежа, %1', Параметры.ВалютаДокумента), 'Сумма платежа')")
    ;

Отображение суммы расчетов, если валюта разная

Отображение заголовка валюты расчетов, если валюта расчетов совпадает с валютой документа

Заключение

Вам была представлена новая версия подсистемы, реализующей паттерн MVC на платформе 1С. В этой версии используется единое пространство параметров модели объекта и формы. Для описания зависимостей используется модель состояния. Построение модели состояния реализовано в паттерне Построитель, когда конструирование объекта осуществляется посредством DSL.

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

Поставка

Метаданные подсистемы:

  • ОбщийМодуль.РаботаСМодельюОбъекта

  • ОбщийМодуль.РаботаСМодельюОбъектаКлиентСервер

  • ОбщийМодуль.РаботаСМодельюФормы

  • ОбщийМодуль.РаботаСМодельюФормыКлиентСервер

  • Обработка.МодельСостояния

Зависимости:

Решение выложено на github

Версия платформы 8.3.21.1302.

Скачать файлы

Наименование Файл Версия Размер
Модель состояния для MVC - демо

.dt 121,28Mb
2
.dt 1.0.0.3 121,28Mb 2 Скачать
Модель состояния для MVC - конфигурация для обновления

.cf 98,62Kb
1
.cf 1.0.0.3 98,62Kb 1 Скачать

Специальные предложения

Оставьте свое сообщение

См. также

Мобильное приложение 1С и Умный дом. В каждый дом. Пролог

Идеи и тренды в разработке Мобильная разработка Мобильная платформа Конфигурации 1cv8 Абонемент ($m)

Хотите попробовать свои силы в разработке собственного мобильного приложения на 1С для управления светом и электроприборами в своём доме? Добро пожаловать! Хочу поделиться собственными наработками в этой области. Это будет приложение, разработанное для мобильных устройств на базе Android. Основное предназначение: управление включением/выключением устройств, работающих от сети 220 V (свет, телевизор, чайник, вентилятор, микроволновка и т.д.). Управлять будем: из приложения, голосом, на заданный промежуток времени, интенсивностью света, расписанием работы.

1 стартмани

19.12.2022    1008    osivv    8    

19

Вырожденное состояние и сложность в интерфейсе

Работа с интерфейсом Платформа 1С v8.3 Абонемент ($m)

На примере вырожденного состояния из одного параметра дается представление о рождении сложности интерфейсного представления объекта.

1 стартмани

19.12.2022    489    kalyaka    9    

3

Интеграция (Ich will version)

Идеи и тренды в разработке WEB-интеграция Платформа 1С v8.3 Абонемент ($m)

Поговорим про интеграцию с точки зрения архитектора.

1 стартмани

16.09.2022    3425    botokash    66    

53

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    5196    6    kalyaka    11    

36

Работа с данными заполнения

Инструментарий разработчика Платформа 1С v8.3 Россия Абонемент ($m)

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

1 стартмани

26.02.2022    5342    2    kalyaka    4    

15

Видеокурс-практикум: как подготовить и написать ТЗ, ЗНР, ЧТЗ. Промо

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

3 500 рублей

Рендеринг элементов управляемого интерфейса

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Россия Бесплатно (free)

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

22.09.2020    4902    kalyaka    5    

39

Настройка колонок для вывода в отчет

Работа с интерфейсом Система компоновки данных Конфигурации 1cv8 Украина Абонемент ($m)

Иногда возникает задача вывести в отчет по запросу не все колонки, а только определенные.

1 стартмани

12.07.2020    6100    user847462    2    

1

Сохранение настроек колонок

Работа с интерфейсом Универсальные функции Платформа 1С v8.3 Абонемент ($m)

Сохранение настроек колонок табличных полей. Получение имени формы из модуля формы. Для обычных форм.

1 стартмани

10.07.2020    2593    Arc    1    

4

Управление состоянием для шаблона MVC и работы с данными объекта

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

18.03.2020    5014    kalyaka    35    

34

Как в 1С создать паутинку "как на Инфостарте"

Работа с интерфейсом Управляемые формы Конфигурации 1cv8 Россия Абонемент ($m)

Добрый день, уважаемы коллеги! В этой статье я расскажу, как в 1С создать отчет - "паутинку" на примере отчета по компетенциям сотрудника (разрабатывала на платформе 1С:Предприятие 8.3 (8.3.13.1865).

1 стартмани

15.01.2020    10826    user660153_aleks.pisanets    19    

67

1СПАРК РИСКИ. Сервис оценки благонадежности контрагентов. Промо

СПАРК помогает предотвратить мошенничество со стороны компаний и предпринимателей, благодаря актуальным сведениям о компаниях и системе выявления факторов риска.Сервис позволяет управлять налоговыми рисками и комплексно оценивать благонадежность контрагентов.

Генерация управляемой формы на основе обычной (proof of concept)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

06.11.2019    12626    user700211_a.straltsou    29    

28

"Живые" картинки со Snap.SVG

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 Абонемент ($m)

В статье рассмотрен пример использования http-сервисов для визуализации данных

1 стартмани

24.10.2019    16439    blackhole321    7    

93

Еще один способ программной модификации управляемых форм

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

03.09.2019    5560    infosoft-v    15    

14

Изменяющееся контекстное меню в 1С 8.3

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Абонемент ($m)

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

1 стартмани

06.08.2019    29459    signum2009    16    

67

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

Как вывести в СКД две независимые таблицы, объединенные одним полем

Работа с интерфейсом Система компоновки данных Абонемент ($m)

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

1 стартмани

06.06.2019    9682    swimdog    13    

13

Легкий "тюнинг" УТ 10.3

Работа с интерфейсом Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 Россия Управленческий учет Абонемент ($m)

Вариант программной реализации изменения форм типовых объектов для конфигурации Управление торговлей 10.3.

1 стартмани

15.03.2019    5832    pm74    6    

9

Раскрашенный log-файл без HTML и СМС (используем Форматированный документ в личных целях)

Оптовая торговля Работа с интерфейсом Оперативный учет 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Абонемент ($m)

Иногда пользователям отдается на откуп загрузка каких то данных, результат загрузки которых желательно раскрасить если и не всеми цветами радуги, то хотя бы светофором. Один из вариантов – это использовать Форматированную строку. Следите за руками:

1 стартмани

08.02.2019    3634    kembrik    2    

3

HTML в новой версии 8.3.14 на примере 3-х JavaScript библиотек: AmCharts, HighCharts, DHTMLX

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Тестируем возможности HTML в новой версии 8.3.14 платформы на примере 3-х JavaScript библиотек: AmCharts, HighCharts, DHTMLX.

1 стартмани

29.01.2019    34173    Synoecium    46    

215

Своя индикация длительной операции во внешней обработке

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Описан способ организации собственной индикации длительной операции для внешних обработок для БСП версии 2.4 и выше

1 стартмани

05.11.2018    10366    vadim1011985    18    

20

Программы для исполнения 488-ФЗ: Маркировка товаров Промо

1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя. Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.

Поиск по дереву значений рекурсией, методом НайтиСтроки(), с помощью СКД. Вывод результата поиска в отдельную таблицу. Активация строки в дереве значений при выборе в таблице

Работа с интерфейсом Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

29.10.2018    20455    Vyacheslav_Kochnev    5    

26

Основы компьютерной графики (Часть 2)

Математика и алгоритмы Работа с интерфейсом Управляемые формы Конфигурации 1cv8 Россия Абонемент ($m)

Статья является продолжением публикации "Основы компьютерной графики". Во второй части будут рассмотрены следующие темы: 1. Преобразования в трехмерном пространстве. 2. Ортографическая проекция трехмерного изображения на экран. 3. Определение, какой поверхностью (лицевой/задней) проецируется грань на экран. 4. Перспективная проекция.

1 стартмани

03.08.2018    6935    HAMMER_59    13    

14

Основы компьютерной графики

Математика и алгоритмы Работа с интерфейсом Управляемые формы Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

30.07.2018    8749    HAMMER_59    39    

25

Работа с данными выбора

Работа с интерфейсом Платформа 1С v8.3 Россия Абонемент ($m)

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

1 стартмани

17.07.2018    92521    32    kalyaka    17    

71

Управление состоянием формы через конечный автомат

Работа с интерфейсом Платформа 1С v8.3 Россия Абонемент ($m)

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

1 стартмани

19.06.2018    17541    kalyaka    41    

89

Готовые переносы данных из различных конфигураций 1C Промо

Рекомендуем готовые решения для переноса данных из различных конфигураций 1C. C техподдержкой от разработчиков и гарантией от Инфостарт.

Мухи отдельно, котлеты отдельно. Еще раз про HTML и JavaScript

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Это еще одна статья про документ HTML и JavaScript. Уклон сделан на организацию хранения HTML документа и скриптов а так же на подключение скриптов к документу.

1 стартмани

08.06.2018    15433    infosoft-v    21    

42

Гиперссылка в табличной части управляемых форм

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Задача: Управляемые формы. В табличной части документа добавить ссылочный реквизит с гиперссылкой. Если реквизит пустой, то отображать произвольное слово с возможностью выполнить свою процедуру, иначе открытие формы ссылки этого реквизита.

1 стартмани

23.05.2018    26972    pyrkin_vanya    3    

51

Условное оформление горизонтальных итогов без использования макетов

Работа с интерфейсом Система компоновки данных Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

14.03.2018    23922    nreisende    19    

139

Шаблон MVC для управляемого интерфейса

Работа с интерфейсом Управляемые формы Конфигурации 1cv8 Россия Абонемент ($m)

Мы воспринимаем как что-то само собой разумеющееся интуитивно понятный интерфейс, мгновенно реагирующий на наши клики, подстраивающийся под уже сделанный нами выбор. А между тем за этой возможностью - решение серьезных алгоритмических задач. В общем случае решения этих задач уже найдены, но проблема их конкретного применения остается как для выбранного окружения (веб-браузер, экран мобильного телефона, компьютер), так и возможностей языка программирования. В следующей статье представлено одно из таких применений общего решения на основе шаблона MVC для 1С в сочетании с возможностями управляемых форм и декларативного описания интерфейса.

1 стартмани

14.03.2018    22255    kalyaka    37    

79

Варианты отображений свертываемых групп

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Как пользователю только одним внешним видом сказать "Тут есть нужные данные. Только нажми". Используем разные варианты свертываемых групп.

1 стартмани

19.12.2017    26229    Kim1C    13    

55

Распознавание и загрузка документов в 1С Промо

Универсальная программа-обработка для распознавания любых сканов или фото первичных документов в 1С (счета-фактуры, УПД, ТТН, акты и тд). Точность распознания до 98%.

от 11 рублей

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

Работа с интерфейсом Управляемые формы 1С:ERP Управление предприятием 2 Россия Абонемент ($m)

Отображение локальных файлов и файлов справочника "НоменклатураПрисоединенныеФайлы" на управляемой форме с помощью поля HTML документа.

1 стартмани

01.11.2017    16085    Vyacheslav_Kochnev    30    

103

Размеры управляемой формы

Работа с интерфейсом Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

08.10.2017    33354    json    10    

112

Условное оформление таблицы управляемой формы

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

17.05.2013    43048    akomar    6    

24

Программная настройка рабочего стола, или Как на лету добавить, скрыть, подменить формы

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Долгожданная возможность программно управлять составом форм рабочего стола! Публикация написана новичком для новичков, гуру 1С просьба не судить строго.

1 стартмани

07.11.2012    37819    NittenRenegade    12    

35

Расширение управляемой формы для отчета. Несколько действий с параметром "Отбор".

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Статья о том как открывать формы отчетов с параметром "Отбор" (платформа, на которой проводилось тестирование- 8.2.16).

1 стартмани

03.10.2012    20172    olches    11    

89

Подборка программ для взаимодействия с ЕГАИС Промо

ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.

1С:Предприятие 8.2. Управляемая Форма. Меняем иконку рабочего стола.

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

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

1 стартмани

28.09.2012    31936    ghostaz    39    

65

Красивое отображение графиков (диаграмм) на базе highcharts

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Платформа предоставляет довольно скудный интерфейс в плане вывода графиков/диаграмм. В статье рассматривается инструкция, как внедрить библиотеку Highchart в 1С.

1 стартмани

17.08.2012    62863    Dimasik2007    98    

167

Редактирование текстов интерфейса …

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Редактирование текстов интерфейса … (перевод интерфейса конфигурации на другой язык английский – немецкий – китайский – японский и многие другие). У вас есть стандартная конфигурация, в которой надо перевести интерфейс на другой язык, легко! А вот со справкой придется немного помучаться. Просьба не путать с данными, которые хранятся в реквизитах объектов.

1 стартмани

26.06.2012    42563    Iaskeliainen    39    

96

Приятная глазу цветовая схема 1С 8.х

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Несколько цветовых схем для встроенного языка 1С, которые минимизирует нагрузку на глаза, за счет чего повышается производительность!

1 стартмани

26.03.2012    80908    NDM    127    

384

Вывод изображений в системе компоновки данных и отчётах

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Как выводить изображения в СКД, отчетах ? Как хранить картинки, чтобы они не занимала много места?

1 стартмани

19.03.2012    4848    igorvs66    1    

15