База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Почему не выполняется условие `Если ЗначениеЗаполнено(Источник.Склад)` в конверт
- В этой теме 1 ответ, 2 участника, последнее обновление 10 часов, 16 минут назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
23 сентября 2026 в 12:12 #38706
не работает условие в конвертации Если ЗначениеЗаполнено(Источник.Склад) Тогда
Значение = Источник.Склад;
КонецЕсли; -
23 сентября 2026 в 12:12 #38707
В конвертации проблема чаще всего не в
Если, а в том, чтоИсточник.Складможет быть:—
Неопределено;
— пустой ссылкой;
— структурой или объектом XDTO, у которого нет обычного доступа через точку;
— не загружен в источник;
— значением другого типа;
— реквизитом с другим именем.Ваш код:
1С (Код)123Если ЗначениеЗаполнено(Источник.Склад) ТогдаЗначение = Источник.Склад;КонецЕсли;можно использовать только если
Источник.Складдействительно существует и имеет обычный тип значения.## Надежный вариант для объекта или структуры
Сначала получите значение в отдельную переменную:
1С (Код)123456789101112131415СкладИсточник = Неопределено;Если ТипЗнч(Источник) = Тип("Структура") ТогдаИсточник.Свойство("Склад", СкладИсточник);ИначеСкладИсточник = Источник.Склад;КонецЕсли;Если ЗначениеЗаполнено(СкладИсточник) ТогдаЗначение = СкладИсточник;КонецЕсли;Но для правил конвертации КД2 обычно лучше проверять наличие свойства через
Свойство():1С (Код)123456789СкладИсточник = Неопределено;Если Источник.Свойство("Склад", СкладИсточник) ТогдаЕсли ЗначениеЗаполнено(СкладИсточник) ТогдаЗначение = СкладИсточник;КонецЕсли;КонецЕсли;Такой вариант не вызовет ошибку, если в источнике вообще нет свойства
Склад.## Если
Источникявляется объектом 1СДля объекта документа или элемента справочника используйте:
1С (Код)123Если ЗначениеЗаполнено(Источник.Склад) ТогдаЗначение = Источник.Склад;КонецЕсли;Но нужно проверить, что поле действительно называется именно
Склад.Например, в источнике оно может называться:
1С (Код)12345СкладСкладОтправительСкладПолучательМестоХраненияСкладОрганизацииВ правилах конвертации имя должно совпадать с именем реквизита объекта-источника, а не с его представлением на форме.
## Если
Складимеет составной типЕсли реквизит
Складможет содержать несколько типов, например:—
СправочникСсылка.Склады;
—СправочникСсылка.СкладыНоменклатуры;
—СправочникСсылка.СкладыОрганизаций;
—СправочникСсылка.СтруктурныеЕдиницы;то нужно проверить тип значения:
1С (Код)123456789101112СкладИсточник = Источник.Склад;Если ЗначениеЗаполнено(СкладИсточник) ТогдаЕсли ТипЗнч(СкладИсточник) =Тип("СправочникСсылка.Склады") ТогдаЗначение = СкладИсточник;КонецЕсли;КонецЕсли;Если в вашей конфигурации склад хранится не в справочнике
Склады, подставьте фактический тип справочника.Для диагностики временно добавьте:
1С (Код)1234567891011Сообщить("Тип Источник.Склад: "+ Строка(ТипЗнч(Источник.Склад)));Сообщить("Значение Источник.Склад: "+ Строка(Источник.Склад));Сообщить("ЗначениеЗаполнено: "+ Строка(ЗначениеЗаполнено(Источник.Склад)));В некоторых обработчиках КД сообщения не отображаются в пользовательском окне. Тогда используйте запись в журнал регистрации либо стандартную функцию диагностики конкретной версии конвертации.
## Для пустой ссылки лучше использовать явную проверку
В старых версиях платформы и отдельных механизмах конвертации
ЗначениеЗаполнено()может вести себя не так, как ожидается для ссылочных значений. Можно проверить явно:1С (Код)12345678СкладИсточник = Источник.Склад;Если СкладИсточник <> НеопределеноИ ЗначениеЗаполнено(СкладИсточник) ТогдаЗначение = СкладИсточник;КонецЕсли;Если нужно убедиться, что это именно ссылка на нужный справочник:
1С (Код)12345678910СкладИсточник = Источник.Склад;Если СкладИсточник <> НеопределеноИ ТипЗнч(СкладИсточник) =Тип("СправочникСсылка.Склады")И ЗначениеЗаполнено(СкладИсточник) ТогдаЗначение = СкладИсточник;КонецЕсли;## Если используется 1С 7.7 или старый обработчик КД
В старом обработчике может отсутствовать современная функция
ЗначениеЗаполнено(), либо она работает иначе. Тогда проверяйте значение черезПустоеЗначение():1С (Код)123Если ПустоеЗначение(Источник.Склад) = 0 ТогдаЗначение = Источник.Склад;КонецЕсли;Для 1С 7.7 также может потребоваться проверка существования реквизита:
1С (Код)1234567Если Источник.ПолучитьАтрибут("Склад") = 1 ТогдаЕсли ПустоеЗначение(Источник.Склад) = 0 ТогдаЗначение = Источник.Склад;КонецЕсли;КонецЕсли;Но этот вариант относится именно к старому встроенному языку 1С 7.7. Для 1С 8.x его применять не нужно.
## Частая ошибка в обработчике ПКС
В правилах конвертации
Значениеможет быть не обычной переменной результата, а уже заполненным значением, которое потом используется механизмом ПКС. Если склад не заполнен, ваш код ничего не делает, и вЗначениеостается прежнее значение.Если при пустом складе нужно явно очищать результат, пишите так:
1С (Код)123456789Значение = Неопределено;Если Источник.Свойство("Склад", СкладИсточник) ТогдаЕсли ЗначениеЗаполнено(СкладИсточник) ТогдаЗначение = СкладИсточник;КонецЕсли;КонецЕсли;Если ожидается именно пустая ссылка на справочник, а не
Неопределено, используйте пустую ссылку соответствующего типа:1С (Код)12345Значение = Справочники.Склады.ПустаяСсылка();Если ЗначениеЗаполнено(Источник.Склад) ТогдаЗначение = Источник.Склад;КонецЕсли;## Если склад нужно искать в приемнике
Нельзя всегда передавать ссылку склада из базы-источника напрямую. Если базы разные, ссылка из источника не существует в приемнике. В этом случае нужно передавать код или наименование и выполнять поиск в приемнике.
Например, в обработчике перед выгрузкой:
1С (Код)1234567891011Если ЗначениеЗаполнено(Источник.Склад) ТогдаЗначение = Новый Структура;Значение.Вставить("Код",Источник.Склад.Код);Значение.Вставить("Наименование",Источник.Склад.Наименование);КонецЕсли;А в обработчике поиска объекта приемника искать склад по коду или наименованию.
Пример через запрос в 1С:
|ВЫБРАТЬ ПЕРВЫЕ 1
| Склады.Ссылка
|ИЗ
| Справочник.Склады КАК Склады
|ГДЕ
| Склады.Код = &КодСкладаНо в правилах конвертации обычно правильнее настроить ПКС по полям:
1С (Код)12Склад.КодСклад.Наименованиеа не передавать ссылку целиком.
## Практический вариант для КД2
Попробуйте заменить код на такой:
1С (Код)123456789101112СкладИсточник = Неопределено;Если Источник.Свойство("Склад", СкладИсточник) ТогдаЕсли СкладИсточник <> НеопределеноИ ЗначениеЗаполнено(СкладИсточник) ТогдаЗначение = СкладИсточник;КонецЕсли;КонецЕсли;Если это не сработает, добавьте диагностику:
1С (Код)1234567891011121314151617181920212223242526СкладИсточник = Неопределено;Если Источник.Свойство("Склад", СкладИсточник) ТогдаСообщить("Склад найден. Тип: "+ Строка(ТипЗнч(СкладИсточник)));Сообщить("Склад: "+ Строка(СкладИсточник));Сообщить("Заполнен: "+ Строка(ЗначениеЗаполнено(СкладИсточник)));Если ЗначениеЗаполнено(СкладИсточник) ТогдаЗначение = СкладИсточник;КонецЕсли;ИначеСообщить("У Источника отсутствует свойство Склад");КонецЕсли;По результату сообщения будет понятно:
—
Складотсутствует в источнике;
— склад есть, но он пустой;
— склад имеет неправильный тип;
— значение заполнено, но его нельзя напрямую передать в приемник;
— проблема находится уже в поиске соответствия объекта приемника.
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.