Почему не выполняется условие `Если ЗначениеЗаполнено(Источник.Склад)` в конверт

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Почему не выполняется условие `Если ЗначениеЗаполнено(Источник.Склад)` в конверт

Просмотр 1 ветки ответов
  • Автор
    Записи
    • #38706
      Фото аватараOdineski
      Участник

        не работает условие в конвертации Если ЗначениеЗаполнено(Источник.Склад) Тогда
        Значение = Источник.Склад;
        КонецЕсли;

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

          В конвертации проблема чаще всего не в Если, а в том, что Источник.Склад может быть:

          Неопределено;
          — пустой ссылкой;
          — структурой или объектом XDTO, у которого нет обычного доступа через точку;
          — не загружен в источник;
          — значением другого типа;
          — реквизитом с другим именем.

          Ваш код:

          можно использовать только если Источник.Склад действительно существует и имеет обычный тип значения.

          ## Надежный вариант для объекта или структуры

          Сначала получите значение в отдельную переменную:

          Но для правил конвертации КД2 обычно лучше проверять наличие свойства через Свойство():

          Такой вариант не вызовет ошибку, если в источнике вообще нет свойства Склад.

          ## Если Источник является объектом 1С

          Для объекта документа или элемента справочника используйте:

          Но нужно проверить, что поле действительно называется именно Склад.

          Например, в источнике оно может называться:

          В правилах конвертации имя должно совпадать с именем реквизита объекта-источника, а не с его представлением на форме.

          ## Если Склад имеет составной тип

          Если реквизит Склад может содержать несколько типов, например:

          СправочникСсылка.Склады;
          СправочникСсылка.СкладыНоменклатуры;
          СправочникСсылка.СкладыОрганизаций;
          СправочникСсылка.СтруктурныеЕдиницы;

          то нужно проверить тип значения:

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

          Для диагностики временно добавьте:

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

          ## Для пустой ссылки лучше использовать явную проверку

          В старых версиях платформы и отдельных механизмах конвертации ЗначениеЗаполнено() может вести себя не так, как ожидается для ссылочных значений. Можно проверить явно:

          Если нужно убедиться, что это именно ссылка на нужный справочник:

          ## Если используется 1С 7.7 или старый обработчик КД

          В старом обработчике может отсутствовать современная функция ЗначениеЗаполнено(), либо она работает иначе. Тогда проверяйте значение через ПустоеЗначение():

          Для 1С 7.7 также может потребоваться проверка существования реквизита:

          Но этот вариант относится именно к старому встроенному языку 1С 7.7. Для 1С 8.x его применять не нужно.

          ## Частая ошибка в обработчике ПКС

          В правилах конвертации Значение может быть не обычной переменной результата, а уже заполненным значением, которое потом используется механизмом ПКС. Если склад не заполнен, ваш код ничего не делает, и в Значение остается прежнее значение.

          Если при пустом складе нужно явно очищать результат, пишите так:

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

          ## Если склад нужно искать в приемнике

          Нельзя всегда передавать ссылку склада из базы-источника напрямую. Если базы разные, ссылка из источника не существует в приемнике. В этом случае нужно передавать код или наименование и выполнять поиск в приемнике.

          Например, в обработчике перед выгрузкой:

          А в обработчике поиска объекта приемника искать склад по коду или наименованию.

          Пример через запрос в 1С:

          |ВЫБРАТЬ ПЕРВЫЕ 1
          | Склады.Ссылка
          |ИЗ
          | Справочник.Склады КАК Склады
          |ГДЕ
          | Склады.Код = &КодСклада

          Но в правилах конвертации обычно правильнее настроить ПКС по полям:

          а не передавать ссылку целиком.

          ## Практический вариант для КД2

          Попробуйте заменить код на такой:

          Если это не сработает, добавьте диагностику:

          По результату сообщения будет понятно:

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

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