Пятница, вечер. Сегодня провёл полдня в путешествии отладчиком по коду одной из типовых конфигураций, чтобы найти тот самый крошечный кусочек, который заставляет программу работать "именно вот так", в то время, как хотелось бы чтобы она в этом случае сработала по-другому. Крошечный кусочек кода, малюсенькая правка в нём - и ура, теперь работает как мне нужно! Но потратить полдня на эту задачу?..
Кстати, а как мы вообще тут оказались? Не в смысле как мы оказались на этой планете, а в таких вот обстоятельствах?
Давайте возьмём, например, такую, казалось бы, тривиальную операцию, как инкремент значения переменной.
Когда-то давным-давно мастера "старой школы" писали код вроде этого:
А = А + 1;
Сейчас, конечно же, кроме "фу, цэ мерзость!" ничего про такой код и сказать нельзя. Но программисты в те далёкие времена не были ещё избалованы многочисленными фреймворками и БСП, поэтому писали как Кнут на душу положит.
Шло время, виски программистов старой школы седели, страницы книжки Макконнелла "Совершенный код" безвозвратно желтели, а прогресс не стоял на месте.
И вот в наши замечательные времена, чтобы выполнить инкремент, уже имеет смысл написать хотя бы что-то вроде этого:
А = ОбщегоНазначения.Инкремент(А);
В общем модуле ОбщегоНазначения разместить функцию:
Функция Инкремент(ИнкрементируемоеЗначение) Экспорт
Возврат МатематическиеФункцииКлиентСервер.ВыполнитьАрифметическуюОперацию(
ИнкрементируемоеЗначение,
1,
МатематическиеФункцииКлиентСервер.ИдентификаторОперацииСложение()
);
КонецФункции
И, соответственно, в общем модуле МатематическиеФункцииКлиентСервер следующие функции:
Функция ВыполнитьАрифметическуюОперацию(Операнд1, Операнд2, ИдентификаторОперации) Экспорт
Результат = Неопределено;
Если ИдентификаторОперации = ИдентификаторОперацииСложение() Тогда
Результат = Операнд1 + Операнд2;
ИначеЕсли ИдентификаторОперации = ИдентификаторОперацииВычитание() Тогда
Результат = Операнд1 - Операнд2;
ИначеЕсли ИдентификаторОперации = ИдентификаторОперацииУмножение() Тогда
Результат = Операнд1 * Операнд2;
ИначеЕсли ИдентификаторОперации = ИдентификаторОперацииДеление() Тогда
Результат = Операнд1 / Операнд2;
Иначе
ВызватьИсключение "Неподдерживаемая операция " + ИдентификаторОперации;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ИдентификаторОперацииСложение() Экспорт
Возврат "Сумма";
КонецФункции
Функция ИдентификаторОперацииВычитание() Экспорт
Возврат "Вычитание";
КонецФункции
Функция ИдентификаторОперацииУмножение() Экспорт
Возврат "Умножение";
КонецФункции
Функция ИдентификаторОперацииДеление() Экспорт
Возврат "Деление";
КонецФункции
Внимательный читатель может меня упрекнуть, что во-первых, по сравнению с передовыми методиками разработки, в данном примере слишком малое количество вложенных вызов процедур и функций (например, совершенно не используется потенциал общих модулей с суффиксами "Служебный", "ПовтИсп", "Переопределяемый" и т.п.), во-вторых, что параметры в вызываемые функции передаются как позиционные аргументы, хотя логично было бы упаковать их в структуру, преобразовать в строку таблицы значений, поместить во временное хранилище и потом хотя бы пару раз сериализовать-десериализовать из/в xml или json. Ну и наконец, самый очевидный минус - это то, что вызов идёт не через ДлительныеОперации.ВыполнитьВФоне(...)! Ведь пока "хрустит" весь этот код, пользователь должен иметь возможность насладиться анимацией с котиками! Абсолютно с этим согласен. Просто хочу заметить, что это не готовая разработка, а всего лишь иллюстрация идеи, так сказать концепт, сильно упрощённый учебный пример для демонстрации современных тенденций в 1С-программировании. И при этом, хочу заметить, что несмотря на все описанные недостатки, пример всё же вполне рабочий и инкрементирует исправно!
Что нас ждёт в будущем? Скажу честно, я не футуролог. Но судя по общим тенденциям, открывая Конфигуратор (да-да, его родимый, а не эту вечную бету буржуйской EDT) мы скоро увидим что-то вроде:
P.S. На всякий случай, если вдруг найдутся такие, кто не поймёт: это был САРКАЗМ!