Как упростить запись в непериодический регистр без `ПустаяСсылка()`?

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

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

        Как упростить запись в непериодический регистр накопления, записывать ПустаяСсылка не обязательно если записи предшествовала очистка? и тогда можно использовать упрощённый вариант Если (через «?»)

        ТипРегистратора = ТипЗнч(Регистратор);

        Если ТипРегистратора = Тип(«ДокументСсылка.ЗаказКлиента») Тогда
        Возврат Регистратор;
        ИначеЕсли ТипРегистратора = Тип(«ДокументСсылка.РеализацияТоваровУслуг») И
        (ТипЗнч(Регистратор.ЗаказКлиента) = Тип(«ДокументСсылка.ЗаказКлиента»)) Тогда
        Возврат Регистратор.ЗаказКлиента;
        Иначе
        Возврат Документы.ЗаказКлиента.ПустаяСсылка();
        КонецЕсли;

      • #34935
        Телеграм группа https://t.me/odineskiOdineski
        Участник

          Если перед записью в непериодический регистр накопления была выполнена полная очистка (удаление всех записей), то действительно можно упростить логику записи и не обязательно явно записывать `ПустаяСсылка()`. Это связано с тем, что при записи нового набора записей с замещением (по умолчанию `Замещать = Истина`) все старые записи, включая те, где поле было бы пустой ссылкой, уже удалены.

          ### Как упростить запись

          Вместо сложной конструкции с несколькими `Если … Тогда … ИначеЕсли …` можно использовать тернарный оператор `? :` для выбора нужного значения регистратора, например:

          Возврат 
              (ТипЗнч(Регистратор) = Тип("ДокументСсылка.ЗаказКлиента")) ? 
                  Регистратор : 
                  ((ТипЗнч(Регистратор) = Тип("ДокументСсылка.РеализацияТоваровУслуг") 
                    И ТипЗнч(Регистратор.ЗаказКлиента) = Тип("ДокументСсылка.ЗаказКлиента")) ? 
                      Регистратор.ЗаказКлиента : 
                      Неопределено);
          

          Или, если в регистр не нужно записывать пустую ссылку, можно вернуть `Неопределено` (или `Null`), и при записи в регистр просто не указывать это измерение, если оно не обязательно.

          ### Можно ли не записывать ПустаяСсылка?

          — Если регистр накопления **непериодический и независимый**, и вы делаете запись с замещением после очистки, то записи с пустыми ссылками можно не создавать, так как они не нужны для корректности данных.
          — Если поле измерения обязательно, то его нужно указывать, но можно использовать `Неопределено` или просто не создавать запись с таким ключом.
          — Если поле измерения не обязательно, то можно просто не создавать запись с пустым значением.

          ### Итог

          — После очистки регистра можно записывать только нужные записи без пустых ссылок.
          — Упрощённый тернарный оператор `? :` отлично подходит для выбора нужного значения регистратора.
          — Важно, чтобы при записи не было конфликтов по ключам (уникальность комбинации измерений).

          ### Пример упрощённого варианта с тернарным оператором:

          Функция ПолучитьЗаказКлиента(Регистратор)
              Возврат 
                  (ТипЗнч(Регистратор) = Тип("ДокументСсылка.ЗаказКлиента")) ? 
                      Регистратор : 
                      ((ТипЗнч(Регистратор) = Тип("ДокументСсылка.РеализацияТоваровУслуг") 
                        И ТипЗнч(Регистратор.ЗаказКлиента) = Тип("ДокументСсылка.ЗаказКлиента")) ? 
                          Регистратор.ЗаказКлиента : 
                          Неопределено);
          КонецФункции
          

          При записи в регистр:

          Если ЗначениеЗаписи <> Неопределено Тогда
              НоваяЗапись.ЗаказКлиента = ЗначениеЗаписи;
          КонецЕсли;
          

          Рекомендую посмотреть здесь:
          https://helpf.pro/faq/view/558.html
          https://helpf.pro/faq/view/340.html

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