Программисты 1C не любят типовые конфигурации.

Объясню на одном примере и станет понятно, что 1C не заботится о тех, кто использует ее код в своих решениях.

В одном месте кода получали основной банковский счет организации при заполнении документа:

БанковскийСчетОрганизации = ЗначениеНастроекПовтИсп.ПолучитьБанковскийСчетОрганизацииПоУмолчанию(СтруктураПараметров);

Стала возникать ошибка, что не заполнено поле КорреспондирующийСчет.

Ошибка возникала в процедуре Справочник.БанковскиеСчетаОрганизаций.ПолучитьБанковскийСчетПоУмолчанию:

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

Если бы просто проверяли наличие необязательных параметров в структуре, это не приводило бы к ошибке.

В итоге я сделал заплатку:

&Вместо("ПолучитьБанковскийСчетПоУмолчанию")
Функция дор_ПолучитьБанковскийСчетПоУмолчанию(СтруктураПараметров)
	Если НЕ СтруктураПараметров.Свойство("КорреспондирующийСчет") Тогда
		СтруктураПараметров.Вставить("КорреспондирующийСчет", Неопределено);
	КонецЕсли;                            
	Если НЕ СтруктураПараметров.Свойство("ИсключитьСчетаВВалюте") Тогда
		СтруктураПараметров.Вставить("ИсключитьСчетаВВалюте", ложь);
	КонецЕсли;                            
	
	Результат = ПродолжитьВызов(СтруктураПараметров);
	Возврат Результат;
КонецФункции

При переходе с 11.5 на 11.6 разработчики типовой конфигурации УТ решили полностью переписать код, даже там, где можно было бы не плодить ошибки, наплодили. Абсолютно не подумали о тех, кто пользуется их кодом. Для костылестроительной фирмы это было бы еще допустимо, но для фирмы, пишущей на всю страну — ПОЗОР.

Вот из таких «мелочей», которые объясняются плохим методическим построением процесса разработки типовых конфигураций и складывается «нелюбовь» программистов к типовым конфигурциям.

В мире «большого» программирования для такой проблемы есть четкая терминология:

  • Breaking Changes (Ломающие изменения / Нарушение обратной совместимости)

    Главная причина боли. Это ситуация, когда обновление функции или API ломает существующий код, который до этого успешно работал. В зрелых экосистемах принято сохранять Backward Compatibility (обратную совместимость): если в функцию добавляются новые параметры, их делают необязательными (указывают значения по умолчанию) или создают новую функцию, оставляя старую рабочей.

  • Tight Coupling (Жесткая связность)

    Проблема, когда внешний код слишком сильно зависит от внутренней реализации функции (в данном случае — от точного состава полей структуры параметров). Изменение одного винтика в модуле приводит к каскаду ошибок по всей системе.

  • Defensive Programming Violation (Нарушение принципов защитного программирования)

    Код платформы или типовой конфигурации ожидает «идеальный» вход и сразу падает в ошибку, вместо того чтобы безопасно обработать отсутствие необязательных ключей (как раз то, что пришлось исправлять через Свойство()).

  • API Rot / Code Smells (Деградация API и «Дурной код»)

    Ситуация, когда разработчики базового продукта хаотично меняют сигнатуры функций от версии к версии без соблюдения стандартов проектирования (например, правил семантического версионирования SemVer), превращая работу с экосистемой в постоянную латание дыр.

Среда: УТ 11.6.1.53.

Комментарии (14)


  1. Dhwtj
    22.08.2026 06:26

    Сломали совместимость, бида


    1. fixin Автор
      22.08.2026 06:26

      и не говори... из таких вот мелких ложек дегтя портится бочка желтого 1с-мёда.


      1. Dhwtj
        22.08.2026 06:26

        Не ешь жёлтый снег©


        1. fixin Автор
          22.08.2026 06:26

          Я сам не ем, но лечу тех, кто его потребляет.


  1. Ulrih
    22.08.2026 06:26

    Не пользуй типовые, делай свое.


    1. fixin Автор
      22.08.2026 06:26

      да, планирую написать F3, но пока недосуг.


  1. KoIIIku_PuJI9IT
    22.08.2026 06:26

    Уж сколько раз твердили миру,

    А воз и ныне там! ©

    Абсолютно не подумали о тех, кто пользуется их кодом

    Они, как раз, подумали! Они только об этом и думают. Безжалостно и беспощадно. - Ошибка вендора, или Сказка про Курочку Рябу / Хабр -

    всё то, что мы видим в Снеговике, — это работа над ошибками, чтобы свободных художников в этой среде больше не осталось, а была бы только одна‑единственная и проприетарная экосистема, замкнутая на вендоре.

    з.ы. Спасибо, что лишний раз подтверждаешь мои выводы и аргументы.

    з.з.ы. Только когда в следующий раз будешь меня цитировать:

    превращая работу с экосистемой в постоянную латание дыр.

    не забывай копирайты указывать ...


    1. fixin Автор
      22.08.2026 06:26

      Вам бы написать убийцу 1С, чтобы не платить 1С за платформу 77.
      Почитал статью, она немного фанатичная. Проблема 8х не в том, что платформа хуже, а в том, что типовые конфигурации стали более монструозными. Не в последнюю очередь, потому, что 8х позволяет контролировать более сложный код.

      В 77 нет расширение, сравнение конфигураций сложнее, чем в 8х.

      Так что все же 77 сбитый летчик. Несмотря на все его возможности.


      1. KoIIIku_PuJI9IT
        22.08.2026 06:26

        Почитал статью

        Почитал - хорошо. Плохо, что ничего не понял ...


        1. fixin Автор
          22.08.2026 06:26

          Если кто-то что-то не понимает в передаче информации, то не всегда проблема на стороне приемника. Помедитируйте над этим.


  1. Naf2000
    22.08.2026 06:26

    Справедливости ради, если бы изначально структура параметров была получена из типовой функции, то ничего изменять бы не пришлось:

    	СтруктураПараметров = ДенежныеСредстваСервер.ПараметрыЗаполненияБанковскогоСчетаОрганизацииПоУмолчанию();
    	СтруктураПараметров.Организация = Объект.Организация;	
    	СтруктураПараметров.Валюта      = Объект.Валюта;
    	Объект.БанковскийСчет = ЗначениеНастроекПовтИсп.ПолучитьБанковскийСчетОрганизацииПоУмолчанию(СтруктураПараметров);

    Ну и если делать "заплатку", то хотя бы более универсально, а не до следующего изменения:

    &Вместо("ПолучитьБанковскийСчетПоУмолчанию")
    Функция дор_ПолучитьБанковскийСчетПоУмолчанию(СтруктураПараметров)
    	СтандартнаяСтруктураПараметров = ДенежныеСредстваСервер.ПараметрыЗаполненияБанковскогоСчетаОрганизацииПоУмолчанию();              
        ЗаполнитьЗначенияСвойств(СтандартнаяСтруктураПараметров, СтруктураПараметров);	
    	Возврат ПродолжитьВызов(СтандартнаяСтруктураПараметров);
    КонецФункции

    Заодно и лаконичнее вышло.


    1. fixin Автор
      22.08.2026 06:26

      Это надо знать, где эта структура формируется... Нет уж, эти кошмары разума и вялые попытки в ООП оставлю разработчикам 1С.


      1. Naf2000
        22.08.2026 06:26

        ООП тут вообще нет. А чтобы знать - достаточно заглянуть в процедуру. В новой версии так вообще вынесли в описание к методу


        1. fixin Автор
          22.08.2026 06:26

          Ну как нет, все эти структуры с полями, похожие на описание классов. Но нет приведения входной структуры к классу, где заполнялись бы необходимые поля. Да, ООП к сожалению в 1С нет. ггг

          Убого все это выглядит.