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