Введение
Что нашёл:
//infostart.ru/1c/articles/125344/
https://habr.com/ru/articles/271731
https://forum.mista.ru/topic.php?id=841622
Долго не искал. Статьи очень давние. Но и предлагаемый в этой статье поход к эмуляции ООП можно реализовать и на 1С8.0.
Интересны не столько статьи, сколько комментарии к ним. Часто – не нужен ОПП в 1С.
Из всех комментариев выбрал два
-
ООП в 1С = резиновая баба
-
А как же это ООП применить на практике
Эта статья написана в стиле «не лить много воды». Лаконично. Есть комментарии в коде.
Итак. ООП - это иерархия классов.
Значит, нам нужна какая-то иерархическая …
Можно «мутить» с XML, но нужно писать интерфейс.
Можно «мутить» с расширениями, но очень громоздко, хотя для типовых объектов можно обратить внимание.
Выбираем иерархический справочник. И так, класс — это элемент в иерархическом справочнике, а объект - структура. Вот и вся модель.
Принципы организации ООП будем рассматривать так, как это описано ниже.
Абстрагирование выделяет существенные характеристики некоторого объекта, отличающие его от всех других видов объектов и, таким образом, четко определяет его концептуальные границы с точки зрения наблюдателя.
Источник - https://ru.wikipedia.org/wiki/Объектно-ориентированное_программирование
Наследование - это принцип, который позволяет создавать иерархии классов: дочерние классы наследуют свойства и методы от родительских классов.
Инкапсуляция — это способ организации данных так, чтобы к ним нельзя было просто так обратиться извне.
Другими словами, инкапсуляция представляет собой способность объекта сохранять свои данные в приватной области видимости,
предоставляя для работы с ними только определенные публичные методы.
Таким образом, объект контролирует доступ к своим данным и обеспечивает их целостность.
Источник - https://skyeng.ru/magazine/wiki/it-industriya/chto-takoe-inkapsuliatciia/
Полиморфизм
-
Полиморфизм подтипов (наследования)
-
Параметрический полиморфизм (обобщённое программирование)
-
Полиморфизм в интерфейсах
Источник - https://tproger.ru/articles/osnovnye-principy-oop-polimorfizm-v-programmirovanii
Все варианты полиморфизма реализуются в предлагаемой модели ООП.
Модель
Создаем справочник Классы.
Классы представляют собой элементы справочника Классы. Каждый элемент справочника (класс) имеет две ТЧ:
-
Свойства
-
Методы
Каждый класс имеет свой набор свойств и методов – строки в ТЧ.
Алгоритм создания объекта на основе класса следующий.
Объект — это структура. Объект создается в памяти.
Объект создается на основе конкретного класса (элемента справочника Классы).
При создании объекта добавляются все свойства и методы предков, которые не отмечены флагом Местный.
Если некоторый класс имеет метод и для этого метода реквизт Местный = Истина, то он не подлежит наследию.
Если класс имеет метод совпадающий по имени с наследуемыми методом, то он не переопределяется (остается таким, каким назначен для класса).
На языке расширений платформы 1С8 это «Вместо».
Это простейший случай. На самом деле уместно использовать нечто похожее на терминологию расширений.

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

Здесь уместно уже оговорить, что конфигурация, прилагаемая к статье – написана для попытки наглядного изложения. Написана сугубо только для статьи. Без всяких проверок и наворотов.
Есть продвинутый вариант «аля» ООП в 1С. Где не просто свойства объекта, а элементы XML.
И свойства являются атрибутами элемента XML, текст элемента - метод. То есть Объект имеет методы как и в этой статье, но еще и методы элементов XML. Еще объект наделен массивами.
Так выглядит модуль менеджера справочника Классы.

Здесь еще много планов по развитию в сторону «скрещивания» классического ОПП и XML.
Также добавления перехватчиков событий для сеттеров и геттеров и так далее.
Это уже следующая статья… Такое развитие подход получил в результате применения его на практике.
Итак, рассмотрим упрощенный вариант.

Классический пример для ООП – Фигура. (Другой классический животные, гав-гав и мяу-мяу). Мы выбираем фигуру.
Фигура – корневой класс. Это абстрактный класс (Shape). Базовый класс.
Абстракция данных – это одно из четырех основных понятий ООП.
https://ru.wikipedia.org/wiki/Объектно-ориентированное_программирование
На основе класса Фигура – объекты не создаются. Он служит для передачи своих методов и свойств потомкам.

Класс Многогранник

Класс имеет одно свойство Стороны и один метод РассчитатьПериметр.

Метод:

Для расчета периметра потомков можно было бы не добавлять (свойства и метод).
Почему не добавлять? Достаточно задать свойство Стороны следующим способом:
| Параллелограмм | 4,7,4,7 |
|---|---|
| Прямоугольник | 5,6,5,6 |
| Квадрат | 3,3,3,3 |
| Треугольник | 7,9,12 |
И использовать наследуемый метод Многогранника.
Но мы добавим и свойства, и методы, чтобы раскрыть возможности предлагаемой модели ООП в 1С.
Класс Параллелограмм

Метод:
Периметр = 2*(Число(Объект.Сторона1.Значение) + Число(Объект.Сторона2.Значение))
Метод наследуется классом Прямоугольник.
Для квадрата и треугольника свои свойства и методы.



Это картинка из расширенной версии ООП в 1С.
Видим в отладчике, что до Квадрата местные свойства Прямоугольника не дошли (инкапсуляция).
Есть свое свойство Сторона (значение по умолчанию = 15)
Метод «Сообщение» – достался от Фигуры, он наследуется всеми классами и используется для сообщений.
Есть свой метод расчета периметра.
К статье прилагается демонстрационная конфигурация.
В конфигурации рассмотрены примеры инкапсуляции, наследования и полиморфизма.

Приведен пример расчета общего периметра группы фигур.

Здесь примечательно то, что в цикле отрабатывают методы каждой фигуры. Код выглядит очень лаконично.
Конечно! Использование текста из справочника как алгоритма для команды Выполнить давно известно.
Но здесь не просто текст из справочника. Это метод Объекта. Наследованный или свой.
Структуры для ООП давно предложены, алгоритмы в текстовом поле справочника давно используются… Что же нового.
Немного юмора.
Попов. Радио. Патент. Ему говорят: резисторы, конденсаторы и индуктивности давно известны…
Nota bene – может, не такая резиновая?
Как применить
Рассматриваемая в статье модель ООП применена в подсистеме расчета себестоимости.
В настоящее время справочник Классы выглядит следующим образом:

Этапы расчета себестоимости имеют вид:

Один из этапов – Расчет всех баз распределения.
На примере баз распределения рассмотрим применение ООП, хотя очень интересные эффекты обнаружились и для документов.
ООП в 1С даже интересней классического…
В классическом ООП каждый объект «живет» самостоятельно. Здесь же в 1С целесообразно использовать связь
Объекта 1С и объекта ООП. В элементе справочника (документе) есть ссылка на класс.
При работе с элементом справочника работаем с методами его (элемента) класса, которые унаследованы от предков.


Класс МатериальныеТопливо – наследует текст запроса от класса (дед) – Затраты.
В справочнике Базы распределения хранятся параметры для запроса. В этом случае Корсчет = 10.03.
В итоге процедура для этапа Расчет всех баз распределения имеет вид:

Лаконичный код.
Выбираются базы распределения, помеченные для использования.
Создаются два объекта (из двух справочников) и выполняется метод.
В итоге мы Подсистеме расчета себестоимости придали некую иерархичность. Разложили всё по «полочкам».
Модель легко масштабируется в ширину (братья и сестры) и в высоту (внуки и правнуки).
Но можно также (в глубину) между отцом и детьми добавить узел («отчим») и таким образом наследовать для детей всё наработанное для отца и его предков.
Приложенный файл тестировался на платформе 1С:Предприятие 8.3 (8.3.27.1719)
Вступайте в нашу телеграмм-группу Инфостарт