Попытался в одном модуле реализовать классы с частично-пересекающимся функционалом. Т.е. некоторые свойства/методы одинаковые, некоторые одинаковы по вызову но немного отличаются в реализации. Вобщем, в реализации изменяются только некоторые моменты. Выглядеть должно было примерно так:
//-------------------------------
Функция НекийМетод()
Перем п1,п2,п3;
//# ClassBegin Класс1;
Я().МетодПредкаКласса1(п1,п2,п3);
//# ClassEnd Класс1;
//# ClassBegin Класс2;
Я().МетодПредкаКласса2(123,456,п1,п2,п3);
//# ClassEnd Класс2;
Возврат обрботкаРезультатов(п1,п2,п3);
КонецФункции //НекийМетод
Но не сработало. В ходе танцев с бубном оказалось, что:
1. //# ClassBegin, //# ClassEnd - нужно писать именно таким образом, с пробелом!
2. Выражение из документации "Текст одного класса обязательно должен идти одним куском" следует понимать так, что код класса Класс1 идет
только между ClassBegin и ClassEnd, при чем только между первыми. Я по наивности думал, что "один кусок" означает недопустимость конструкции
//# ClassBegin Класс1;
...
//# ClassBegin Класс2;
...
//# ClassEnd Класс2;
...
//# ClassEnd Класс1;
и что текст модуля остается как есть, лишь вырезаются определения "чужого" класса.
Правильно ли я все понял?
ИМХО, в таком виде реализация неудобна. Удобнее было бы сделать это как-то так:
поскольку в выражениях //#if, //#elif допустимы не только условия определенности/неопределенности символа, но и сравнения, можно добавить символ classname, автоматом получающий имя компилируемого класса. Тогда определение множества классов в одном модуле реализуется вполне логично
//#if classname = "Класс1"
...
//#elif classname = "Класс2"
...
и т.п.
P.S.
Кстати, я счас примерно так и сделал
Если типЗначенияСтр(Я())="Класс1" Тогда
Я().МетодПредкаКласса1(п1,п2,п3);
ИначеЕсли типЗначенияСтр(Я())="Класс2" Тогда
Я().МетодПредкаКласса2(123,456,п1,п2,п3);
КонецЕсли
но это не кузяво. К тому же для определения
различных методов у классов (т.е. которые у одного есть, у другого нету, или с разной сигнатурой) не подойдет.