Почему использование НайтиПоКоду нарушает стандарты 1С?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Почему использование НайтиПоКоду нарушает стандарты 1С?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #33544
      Телеграм группа https://t.me/odineskiOdineski
      Участник

        почему так обращаться ошибочно (нарушает стандарты 1С)?
        Элемент = Справочники.Номенклатура.НайтиПоКоду(КодНоменклатуры)

      • #33545
        bot_avaOdin — Одинэсник
        Участник

          Даниил, привет!

          Обращение через `Справочники.Номенклатура.НайтиПоКоду(КодНоменклатуры)` считается ошибочным и нарушающим стандарты 1С по следующим причинам:

          1. **Нарушение принципа универсальности и гибкости кода**
          Метод `НайтиПоКоду` жестко привязывает поиск к коду элемента справочника. В реальных бизнес-процессах код может быть не уникальным или меняться, а также не всегда является удобным идентификатором для поиска. Стандарт 1С рекомендует использовать универсальные методы поиска, например, `НайтиПоНаименованию`, `НайтиПоСсылке` или запросы, которые более гибко и надежно работают с данными.

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

          3. **Потенциальные проблемы с производительностью**
          При большом объеме данных поиск по коду без индексации или оптимизации может быть менее эффективным. В стандартах 1С рекомендуется использовать запросы с фильтрами и индексами, что обеспечивает более быструю и надежную работу.

          4. **Нарушение принципа инкапсуляции и бизнес-логики**
          Код элемента — это технический реквизит, а бизнес-логика должна опираться на более осмысленные признаки (например, уникальные идентификаторы, свойства, характеристики). Прямой поиск по коду часто обходится без учета бизнес-правил, что ведет к ошибкам и дублированию.

          5. **Рекомендации по использованию**
          В стандартах 1С рекомендуется:
          — Использовать универсальные методы поиска с проверкой результата.
          — При необходимости — использовать запросы к базе данных с фильтрами по нужным реквизитам.
          — Внедрять дополнительные реквизиты для уникальной идентификации (например, уникальный идентификатор или GUID).
          — Обеспечивать контроль и нормализацию справочника, чтобы минимизировать дубли и ошибки.

          **Пример правильного подхода:**

          1C
          Элемент = Справочники.Номенклатура.НайтиПоНаименованию(Наименование);
          Если Элемент = Неопределено Тогда
              // Обработка отсутствия элемента
          КонецЕсли;
          

          Или через запрос:

          1C
          Запрос = Новый Запрос;
          Запрос.Текст = 
          "ВЫБРАТЬ
              Номенклатура.Ссылка
          ИЗ
              Справочник.Номенклатура КАК Номенклатура
          ГДЕ
              Номенклатура.Код = &Код";
          Запрос.УстановитьПараметр("Код", КодНоменклатуры);
          Результат = Запрос.Выполнить().Выбрать();
          Если Результат.Следующий() Тогда
              Элемент = Результат.Ссылка;
          Иначе
              Элемент = Неопределено;
          КонецЕсли;
          

          **Итог:**
          Обращение через `НайтиПоКоду` считается ошибочным, потому что оно жестко привязывает логику к техническому реквизиту, не учитывает бизнес-правила, не обеспечивает надежность и гибкость, а также может привести к ошибкам и снижению производительности. Стандарты 1С рекомендуют использовать более универсальные и безопасные методы поиска с обязательной обработкой результата.

          Рекомендую посмотреть здесь:
          https://infostart.ru/public/71715/
          https://infostart.ru/1c/articles/62785/

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

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С