ООП. Инкапсуляция. Часть 1.

11.12.08

Разработка - Механизмы платформы 1С

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

Часто, при работе с компонентой "Бухгалтерский учет", в конфигурациях встречается конструкция

Сч60_1 = СчетПоКоду("60.1");

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

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

Функция СчетРеализации() Экспорт 
Возврат СчетПоКоду("90.1");
КонецФункции
Функция СчетУчетаТоваров() Экспорт
Возврат СчетПоКоду("41.1");
КонецФункции
Функция СчетАвансовПоставщикам() Экспорт
Возврат СчетПоКоду("60.2");
КонецФункции

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

Функция СчетРеализации() Экспорт 
Возврат СчетПоКоду("90.1.1");
КонецФункции

и добавляем еще один:

Функция СчетРеализацииЕНВД() Экспорт 
Возврат СчетПоКоду("90.1.2");
КонецФункции

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

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4492    dsdred    53    

71

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    5286    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6403    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18469    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12086    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    8810    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

20.08.2023    6274    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15980    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. tango 506 10.12.08 15:49 Сейчас в теме
В типовой (УПП?) что-то похожее встречалось, да.
"Инкапсуляция на последней миле"
Скоро план счетов вообще станет не регистром учета, а чисто жупелом.
2. Fuego 462 10.12.08 15:56 Сейчас в теме
(1) А когда план счетов был регистром учёта?..
4. coder1cv8 3468 10.12.08 16:10 Сейчас в теме
Это чего? Семерошники таким извратом вместо предопределенных занимаются?... )
5. tango 506 10.12.08 16:45 Сейчас в теме
(4) ?
вот "васмерашники" (упп):
Сч62_01 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.01");
Сч62_21 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.21");
Сч62_31 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.31");
Сч90 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90");
Сч62_02 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.02");
Сч62_22 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.22");
Сч62_32 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.32");
Сч86 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("86");
Сч58_03 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("58.03");
Сч60_02 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("60.02");
Сч60_22 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("60.22");
Сч60_32 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("60.32");
Сч91_01 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("91.01");
14. fez 46 10.12.08 18:58 Сейчас в теме
(4) Нельзя ли поподробнее про предопределенные? В восьмерке я не очень, так что с интересом послушаю.
15. coder1cv8 3468 10.12.08 19:13 Сейчас в теме
(14) предопределенные элементы - это элементы созданные на этапе конфигурирования, для которых задано имя и к которым по этому имени можно обращаться из кода, например: ПланыСчетов.Хозрасчетный.СчетРеализации
Таким образом, изменение кода элемента не влияет на логику работы конфигурации.
(5) Не знаю чего уж там в УПП, но обычно так не делают...
16. fez 46 10.12.08 19:17 Сейчас в теме
(15) Ага, понятно. Завтра будет часть вторая, где я постараюсь рассказать, чем может оказаться плох и такой подход тоже (на примере констант 7.7).
17. vde69 925 10.12.08 19:59 Сейчас в теме
(16) если уж и обсуждать эту тему, то только в разрезе восьмерке, там реализация будет такая:

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

ПроверкаПароля
СменаПароля

при этом проверка и смена могут внутри себя вычислять хеш и хранить уже его и в добавок выполнять еще действия (например писать лог)


Вот это будет уже ближе к САБЖУ, но все равно это НЕ Инкапсулирование
6. tango 506 10.12.08 16:47 Сейчас в теме
а вот еще прикольней, из той же УПП:
СчетКоррБУ = ПланыСчетов.Хозрасчетный.НайтиПоКоду(КодСчетаКоррБУ);
7. artbear 1448 10.12.08 17:22 Сейчас в теме
(0) Федор, в первой же строке баг :)
"Обектный подход к программированию" :)

А вообще плюс, без вопросов.
11. fez 46 10.12.08 18:52 Сейчас в теме
(7) Спасибо, Артур. На домашней клавиатуре твердый знак плохо нажимается :)
8. vde69 925 10.12.08 17:25 Сейчас в теме
вообще это не "Инкапсуляция" а "модульность"

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

то-есть это закрытие данных обьекта за програмную оболочку, то-есть запрет прямого обращения к полям!!! в семерке нельзя закрыть доступ к полям данных, по сколько нету разделения на области видимости.
12. fez 46 10.12.08 18:54 Сейчас в теме
(8) А никто и не говорит, что семерка - это объектно-ориентированный язык программирования. Но если понимать, зачем это нужно - можно ведь и не обращаться к полям данных самостоятельно. Усилием воли. Несмотря на то, что язык позволяет это делать.
9. tango 506 10.12.08 17:49 Сейчас в теме
А модульность ("вся система должна быть разделена на части, называемые модулями. Это деление более крупное, чем разбиение на классы - модули должны их в себе содержать") тут в чем?
10. O-Planet 6431 10.12.08 18:04 Сейчас в теме
Статью - ф топку, или переименовать, или привести другой пример. то, что сейчас, к инкапсуляции имеет очень сомнительное отношение. Инкапсуляция - это объединение данных с методами их обработки. Приведенный в статье пример можно - не в тему. Можно вообще использовать глобальную переменную: глСчетРеализации. По идее статьи это тоже будет инкапсуляция.
13. fez 46 10.12.08 18:57 Сейчас в теме
(10) Согласен. глСчетРеализации - это тоже инкапсуляция. Дело в том, что инкапсуляция сама по себе не является отличительной чертой только и исключительно объектно-ориентированных языков программирования. Это некоторый прием програмирования, который позволяет решать определенные задачи. Объектно-ориентированные языки всего лишь активно поддерживают инкапсуляцию своим синтаксисом.
18. O-Planet 6431 10.12.08 20:33 Сейчас в теме
(13) // Согласен. глСчетРеализации - это тоже инкапсуляция.

Да нет же! Это - параметризация, не больше, только параметр глобален. Инкапсуляция - это объединение данных с методами работы над ними. В контексте ООП - это объединение переменных и процедур в один класс.
22. artbear 1448 11.12.08 06:50 Сейчас в теме
(18) (10) Нет, ты не совсем прав :(
ИМХО в инкапсуляции главное это как раз сокрытие реализации от клиента, а уж объединение данных и кода это вторично :)

Например, можно представить класс, в котором нет данных, а только спрятанные методы и открытый интерфейс.
26. O-Planet 6431 11.12.08 20:27 Сейчас в теме
(22) Этимологически, инкапсуляция - это сокрытие. Второе значение - согласование. В применении к программированию термин инкапсуляция используется во втором значении. Иначе, чем инкапсуляция отличается от процедурности и той же параметризации? Вообще, всю программу можно представить в виде одной универсальной процедуры с входными параметрами. Собственно, на С так и есть. Но сказать, что мы инкапсулируем программу в функцию main будет неправильно. А вот сказать, что методы инкапсулируются в класс - звучит верно.
19. O-Planet 6431 10.12.08 20:35 Сейчас в теме
Инкапсуляцию в 1С можно увидеть, рассматривая встроенные объекты, такие, как Справочник, Документ. С документом можно работать, как с единицей информации, но в своей структуре он имеет параметры (поля) и функции.
20. ineoosaki 10.12.08 22:52 Сейчас в теме
Еще, над этим подискутируйте:

http://stupid1snik.narod.ru/

В статье, автор, о наследовании (приминительно к 1с) рассуждает.
23. artbear 1448 11.12.08 06:53 Сейчас в теме
(0) Ссылка на вторую часть статьи желательно бы к этой статье приложить :)
ЗЫ ну и наоборот, конечно.
24. Ёпрст 1063 11.12.08 13:37 Сейчас в теме
25. BabySG 11.12.08 18:59 Сейчас в теме
(21) Смешная статья :)
То, что там написано реализуется через Подписки на события.
И автор не учитывает, что очень часто требуется изменить саму логику проведения и придется ПОЛНОСТЬЮ переписать процедуру проведения.

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

ЗЫ. Что бы не было воплей - занимался несколько лет системным программированием на С++ - так что ООП знаю не по наслышке.
27. пользователь 14.12.08 00:12
Сообщение было скрыто модератором.
...
Оставьте свое сообщение