ООП на платформе 1С Предприятие 8

02.12.25

Разработка - Языки и среды

Подсистема для использования принципов объектно-ориентированного программирования на платформе 1С:Предприятие 8

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
ООП на платформе 1С Предприятие 8
.cf 45,84Kb
0 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

1. Назначение

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

 

2. Описание

2.1. Классы определяются в общих модулях с именем вида Классы_<имя пакета>. Если необходимо использовать несколько уровней пакетов, имя модуля должно иметь вид Классы_<пакет>_<подпакет> и т.д. Если часть классов пакета должна быть доступна только на сервере или только на клиенте, устанавливаются все признаки доступности, а затем с помощью директив компиляции определяются определяется доступность на уровне отдельных классов.
Определять классы рекомендуется в отдельных областях с именем, совпадающим с именем класса

Если следующий класс определен в общем модуле с именем Классы_Тест, его полное имя будет Тест.А1.

#Область А1

Функция А1_Конструктор(Объект) Экспорт
	Объект.Вставить("Поле_А1");
	Сообщить("А1_Конструктор");
КонецФункции

Функция А1_Метод1(Объект) Экспорт
	Сообщить("А1_Метод1");
КонецФункции

Функция А1_Метод2(Объект) Экспорт
	Сообщить("А1_Метод2");
КонецФункции

#КонецОбласти

Для определения класса необходимо либо определить функцию с именем <имя класса>_Конструктор, у которой первым параметром является Объект, либо функцию с именем <имя класса>_БазовыеКлассы без параметров, в которой через запятую перечисляются полные имена базовых классов

#Область Б

Функция Б_БазовыеКлассы() Экспорт
	Возврат "Тест.А1, Тест.А2";
КонецФункции

#КонецОбласти

2.2. Атрибуты объекта определяются в конструкторе с помощью вставки элементов

Функция А1_Конструктор(Объект) Экспорт
	Объект.Вставить("Поле_А1", "");
	Сообщить("А1_Конструктор");
КонецФункции

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

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

Функция А1_Метод1(Объект) Экспорт
	Сообщить("А1_Метод1");
КонецФункции

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

Функция Б_МетодКласса() Экспорт
	Сообщить("Б_МетодКласса");
КонецФункции

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

В = глНовый("Тест.В");

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

Функция В_БазовыеКлассы() Экспорт
	Возврат "Тест.Б";
КонецФункции

Функция В_Конструктор(Объект) Экспорт
	глВызвать(Объект, "Тест.Б.Конструктор");
	Объект.Вставить("Поле_В");
КонецФункции

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

глВызвать(В, "Метод1");

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

Для вызова метода объекта, определенного в базовом классе, необходимо перед именем функции указать полное имя базового класса, например:

глВызвать(В, "Тест.Б.Метод1");

Для вызова метода класса, достаточно не указывать значение параметра Объект, например:

глВызвать( , "Тест.Б.МетодКласса");

 

3. Существующие ограничения

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

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

 

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

4.1. Так как для вызовов используется функция платформы Вычислить, скорость вызова методов примерно в 15 раз медленнее, чем напрямую и зависит в том числе от расстояния между объектом и базовым классом, в котором метод реализован. Обычно это не является проблемой если количество объектов не исчисляется тысячами

 

5. Использование

5.1. Для использования подстемы в своей конфигурации, достаточно перенести в нее общий модуль РаботаСКлассамиГлобальный

 

6. Примеры

В приложенной конфигурации доступны следующие примеры:

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

6.2. Обработка ЧтениеНастроекКластера, которая позволяет считывать настройки кластера из файла с расширением lst и вывести их в виде табличного документа

Вступайте в нашу телеграмм-группу Инфостарт

lооп

См. также

Языки и среды Программист ИТ-компания Бесплатно (free)

В статье рассматриваются принципы работы с асинхронным программированием в Python с использованием async/await. На практических примерах показано, как создавать и управлять асинхронными задачами, использовать ключевые методы модуля asyncio, такие как create_task, gather, wait_for, и избегать распространённых ошибок. Материал будет полезен разработчикам, которые хотят улучшить производительность своих приложений за счёт асинхронного выполнения операций.

03.03.2025    2576    war41k    2    

4

Языки и среды Программист 1С:Предприятие 8 Бесплатно (free)

Будем писать свои скрипты на питоне и запускать их на 1С.

15.04.2024    9428    YA_418728146    14    

67

Языки и среды Программист Стажер 1С:Предприятие 8 Бесплатно (free)

Существует множество языков программирования, и каждый имеет свои особенности по работе с типами данных. Слабые, явные, динамические и другие... Но кто же здесь 1С и почему с приходом "строгой" типизации EDT 1С-программистам стоит задуматься над изменением своих привычек.

16.01.2024    13468    SeiOkami    25    

64

Языки и среды Программист Бесплатно (free)

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

08.08.2023    6105    acvatoris    6    

15

Языки и среды Программист 1С:Предприятие 8 Россия Бесплатно (free)

Написание статического анализатора для 1С традиционным способом на Си.

30.06.2023    5055    prohorp    15    

12

Языки и среды Программист Абонемент ($m)

Поставили нам задачу - вынести на отдельный сервер функционал получения заказов от клиентов по электронной почте, парсинг полученных XLS в приемлемый вид и трансформация заказов в красивый JSON, понятный нашей учетной системе на 1С. Всю эту красоту желательно запустить в отдельном докер - контейнере, по возможности не тратя лицензии, поэтому отдельно стоящую конфигурацию на БСП отвергаем сразу. Можно было бы собрать всё на Apache Airflow или Apache NiFi, но решили попробовать реализовать всю логику без Open Source, будем делать свой ETL, с Исполнителем, который в версии 3.0 научился взаимодействовать с электронной почтой по IMAP. Начнем с середины - сначала напишем скрипты, а потом соберем их в рабочую конструкцию

1 стартмани

01.06.2023    3680    0    1cembreg    2    

11

Языки и среды Инструментарий разработчика Программист 1С:Предприятие 8 Абонемент ($m)

Вставки кода на C# внутри кода на 1С.

5 стартмани

07.04.2023    13396    6    SerVer1C    58    

46

Языки и среды Программист 1С:Предприятие 8 Бесплатно (free)

При работе с 1С ORM (object relation mapping) все время преследует ощущение постоянного создания монолитного приложения — один раз привязался к какой либо сущности (например, справочник Контрагенты), и весь код заполнен ссылками на эту конкретную реализацию. Можно ли независимо разрабатывать в ORM совместимые между собой справочник «Контрагентов» и использующий его документ «Платежное поручение», но при этом избежать жестких зависимостей? Спасут ли нас микросервисы? Пример на аннотациях Java демонстрирует, как это возможно делать.

13.03.2023    2311    1CUnlimited    0    

4
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. fotov 328 02.12.25 18:51 Сейчас в теме
Вот так, с помощью нехитрых приспособлений буханку белого (или черного) ХЛЕБА можно превратить в троллейбус... НО ЗАЧЕМ?!

Если по теме - для имитации объектной модели удобнее использовать обработки. Появляются экспортные процедуры/функции/перменные (через ключевое слово Экспорт), а остальные будут приватными.

Также есть возможность реализовать инициализацию объекта при создании.

Но в целом остаётся вопрос - зачем, т.к. сила 1С в простоте.
Прикрепленные файлы:
GarriSoft; +1 Ответить
3. vadim1980 126 02.12.25 23:49 Сейчас в теме
(1) Обработки как минимум не поддерживают работу на тонком клиенте, при этом никаких преимуществ по сравнению с общими модулями они не дают. Вы упомянули инкапсуляцию, про наследование и полиморфизм ни слова.
2. gybson 02.12.25 19:50 Сейчас в теме
Продемонстрировано примерно 0 принципов
4. vadim1980 126 02.12.25 23:52 Сейчас в теме
(2) примеры использования в приложенной конфигурации. в описании указано с помощью каких механизмов платформы реализуются основные принципы ООП - инкапсуляция, наследование и полиморфизм
5. GarriSoft 178 03.12.25 00:42 Сейчас в теме
Отличная статья!
Но с одной стороны - восторг от человеческой изобретательности.
Автор, как настоящий МакГайвер от 1С, увидел Вычислить() и ухватился, чтобы высечь искру ООП на граните платформы.
Это напоминает создание веб-сервера на Excel или игры на PowerPoint - делается не потому, что нужно, а потому что можно.

С другой стороны - легкая грусть. Читая про вызовы через глВызвать(), ловишь себя на мысли:
"Так ведь это же попытка вручную собрать велосипед, когда за окном уже давно стоят готовые гоночные болиды!" Платформа 1С:Предприятие 8, хоть и не чисто объектная, но многие принципы в ней уже есть и зачастую проще и надежнее использовать встроенные механизмы, чем создавать свою «вселенную в бутылке» со своими правилами и ограничениями в 15 раз медленнее.

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

Дружище, без обид и респект тебе за полёт мысли! )
6. muskul 03.12.25 01:45 Сейчас в теме
примерно в 15 раз медленнее

в ооп на других языках в целом все тоже самое
Для отправки сообщения требуется регистрация/авторизация