Акт I: Гром с ясного неба
Дело было в самый разгар квартального закрытия. Вася Пупкин мирно пил свой третий кофе, размышляя о высоком - о том, как бы переписать обработку обмена так, чтобы она не падала каждый раз в полночь. И тут, как гром среди ясного неба, раздался звонок. Вася взял трубку и уже через секунду лицо его приняло то самое выражение, которое бывает у человека, внезапно вспомнившего, что он забыл сделать что-то очень важное, для директора.
Василий! Немедленно! - голос главного бухгалтера Марьи Ивановны звенел, как системное предупреждение о блокировке базы.
В сводном отчёте за апрель, расхождение на одну копейку!
Сегодня последний день сдачи!
Срочно разберитесь и исправьте!
Вздохнув, Пупкин открыл конфигурацию. Он знал, о каком отчёте речь. Это был тот самый легендарный отчет, в модуле которого красовался артефакт эпохи - комментарий легендарного предшественника Димы, ушедшего в нирвану (или в фриланс) ещё во времена 8.2. Надпись гласила:
//Тут костыль. Не трогать до Второго Пришествия. Ну или до Вани. Ваня, если читаешь — привет.
А под комментарием была процедура РассчитатьЧТОТООЧЕНЬВАЖНОЕ(). Объём - ровно 11 000 строк. Это была не просто программа. Это была летопись, написанная руками десятков разработчиков за полтора десятилетия. Код времён 7.7 соседствовал с конструкциями 8.3, попытки рефакторинга утопали в паутине условий, а в самом центре, как чёрная дыра, находился цикл, который, по некоторым слухам, однажды самопроизвольно сгенерировал накладную.
Акт II: Погружение в лабиринт
Вооружившись крепким чаем и пачкой печенья "Юбилейное", Вася начал погружение. Первые несколько сотен строк были скучны, как документация к типовой конфигурации, инициализация переменных с именами:
Перем А;
Перем А_Старое;
Перем А_Новое_Но_Наверное_НеФакт;
...
А дальше начиналась магия.
Логические конструкции достигали невиданной сложности:
Если Найти(Контрагент, "ИП Сидоров") > 0 Тогда
// Что-то очень важное для Сидорова
ИначеЕсли Найти(Контрагент, "РОГА И КОПЫТА") > 0 Тогда
// Логика на случай, если в названии есть рога или копыта
...
КонецЕсли;
На отметке в две тысячи строк Вася обнаружил процедуру-призрак ОбработатьОсобыйСлучай(). Она вызывалась из множества мест, но вся её внутренность была закомментирована. Рядом красовалась записка:
//Здесь был баг. Мы его победили. Но стены остались. Удалять страшно.
А на строке 5500 его ждала перекличка поколений:
// Дима: тут баг был, я пофиксил. должно работать.
// Юра-2015: Проверил, вроде норм.
// Семен-2016: Кто пишет такие комментарии?!
// Неизвестный-2020: Ребята, тут явно нужен рефакторинг...
К концу дня Вася Пупкин смотрел в свой монитор стеклянным взглядом. Он начал думать категориями того кода, который пытался понять сегодня, весь день.
Фраза жены: "Если пойдешь в магазин, купи хлеба" мысленно оформилась у него как:
Если ПойтиВМагазин Тогда
КупитьХлеб = Истина;
КонецЕсли;
Акт III: Озарение
На следующий день давление со стороны Марии Ивановны достигло критического уровня. Звонки следовали каждые полчаса, а иногда и чаще. И тогда, в момент наивысшего отчаяния, Васю осенило. Он оторвался от эпического полотна в 11 000 строк и посмотрел на окружение этого отчёта.
Там, среди прочих внешних обработок, скромно лежал файл ДопОбработкаОтчета.epf. Висел он там с такими древними датами изменения, что, казалось, помнил ещё интерфейс Такси в виде концепта. Вася открыл его. И обомлел...
Вся обработка состояла из одной процедуры, где гордо красовался комментарий времён олимпиады в г. Сочи и единственная строка кода, менявшая судьбу всех вычислений:
Процедура РассчитатьИТОГО()
// Временный костыль от Димы, 2014г. Баг в 8.2.14. НЕ УДАЛЯТЬ!!!
ИтоговаяСумма = ИтоговаяСумма * 0.99999999;
КонецПроцедуры
Вся титаническая работа гигантского модуля, все 11 000 строк его логики, в конечном счёте, умножались на этот самый коэффициент. Коэффициент, который должен был быть удалён после обновления платформы до 8.2.15, но благополучно пережил все миграции, подобно таракану после ядерной зимы. Та самая злополучная копейка и появлялась тогда, когда исходная сумма после всех вычислений оказывалась такой, что умножение на 0.99999999 давало разницу в одну копейку.
Акт IV: Финал (он же "Костыль поверх костыля")
Тронуть 11 000 строк? Это было бы святотатством, равносильным попытке переписать ядро типовой конфигурации. Удалить обработку Димы? Невозможно. Комментарий «НЕ УДАЛЯТЬ!» был написан с такой энергетикой, что даже система контроля версий, при попытке сделать коммит, не решилось бы на это.
Вася Пупкин поступил как истинный наследник легендарного Димы. Он открыл внешнюю обработку ДопОбработкаОтчета.epf и аккуратно дополнив наследие предка:
Процедура РассчитатьИТОГО()
// Временный костыль от Димы, 2014г. Баг в 8.2.14. НЕ УДАЛЯТЬ!
// ИтоговаяСумма = ИтоговаяСумма * 0.99999999;
// Доп.костыль от Васи, 2025г. Исправлен копеечный баг. ТОЖЕ НЕ УДАЛЯТЬ!
ИтоговаяСумма = Окр(ИтоговаяСумма, 2);
КонецПроцедуры
Он сохранил обработку под новым именем — ДопОбработкаОтчета_сКопейкой.epf, подключил её к отчёту вместо старой и запустил расчёт. Расхождение в копейку исчезло. Мария Ивановна успокоилась. В бухгалтерии воцарился мир, нарушаемый лишь привычным стуком клавиш.
А уже после, листая другие части конфигурации, Вася нашёл в модуле справочника "Номенклатура" ещё одно послание, будто бы оставленное специально для него:
// ВНИМАНИЕ! Тот, кто придёт рефакторить 11000 строк в отчёте "ТотСамый" - ищи не в глубине, а на поверхности.
// И помни: лучше старый костыль, чем новый баг.
// Дима.
// P.S. Кофе в автомате снова нет. Несите свой.
Эпилог
Такова эта история. Порой решение сложной задачи в 1С - это не героический рефакторинг, а аккуратное наслоение. Мы не пишем новый код, мы делаем апгрейд истории. А гигантские монолиты в 11 000 строк и скромные обработки в три строки - это летопись нашей работы. Это не просто костыли, коллеги. Это технологические костыли - особый класс решений, где элегантность уступает место выживаемости, а чистота кода - исторической преемственности. Они обрастают легендами, комментариями и своим собственным жизненным циклом, становясь неотъемлемой частью нашей системы.
Эти костыли - наша общая память, боль и своеобразная гордость. Как шрам, который есть у каждого, кто хоть раз написал комментарий "временное решение" с мыслью "потом обязательно перепишу".
P.S. Мария Ивановна, оценив скорость решения, лично принесла Васе пирожок с капустой. Что, впрочем, не удивительно, она была женщиной отходчивой, хоть и очень строгой.
На этом всё. Коллеги, пусть ваши костыли будут технологичными, а наследие - понятным.
С наступающим НГ!
Другие статьи автора:
- Древняя УТ 10.3 (10.3.6.8) и маркировка товара: как обойтись без перехода на УТ 11.5 (мой практический опыт)
- Автоматическое обновление токенов Честного Знака в 1С: устраняем человеческий фактор
- Дубликатор кодов маркировки (КИЗ) DataMatrix: Расширение 1С с проверкой в Честном Знаке (копирует ЛЮБЫЕ КИЗы!)
- Маркировка остатков товаров на складе: Как сделать все быстро и без ошибок (мой практический опыт)
- Маркировка остатков в распределенной рознице: Как промаркировать более 100 тыс. товаров в нескольких десятках магазинов без хаоса и ошибок
Вступайте в нашу телеграмм-группу Инфостарт
