Версия для печати темы (https://pro1c.org.ua/index.php?showtopic=18645)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Проверка на пустую ссылку в запросе

Автор: Agapov_Stas 07.07.14, 13:20

Не спишите писать Значение(Справочник.Номенклатура.ПустаяССылка) smile.gif
Вопрос вот в чем. Есть реквизит с составным типом данных.
Он может принимать как значение пустой ссылки одного из типов данных (которые ему доступен) так и значение НЕОПРЕДЕЛЕННО
Как в запросе проверить заполнен ли этот реквизит?

Выражение типа:

ВЫБОР КОГДА Реквизит  = Значение(Справочник.Номенклатура.ПустаяССылка) Тогда 
      "Пустой"
Иначе
      "Не пустой"
Конец

Не подходит - т.к. реквизит имеет составной тип данных
И не всегда принимает значение НЕОПРЕДЕЛЕННО (пользователь мог выбрать тип данных - но не выбрать сами данные и сохранить)
Спасибо.

Автор: Vofka 07.07.14, 13:27

ВЫБОР КОГДА Реквизит  = Значение(Справочник.Номенклатура.ПустаяССылка) ИЛИ 
               Реквизит = Значение(Справочник.Номенклатура1.ПустаяССылка) ИЛИ
               Реквизит = Значение(Справочник.Номенклатура2.ПустаяССылка) ИЛИ
               Реквизит = Неопределено Тогда
      "Пустой"
Иначе
      "Не пустой"
Конец

Автор: Agapov_Stas 07.07.14, 13:38

Не годится - нужен универсальный метод - Вы не знаешь состав

Автор: Acid 07.07.14, 14:00

NULL

Автор: Agapov_Stas 07.07.14, 14:07

А причем тут NULL если я говорю про не заполненное значение?
Значение ЕСТЬ - как его проверить на заполненность ?

Автор: Rayne 07.07.14, 14:10

А что, если попробовать выразить значение в строку и проверять на пустую строку?

Автор: Agapov_Stas 07.07.14, 14:22

Цитата(Rayne @ 07.07.14, 15:10) *
А что, если попробовать выразить значение в строку и проверять на пустую строку?

Не работает: пишет ошибку "Несовместимые типы"
Еще есть варианты ?

Автор: Vofka 07.07.14, 15:01

Цитата(Agapov_Stas @ 07.07.14, 14:38) *
Не годится - нужен универсальный метод

Сообщите мне, когда найдете универсальный метод.

Автор: Rayne 07.07.14, 15:10

Цитата(Agapov_Stas @ 07.07.14, 15:22) *
Не работает: пишет ошибку "Несовместимые типы"
Еще есть варианты ?


А через функцию ПРЕДСТАВЛЕНИЕ?

Автор: Agapov_Stas 07.07.14, 15:19

В общем методом проб и ошибок нашел универсальный метод (как мне кажется) проверить на заполненность значения в запросе

ВЫБОР КОГДА ПРЕДСТАВЛЕНИЕССЫЛКИ(Реквизит1) = "" Тогда   // Пустая ссылка будет возвращать пустую строку 
    "Пустое значение"
КОГДА ПРЕДСТАВЛЕНИЕССЫЛКИ(Реквизит1) = НЕОПРЕДЕЛЕННО ТОГДА  // Не выбранное значение будет возвращать НЕОПРЕДЕЛЕННО
    "Пустое значение"
КОГДА Реквизит1 ЕСТЬ NULL Тогда  // В Случае если вы присоединяете таблицы  
    "Пустое значение"
Иначе
    "Заполненное значение"
Конец


Также - если у вас составное поле не ссылочного типа, то можно добавить проверку на заполненность примитивных типов данных (в зависимости от задачи и потребностей)


Автор: sava1 07.07.14, 15:20

По-идее: Неопределено - будет NULL, Пустая ссылка - ИД=00000000....; если что-то выбрано - не НУЛЛ и не 00000...

Это если только ссылочный тип

Автор: Agapov_Stas 07.07.14, 15:21

Цитата(sava1 @ 07.07.14, 16:20) *
По-идее: Неопределено - будет NULL, Пустая ссылка - ИД=00000000....; если что-то выбрано - не НУЛЛ и не 00000...

Это если только ссылочный тип


Вообще не по идее
Неопределенно и NULL совершенно разное(!)
Как можно сравнивать два этих значения?

Автор: sava1 07.07.14, 15:25

И чем это они отличаются?

Автор: Agapov_Stas 07.07.14, 15:34

Цитата(sava1 @ 07.07.14, 16:25) *
И чем это они отличаются?

Есть немного отличий ))

я в решении написал ответ - там кстати написано чем они отличаются

Автор: alex040269 07.07.14, 15:53

Цитата(sava1 @ 07.07.14, 16:25) *
И чем это они отличаются?

NULL - когда в соединении не найдена соответсвующая строка
Неопределено - когда строка найдено, но в колонке неопределен тип.


неопределно - тип 1с
NULL - результат выбора sql.

ну в общем одна дает, другая дразнится. Вот и вся разница.smile.gif

Автор: Vofka 07.07.14, 16:20

По-моему так надо:

ВЫБОР КОГДА ПРЕДСТАВЛЕНИЕССЫЛКИ(Реквизит1) = "" Тогда   // Пустая ссылка будет возвращать пустую строку 
    "Пустое значение"
КОГДА Реквизит1 = НЕОПРЕДЕЛЕННО ТОГДА  // Не выбранное значение будет возвращать НЕОПРЕДЕЛЕННО
    "Пустое значение"
КОГДА Реквизит1 ЕСТЬ NULL Тогда  // В Случае если вы присоединяете таблицы  
    "Пустое значение"
Иначе
    "Заполненное значение"
Конец


Потому что Представление(Неопределено) возвращает пустую строку. А так жму палец. smile.gif

Автор: Agapov_Stas 07.07.14, 16:48

не ПРЕДСТАВЛЕНИЕ, а ПРЕДСТАВЛЕНИЕССЫЛКИ

Функция ПРЕДСТАВЛЕНИЕССЫЛКИ
Позволяет получать представление ссылочного значения.
В качестве параметра функции передается выражение, представление результата которого нужно получить. В случае, если результатом выражения является ссылка, результатом функции будет строка – представление данной функции. В остальных случаях результатом функции будет значение переданного параметра.
я даже перепроверил :-) если НЕОПРЕДЕЛЕННО, то возвращает НЕОПРЕДЕЛЕННО, а не пустую строку.

Автор: sava1 08.07.14, 6:48

Цитата(alex040269 @ 07.07.14, 16:53) *
ну в общем одна дает, другая дразнится. Вот и вся разница

Когда-то писали - очередной костыль от 1С - для СКЛ сервера (прямого запроса) - никакой разницы.
А костыль обусловлен методой хранения типизированых значений в базе.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua