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

Публикация № 841130

Разработка - Практика программирования

Форма Управление формой Интерфейс Работа с интерфейсом

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

Оглавление

ВВЕДЕНИЕ

ФУНКЦИЯ СОСТОЯНИЯ

ПАРАМЕТРИЗАЦИЯ СОСТОЯНИЙ

ПОДСИСТЕМА "УПРАВЛЕНИЕ ФОРМОЙ"

Инициализация

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

Параметры состояния

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

Процедуры подсистемы. API

Структура данных

Производительность

ПРАКТИЧЕСКИЕ ПРИМЕРЫ

Общая демонстрация. Стенд "УправлениеФормой"

Управление доступностью. Исключение из общего режима "Только просмотр"

Управление видимостью. Стенд "Валютный платеж"

Установка пометки. Стенд "Включение панелей"

Оформление заголовков. Стенд "Гиперссылка"

ПОСТАВКА


Введение

Любая форма, даже самая простая, содержит в себе элементы. Если в форме предусмотрено несколько состояний, то каждое из них должно поддерживаться соответствующими состояниями её элементов.

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

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

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

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

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

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

Использование функционального подхода для определения свойств элементов может показаться очень расточительным. Однако основные потери при этом не в производительности (дополнительные потери здесь возникают на сам вызов функции, но это во первых очень незначительное время, во вторых поддается оптимизации путем использования вызова только по изменениям), а в объеме кода. Но кого особо волнует объём кода в современном мире ПО? Особенно если сам код получается путем генерации по декларативному описанию. Нельзя забывать и о том, что элементы можно группировать и применять функцию к группе - тогда количество таких функций будет меньше.

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

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

При непрямом расчете параметра используется функция значения. Результатом работы функции является новое значение параметра.

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

В завершение, с помощью процедуры ДобавитьРеквизитФормыДанныеУправленияФормой создается реквизит формы, в котором сохраняется структура данных настройки состояния. В процедуре ДобавитьОбработчикиПриИзменении происходит установка обработчика в элементах формы, с которыми есть связь параметра с элементом через общие данные.

Листинг 1. Настройка параметров управления формой при создании формы

 

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

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

Параметры состояния

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

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

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

Листинг 2. Пример реализации функции значения

 

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

Функция может возвращать значение. Практически анализируется только одно значение - если возвращено Ложь, то обновление состояния элемента не происходит. Практическое применение возвращаемого значения я пока не нашел, однако заменить функцию на процедуру тоже нельзя. Последнее связано с ограничением платформы: для вычисления функции используется оператор Вычислить, а для процедуры - Выполнить. Первый работает везде, а второй только в толстом и тонком клиенте (не работает в веб-клиенте, на iOS). И кроме того, функцию можно отлаживать в отличии от кода в операторе Выполнить.

Листинг 3. Пример реализации функции состояния


Процедуры подсистемы

Процедуры и функции подсистемы представлены в таблице API ниже. Более подробное описание содержится в самих модулях (для описания используется формат по стандартам 1С).

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

Таблица 1. API

Модуль Функция/процедура
Модуль формы УправлениеФормой
НастройкаЭлементовФормы
РассчитатьЗначенияПараметров
РассчитатьЗначениеПараметра
УправлениеФормойКлиентСервер ПолучитьСтруктуруДанныхУправленияФормой
ПолучитьСтруктуруПараметра
ДобавитьПараметр
ПолучитьСтруктуруНастройки
ДобавитьНастройку
УправлениеФормой ДобавитьРеквизитФормыДанныеУправленияФормой
ДобавитьОбработчикиПриИзменении

 

Рисунок 1. Диаграмма взаимодействия

 

Структура данных

В подсистеме используется два основных элемента данных: элементы и параметры состояния и два вспомогательных - зависимые от параметров элементы и зависимые от параметров параметры.

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

Рисунок 2. ER-диаграмма

 

 

Рисунок 3. Объектная модель данных

 

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

Для тестирования производительности в форме обработки стенда достаточно убрать параметр ИзмененныеРеквизиты при вызове процедуры УправлениеФормой. Такой вызов приведет к полному расчету формы при каждом изменении. Измерять нужно вызов процедуры УправлениеФормой.

Практические примеры

Общая демонстрация. Стенд "УправлениеФормой"

В качестве иллюстрации проблематики и механизма работы формы я разработал обработку-стенд. Форма обработки содержит 12 реквизитов. Состояние формы описывается 4 параметрами. Если для простоты считать, что параметры могут принимать всего два значения, то общее число состояний формы согласно формуле сочетаний k из n будет 70. Однако из числа возможных сочетаний я выбрал всего 14 доступных. Эти состояния представлены в таблице ниже.

Приведенные расчеты показывают, как быстро растет число возможных состояний (при количестве значений параметров 12 число состояний уже будет около 500). С другой стороны не все состояния имеют смысл и это спасает ситуацию с программированием этих состояний. Однако при достаточно сложном программном коде можно «легко» не уследить и тогда число недокументированных доступных состояний может резко возрасти.

Формула 1. Число сочетаний k из n

 

Формула 2. Число сочетаний 4 из 8

 

Рисунок 4. Форма стенда в различный состояниях

 

Таблица 1. Состояния формы

 

Управление доступностью. Исключение из общего режима "Только просмотр"

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

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

Для управления признаком "Только просмотр" для таких элементов нужно добавить их настройку в подсистему "Управление формой". Порядок внедрения подсистемы рассмотрим на примере доработки документа _ДемоПеремещениеТоваров из демо-базы БСП. Добавим реквизит формы Комментарий и элемент-поле редактирования реквизита с таким же именем - Комментарий. Далее выполним следующие шаги:

  1. Скопируем в форму документа функции области ПроцедурыПодсистемыУправлениеФормой из формы демо-обработки стенда
  2. Добавим настройку параметров в процедуре ПриСозданииНаСервере
  3. Добавим функцию состояния элемента формы Комментарий

Листинг 4. Модуль формы доработанного документа. Где область КодБСП содержит код из демо-базы БСП, а функция состояния здесь одна - РассчитатьСвойстваЭлементаКомментарий.

 

Управление видимостью. Стенд "Валютный платеж"

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

Рисунок 5. 

Листинг 5.

Установка пометки. Стенд "Включение панелей"

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

Рисунок 6.

Листинг 6.

 

Оформление заголовков. Стенд "Гиперссылка"

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

Рисунок 7.

Листинг 7.


Поставка

Решение поставляется в виде конфигурации и обработок демо-стендов. Подсистема использует общие процедуры БСП. Перед объединением сбросьте признак объединять свойства конфигурации.

Для использования демо-обработок разверните демо-базу БСП и объедините с конфигурацией подсистемы.

Порядок использования в своих формах:

  1. Из демо-стенда скопируйте в модуль формы область ПроцедурыПодсистемыУправлениеФормой
  2. Создайте область ФункцииСостоянияИЗначения и добавьте свои функции состояния и значения параметров
  3. Добавьте настройку данных управления формой в процедуре ПриСозданииНаСервере

 

Таблица 2. Состав поставки

Метаданные Наименование Назначение Ограничения
ОбщийМодуль УправлениеФормой   Использует БСП
  УправлениеФормойКлиентСервер   Использует БСП
  ОбщийКлиентСервер вспомогательный  
  ОбщийВызовСервера вспомогательный  
Обработка СтендУправлениеФормой демо  
  СтендВключениеПанелей демо  
   СтендРасчетВВалюте демо  
  СтендЗаголовокГиперссылки демо  

 

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

Наименование Файл Версия Размер
Конфигурация+демо-обработки
.zip 49,22Kb
17.06.18
12
.zip 1.02 49,22Kb 12 Скачать

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

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. bulpi 173 19.06.18 12:10 Сейчас в теме
"Но кого особо волнует объём кода в современном мире ПО?"
Меня волнует, меня. Когда мне нужно что-то переделывать в конфигурациях, написанных такими умниками.
Грибоедов , "Горе от ума". Мне всегда вспоминается это гениальное название, когда я читаю подобные вещи.
Solovyeff; oninfostart; Yakud3a; Soloist; корум; rpgshnik; grumagargler; SlavaKron; +8 Ответить
9. kalyaka 576 19.06.18 18:42 Сейчас в теме
(1) Извините, ответ получился в отдельный пост ниже
2. kalyaka 576 19.06.18 12:31 Сейчас в теме
Не зная системы понять ее по фрагментам может быть очень тяжело и наоборот - знание системы позволяет реализовывать качественные системы с более сложным поведением.

Если в качестве аналогии взять технологию Конвертации, то при описании правил на выходе тоже генерируется код. И наверняка, если писать код обмена без правил его объем будет меньше, однако это ж не говорит в пользу такого подхода?
3. Идальго 130 19.06.18 14:00 Сейчас в теме
Думаю, что вот излишне формы лучше не усложнять, таких вот обработчиков состояний стараться не городить шибко много. Муторно поддерживать всё это, особенно когда разные люди и каждый на свой лад (и в разных местах) пишут такие штуки. А в целом норм написано вроде.
Solovyeff; Gang031; rpgshnik; bulpi; CSiER; +5 Ответить
8. kalyaka 576 19.06.18 18:39 Сейчас в теме
(3) Согласен, поэтому планирую модуль формы генерировать на основе декларативного описания по аналогии получения модуля обмена из Конвертации данных
4. unichkin 1251 19.06.18 17:34 Сейчас в теме
Модули форм не оформлены по стандарту. Нет областей основных разделов. Кроме того, для параметризованной передачи используется ЭтаФорма, а не ЭтотОбъект. Далее в внеконтекстных методах формы - используется параметр "ЭтаФорма". Понятно что эта переменная вне контекста не является именно свойством, а это переданный параметр. Но все-равно, кажется что нужно выделить этот нюанс, который при разработке может создать лишнюю "кашу в голове" - я в таких случаях именую параметр просто "Форма". Пример:
&НаКлиентеНаСервереБезКонтекста
Функция ПроцентСкидки(Форма)
    Если Форма.Объект.Статус = ПредопределенноеЗначение(...)    
    //...

КонецФункции

// Вызов
Если ПроцентСкидки(ЭтотОбъект) > 0 Тогда
//...

Показать


Подобный пример можно увидеть на ИТС https://its.1c.ru/db/v8std/content/2149184279/hdoc
21. kalyaka 576 20.06.18 20:40 Сейчас в теме
(4) Согласен. По началу я так и писал. Однако при разработке системы удобнее использовать имя ЭтаФорма, т.к. В этом случае работает контекстная подсказка. После разработки глаз «замылился» и мне уже казалось вполне обычно использование ЭтаФорма как параметр.

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

В приведенных модулях форм демо-обработок нет смысла выделять разделы, т.к. Сами обработки - пустышки, назначение которых пояснить работу механизма.
24. unichkin 1251 21.06.18 00:04 Сейчас в теме
(21)
В приведенных модулях форм демо-обработок нет смысла выделять разделы, т.к. Сами обработки - пустышки, назначение которых пояснить работу механизма.

Коль выкладывается встраиваемая подсистема, с примерами - я считаю что "нет смысла" так рассуждать :) Это т.н. хороший тон. А то выходит - вот это я оформлю, а вот здесь - можно и забить.
Беда в том, что те кто только начинает постигать 1С - учась и смотря на такие примеры вообще опускают оформление в 99% случаев. А вместе с ним - и прочие стандарты ИТС. Дьявол в деталях..
pavlov_dv; +1 Ответить
27. kalyaka 576 21.06.18 23:34 Сейчас в теме
(24) Тут я сторонник рационального перфекционизма. Что касается непосредственно подсистемы должно быть на самом высоком уровне, т.к. это основа.

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

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

Идея должна либо умереть, либо превратиться в практику. Это как с новым изобретением. Вначале собираются устройство образно на "соплях". Демонстрируют и убеждают вложиться. После, как говорят, идея должна преодолеть пустыню смерти.
5. unichkin 1251 19.06.18 17:54 Сейчас в теме
Общие модули подсистемы также не оформлены, нарушены рекомендации итс по именованию методов https://its.1c.ru/db/v8std#content:2149184296:hdoc. Присутствуют избыточные судя по коду модули "ОбщийВызовСервера", "ОбщийКлиентСервер" - также не оформленные. Флаги серверного модуля "УправлениеФормой" - выставлены некорректно с т.з. стандарта https://its.1c.ru/db/v8std#content:2149184118:hdoc.
Идея хорошая, но я б себе это внедрять не стал. Либо после доработки. А там, вероятно родился иной архитектурный концепт.
22. kalyaka 576 20.06.18 20:48 Сейчас в теме
(5) про общие модули «ОбщийВызовСервера», «ОбщийКлиентСервер». Не знал, что они вообще кого то привлекут внимание. Дело в том, что эти модули я использую во многих разработках и не только я.

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

А вот про «УправлениеФормой» -Согласен, для серверного модуля нужно ставить Внешнее соединение и Клиент (обычное приложение), это я не доглядел. Спасибо :)
25. unichkin 1251 21.06.18 00:06 Сейчас в теме
(22)
Конкретно в этом решении из модуля используется две простые функции, одна в подсистеме и одна в демо-обработке, т.е. Использование их вообще не принципиально.

Получается, я при встраивании должен об этом думать?.. И где-же универсальность?
28. kalyaka 576 21.06.18 23:36 Сейчас в теме
(25) Продукт еще не полный, пока просто зацените идею :)
6. grumagargler 649 19.06.18 18:02 Сейчас в теме
подскажите пожалуйста, а если у поля свой обработчик ПриИзменении, что в этом случае предлагает подход?
YaroslavHolovatiy; +1 Ответить
7. kalyaka 576 19.06.18 18:24 Сейчас в теме
(6) в этом случае Вы сами ответственны за вызов процедуры УправлениеФормой, подсистема не перекрывает уже установленные обработчики.

Думаю это нормально: система обеспечивает обработчик по умолчанию, а если поведение по умолчанию Вам не подходит, то Вы пишите свой обработчик.
10. grumagargler 649 19.06.18 18:47 Сейчас в теме
(7) ясно. Выскажусь как разработчик похожего механизма: вы уделили большое внимание теории, оставив без должного внимания практику. В подавляющем большинстве случаев, видимость/доступность связана не только с действием пользователя, но и программной обработкой и события, напрямую с этим не связанным, например при перечтении данных формы; наличие вызова обновления из таких обработчиков - делает несостоятельной всю описываемую теорию, потому что она ложится на плечи программиста. Значительно проще сериализовать неподдерживаемое условное оформление формы (включая условия СКД) в реквизит формы, дав программисту в руки безконтекстную клиент/серверную функцию обновления по зависимому реквизиту или обновляемому контролу.
YaroslavHolovatiy; +1 Ответить
11. Adept 19.06.18 19:11 Сейчас в теме
(10) Может не внимательно смотрел, вы выкладывали этот механизм в свободный доступ? Хотелось бы посмотреть ...
12. grumagargler 649 19.06.18 19:23 Сейчас в теме
(11) Реализация выполнена в рамках решения Тестер. Но, Александр, это решение внутри на английском, по собственным стандартам, и вероятно будет совсем вам не интересно. На всякий случай: за это там отвечают два модуля: Appearance и AppearanceSrv, а пример использования см. в основной форме справочника Scenarios (https://github.com/grumagargler/tester)
13. grumagargler 649 19.06.18 19:40 Сейчас в теме
(11) (непонятно почему пропало измененное сообщение) Реализация выполнена в рамках решения Тестер. Но, Александр, это решение внутри на английском, по собственным стандартам, и вероятно будет совсем вам не интересно. На всякий случай: за это там отвечают два модуля: Appearance и AppearanceSrv, а пример использования см. в основной форме справочника Scenarios (https://github.com/grumagargler/tester)
14. kalyaka 576 19.06.18 20:33 Сейчас в теме
(10) Теория рождается из обобщения практики. Другое дело, что вначале модель может быть слишком идеальной.
Следующей своей задачей вижу проверить теорию на практике и при необходимости доработать реализацию.

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

Если же имеется в виду работа с моделью в терминологии MVC, то для этого у меня есть другое решение.

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

По поводу использования условного оформления идея интересная. Вы писали о разработке похожего механизма, было бы интересно ознакомиться.
YaroslavHolovatiy; +1 Ответить
15. grumagargler 649 19.06.18 21:21 Сейчас в теме
(14)
делает несостоятельным предложенное решение?

Спасибо за содержательный комментарий. Но я смею утверждать, что да, подход не выдерживает испытание практикой. Понимаете, если бы цепочка связанного оформления полей запускалась полностью декларативно, тогда нет вопросов, и в вашем примере, это почти так и происходит через вентиль ОбработчикПриИзменении (). Но, повторю, мне очень редко встречаются случаи, когда изменяемый реквизит только то и делает, что влияет на оформление формы. Более частыми, идут задачи такого плана: установили галку -> ушли на сервер заполнять таблицу -> сделали там её (на сервере) видимой -> вернулись на клиент. Другой пример: изменили реквизит Договор -> получили из него валюту -> увидели что она не локальная -> сделали доступной состав реквизитов с курсом (не говорим про ФО). Оба случая, во-первых, желают изменить (в частности видимость) оформление на сервере, чтобы с клиента опять сервер уже платформа не вызвала (для видимости это произойдет почти наверяка), во-вторых - будут требовать от программиста как минимум одну строку кода для запуска обновления связанных полей, что в данном случае - фактически делает из декларативного подхода, просто копилку настроек оформления полей. И вот в этой связи, я предлагаю чуть другой подход - собрать неподдерживаемое условное оформление и применять его по необходимости. Решение не претендует на элегантность и новизну, но с практической точки зрения очень удобно (вопросы сравнения конфигураций с проблемой УО вынесем за скобки, потому тут тоже есть о чем подискутировать).
Подход можно посмотреть в конфигурации Тестер (https://github.com/grumagargler/tester), там два модуля Appearance и AppearanceSrv, применение см. в форме справочника Scenarios, написано по своим стандартам, на английском, поэтому вероятно, будет интересен с чисто теоретической точки зрения.
YaroslavHolovatiy; +1 Ответить
23. kalyaka 576 20.06.18 23:26 Сейчас в теме
(15)
очень редко встречаются случаи, когда изменяемый реквизит только то и делает, что влияет на оформление формы. Более частыми, идут задачи такого плана: установили галку -> ушли на сервер заполнять таблицу -> сделали там её (на сервере) видимой -> вернулись на клиент

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

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

Обсчёт модели происходит по зависимостям реквизитов. Более подробно механизм я описал в своей статье про MVC.

Так вот, если эти две модели соединить (MVC и состояние формы), то в модуле формы ничего программировать вообще не нужно будет - весь код будет располагаться для модели в модуле Менеджера (например), а для состояния в функциях состояния.

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

во-вторых - будут требовать от программиста как минимум одну строку кода для запуска обновления связанных полей
Не потребует, если использовать две модели (MVC+состояние формы).

собрать неподдерживаемое условное оформление и применять его по необходимости
Посмотрел, на английском без единого комментария выглядит как в лесу зимой: все кругом белым бело и голые деревья -процедуры :) Да, можно подумать о таком подходе, правда, здесь контекстный вызов сервера без альтернатив. И нужно придумать как обсчитывать условия по изменениям. И возможно описаний условий будет больше, чем в моем варианте. Одно дело задать все условия по разным свойствам оформления, другое - обыграть все это в коде функции состояния.
26. grumagargler 649 21.06.18 00:41 Сейчас в теме
(23)
Обсчёт модели происходит по зависимостям реквизитов. Более подробно механизм я описал в своей статье про MVC.

Так вот, если эти две модели соединить (MVC и состояние формы), то в модуле формы ничего программировать вообще не нужно будет - весь код будет располагаться для модели в модуле Менеджера (например), а для состояния в функциях состояния.

У меня был неудачный опыт описания логики работы формы декларативно. Я думаю, что единственное, на что годен декларативный подход - оформление. То, что в модуле ничего программировать не нужно, не нахожу преимуществом. Почему? Потому что непонятно, что, когда и где происходит, это сложно отлаживать (нужно помнить где ставить точки останова и делать их условными), добавим сюда отсутствие рефакторинга, который будет невыполним в строковых полях зависимости, невозможность анализа конфигурации (поиск неиспользованных обработчиков), сложности обработки равносвязных полей (например, ввод документа из журнала, где фильтром был склад и организацию нужно заполнить по его владельцу).
Не согласен с мнением "...заморачиваться с работой без контекста формы..."). Вы решаете проблему зависимостей, принося в жертву совсем немаловажные вещи. А такая ли уж большая эта проблема зависимостей? Я считаю, что небольшая. Даже обыденная вещь, как организация правильного клиент-серверного взаимодействия - это не вопрос оптимизации, это вопрос правильной архитектуры вашего кода в рамках проектных решений платформы (вопросы безопасности, отзывчивости интерфейса, а порой и обхода проблем с вызовом сервера самой платформы).

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

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

Понимаю вас, но так в команде все пишут, это одно из требований.
29. kalyaka 576 22.06.18 00:13 Сейчас в теме
(26)
Потому что непонятно, что, когда и где происходит, это сложно отлаживать ...отсутствие рефакторинга, который будет невыполним в строковых полях зависимости

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

невозможность анализа конфигурации

Здесь соглашусь. Опять же сошлюсь на опыт с конвертацией данных. Для анализа нужно использовать отдельное решение типа конфигурации Конвертация.

большая эта проблема зависимостей?
Проблему я в свое время подробно исследовал в своих статьях (Шаблон MVC, Программирование интерфейсов)

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

Такой пример я планирую выложить. Идея с типовой интересная. Действительно, зачем придумывать пример, если можно взять типовое решение и переложить его в новой подсистеме работы интерфейса. Возможно это будет очень затратно, но очень эффектно :)
36. kalyaka 576 23.03.20 10:39 Сейчас в теме
37. grumagargler 649 23.03.20 15:55 Сейчас в теме
(36) Да, я читал, спасибо! Мы пошли чуть иным путем, реализовали свой небольшой язык уо (см.вложение)
Прикрепленные файлы:
ca.pdf
16. rpgshnik 2158 20.06.18 01:45 Сейчас в теме
Листинги не кликабельны, на мониторах 15" ни чего не видно.
У инфостарта при создание публикации есть "вставить сниппет" лучше бы его использовали.
18. kalyaka 576 20.06.18 09:26 Сейчас в теме
(16) в статье я сознательно отказался от сниппетов в пользу картинок для повышения иллюстративности кода в окружении.
С картинками однако есть проблема - они по разному отображаются при разном разрешении. На том же ipad или mac картинки выглядят четко. Попробуйте увеличить масштаб в браузере (у меня под windows при масштабе 175% исчезают боковые поля инфостарта и картинки показываются в разрешении близком к исходному) или же используйте просмотр картинок в исходном разрешении (нужно нажать (+) на картинке в заголовке статьи и там можно листать все иллюстрации)
С другой стороны весь приведенный код доступен в обработках и конфигурации, приложеных к статье.
YaroslavHolovatiy; +1 1 Ответить
17. evgen7938 7 20.06.18 04:40 Сейчас в теме
Конфигурацию не качал, но по тому, как преподносится материал, видно сразу, что решение очень хорошо спроектировано и учтены очень многие детали.
Лично я хочу выразить признание и уважение.
Вы проделали очень большую работу и уделили много внимания мелочам.
pbabincev; raider-rec@ya.ru; Evil Beaver; +3 Ответить
19. kalyaka 576 20.06.18 09:27 Сейчас в теме
20. Evil Beaver 6707 20.06.18 18:06 Сейчас в теме
Плюсую не читая. Сложные формы ВСЕГДА делаются на конечных автоматах. Радостно, что это приезжает в мир 1С.
harmit; tsukanov; +2 Ответить
30. WalterMort 314 14.08.18 10:31 Сейчас в теме
Для меня загадка, почему задача управления состоянием формы так будоражит умы 1С-ников. Не встречал решений в которых формы поголовно ведут себя вопреки заложенной логике. Не встречал программистов, настолько плохих, чтобы у них были трудности с управлением видимостью/доступностью. А вот что часто встречал - уродливые архитектуру и интерфейсы с кучей кнопок, полей появляющихся и исчезающих по ходу работы с формой, вечные вопросы пользователю и ещё портянки кода на обслуживание всего этого. Вот сделать форму понятной и лаконичной (а вместе с ней и код формы понятным и лаконичным) - автомат не поможет.
31. kalyaka 576 14.08.18 14:28 Сейчас в теме
(30)
Не встречал решений в которых формы поголовно ведут себя вопреки заложенной логике... А вот что часто встречал - уродливые архитектуру и интерфейсы с кучей кнопок, полей появляющихся и исчезающих по ходу работы с формой
Если я правильно Вас понял, хоть архитектура и уродлива, но работает верно: нужные кнопки появляются где надо и когда надо? Т.е. Вопрос только в том, что слишком запутанные алгоритмы обслуживают эти формы, их сложно сопровождать, но можно.
В принципе это наверно нормально, что сложные формы порождают сложные алгоритмы и архитектуру?
Так вот, идея автомата заключается в том, что вместо программирования поведения формы акцент делается на программирование состояний формы. При этом переход из одного состояния в следующее берет на себя подсистема, а программирование заключается в выделении таких состояний и описании их.
Что решает подсистема при этом: подсистема рассчитывает оптимальный переход и гарантирует соответствие конечного состояния заданному. Алгоритмически система берет на себя задачу: рассчитать измененные параметры состояния, найти зависимые параметры и рассчитать их, найти элементы формы или объединения элементов, состояния которых изменились, пересчитать их состояния и отобразить их на форме.
Почему это должно быть проще и надежнее? Потому что есть 100500 способов перехода из одного состояния в другое и есть только одно описание этого состояния. Подсистема берет на себя 1-ое, а второе должно быть согласно требованиям.
32. WalterMort 314 14.08.18 16:44 Сейчас в теме
(31) Я скорее о том, что сложные формы в принципе зло и их быть не должно. Надо в первую очередь думать как сделать сложную форму проще, а не превращать код сложной формы в нечитаемый манускрипт.

А про кучу состояний проблема надуманная, никто не будет описывать кубик Рубика его возможными состояниями. А вот принцип "разделяй и властвуй" - пожалуйста. Вот процедуры управления элементами одной закладки, вот другой. Всё прозрачно и понятно.
Универсальность решения имеет границу, пройдя которую она начинает вредить.
33. kalyaka 576 14.08.18 21:03 Сейчас в теме
(32)
Надо в первую очередь думать как сделать сложную форму проще

Хочу уточнить, Вы имеете в виду проще в плане реализации, но не в поведении?

А про кучу состояний проблема надуманна

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

А вот принцип "разделяй и властвуй" - пожалуйста

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

Универсальность решения имеет границу

Концепция конечного автомата это не просто унивесальность, это другая парадигама мышления. Фактически это функциональный подход в программировании.
34. WalterMort 314 15.08.18 12:39 Сейчас в теме
(33) проще в поведении, конечно. Минимум элементов. А видимость менять вообще зло. В лучшем случае вид формы должен изменятся с одним реквизитом, видом операции, например. Остальные "спецэффекты" типа "тут включил - здесь появилось" это отстой. А когда форма имеет простое поведение, и городить ничего не надо.
35. kalyaka 576 15.08.18 16:02 Сейчас в теме
(34) Я тоже против перегруженных форм с большим количеством возможностей.

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

А по поводу
Остальные "спецэффекты" типа "тут включил - здесь появилось" это отстой
могу привести пример проектирования интерфейсов для мобильных устройств. Например для apple используется технология сценариев взаимодействия на основе разработки последовательности экранов (даже не изменяемых форм, а отдельных экранов). И это не ведет к упрощению поведения, а наоборот к более адекватному взаимодействию с пользователем. Это я к тому, что индустрия стремиться к лучшему взаимодействию, а не к простым формам с низким уровнем взаимодействия (см. Примеры низкого взаимодействия из книги «Психбольница в руках пациентов» Алана Купера).

И возвращаясь к перегруженным и простым формам - на мой взгляд это две крайности. Нужно стремиться к формам с лучшим взаимодействием или с низким уровнем когнитивного сопротивления (Алан Купер), разве нет?
Оставьте свое сообщение

См. также

Альтернативный способ добавления элементов и реквизитов на формы Промо

Работа с интерфейсом v8 ERP2 УТ11 Россия Абонемент ($m)

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

1 стартмани

09.09.2019    8339    10    bmk74    1    

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

Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

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

1 стартмани

18.03.2020    2601    2    kalyaka    33    

Позиционирование в помещении с помощью нейросети по сигналу Wi-Fi. Интерактивная карта склада в 1С с показом позиции

Инструментарий разработчика Практика программирования v8 Абонемент ($m)

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

5 стартмани

09.08.2018    24264    25    informa1555    26    

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

Практика программирования Работа с интерфейсом v8 Россия Абонемент ($m)

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

1 стартмани

17.07.2018    36962    17    kalyaka    16    

Безопасная работа с транзакциями во встроенном языке Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

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

1 стартмани

25.03.2019    28505    9    tormozit    44    

БСП: Дополнительная обработка (Регламенты), примеры от простого к сложному

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Абонемент ($m)

Очень много попадается странных решений, которые можно решить через БСП:Дополнительные отчеты и обработки. Я бы вообще БСП из-за этой подсистемы переименовал в «Большое Спасибо Программистам». Поработаем с подсистемой в части написания регламентных заданий.

1 стартмани

10.05.2018    39625    33    dsdred    36    

Работа со схемой запроса

Инструментарий разработчика Практика программирования v8 v8::Запросы Абонемент ($m)

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

1 стартмани

24.04.2018    39672    83    kalyaka    34    

Бесплатная проверка контрагентов в ФНС (общий модуль с алгоритмом). На примере выводим статус в список справочника контрагентов

Практика программирования v8 1cv8.cf Абонемент ($m)

Если вам интересно проверить контрагенте в ФНС, вам поможет данная публикация. Весь алгоритм работы строится на основе данных, полученных с сервиса http://npchk.nalog.ru совершенно бесплатно.

1 стартмани

01.02.2018    32111    54    rpgshnik    48    

Вам нравятся запросы в 1С? Промо

Практика программирования Разработка v8 v8::Запросы 1cv8.cf Абонемент ($m)

Речь не только о том, что простейший запрос с "легальным" оформлением растянется на пол-экрана, речь еще обо всем, что нужно написать "в нагрузку" к тексту запроса. Все эти "Новый Запрос", "УстановитьПараметр" и последующие пляски с обработкой результата... Пора с этим заканчивать!

1 стартмани

03.07.2019    16545    4    m-rv    86    

Расширение возможностей печати: Вывод произвольного нижнего и верхнего колонтитула

Печатные формы документов Практика программирования Универсальные функции v8 1cv8.cf Абонемент ($m)

Расширяем функционал вывода нижнего / верхнего колонтитула. Стандартно 1С имеет достаточно ограничений по выводу и наполнению колонтитулов содержимым, взять хотя бы такие, как вывод только текста и отсутствие ограничения на номер конечной страницы. А при разработке кода сталкиваешься с тем, что свой блок с нижним колонтитулом нужно прижимать к низу страницы. Казалось бы быстро решаемый вопрос, но и в нем есть нюансы. Сейчас я расскажу о том, как решалась эта задача. UPD 15.02.2018. Добавлен вывод верхнего колонтитула; Вывод колонтитулов на первой и последней странице управляется параметрами; Научился считать страницы: Добавлено заполнение переменных аналогичных стандартным из колонтитулов; Задаются форматы даты и времени. Ограничения прежние: 1. Повторно сформировать табличный документ после смены параметров страницы интерактивно.; 2. Передавать данные для более плотной печати как можно более мелко нарезанными кусками.

1 стартмани

29.12.2017    34622    27    agent00mouse    0    

Печатная форма, сделанная как расширение конфигурации для БП 3.0. Новые возможности БСП

Практика программирования Универсальные печатные формы v8 БП3.0 Абонемент ($m)

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

1 стартмани

06.12.2017    24035    49    kwazi    6    

Программное формирование форматированной строки в стиле html+inline CSS

Работа с интерфейсом Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

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

1 стартмани

18.11.2017    27362    30    bonv    9    

Расширенная настройка динамического списка УФ Промо

Работа с интерфейсом v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

31.05.2017    29370    146    tormozit    23    

Расширения конфигураций 1С: учимся перехватывать методы

Практика программирования v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

30.05.2017    111803    13    signum2009    45    

Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов

Практика программирования Математика и алгоритмы Универсальные функции Производительность и оптимизация (HighLoad) v8 1cv8.cf Россия Абонемент ($m)

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

26.05.2017    46048    15    DarkAn    86    

Простой способ индексирования интервалов

Практика программирования v8 Абонемент ($m)

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

1 стартмани

28.09.2016    37477    38    ildarovich    22    

Открывашка ячеек таблиц Промо

Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

Глобальное сочетание клавиш для открытия объекта по ссылке из текущей ячейки любой таблицы в большинстве управляемых форм

1 стартмани

27.10.2018    14509    12    tormozit    31    

1С: Предприятие + корпоративный чат, как наладить оперативные уведомления за 10 минут

Практика программирования v8 Абонемент ($m)

Как сделать автоматические уведомления о разных событиях из 1С в корпоративный чат MyChat для сотрудников компании

1 стартмани

14.08.2016    43933    36    Demanoidos    60    

Хранение файлов в томах на диске (для УПП 1.3)

Практика программирования v8 УПП1 Абонемент ($m)

Доработка типовой УПП 1.3 в плане хранения присоединенных файлов вне базы данных

2 стартмани

05.06.2016    51934    7    wowik    29    

Остатки на каждый день в запросе

Практика программирования Учет ТМЦ Учет ТМЦ v8 1cv8.cf УУ Абонемент ($m)

Запрос формирует остатки товаров на каждый день в пределах выбранного периода.

1 стартмани

26.04.2016    49371    19    arakelyan    18    

ВСТАВИТЬ В Справочник.Номенклатура (Код, Наименование) ЗНАЧЕНИЯ ("001", "Новый товар") Промо

Практика программирования v8 v8::Запросы 1cv8.cf Абонемент ($m)

Вас не обманывают ваши глаза, это запрос на изменение данных! И это работает без прямого доступа к БД, регистрации и смс.

1 стартмани

01.06.2018    26712    86    m-rv    57    

Выполнение JavaScript кода из 1С в объекте Поле HTML Документа (HTML 5) и вызов события в 1С ПриНажатии

Практика программирования v8 1cv8.cf Россия Абонемент ($m)

Пример выполнения JS кода из 1С в Поле HTML Документа под управляемыми формами, с удобным получением результата в 1С(С помощью вызова привязанного события ПриНажатии к элементу ПолеHTMLДокумента)

1 стартмани

22.03.2016    72606    145    igo1    51    

Количество дней недели (понедельников/вторников/...) в заданном диапазоне одним запросом

Практика программирования v8 Абонемент ($m)

При реализации периодического авто-заполнения маршрутных листов по графику (недельному) необходимо было просчитать стоимость всего периода, с условием выездов только по определенным дням. Заморачиваться с обходом результата не хотелось. Пришлось написать "Небольшой" запрос.

1 стартмани

03.03.2016    15946    1    Alexander.Shvets    5    

Простые радости жизни программиста 1С: выбор типа значения

Работа с интерфейсом Практика программирования v8 1cv8.cf Абонемент ($m)

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

1 стартмани

17.02.2016    45059    47    yuraos    17    

Лучший подарок для бухгалтера - счёты 8.2 (со звуком) Промо

Работа с интерфейсом v8 1cv8.cf Россия Абонемент ($m)

(Толстый клиент) Подарите бухгалтеру счеты, и он(а) Вас никогда не забудет.

1 стартмани

13.05.2011    37841    24    Tatitutu    45    

Яндекс.Деньги "Благотворительность"

Инструментарий разработчика Практика программирования v8 1cv8.cf Абонемент ($m)

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

1 стартмани

16.02.2016    21096    8    Tatitutu    5    

Мастер рассылки e-mail 2.2 для управляемых форм

Практика программирования Email v8 v8::УФ ERP2 БП3.0 УТ11 Абонемент ($m)

Для пользователей: переделанный из старый разработки под 8.2 с использованием библиотеки Мастер рассылки e-mail 2.2 (ERP, УТ, БП) (Только управляемые формы), который теперь может запускаться под любой версией платформы с разрешенными или запрещенными модальными/синхронными вызовами в конфигурации. Также удобный выбор e-mail и их владельцев с помощью отбора динамического списка по любым критериям и галочки исключения.

1 стартмани

29.12.2015    34978    19    milkers    4    

Передача больших пакетов через веб-сервисы

Практика программирования Администрирование данных 1С Внешние источники данных v8 Абонемент ($m)

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

1 стартмани

06.12.2015    52012    47    YPermitin    19    

Шпаргалка разработчика для работы с формами Промо

Работа с интерфейсом v8 Россия Абонемент ($m)

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

3 стартмани

31.10.2018    13808    77    ELAM    3    

Быстрое определение интервалов в запросе

Практика программирования v8 Абонемент ($m)

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

1 стартмани

01.10.2015    46949    32    ildarovich    41    

Полезные приемы при работе с Excel из 1С (Версия 3.1)

Практика программирования Разработка внешних компонент Загрузка и выгрузка в Excel v8 1cv8.cf Абонемент ($m)

Программисту 1С часто приходится работать с таблицами Excel из 1С. Я постарался собрать небольшой FAQ и набор функций для работы с файлами Excel. Надеюсь, кому-то будет полезна данная статья.

1 стартмани

22.09.2015    172631    424    Zerocl    65    

Code First и Linq to EF на примере 1С версии 7.7 и 8.3 часть I

Практика программирования v8 Абонемент ($m)

Данный проект является чисто исследовательским примером использования Code First и Linq to EF на примере 1С версии 7.7. Так как сам я программист 1С, то мне всегда было интересно, как можно перенести модель объектов 1С на компилируемые языки, и использовать мощь Linq to EF. С появлением Code First давно хотел прикрутить, но все как-то руки не доходили, и вот, наконец ..

1 стартмани

28.08.2015    20962    3    Serginio    2    

Заполняем по шаблону (по умолчанию) Промо

Практика программирования v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

08.02.2018    24204    19    mvxyz    17    

Универсальная учетная система с конструктором документов и справочников в режиме 1С: Предприятие

Инструментарий разработчика Практика программирования v8 1cv8.cf УУ Абонемент ($m)

Заголовок статьи звучит фантастично, но это не шутка. Занимаясь внедрениями, я часто сталкивался с ситуацией, когда надо было к типовой конфе приделать простенький модуль учета чего-нибудь, не специфичного для самой конфы. Например в УТ учет материалов в эксплуатации. Модуль обычно состоял из пары справочников (2-3), 3-х документов и регистра или пары регистров. Однажды подобные пристройки понадобились одновременно на 3 проектах. Скучно делать одинаковую работу, и я подумал, а что, если сделать универсальный инструмент, в котором пользователь сам сможет нарисовать себе справочники, реквизиты к ним, документы и движения. Т.е. конструктор полноценных документов в пользовательском режиме. Это оказалось не так сложно - все дело в подходящей архитектуре данных.

1 стартмани

29.07.2015    29613    87    informa1555    41    

NativeDraw: Компонента рисования для 1С [V2.6.2]

Разработка внешних компонент Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

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

1 стартмани

13.07.2015    43555    416    ПерваяСистема    147    

Методы для группировки данных по полю,полям в Таблице Значений на примере универсального метода списания по партиям, а также отбора строк в ТЗ по произвольному условию. Для 8.x и 7.7

Универсальные функции Практика программирования v7.7 v8 1cv8.cf 1cv7.md Абонемент ($m)

Я очень часто использую группировку данных по полю и полям, как в восьмерке, так и в семерке. Это аналог запроса Итоги, но там строится дерево, а в большинстве случаев нужны "плоские данные". Да и делать запрос в большинстве случаев более накладный процесс, чем работа с ТЗ. Все достоинства такого подхода приведены на примере метода универсального списания по париям, а так же отбора строк в ТЗ по произвольному условию. Для 7.7 еще отчеты сравнения двух ТЗ. Работая с различными базами для упрощения сравнения номенклатуры, или как аналог джойнов(join), сделал сравнение двух таблиц значений по нескольким полям. Пока группировки полей должны быть уникальны. Часто приходится искать дубли, для универсального поиска есть ДублиВТзПоПолю и пример в Тест.ert.

1 стартмани

25.06.2015    25866    3    Serginio    1    

Нечеткий поиск одним запросом Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

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

1 стартмани

28.12.2015    23860    61    vasvl123    9    

И снова "Как сжать картинки для экспорта в EXCEL?" или Умная картинка 8.2

Практика программирования Загрузка и выгрузка в Excel v8 1cv8.cf Абонемент ($m)

Прошла уже эпоха , когда экономили на трафике интернета. Но все же...повторюсь. Я предлагаю совершенно новый способ сжатия картинки - эффект в 20 раз !!!

1 стартмани

17.06.2015    27640    42    Tatitutu    10    

Кнопки управления группировками табличного документа для управляемых форм

Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

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

1 стартмани

02.06.2015    24828    23    unichkin    9    

Альтернативная визуализация данных для 1С 8.3.6

Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

Нужен приятный Bi Dashboard? Или просто красивый график/диаграмма для сайта? Тогда эта разработка для Вас!

1 стартмани

29.05.2015    29105    78    vano-ekt    3    

Работа с публикациями "Инфостарт" Промо

Практика программирования О сообществе WEB v8 УУ Абонемент ($m)

Работа с рублевыми публикациями на сайте "Инфостарт": ведение клиентов, заказов, обновление файлов публикации, рассылка обновлений.

1 стартмани

13.09.2018    17278    12    RocKeR_13    16    

Регулярные выражения без COM объектов и внешних компонент

Универсальные функции Практика программирования v8 1cv8.cf Абонемент ($m)

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

1 стартмани

09.02.2015    22872    8    boogie    38    

Асинхронные вызовы

Практика программирования v8 1cv8.cf Абонемент ($m)

В этой статье я покажу свою реализацию асинхронных вызовов серверных функций и процедур

1 стартмани

02.02.2015    38938    117    rtnm    25    

Автоматический REST-сервис в «1С:Предприятии». OData. Пример работы из Jscript/AJAX

Практика программирования WEB v8 1cv8.cf Абонемент ($m)

Небольшой обзор REST-сервиса в «1С:Предприятии». Рассмотрен механизм работы c REST-сервером 1С:Предприятия из внешнего приложения - веб-страницы с использованием языка JavaScript и технологии AJAX.

1 стартмани

08.10.2014    75479    75    vano-ekt    48    

Как выполнить отчет на СКД через COM и получить данные отчета? Промо

Практика программирования v8 УПП1 Россия Абонемент ($m)

Для чего это нужно. Например, нужно в одной базе получить какой-либо показатель из другой базы. Этот показатель вычисляется в каком-либо сложном отчете, который написан на СКД. Можно, конечно, "скопипастить" текст запроса из другой базы, немного подправить его и выполнять в том же COM подключении. Но с этим теряется гибкость: если отчет изменился, то нужно помнить о том, что где-то есть его "немного модифицированная" копия. В статье будет рассмотрен пример получения данных из базы ЗУП.

2 стартмани

08.05.2018    24532    8    wowik    3    

Дерево объектной модели схемы запроса (декомпиляция текста запроса).

Практика программирования Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Удобный просмотр схемы запроса. Формирование команд программной модификации запроса.

1 стартмани

05.10.2014    33929    187    ekaruk    20    

Пример построения маршрута и оптимизация его с помощью Яндекс карт и api Яндекса 2.1

Практика программирования Универсальные обработки WEB v8 1cv8.cf Автомобили, автосервисы Розничная и сетевая торговля (FMCG) Абонемент ($m)

Пример использования карт Яндекса и api 2.1. Построение оптимального маршрута движения курьеров. Оптимальность маршрута считается для общественного транспорта. Потом можно переключить маршрут на автомобиль.

1 стартмани

03.10.2014    47896    211    Трактор    56    

Учим 1С разговаривать с клиентами или работаем с API Бродкастер

Универсальные обработки Практика программирования SMS рассылки v8 v8::УФ 1cv8.cf Абонемент ($m)

Пример использования API Бродкастера в 1С. Совершаем автоматические обзвоны путем синтезирования речи из текста.

29.09.2014    32001    32    Zircool    30    

Визуализация событий на временной шкале средствами "Поле HTML документа" Промо

Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

Интересный способ наглядно отобразить события на временной шкале. Например, может быть применен для красивого вывода документов по клиенту. Тестировалось на платформе 8.3.12.1469

1 стартмани

31.07.2018    20901    135    Plotks2017    27    

Яндекс.Деньги. Управление счетами из 1С

Практика программирования WEB v8 1cv8.cf Абонемент ($m)

Пример использования API Яндекс.Денег в 1С. В публикации используются http-сервисы для получения токена OAuth 2.0 авторизации.

1 стартмани

26.09.2014    32940    48    vano-ekt    14    

Расчет вероятностей запросом

Практика программирования v8 1cv8.cf Абонемент ($m)

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

1 стартмани

20.09.2014    20212    3    ildarovich    8    

Получение запросом данных журнала регистрации хранящегося в SQLite

Практика программирования Журнал регистрации v8 1cv8.cf Абонемент ($m)

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

1 стартмани

17.09.2014    62407    163    rtnm    38    

HTTP-сервисы в 1С Предприятие 8.3

Практика программирования WEB v8 1cv8.cf Абонемент ($m)

В платформе 1С Предприятие 8.3 появилась возможность создавать HTTP-сервисы. Пример работы.

1 стартмани

17.09.2014    80645    228    vano-ekt    59