История о том, как Вася Пупкин спас квартальный отчет Марьи Ивановны

28.01.26

Разработка - Рефакторинг и качество кода

История о легендарном отчете на 11 000 строк, копеечном расхождении и костыле 2014 года, который пережил все обновления. О том, как Василий спас квартальное закрытие, не тронув ни единой строчки кода монолита

Акт 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) и полноценный ТСД (Online) или как обойтись без перехода на УТ 11.5
Как подключить маркировку в древней УТ 10.3 без перехода на УТ 11.5 - все необходимые объекты, модули и доработки
Автоматическое обновление токенов Честного Знака в 1С
Автоматическое обновление токенов Честного Знака в 1С - готовое решение для УТ, КА, ERP, УНФ, Розницы и Бухгалтерии, которое избавляет от ручных обновлений и остановки процессов.
Дубликатор кодов маркировки (КИЗ) DataMatrix: Расширение 1С с проверкой в Честном Знаке (копирует ЛЮБЫЕ КИЗы!)
Автоматическое обновление токенов Честного Знака в 1С - готовое решение для УТ, КА, ERP, УНФ, Розницы и Бухгалтерии, которое избавляет от ручных обновлений и остановки процессов.
Маркировка остатков товаров на складе: Как сделать все быстро и без ошибок (мой практический опыт)
Маркировка остатков 10 000+ товаров без ошибок — готовое решение, которое исключает человеческий фактор, автоматизирует процесс и работает напрямую с 1С. Пошаговый опыт и готовое расширение внутри.
Маркировка остатков в распределенной рознице: Как промаркировать более 100 тыс. товаров в нескольких десятках магазинов без хаоса и ошибок
Маркировка остатков 100 000+ товаров в рознице без хаоса и ошибок — клиент-серверное решение, где сканируешь ШК в магазине и сразу получаешь КМ на принтере, независимо от кассового ПО. Практический опыт, регламент и готовый комплект кода внутри.

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Нейросети Рефакторинг и качество кода Запросы Разработчик 1С 8.3 Абонемент ($m)

Нейросеть написала запрос или процедуру для вашей базы 1С, и непонятно, все ли имена в нём настоящие. Обработка компилирует текст без выполнения, сверяет его с метаданными этой базы и к каждой ошибке пишет настоящее имя, например ВНаличииОстаток вместо выдуманного КоличествоОстаток. Список ошибок с подсказками одной кнопкой копируется обратно в чат с моделью.

10 стартмани

02.11.2026    324    1    nedomolkov.ivan    1    

2

Рефакторинг и качество кода Разработчик 1С:Предприятие 8 Россия Бесплатно (free)

Одна проверка в обработчике кнопки может выглядеть достаточной, пока ту же операцию не вызовут из другого места. На примере управляемой формы разберём, почему так происходит, как разместить проверку в общей серверной функции и чем отличается удобная проверка ввода от обязательного условия выполнения операции.

29.10.2026    350    YA_777378709    0    

4

Рефакторинг и качество кода Разработчик Бесплатно (free)

Рассказываем, почему качественный код – это не техническая прихоть, а актив, который помогает бизнесу быстрее адаптироваться к изменениям и запускать новые фичи без бесконечного преодоления техдолга. Показываем, как объяснить бизнесу ценность рефакторинга через понятные признаки: замедление разработки, неточные оценки, страх перед legacy и хрупкость системы. Разбираем, почему неправильный рефакторинг может быть дороже его отсутствия, какие анти-паттерны ломают процесс и как не превратить улучшения в бесконечную переделку ради переделки. Объясняем, как сделать рефакторинг частью культуры команды: договориться с бизнесом, научить разработчиков видеть проблемные места, закрепить правила и поддерживать улучшения на уровне тимлидов, архитекторов и всей команды.

28.10.2026    467    Pavel791    0    

2

Рефакторинг и качество кода HighLoad оптимизация Системный администратор Разработчик Стажер 1С 8.3 Абонемент ($m)

Если к HTTP-сервису 1С обращаются сразу несколько программ, сколько запросов в секунду он успеет обработать? Я опубликовала простой HTTP-сервис на нашей "подопытной" конфигурации «Нано-УТ» (файловая база, Apache, без прав администратора) и нагрузила его скриптом на Python. Ответ: около 15-16 запросов в секунду, сколько бы клиентов ни обращалось одновременно. Запросы ждут своей очереди, и при 32 клиентах ответ приходит через 2 секунды вместо 64 мс. Заодно разобрала скрипт из первого варианта статьи: он «проверял» сервер, который отвечал по одному, и считал ошибки вместе с успешными ответами. В архиве исправленный скрипт, учебный сервер, HTTP-сервис для 1С и инструкция по запуску.

1 стартмани

23.10.2026    503    Ninel_S    3    

2

Рефакторинг и качество кода Разработчик 1С 8.3 Абонемент ($m)

Запустили Analyzer 1C 2.7.65 на промышленной конфигурации (596 модулей, 13 669 функций) и исследовали перегруженные функции (до 1887 строк), циклические зависимости и экран «Циклы» (кольцо из 64 модулей). Разобрали, почему популярные метрики (McCabe, связность) не представлены в продукте вендора, и составили пошаговый план разделения модуля. Привели проверенный платформой 8.3.27 пример до и после рефакторинга и выявили скрытую ловушку загрузки модулей с точкой в имени.

9 стартмани

19.10.2026    442    Ninel_S    2    

2

Рефакторинг и качество кода EDT СКД Разработчик 1С 8.3 1С 8.5 1С:Бухгалтерия 3.0 Бесплатно (free)

Одиннадцать граблей схем компоновки, которые не видно в конструкторе и не ловит EDT, на реальных отчетах БП КОРП. Формат числа задается в двух местах, и условное оформление варианта перебивает формат поля. Ресурс складывает штуки с часами, и помогает выражение «только когда единица одна». Ресурс пуст в детальных записях, параметр не появляется в шапке без userSettingID, valueListAllowed ломает границы периода, Остатки и СрезПоследних с параметром периода падают с «Несоответствием типов», title без xsi:type дает «Исключение XDTO» при загрузке. В конце код проверки схемы из файла до обновления базы, сводная таблица и чеклист.

16.10.2026    501    Konstmax13    2    

2

Инструментарий разработчика Нейросети Рефакторинг и качество кода EDT Разработчик 1С 8.3 1С 8.5 1С:Бухгалтерия 3.0 Бесплатно (free)

Как ИИ-агент (Claude Code) работает в живом EDT-проекте 1С:Бухгалтерии КОРП 3.0: из чего собрать стенд с MCP-сервером для EDT, как ставить задачи агенту, где он ломает проект и какие проверки это ловят. Реальные случаи: рукописные метаданные, ронявшие конфигуратор; четыре дня зависшего обновления из-за порядка блоков в Rights.rights; ошибки, которые EDT пропускает, а платформа нет; сплошная сверка вместо «вроде работает». В приложении шаблон CLAUDE.md, шаблон правила, чеклист перед обновлением базы и скрипты проверки ролей и схем СКД.

15.10.2026    3431    Konstmax13    11    

11

Рефакторинг и качество кода Тестирование QA Разработчик 1С 8.3 Абонемент ($m)

Инженерный анализ влияния (Impact Analysis) при изменении общего метода в 1С:Предприятии: почему штатный поиск ссылок скрывает 99% зависимостей и как обратный обход графа вызовов выявляет 370 скрытых потребителей на глубине 3 уровней. В статье — верификация сквозной цепочки обмена с маркетплейсом; в архиве-компаньоне — автономный BFS-анализатор на Python, слепки графа и план регрессионного тестирования.

1 стартмани

12.10.2026    314    Ninel_S    0    

2
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. DmitryKlimushkin 9 15.12.25 10:09 Сейчас в теме
Прочитал текст, попробовал перенести на реальность... Не легло.
Я, так понимаю, уже где-то корпоративы тренировочно-разминочные начались?) Киньте Марь Иванне ссылку на мою страничку, а то её этот Вася разорит на пирожках, ничего толкового так и не сделав)
4. GarriSoft 803 15.12.25 10:44 Сейчас в теме
(1)
Вам явно повезло, что ваша реальность проще!
Видимо, в ней нет legacy-кода, который читается как исторический роман с непредсказуемым финалом.
akR00b; pavlov_dv; +2 – Ответить
5. DmitryKlimushkin 9 15.12.25 11:15 Сейчас в теме
(4) Ну, я-то на работе не балуюсь)
Если серьёзно, то уже достаточно давно я действую по поговорке:
- Ты сильный! Ты - справишься!
- Я - умный! Я даже браться за такое не буду...
Я либо берусь за решение самой проблемы в самой её первопричине, либо предоставляю ковыряться во всех этих "легациях" молодым и ретивым) Опыт показал, что перекладывание старья с боку на бок только старых блох беспокоит, никак не решая самой проблемы.
6. GarriSoft 803 15.12.25 11:26 Сейчас в теме
(5)
Понятно. Вы - умный. Вы даже за такое браться не будете, но Вася тоже не дурак - он сильный, справился и с легаси и со всем остальным.
Повезло же тем, кто может выбирать, пока другие разгребают задачи и делятся пирожками с коллегами.
Мир в балансе!
7. DmitryKlimushkin 9 15.12.25 11:36 Сейчас в теме
(6) А тут места для смеха и нет совсем, всё так и есть. Наступит момент, когда выплатишь все ипотеки, вырастишь и поставишь на ноги всех иждивенцев, а жить сможешь просто на пассивный доход. Тогда можешь работать только там, где интересно. А браться за любую ИТ-корягу уже и необязательно, легче заявление написать.
8. GarriSoft 803 15.12.25 11:45 Сейчас в теме
(7)
Не все могут попасть на уровень "Пошел ты!", но некоторым все же удается.
из к/ф "Игрок":
"
Кто-то о чем то просит, - Пошел ты!
Шеф разозлил, - Пошел ты!
"
отрывок: https://vk.com/video-182763495_456240013?t=1m30s

В этом и есть главный парадокс. Чтобы достичь уровня "Пошёл ты", нужно сначала долго и успешно говорить "Да, сделаю".
Вася как раз на этом этапе. А когда-нибудь и он, глядя на свои старые костыли, скажет новому Васе: "Ты сильный! Ты справишься!".
jan-pechka; akR00b; ef42; +3 – Ответить
9. GarriSoft 803 15.12.25 14:25 Сейчас в теме
(7)
Дмитрий, если говорить серьезно, то я прекрасно понимаю и разделяю ваше стремление к архитектурной чистоте и имея за плечами 28 лет опыта в 1С, я полностью согласен: костыли - это боль.

Но разница, как мне кажется, вот в чём:
Вы достигли права отказаться от подобных "коряг". И, наверное, это заслужено.
Я же написал шуточную историю о том, как необходимо было поставить этот "технологический костыль", чтобы обеспечить квартальное закрытие и удержать бизнес на плаву.

В этом и заключается мудрость "Сеньора-помидора": знать, когда нужно все переписать, а когда - сделать максимально быстро и безопасно то, что принесёт результат бизнесу прямо сейчас.
В этом и была суть этой байки из склепа

И самое главное, не стоит расценивать эту историю, как пропаганду нетрадиционных методик написания кода (говнокода).
Award; akR00b; +2 – Ответить
10. DmitryKlimushkin 9 15.12.25 19:33 Сейчас в теме
(9) Ты нечаянно тряхнул соль на мою незажившую рану) Я и рад бы посмеяться, но накануне лазил по тем участкам кода, когда, прям, кровь из глаз. Ну, ты знаешь, да?) Я прочёл твой позитивный посыл не в том настроении - не принимай моё брюзжание на свой счёт!
11. GarriSoft 803 15.12.25 20:31 Сейчас в теме
(10)
Дмитрий, я прекрасно тебя понимаю!
У каждого Сеньора есть такая "незажившая рана", куда лучше не лезть без крепкого кофе. ;)

Всё в порядке, я и сам иногда брюзжу. Главное, наш опыт - это наша сила.

С наступающим!
Успехов тебе в обходе костылей!
12. DmitryKlimushkin 9 15.12.25 20:56 Сейчас в теме
2. ixijixi 2177 15.12.25 10:31 Сейчас в теме
Такова эта история
И больше никакова!
akR00b; ef42; 0x00; +3 – Ответить
3. GarriSoft 803 15.12.25 10:36 Сейчас в теме
(2)
История, конечно, такова, а вот понятие юмора - у всех разное.
13. Suker86 87 15.12.25 22:35 Сейчас в теме
Зачетно, жизненно !
Недавно краем глаза увидел расчет отложенного налога от 1С с округлением, они копейку гоняют туда сюда, она вылезает в итоге в той строке, где налога вообще не должно быть, забавно. Раз в квартал копейка вылезает :) Причем там такие комменты от 1С, прямым текстом пишут в комментах - не трогай. Округление по вертикали, по горизонтали, а считает всё равно неверно :)
14. GarriSoft 803 15.12.25 22:46 Сейчас в теме
(13)
Это не копейка, коллега, это призрак прошлого архитектора!
Он будет появляться раз в квартал, напоминая, что идеальный код требует жертв, пока его не отрефакторят. Но, как мы знаем, это будет не сегодня.
Но тут главное - чтобы Марья Ивановна была довольна! 😉
hercules; +1 – Ответить
20. SemandCheb 1 19.12.25 22:32 Сейчас в теме
(13) Почти такая же история с УХ 3.2.
В коде регламентного задания по переоценки валютных заявок на оплату когда
сравнивают "Выразить(результат деления 1 КАК Число(15,7)" с "результат деления 2"

ГДЕ
	(ВЫРАЗИТЬ(ЕСТЬNULL(КурсВалютыВзаиморасчетов.Курс * КурсВалютыОплаты.Кратность, 0) / ЕСТЬNULL(КурсВалютыВзаиморасчетов.Кратность * КурсВалютыОплаты.Курс, 1) КАК ЧИСЛО(15, 7))) <> ВТ_ОперацииСДатамиКурсов.КурсПлатежа / ВТ_ОперацииСДатамиКурсов.КратностьПлатежа
15. polos75 16.12.25 09:25 Сейчас в теме
Вспомнил, как долго искал в зуп 7.7 почему у Семина неправильно считается НДФЛ в мае, а у Петрова в июне.
После обновления ошибка ушла, а в пояснениях к релизу обнаружил: ндфл неправильно считался, если количество букв в фамилии сотрудника совпадало с номером месяца расчёта.
Жаль что не было времени разобраться и свободных дискет. Но когда-нибудь я найду тот релиз и посмотрю на код!
jan-pechka; rozer; GarriSoft; +3 – Ответить
16. GarriSoft 803 16.12.25 09:54 Сейчас в теме
(15)
Вот это я понимаю - настоящая байка из склепа!
Код, который учитывает длину фамилии, это явно чей-то очень изысканный костыль.

Хорошо, что дискет тогда не хватило, а то этот код мог бы изменить ваше мировоззрение навсегда!

Хотя, может быть, это уже не программирование вовсе, а высшая нумерология от 1С!
Может быть, тот разработчик из 1С верил, что звезды и количество букв в фамилии влияют на бюджет страны сильнее, чем Налоговый кодекс, времена тогда были не простые.
18. rozer 324 17.12.25 17:22 Сейчас в теме
(15) только это был ЗиК тогда а не зуп )
21. polos75 23.12.25 12:16 Сейчас в теме
(18) Точно, уже руки отвыкли печатать: зик, тис...
Один клиент до сих пор на зик 7.7 сидит и слезать не хочет, программирую ещё.
19. SemandCheb 1 19.12.25 22:17 Сейчас в теме
(15) Скорее всего совпали имена переменных, одна из которых использовалась в качестве индекса для обращения, а в другой подсчитывалось коло-во символов в фамилии
17. akR00b 26 17.12.25 08:08 Сейчас в теме
Класс! Прочитал на одном дыхании) спасибо!
Для отправки сообщения требуется регистрация/авторизация