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 и вывести их в виде табличного документа
Вступайте в нашу телеграмм-группу Инфостарт