Строим "фасады" в 1С

Программирование - Практика программирования

Как реализовать функционал, чтобы не было “мучительно больно” при расширении требований.

И тут я сказал малышу:

       - Вот тебе ящик. А в нем сидит твой барашек.

И как же я удивился, когда мой строгий судья вдруг просиял:

       - Вот такого мне и надо!...

Антуан де Сент-Экзюпери

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

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

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

Внезапно выясняется, что пользователи поголовно используют “модную” программу мгновенного обмена сообщениями и предпочли бы получать оповещения в ней.

Традиционно, для реализации нового требования потребуется модифицировать процедуру ОтправитьУведомление(), добавив дополнительную ветку кода для нового способа отправки.

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

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

 

Почему “фасады”?

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

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

Например, объявляем интерфейс «РассылкаУведомлений», который содержит метод ОтправитьУведомление() и создаем объекты ОтправительEmail, ОтправительMessenger, которые реализуют созданный интерфейс.

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

 

Где может пригодиться такой подход к разработке в 1С?

Навскидку, несколько вариантов распространенных задач:

  • Логирование – настраиваемые точки и способы вывода логов

  • Доставка оповещений – настраиваемые  способы отправки оповещений

  • Версионирование данных – использование различных способов хранения версий данных

  • События и обработка событий – настраиваемое обнаружение возникших событий и реакция системы на события

  • Обмен данными – обработки трансформации данных и транспорт файлов с  данными

  • Присоединяемые файлы - использование различных способов хранения, получения и версионирования присоединяемых файлов

  • Адаптивные формы – возможность настройки различных форм для объектов одного типа

You name it…

 

Как это может выглядеть в 1С?

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

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

Логика работы конкретных объектов реализуется в виде обработок, которые могут быть как встроенными , так и внешними (например, на время отладки).

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

 

Пример с логированием

Для наглядности рассмотрим пример реализации механизма логирования. Демонстрационная конфигурация прилагается (на GitHub).

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

  • префикс объектов фасадов: ктв - мой личный префикс объектов

  • для обработок-объектов: <ПостоянныйПрефиксОбъектов>_<ТипРеализуемогоИнтерфейса>_<ИмяРеализации>, в нашем случае, например ктв_Лог_ЖурналРегистрации

 

Интерфейс

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

Т.к. вывод логов может использоваться  как для хранения, так и для просмотра актуальной информации пользователем, мы предусмотрели  возможность вызова интерфейсных методов как на сервере, так и на клиенте. Поэтому модуль ктв_Логирование допускает вызов как на клиенте, так и на сервере.

Главным методом нашего интерфейса  является ктв_Логирование.ЗаписатьВЛог()

Процедура ЗаписатьВЛог(ИмяЛога, Текст, УровеньЛога = 1, ПараметрыЗаписи = Неопределено) Экспорт

где:

  • ИмяЛога - строковый идентификатор лога

  • Текст - собственно текст сообщения для помещения в журнал

  • УровеньЛога - числовой уровень лога, “чем больше, тем страшнее”

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

В зависимости от “места вывода”, из этой процедуры вызывается  процедура ЗаписатьВЛог() клиентского (ктв_ЛогированиеКлиент) или серверного (ктв_ЛогированиеВызовСервера) модуля.

Метод ПолучитьЛог() возвращает объект (для вывода лога на сервере) или форму (для вывода на клиенте) интерфейсной (фасадной) обработки ктв_Логирование и позволяет заранее установить имя лога и набор постоянных параметров, что упрощает вызов записи в лог:

Лог = ктв_Логирование.ПолучитьЛог(“1c.iface.demo”, Новый Структура(“Параметр”, “ЗначениеПараметра”));
Лог.ЗаписатьВЛог(“Запись в лог”, ктв_Логирование.УровниЛога().Ошибка);

 

А куда пишем-то?

Тут появляется справочник ктв_СпособыЛогирования и сами обработки-объекты, реализующие механизм  логирования.

Основные реквизиты этого справочника:

  • Обработка -  содержит имя встроенной обработки или саму внешнюю обработку

  • ОбработкаНастройки” - здесь могут находиться параметры вывода лога, которые нужны конкретно для выбранной обработки.

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

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

Информация о назначении имен логов способам логирования сохранится в служебном регистре.

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

 

Что в обработке?

Обработки, которые реализуют логику записи информации в лог, должны содержать следующие экспортируемые методы:

Функция ЭтоОбработкаЛогирования() Экспорт

    Возврат Истина;

КонецФункции // ЭтоОбработкаЛогирования()

При поиске обработок в конфигурации и при добавлении внешней обработки, проверяем, что это “правильная” обработка.

 

Функция ВыводитьНаКлиенте() Экспорт

    Возврат Истина;

КонецФункции // ВыводитьНаКлиенте()

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

 

Функция ВыводитьНаСервере() Экспорт

    Возврат Ложь;

КонецФункции // ВыводитьНаСервере()

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

 

Функция ПолучитьФормуОбработчиковКоманд() Экспорт

    Возврат "Форма";

КонецФункции // ПолучитьФормуОбработчиковКоманд()

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

 

Функция ПолучитьСписокДействийКнопкиОткрытия() Экспорт

    СписокДействий = Новый СписокЗначений();
    СписокДействий.Добавить("ВыполнитьКоманду_КаталогЛогированияОткрытие(Неопределено, Ложь)", "Открыть каталог логов...", , БиблиотекаКартинок.ОткрытьФайл);
    СписокДействий.Добавить("ОткрытьФорму_Форма", "Настройка...", , БиблиотекаКартинок.ИзменитьФорму);

    Возврат СписокДействий;

КонецФункции // ПолучитьСписокДействийКнопкиОткрытия()

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

 

Процедура ЗаписатьВЛог(Текст, СпособЛогирования, ПараметрыЗаписи) Экспорт

    Если НЕ Настройка.Свойство("КаталогЛогирования") Тогда
        ПараметрыЗаписи.Вставить("ТекстОшибки", СтрШаблон("Не указан каталог логирования для способа ""%1""!", СокрЛП(СпособЛогирования)));
        Возврат;
    КонецЕсли;

    ИмяФайлаЛога = ПолучитьИмяФайлаЛога(Настройка.КаталогЛогирования);

    мФайлЛога = Новый ЗаписьТекста(ИмяФайлаЛога, "UTF-8", , Истина);
    мФайлЛога.ЗаписатьСтроку(Текст);
    мФайлЛога.Закрыть();

КонецПроцедуры // ЗаписатьВЛог()

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

  • Текст - текст для записи в лог

  • СпособЛогирования - элемент справочника вфт_СпособыЛогирования, для которого была вызвана обработка. Используется для получения настроек способа логирования.

  • ПараметрыЗаписи - структура произвольных параметров, которые могут быть использованы в алгоритме записи в лог.

 

Как убедиться, что все заработало?

Есть простенькая встроенная демо-обработка:

Указываем имя лога, не забывая что оно должно быть назначено одному из способов в справочнике (ну или есть “всеядный” способ). Указываем уровень лога и текст сообщения. Жмем Записать... (на клиенте будут отработаны только те способы вывода лога, которые предусматривают работу на клиенте).

В итоге получаем такую картинку:

или такую:

или такую:

ну или все сразу.

 

Что в итоге?

  1. Есть подход, который может быть применен для решения многих задач более-менее единообразным способом.

  2. Демо-конфигурация, которая содержит как пример, так и готовые механизмы для “быстрой” реализации подхода. Справочник ктв_Логирование может быть использован как шаблон, а основная логика взаимодействия с обработками-объектами находится в общих модулях:

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

 

Кстати!

  • Если представить, что нам необходимо отправлять логи в Google Cloud Platform, как описал Дмитрий Шерстобитов в свой статье //1c-book.ru/public/796913/, - то нам остается только реализовать еще один способ логирования, а фасад во всей системе переписывать не придется.

  • Различные архитектурные идеи будут обсуждаться на Винзаводе 17-18 мая, где в рамках Хакатона по 1С будет рассказано о механизме событийной интеграции подсистем, который также использует описанный выше подход. Если кто не в курсе - то это  вот это мероприятие https://isthisdesign.org,

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

Наименование Файл Версия Размер
Демо конфигурация
.dt 104,11Kb
04.05.18
1
.dt 8.3.10 104,11Kb 1 Скачать

См. также

Комментарии
Сортировка: Древо
1. TODD22 17 05.05.18 05:21 Сейчас в теме
Пример начал с рассылки уведомлений и как то внезапно перескочил на логирование.
2. ktb 334 05.05.18 09:10 Сейчас в теме
(1) Есть такой момент, но про уведомления показалось интереснее, а логирование было быстрее и проще реализовать для примера. ;-)
3. neikist 05.05.18 09:15 Сейчас в теме
Хм, может ошибаюсь, но это больше не на фасад похоже, а на шаблон "Самозванец (Imposter)", правда узнал я об этом шаблоне из книги "Разработка через тестирование" Кента Бека, и что то он довольно редко встречается, когда загуглил - только на некоторых сайтах было. А фасад на мой взгляд это скорее обертка над одним или несколькими объектами сделанная для упрощения взаимодействия (может уровень абстракции повыше нужен, может половина api не нужна, а часть нужно объединить, и т.д.). А так подход хороший, сам пользуюсь, правда в моем случае я часто в модулях менеджеров такое размещаю вместо общих. Плюс можно задействовать шаблон "Шаблонный метод", определить некую общую логику куда передавать свой модуль реализующий интерфейс как зависимость и дергать методы уже "интерфейса".
CSiER; kalyaka; lustin; +3 Ответить
5. ktb 334 05.05.18 14:24 Сейчас в теме
(3) Согласен, что это не совсем "фасад", но уж больно название понравилось. :-)
7. kalyaka 355 05.05.18 23:51 Сейчас в теме
(5) вот описание паттерна Фасад: https://refactoring.guru/ru/design-patterns/facade

У Вас же скорее Интерфейс или Адаптер:
https://refactoring.guru/ru/design-patterns/adapter

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

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

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

Сами примеры мне показались не наглядными, т.к. отражают решение конкретной задачи, а не сути идеи Вашей статьи.
13. ktb 334 07.05.18 09:27 Сейчас в теме
(7) Ну фасад, является частным случаем интерфейса, а адаптер все таки немного про преобразование интерфейса.

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

В статье я привел только общее описание для пояснения подхода, все детали можно изучить в коде. :-)
4. boln 977 05.05.18 13:23 Сейчас в теме
На партнерке был 10 лет назад разговор про "мегадокументы". Это тоже один из частных случаев паттерна Facade.
https://partners.v8.1c.ru/forum/topic/586245
6. ktb 334 05.05.18 17:57 Сейчас в теме
(4) В принципе, это все про абстрактные классы. :-)
8. o.nikolaev 228 06.05.18 08:09 Сейчас в теме
Насчет попытки протащить полноценный ООП в язык платформы как-то было замечено, что через некоторое время начнут возмущаться "почему так сложно все стало"? Ибо одолеть сложность с помощью ООП, увы, нет - через некоторое время потекут и "фасады" и "мегадокументы" и "фабрики" и любая, в общем-то, human-конструкция.

На местах - кто во что горазд, в зависимости от того какие книжки по ООП (или компиляторам) были прочитаны: и обработки зашивают в макеты обработки - "менеджера пакетов" и встраивают свои языки в строковые реквизиты справочников-интерпретаторов и обработки - генераторы исполнения текстов для "Выполнить()". Полный набор годноты. Критерий истинности, как всегда - практика. Работает? Стабильно? Надежно? Позволяет доработку-эволюцию быстро исполнить? Ну и "молодцом".
CyberCerber; raider-rec@ya.ru; МимохожийОднако; Art1387; +4 Ответить
9. boln 977 06.05.18 15:32 Сейчас в теме
(8)
Насчет попытки протащить полноценный ООП в язык платформы как-то было замечено, что через некоторое время начнут возмущаться "почему так сложно все стало"?
Да ладно, повозмущаемся да привыкнем :)

Уж какой взрыв возмущения вызвала три года назад 1С-овская реализация "асинхронности", и то уже забыли и смирились.
14. ktb 334 07.05.18 09:29 Сейчас в теме
(8) Согласен, главное вовремя остановиться, до того как работа с универсальным механизмом станет сложнее чем с конфигуратором. :-)
10. HAMMER_59 36 07.05.18 08:04 Сейчас в теме
Каждый раз когда читаю подобные статьи, у меня создается ощущение, что берут одну либо несколько статей по Си++ ,либо Си Шарп, и пытаются это натянуть на 1С. Натягивается, конечно, так себе, но все равно пытаются.

Зачем в Си++ создается интерфейс?
Интерфейс предписывает объекту, что тот должен содержать определенный набор функций, кроме того эти должны содержать параметры определенного типа.
Как это можно реализовать в 1С? Никак.
Объекты можно упаковать в динамические библиотеки (dll), т.е. достаточно заменить библиотеку и вуаля, реализован новый функционал, кроме того можно создать различные dll для различных конфигурации ОС и ПК.

Есть такой термин - декомпозиция. Декомпозиция применяется крайне широко, и далеко не только в программировании, но нет, мы буде упорно пытаться натянуть методы ООП, т.к. других не знаем.
boln; max_st; +2 3 Ответить
15. ktb 334 07.05.18 09:36 Сейчас в теме
(10)
...достаточно заменить библиотеку и вуаля, реализован новый функционал...


Как бы в статье именно такой вариант и описан, только вместо DLL, обработка.
16. awk 689 07.05.18 09:37 Сейчас в теме
(10)
берут ... и пытаются это натянуть на 1С


Неужели лучше брать и изобретать велосипед?

Зачем в Си++ создается интерфейс?
Интерфейс предписывает объекту, что тот должен содержать определенный набор функций, кроме того эти должны содержать параметры определенного типа.
Как это можно реализовать в 1С? Никак.


Да вы что? Пример (псевдокод):

Интерфейс И {
void** foo(void** pp);
}

Клас А : И {
void** foo(void** pp) throw new FuException("....");
}

И что тут интерфейс предписал? Какого типа параметр?

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


А что обработки отменили? Меняйте обработки, хоть статически, хоть динамически.

Есть такой термин - декомпозиция. Декомпозиция применяется крайне широко, и далеко не только в программировании, но нет, мы буде упорно пытаться натянуть методы ООП, т.к. других не знаем.


Допустим знаем, все равно нельзя брать лучшее от ООП?
18. HAMMER_59 36 07.05.18 14:22 Сейчас в теме
(16)
Да вы что? Пример (псевдокод):

Интерфейс И {
void** foo(void** pp);
}

Клас А : И {
void** foo(void** pp) throw new FuException("....");
}


Дай дураку стеклянный... он и руки порежет.

Естественно много чего можно написать на Си++, но мы же говорим про правильную разработку.
Инкапсуляция, Наследование, Полиморфизм - будете спорить, что всего этого нет в 1С? Удачи.
19. awk 689 07.05.18 16:13 Сейчас в теме
(18)
Дай дураку стеклянный... он и руки порежет.


Согласен. Пример кстати компиляции правильной разработки на С++ и Джава.


HRESULT QueryInterface(
  [in]  REFIID riid,
  [out] void   **ppvObject
);



        Collection<String> c = new ArrayList<>();
        Collections.addAll(c, "a", "b", "c");
        Collection<String> c2 = Collections.unmodifiableCollection©;
        c2.add("d"); // Throw java.lang.UnsupportedOperationException


В последнем примере <String> легко можно опустить.

Инкапсуляция, Наследование, Полиморфизм - будете спорить, что всего этого нет в 1С? Удачи.


Наследование? В 1С? Не в пакетах XDTO? Что-то не припомню, напомните?
21. HAMMER_59 36 08.05.18 07:05 Сейчас в теме
(19) Какой же поток сознания из вас льётся...
Попробую объяснить по простому, может тогда до вас дойдёт.

То что вы написали, звучит примерно так: "А на коробке автомат, вот тоже можно переключать вручную скорости".

Кто с этим спорит? Может для вас это новость, но остальные также понимают, что от этого АКПП, далеко не то же самое что КПП, но вам сложно это осознать.

"Вот же смотрите похоже ведь".

Мой брат (меня он перерос)
Доводит всех до слез,
Он мне сказал, что Дед-Мороз
Совсем не Дед-Мороз!

Он мне сказал:
- В него не верь! -
Но тут сама
Открылась дверь,
И вдруг я вижу -
Входит дед.
Он с бородой,
В тулуп одет.
Тулуп до самых пят!
Он говорит:
- А елка где?
А дети разве спят?

С большим серебряным
Мешком
Стоит
Осыпанный снежком,
В пушистой шапке
Дед,
А старший брат
Твердит тайком:

- Да это наш сосед!
Как ты не видишь: нос похож!
И руки, и спина! -

Я отвечаю: - Ну и что ж!
А ты на бабушку похож,
Но ты же не она!
22. awk 689 08.05.18 09:47 Сейчас в теме
(21)
звучит примерно так


У вас в голове? Я доносил:

1. Знания надо обобщать и повторно использовать.
2. Думать надо головой.
3. Техническое ограничение обойти можно.
4. Ограничения накладываются не только технически.

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

P.S.

Как, вырванное из контекста:

А на коробке автомат, вот тоже можно переключать вручную скорости


соотносится с:

АКПП, далеко не то же самое что КПП


Я вообще не понимаю.
23. HAMMER_59 36 08.05.18 10:10 Сейчас в теме
(22)
1. Знания надо обобщать и повторно использовать.
2. Думать надо головой.
3. Техническое ограничение обойти можно.
4. Ограничения накладываются не только технически.


1. Вчера сделали открытие, а теперь всем доносите?
2. Еще чем-то умеете думать? Точно адекватны?
3. Кто с этим спорит, что можно пытаться натянуть "сову на глобус", и возможно, даже получится.
4. Можно и вовсе вести учет на бумаге без всяких программ и компьютеров. Глубокие сомнение, что у вас есть хоть какое-то представление зачем нужно проектирование, именно поэтому у вас такая каша в голове.
25. awk 689 08.05.18 16:44 Сейчас в теме
(23) Риторику отбрасываем (вопросы 1-4).

Раз вы постулируете знания: "Зачем нужно проектирование", соблаговолите их раскрыть. В противном случае, вы являетесь пустобрехом.
28. HAMMER_59 36 10.05.18 09:01 Сейчас в теме
(25)
Основная цель проектирования, в моём понимании - преодоление ограничений человеческого мышления. Одно из самых слабых мест - краткосрочная память, в которую умещается от 5 до 8 единиц знаний. Данное ограничение легко проверить, попробуйте быстро запомнить число, чем больше цифр будет в числе, тем больше будет ошибок.

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

Я считаю:
1. Проектирование на уровне объектов в 1С ограничено определенными рамками - деревом метаданных, и никуда от этого не деться.
2. Проектировать, естественно, можно не только в конфигураторе, например, для SAP есть стандартные нотации - ARIS.

Для 1С, в частности, на инфостарте все пытаются притянуть методы проектирования от ООП, которые явно не подходят. Но они ведь проще, и информации по ним в разы больше.
29. awk 689 10.05.18 09:44 Сейчас в теме
(28) Вы про какое проектирование? На каком уровне? Как 1С коррелирует с SAP? Как эти фирмы коррелируют с методологиями описания бизнес-процессов? Будет ли ваше высказывание справедливо, если я проектирую класс на яве? Будет ли ваше высказывание справедливо, если я проектирую баг трекер?
30. HAMMER_59 36 10.05.18 12:52 Сейчас в теме
(29) Забавно, я описал общие принципы проектирования, причем уже настолько простыми словами, что даже дети из детского сада уже бы поняли.
У вас же очередной поток сознания. Трудно признать что где-то у Вас капитальный провал в знаниях?

Очень напоминаете человека, который чуток позанимался ООП, а скорее всего так и есть, только вы там чуток, сям чуток, еще там, этакая разносторонняя личность.
- "О я умею классы создавать, и так, и этак, а еще так".
- "А зачем классы создаешь?"
- "Не ну это, ну я и на Си++, и на Си шарп, и Ява, и ..." (опять не видите аналогий с вашими ответами?)
33. awk 689 10.05.18 14:39 Сейчас в теме
(30) Мне крайне льстит, признание вами, наличия у меня сознания. Жаль, что за вами я не могу признать того же. Печально, что выше уровня детского сада вы так и не можете подняться, однако попробую не опускаясь на ваш уровень объяснить.

Проектирование (в общем смысле) - это процесс создания проекта. Соответственно требуется оно для того что бы создать проект. Цель у него проект.

Что такое проект можно посмотреть в Википедии https://ru.wikipedia.org/wiki/Проект_(в_управленческой_деятельности)

Найдете там слова ООП, SAP, 1С, ARIS - кидайте ссылку буду рад ознакомиться.

То о чем вы пишете - называется конструирование.

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


При это вы описываете конструирование крайне конкретное. Конструирование приложений на базе продуктов фирм 1С SAP AG.

Так что про кашу могу согласиться, только уточнив в чьей голове она находиться. Она у вас в голове.
11. Артано 583 07.05.18 08:21 Сейчас в теме
В статье есть неточности и комментаторы выше внесли необходимые уточнения.
Не согласен с выводом в 7, что недостаточно абстрактная статья. Она ведь и называется строим XXX вместе. Это изложение какой-то теории в приложении к конкретной практической реализации.

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

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

В целом - заслуженный плюс. За исследование, обобщение опыта и публикацию
12. Gureev 07.05.18 08:25 Сейчас в теме
1Ска сама по себе фасад.
Чего только стоит
Движения.Записать();
webester; ktb; +2 Ответить
17. Rustig 972 07.05.18 13:11 Сейчас в теме
20. Артано 583 08.05.18 02:48 Сейчас в теме
Читая про споры на тему "в 1с нет ООП" всё время вспоминаю однажды сказанную по этому поводу фразу:

глядя на код некоторых из спорщиков, кричащих что в 1с нет ООП, можно сказать что в 1с нет даже структурного программирования
24. brr 182 08.05.18 11:20 Сейчас в теме
(20) гхм, а что же тогда есть?
31. Артано 583 10.05.18 13:23 Сейчас в теме
(24) спагетти, в виде функций по 500-2000 строк и хорошо если без операторов GoTo
26. supp 3 08.05.18 16:53 Сейчас в теме
А на расширениях такое написать?
27. ktb 334 08.05.18 17:00 Сейчас в теме
(26) Должно превращаться в расширение копи-пастой.
32. lazarenko 100 10.05.18 14:07 Сейчас в теме
ко всему прочему в примере еще паттерн Factory Method применен
34. OerlandHue 17.05.18 04:24 Сейчас в теме
Как вы себя токсично ведете, хотел почитать, может еще в комментариях оставят на похожие статьи ссылки или подводные камни при использовании. Ощущается, будто половина разработчиков считают язык 1С своим проклятием, что вынуждены на нем писать.
Спасибо за статью, я бы с удовольствием почитал больше статей про паттерны программирования в 1С.
35. ktb 334 17.05.18 22:27 Сейчас в теме
(34) Про "токсично ведете" не совсем понял.
Что касается "почитать про паттерны программирования", планирую, как минимум, еще статью по реализации событийной модели в 1С.
38. Vortigaunt 15 29.06.18 14:16 Сейчас в теме
(34) Можете почитать вот эту статью:
https://infostart.ru/public/624689/
Я для себя этот подход с кэшированием адаптировал под написание своеобразных заменителей синглетов (singletone) на язые 1с: если нет - то создать, в любом случае вернуть. Преимущество в том, что объявление и инициализация объекта запакованы в одну функцию. Потом проще взять из загашника старую обработку и скопировать нужные функции, какие надо из одного, а не 3 мест кода.
OerlandHue; +1 Ответить
36. ManyakRus 273 18.06.18 13:34 Сейчас в теме
1) сделано:
1 новый справочник
4 обработки
3 общих модуля
когда по-обычному намного легче "добавив дополнительную ветку кода для нового способа отправки".
В итоге никакой пользы.

2) насчёт "интерфейса" - трудно заставить самого себя писать код по-человечески ?
делать стандартные имена функций и др...
37. Vortigaunt 15 29.06.18 14:03 Сейчас в теме
А разве не тот же подход используют в типовых конфигурациях?
- Торговое оборудование
- Механизм внешних печатных форм / обработок / обработок заполнения таб. частей.
Все это работает практически так же, как описал автор. И цель та же. Расширение функционала без переписывания половины конфигурации.
Или я невнимательно прочитал статью и отличия все таки есть?
39. ktb 334 29.06.18 15:34 Сейчас в теме
(37) Да, принцип реализации похож, различия в деталях.

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

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