Второй простой пример инкапсуляции.
Допустим, есть в конфигурации константа ОсновнаяФирма. И повсюду в конфигурации разбросаны вызовы Константа.ОсновнаяФирма. Как инкапсулировать эту константу и зачем (и в каких случаях) это надо делать?
Для начала отвечу на вопрос "как". Очень просто.
класс Константы = __Константы@MD {};
Функция ОсновнаяФирма() Экспорт
Возврат Константа.ОсновнаяФирма;
КонецФункции
Вы спросите - зачем огород городить? Отвечаю. Мы отделили реализацию от представления. Скрыли реализацию за интерфейсом. Теперь мы можем свободно менять реализацию, оставив старый интерфейс. Кстати, отличный повод для подобного разделения - это несоответствие названия константы реальному состоянию дел. Вместо, или вместе со сменой идентификатора константы можно сразу провести данный рефакторинг. Все равно глобальным поиском трясти.
Примеры, когда нужно вдруг поменять реализацию.
1. Теперь вдруг понадобилось сделать константу периодической. Мы даже интерфейс можем не менять, а расширить:
класс Константы = __Константы@MD
{
Справочник ОсновнаяФирма(Дата _Дата = ТекущаяДата());
};
Функция ОсновнаяФирма(_Дата) Экспорт
Возврат Константа.ОсновнаяФирма.Получить(_Дата);
КонецФункции
2. Вдруг провели измерения быстродействия и выяснили, что обращения к таблице констант занимают существенное время в работе конфигурации. Решение - кэшировать значения тех констант, которые в середине дня ну никак не могут поменяться. ОсновнаяФирма - одна из таких констант (обратный пример - это константа ДатаЗапретаРедактирования, ее кэшировать не стоит).
класс Константы = __Константы@MD {};
Перем КэшОсновнойФирмы;
Процедура Конструктор()
КэшОсновнойФирмы = "";
КонецПроцедуры
Функция ОсновнаяФирма() Экспорт
Если КэшОсновнойФирмы = "" Тогда
КэшОсновнойФирмы = Константа.ОсновнаяФирма;
КонецЕсли;
Возврат КэшОсновнойФирмы;
КонецФункции
3. Мы решили разгрузить таблицу констант от блокировок. И хотим хранить значение основной фирмы в специальном справочнике.
класс Константы = __Константы@MD {};
Функция ОсновнаяФирма() Экспорт
СпрКонстанты = СоздатьОбъект("Справочник.Константы");
СпрКонстанты.НайтиЗначениеПоКоду("ОсновнаяФирма");
Возврат СпрКонстанты.Константа;
КонецФункции
4. У константы не может быть двух идентификаторов, а вот в классе вполне может оказаться два (и даже больше) метода с разными названиями, но которые делают одно и то же. Зачем это может понадобиться - придумайте сами :)