YellowClub

YellowClub

Желтый клуб — сообщество 1С программистов Наша цель — расти профессионально вместе с единомышленниками из 1С сферы Желтый клуб объединяет 1С разработчиков, 1С аналитиков и пользователей платформы 1С Предприятие. Обсуждаем фишки по 1C программированию, управлению проектами, управлению командой, автоматизированное тестирование в 1С Предприятии. Проводим регулярные стримы с интересными людьми из 1С сферы. Иногда встречаемся офлайн в разных городах.
На Пикабу
Дата рождения: 6 августа
в топе авторов на 232 месте
28К рейтинг 450 подписчиков 0 подписок 311 постов 22 в горячем

Разберем задачу: спроектировать в ERP систему уведомлений по документам

Задачу предложил Иван Белокаменцев

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

🟡 изменили контрагента

🟡 добавили строку

🟡 изменилась сумма

🟡 документ отправили на согласование

🟡 документ согласовали

🟡 документ провели

При классическом подходе 1С программисты в первую очередь проектируют метаданные. Это неверно. Начинать нужно со сценариев использования и бизнес-правил, а UI, хранилку и метаданные оставляем на потом. Бизнес-логику пишем так, чтобы без проблем менять UI, хранилку и метаданные в будущем. Сам процесс поиска  сценариев использования и бизнес-правил мы в этом посте не обсуждаем. Концентрируемся только на том, как правильно изолировать слои: UI — Бизнес-логика — Хранилка

Задачу разделим на три части:

1. Правила уведомлений

2. Документы как источник фактов

3. Уведомления как результат применения правил

Слайд №2: Правила уведомлений

С ними поработаем в классической технике, как все привыкли. Используем паттерн Active Record (https://www.litres.ru/book/martin-fauler/shablony-korporativ...): Форма справочника → основной реквизит формы → стандартная запись → ПередЗаписью

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

Слайд №3: Документы.

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

Сначала пройдем классический путь на базе технического жизненного цикла объекта:

🟡 ПередЗаписью — найти факты изменения

🟡 Объект.ДополнительныеСвойства — временно перенести факты

🟡 ПриЗаписи — передать факты в сценарий

Бизнес-логику уведомлений не складываем в обработчик ПриЗаписи

Слайд №4: Отдельно рассмотрим сценарий, который не использует технические коллбеки платформы (ПередЗаписью, ПриЗаписи и тп)

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

Если действие имеет конкретный бизнес-смысл, например «Отправка на согласование», то лучше сделать явный процесс:

🟡 Форма передает намерение и идентификатор документа

🟡 Рабочий процесс оркестрирует операции

🟡 Хранилище согласуемых документов прячет физическую работу с документом 1С

🟡 Операция применения правил уведомлений вызывается как отдельный шаг рабочего процесса

Слайд №5: Сценарий применения правил уведомлений

Он работает с фактами, правилами, получателями и уведомлениями.

Он не должен знать, что именно в 1С является справочником, регистром или документом.

На схемах со слайдов 3, 4, 5 обратите внимание на то, что бизнес-логика изолирована от метаданных и даже не знает где и как хранится состояние. Хранилки в данном случае — это общие модули, либо любой объект, если мы его передадим в бизнес-логику явным параметром. Главное, чтобы этот объект удовлетворял контракту, который требует бизнес-логика.  

А вот на схеме со слайда 2 UI, бизнес-логика, хранилка сплелись воедино

Выводы:

🟡 Метаданные 1С — это способ реализации

🟡 Хранилище — это способ спрятать конкретный справочник или регистр от сценария

🟡 Форма — это способ передать намерение пользователя в бизнес-логику и никакого отношения к месту хранение не имеет

Схемы в хорошем качестве качайте тут: https://disk.yandex.ru/d/_NMp76PvT5lRiw

PS жду ваши вопросы. Очень жду. Не стесняйтесь спрашивать и критиковать мою позицию

Показать полностью 5
5

Разбор архитектуры обработок Контур/СБИС в 1С

На стриме разбираю архитектуру внешних 1С обработок СБИС и Контур: это «приложение внутри приложения», где у них bootstrap/инициализация, точки входа (entry point) и какой жизненный цикл.

Показываю, что в этих решениях сделано круто для «скачай и открой», а где начинаются типовые боли 1С — пинг-понг клиент↔сервер, скрытые зависимости через общий контекст/кэш, service locator вместо DI и протекание состояния в UI.

Показываю, как логику работы приложения в 1С разложить по слоям: UI → контроллер → use case → интеграции, чтобы сценарии стали линейными и управляемыми.

В конце стрима провожу демо и на примере обработки Контура улучшаю структуру и делаю 1С код понятнее по принципам чистой архитектуры.

Показать полностью

1С - Фремворк

В полном видео «Почему код типовых так сложно понимать» показываю, как применять подход Чистая Архитектура Роберта Мартина в 1С

Забирай пример реализации Чистой Архитектуры для игры на Unity в боте. Ссылка на бота в описании к полному видео: Почему код типовых так сложно понимать

Показать полностью

Замечательный комментарий пришел в ютубе

Замечательный комментарий пришел в ютубе

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

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

Может возникнуть вопрос: «Женя, у нас же 1С, у нас нет задачи хранить данные где-то еще кроме SQL».

Более простая аналогия с 1С: сегодня мы храним данные в справочнике, завтра в регистре сведений и нам не придется под это переписывать формы или бизнес-логику. Нужно будет только переписать адаптер (gateway) к хранилке.

Показать полностью 1

Готовлю стрим по DDD

Готовлю стрим по DDD

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

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

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

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

PS спасибо за каменты. они помогают мне лучше понимать, на что делать упор.

Показать полностью 1

Зачем нужен Presenter?

В полном видео «Почему код типовых так сложно понимать» показываю, как применять подход Чистая Архитектура Роберта Мартина в 1С

Забирай пример реализации Чистой Архитектуры для игры на Unity в боте. Ссылка на бота в описании к полному видео: Почему код типовых так сложно понимать

Показать полностью
3

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

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

Спасибо за ваши комментарии.

Одна из больших проблем 1С-разработки — это модель мышления, которую во многом сама платформа нам прививает:

форма = объект метаданных = бизнес-объект = хранение в базе

Есть справочник. Есть форма элемента. Есть основной реквизит формы. Вывели реквизиты объекта на форму, пользователь поменял, нажал «Записать» — объект записался.

Для простого CRUD (создать, прочитать, обновить, удалить) — это нормально. Когда у нас справочник стран, единиц измерения или простых настроек — все хорошо. Там почти нет бизнес-логики: создал, изменил, записал, удалил.

Но большие 1С-системы — это не CRUD.

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

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

А потом уже никто толком не понимает:

👉 кто владеет этим реквизитом

👉 в каком процессе он используется

👉 кто имеет право его менять

👉 какие правила на него завязаны

👉 что сломается, если его изменить

👉 можно ли использовать его в новой задаче

Проблема в том, что в одном объекте смешали разные бизнес-смыслы.

➖ Продажи говорят «контрагент» и имеют в виду клиента

➖ Бухгалтерия говорит «контрагент» и имеет в виду юридическое лицо для документов

➖ Сервис говорит «контрагент» и имеет в виду клиента на обслуживании

Слово одно, а модели разные

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

В DDD это разделяется иначе.

👉 Форма — это сценарий пользователя

👉 Объект метаданных — это техническая структура

👉 Хранение — это способ сохранить данные

👉 Доменная модель — это бизнес-смысл и правила

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

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

Для CRUD это нормально.

Для большой бизнес-системы — нет.

Показать полностью 1
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества