Почему в типовом коде 1С:Документооборот встречаются бессмысленные проверки и как к ним относиться?

Программист 1С v8.3 (Управляемые формы) 1С:Документооборот IT и автоматизация бизнеса
← На главную

При изучении типовых конфигураций от компании 1С, особенно таких сложных систем, как 1С:Документооборот 2.1, разработчики часто натыкаются на фрагменты кода, которые на первый взгляд (и на второй тоже) лишены логического смысла. Одним из ярких примеров является проверка переменной на заполненность сразу после того, как ей было явно присвоено пустое значение. Разберем подробно, почему так происходит, стоит ли этого бояться и как правильно интерпретировать подобные "артефакты" в программном коде.

Анализ проблемного участка кода

Рассмотрим фрагмент кода из модуля формы документа, который выполняется в процедуре ПриСозданииНаСервере при вводе нового объекта. Проанализируем ситуацию, когда система инициализирует переменные для нового документа:


// Ввод нового
Если Объект.Ссылка.Пустая() Тогда 
    СостояниеТекст = Строка(Перечисления.СостоянияДокументов.НаРегистрации);
    
    ВОтветНа = Справочники.ИсходящиеДокументы.ПустаяСсылка();
    НачальноеВОтветНа = ВОтветНа;
    
    Если ЗначениеЗаполнено(ВОтветНа) Тогда // ВОПРОС: ЗАЧЕМ ЭТО?
        РеквизитыВОтветНа = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ВОтветНа,
            "РегистрационныйНомер, ДатаРегистрации, Заголовок");
        // ... дальнейшая логика формирования строки
    КонецЕсли;
КонецЕсли;

В данном примере мы видим, что переменной ВОтветНа присваивается ПустаяСсылка(). Следовательно, функция ЗначениеЗаполнено(ВОтветНа) всегда будет возвращать Ложь, и весь блок кода внутри условия никогда не будет выполнен. Для любого программиста это выглядит как классический "мертвый код".

Выясним причины появления избыточного кода

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

  1. Использование универсальных шаблонов (Copy-Paste): Разработчики типовых конфигураций часто используют готовые блоки кода для обработки связанных документов (таких как "В ответ на", "Предмет переписки", "Первичное обращение"). Этот блок универсален для случаев, когда документ открывается для редактирования (где ссылка заполнена) и когда он только создается. При копировании логики в ветку Объект.Ссылка.Пустая() проверку просто забывают или намеренно не удаляют.
  2. Последствия рефакторинга: В процессе развития конфигурации 1С:Документооборот логика инициализации могла меняться. Например, раньше в этот блок могла передаваться ссылка из параметров формы (при создании на основании), но позже логику перенесли в другое место, а "обвязку" в виде проверки оставили.
  3. Защитное программирование: В среде 1С принято считать, что лучше лишний раз проверить значение на ЗначениеЗаполнено, чем получить ошибку обращения к полям пустой ссылки или объекта Неопределено. Даже если сейчас переменная гарантированно пустая, разработчик оставляет проверку на случай, если в будущих обновлениях логика инициализации ВОтветНа изменится.
  4. Стиль разработки в 1С:ДО 2.1: Исторически сложилось, что код в версии 2.1 содержит множество повторяющихся проверок. Как отмечают опытные специалисты, в этой версии системы разные команды могли вносить изменения в одни и те же модули, просто вставляя свои куски кода без глубокого аудита существующей структуры.

Механизм связей и функция ЗначенияРеквизитовОбъекта

Разберем подробнее функции, которые вызываются внутри "бессмысленного" условия. Функция ОбщегоНазначения.ЗначенияРеквизитовОбъекта — это мощный инструмент БСП (Библиотеки Стандартных Подсистем). Она позволяет получить данные объекта одним запросом к базе данных, что гораздо эффективнее, чем обращение через точку (ВОтветНа.РегистрационныйНомер).

Однако, если передать в эту функцию пустую ссылку, она может вернуть структуру с пустыми значениями или вызвать исключение в зависимости от контекста и версии БСП. Поэтому проверка ЗначениеЗаполнено перед вызовом функций ОбщегоНазначения является стандартом разработки 1С. В данном случае мы видим конфликт между общим стандартом (всегда проверять ссылку перед получением реквизитов) и конкретным контекстом (здесь ссылка точно пустая).

Стоит ли удалять такой код в расширениях?

Когда мы сталкиваемся с подобным в типовой конфигурации, возникает соблазн "почистить" код. Рассмотрим, почему этого делать не рекомендуется:

Сравнение с 1С:Документооборот 3.0

Важно отметить, что в новой редакции системы — 1С:Документооборот 3.0 — подход к написанию кода существенно изменился. Разработчики провели глобальный рефакторинг. Теперь работа со связями документов, состояниями и заполнением реквизитов вынесена в специализированные менеджеры и общие модули.

В версии 3.0 вы практически не встретите таких "забытых" проверок в модулях форм, так как формы стали более "легкими", а вся тяжелая логика инкапсулирована в объектную модель и механизмы обработки событий. Если вы только начинаете изучать систему, примеры из 2.1 стоит воспринимать как историческое наследие, в то время как 3.0 демонстрирует современный стандарт качества кода 1С.

Заключение

Подводя итог нашему анализу, можно сказать следующее: фрагмент кода Если ЗначениеЗаполнено(ВОтветНа) после присвоения пустой ссылки — это типичный артефакт избыточного проектирования. Он не несет полезной нагрузки, но и не вредит системе. Это результат эволюции огромного программного продукта, где стабильность и следование шаблонам зачастую важнее эстетической чистоты каждой строки кода.

При работе с типовыми конфигурациями мы рекомендуем придерживаться правила: "Если код работает и не мешает, не нужно его исправлять только ради красоты". Понимание того, почему код написан именно так, помогает профессионально расти и лучше ориентироваться в архитектуре решений от 1С.

← На главную