Реквизиты ссылочного типа 1с

Обновлено: 04.07.2024

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

Предлагаю простые решения этой задачи (без построения запросов к базе данных), полученные эмпирическим путём:

1) Для платформы 1С-7.7:
- Для «битой» ссылки метод Ссылка . Выбран () и функция ПустоеЗначение () возвращают ноль;
- Для «пустой» ссылки метод Ссылка . Выбран () возвращает ноль, а функция ПустоеЗначение () единицу;
- Для «нормальной» ссылки метод Ссылка . Выбран () возвращает единицу, а функция ПустоеЗначение () ноль;

Таким образом, с точки зрения 1С-7.7 «битая» ссылка – это не пустое значение, которое не является выбранным .

2) Для платформы 1С-8.x:
Все обстаит несколько сложней.
В обоих случаях (для «битых» и «нормальных» ссылок) метод Ссылка . Пустая () и функция ЗначениеЗаполнено () ведут себя одинаково:
первый возвращает Ложь , а второй Истина .

Простоте решение было найдено случайно, при отладке ошибок времени исполнения:

- Для «битой» ссылки метод Ссылка . ПолучитьОбъект () возвращает значение Неопределено;
- Для «пустой» ссылки» метод Ссылка . ПолучитьОбъект () выбрасывает исключение:
«Ошибка при вызове метода контекста (ПолучитьОбъект): Элемент не выбран!» ;
- Для «нормальной» ссылки метод Ссылка . ПолучитьОбъект () возвращает значение согласно документации;

Таким образом, с точки зрения 1С-8.х «битая» ссылка – это не пустое значение ссылочного типа,
для которого возвращается значение объекта равное Неопределено .

При этом особняком стоят ссылки на значения перечислений. У них нет метода Ссылка . ПолучитьОбъект () .
И трудно вообще представить себе ситуацию, когда ссылка на перечисление может оказаться «битой».
Например, если удалить значение в конфигураторе, то при восстановлении значения функцией ЗначениеИзФайла () возвращается пустая ссылка.
Поэтому будем считать любые ссылки на перечисления «небитыми».

В архиве файла поставки находятся текстовые файлы с примерами реализации функции IsEmpty () для платформ 1С-7.7 и 1С-8.x,
возвращающей признак пустого значения и флаг «битой ссылки» для произвольного значения.

Про реквизит Ссылка

Введение

При изучении запросов ученики часто спрашивают про реквизит Ссылка, который есть, например, у справочников и документов.

Давайте зайдём в базу Гастроном и откроем данные справочника Цвета:

Здесь нажмём на кнопку "Стандартные реквизиты":

Вот она наша Ссылка. Это стандартный реквизит и он есть у многих прикладных типов данных.

Вот примеры его значений:
0xA9BA005056C0000811EAA968D227F09E
0xA9BA005056C0000811EAA968D8B6ACBD
0xA9BA005056C0000811EAA968D8B6ACBE
0xA9BA005056C0000811EAA96D0BC160C1

Вся прелесть этого реквизита в том, что его значение формируется платформой 1С автоматически в момент записи нового объекта в базу данных и является уникальным в пределах прикладного типа, к которому этот реквизит относится.

То есть, например, в справочнике Цвета не может быть двух элементов с одинаковым значением реквизита Ссылка.

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

Пример

Представим, что мы создали новый элемент справочника Цвета со следующими значениями реквизитов:

РеквизитЗначениеПояснение
НаименованиеКрасныйзначение этого реквизита указали мы сами при создании элемента
Ссылка0xA9BA005056C0000811EAA968D227F09Cзначение этого реквизита платформа сформировала сама при записи нового элемента в базу данных

А далее мы создали новый элемент справочника Клиенты со следующими реквизитами:

РеквизитЗначениеПояснение
НаименованиеАндрейзначение этого реквизита указали мы сами при создании элемента
ПолМужскойзначение этого реквизита указали мы сами при создании элемента
Ссылка0xA9BA005056C0000811EAA96D0BC160C0значение этого реквизита платформа сформировала сама при записи нового элемента в базу данных

А теперь самое интересное. У элемента справочника Клиенты есть реквизит ЛюбимыйЦвет, который указывает (ссылается) на элемент справочника Цвета.

Как вы думаете, какое именно значение мы должны записать в реквизит ЛюбимыйЦвет, чтобы он указывал на созданный нами ранее элемент справочника Цвета с наименованием "Красный"?

Верно, в этот реквизит мы должны записать значение реквизита Ссылка этого самого элемента (с наименованием "Красный").

То есть будет вот так:

РеквизитЗначениеПояснение
ЛюбимыйЦвет0xA9BA005056C0000811EAA968D227F09C

Примеры использования в запросах

Пример 1

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

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

Пример 2

Давайте напишем очень глупый запрос, который тем не менее продемонстрирует нам, что в реквизит ЛюбимыйЦвет записывается именно значение реквизита Ссылка элемента, на который он ссылается:

Обратите внимание, как выглядит строковое значение реквизита ЛюбимыйЦвет и Ссылка.

Платформа 1С не вывела нам его настоящее значение (например, 0xA9BA005056C0000811EAA968D227F09C).

Вместо этого она определила, что это значение указывает на элемент справочника "Цвета" с наименованием "Красный" и вывела нам слово "Красный" в качестве представления этого элемента.

Это стандартное поведение платформы, просто так мы никогда и нигде не увидим "сырое" представление реквизита Ссылка.

Пример 3

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

К примеру, если мы знаем, что реквизит ЛюбимыйЦвет указывает на элемент справочника Цвета, то мы можем путём разыменования через точку получить любой другой реквизит этого элемента.

Вот пример запроса, в котором мы для каждого элемента справочника Клиенты выводим значение реквизита Код элемента справочника Цвета, на который указывает реквизит ЛюбимыйЦвет.

Войдите как ученик, чтобы получить доступ к материалам школы

Язык запросов 1С 8.3 для начинающих программистов: функции и операторы для работы с типами (ТИПЗНАЧЕНИЯ, ТИП, ССЫЛКА, ЕСТЬNULL, ВЫРАЗИТЬ)

Автор уроков и преподаватель школы: Владимир Милькин

Давайте вспомним, что каждый реквизит (свойство, поле) справочника, документа или любого другого прикладного объекта имеет свой тип . И этот тип мы можем посмотреть в конфигураторе:

01

В языке запросов существует целый класс функций и операторов для работы с типами реквизитов. Давайте рассмотрим их.

Функция ТИПЗНАЧЕНИЯ

Эта функция принимает один параметр (значение) и возвращает его тип. Для описанного на картинке (выше) реквизита Вкус справочника Еда вернётся следующее:

02

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

А теперь давайте рассмотрим реквизит ОтличительныйПризнак у справочника Города:

04

Вы видите, что этот реквизит может иметь один из нескольких типов: Строка, Справочник.Вкусы, Справочник.Цвета. Такой тип реквизитов называется СОСТАВНЫМ .

Если мы попытаемся заполнить значение такого реквизита в режиме 1С:Предприятие, то система спросит нас, какого типа будет вводимое значение:

05

И только после нашего выбора позволит ввести значение выбранного типа.

Таким образом, элементы справочника одного вида (Справочник.Города) смогут хранить в одном и том же реквизите (ОтличительныйПризнак) значения разных типов (Строка, Цвета или Вкусы).

Вы можете убедиться в этом сами пощёлкав по элементам справочника Города в режиме 1С:Предприятие. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.

Здесь значение отличительного признака является элементом справочника Вкусы:

06

07

А здесь вообще элементом справочника Цвета:

09

Вот какие возможности открывает перед нами составной тип данных!

Интересно, как поведёт себя функция ТИПЗНАЧЕНИЯ на реквизите ОтличительныйПризнак, имеющий составной тип данных:

Это уже очень интересно. Давайте разбираться с каждой строкой в отдельности.

Тип значения отличительного признака для элемента Россия равен NULL. Мы впервые сталкиваемся с этим типом. Значения данного типа используются исключительно для определения отсутствующего значения при работе с базой данных.

Так и есть, ведь элемент Россия является группой, а не обычным элементом справочника Города, поэтому у него отсутствует поле ОтличительныйПризнак. А тип у отсутствующего значения, как мы прочитали выше, всегда равен NULL.

Тип значения отличительного признака для Перми равен Вкусы. Так и есть, ведь значение отличительного признака забитое в базе для города Пермь является ссылкой на элемент справочника Вкусы.

Для Красноярска тип признака равен Цвета, потому что значение выбранное в базе является ссылкой на элемент справочника Цвета.

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

Индия снова группа, поэтому значение отсутствует. А тип у отсутствующего значения, как мы помним, равен NULL.

Далее всё аналогично, кроме Сан-Паулу. Это не группа, а обычный элемент справочника (город), но тип его значения пустой. Как так?

А дело вот в чём. Если вы зайдёте в элемент справочника Города с наименованием Сан-Паулу, то увидите, что поле ОтличительныйПризнак совершенно никак не заполнено. Оно пустое. А все незаполненные поля составного типа имеют специальное значение НЕОПРЕДЕЛЕНО .

С НЕОПРЕДЕЛЕНО мы также сталкиваемся впервые.

Значение НЕОПРЕДЕЛЕНО применяется, когда необходимо использовать пустое значение, не принадлежащее ни к одному другому типу. Это как раз наша ситуация.

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

Функция ТИП

Она принимает всего один параметр - имя примитивного типа (СТРОКА, ЧИСЛО, ДАТА, БУЛЕВО), либо имя таблицы, тип ссылки которой нужно получить.

Результатом данной конструкции будет значение типа Тип для указанного типа.

Звучит туманно, не правда ли?

Давайте рассмотрим применение данной конструкции и всё сразу станет на свои места.

Пусть нам требуется отобрать все записи справочника Города, у которых составной реквизит ОтличительныйПризнак имеет значение типа СТРОКА:

01

Теперь давайте отберём все записи, у которых значения реквизита ОтличительныйПризнак являются ссылками на элементы справочника Цвета (таблица Справочник.Цвета):

02

Отступление

Как вы помните, некоторые элементы справочника Города не имеют реквизита ОтличительныйПризнак. Функция ТИПЗНАЧЕНИЯ для таких элементов выдаёт NULL.

Как можно сделать отбор таких элементов в запросе? Для этого предусмотрен специальный логический оператор ЕСТЬ NULL (не путать с функцией ЕСТЬNULL, которую мы рассмотрим ниже). Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.

Вот пример его использования:

03

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

Чтобы отобрать такие записи следует использовать другую конструкцию:

Но сравнение с НЕОПРЕДЕЛЕНО для определения пустых (не заполненных) реквизитов будет работать только для составных типов.

Кстати, у логического оператора ЕСТЬ NULL форма отрицания выглядит следующим образом:

Логический оператор ССЫЛКА

Оператор ССЫЛКА позволяет проверить, является ли значение выражения, указанного слева от него, ссылкой на таблицу , указанную справа.

К примеру, давайте выберем из справочника Города только те записи, у которых значение составного реквизита ОтличительныйПризнак являются ссылкой на элемент справочника Вкусы:

05

Как вы помните, эту же задачу мы могли бы решить используя ТИПЗНАЧЕНИЯ и ТИП:

Функция ЕСТЬNULL

Функция предназначена для замены значения NULL на другое значение.

Мы помним, что значение NULL возвращается в том случае, если запрашиваемый реквизит (поле, свойство) не существует.

Как например, реквизит ОтличительныйПризнак для групп справочника Города:

06

Функция ЕСТЬNULL поможет нам вывести другое значение в том случае, если это значение равно NULL. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Пусть в данном случае это будет строка "Такого реквизита нет!":

08

Получается, что если первый параметр функции ЕСТЬNULL не равен NULL, то возвращается он. Если же он равен NULL, то возвращается второй параметр.

Функция ВЫРАЗИТЬ

Эта функция предназначена только для полей , имеющих составной тип . Отличным примером такого поля является свойство ОтличительныйПризнак у элементов справочника Города.

Как мы помним, составные поля могут быть одного из нескольких типов, указанных в конфигураторе.

Для поля ОтличительныйПризнак такими допустимыми типами являются СТРОКА, Справочник.Цвета и Справочник.Вкусы.

Иногда возникает необходимость привести значения составного поля к какому-либо определенному типу.

Давайте приведём все значения поля ОтличительныйПризнак к типу Справочник.Цвета:

09

В результате, все значения элементов, которые имели тип Справочник.Цвета, остались заполненными и оказались приведенными к указанному типу. Все значения других типов (СТРОКА, Справочник.Вкусы) теперь стали равны NULL. В этом состоит особенность приведения типа при помощи функции ВЫРАЗИТЬ.

Приводить тип можно или к примитивному типу (БУЛЕВО, ЧИСЛО, СТРОКА, ДАТА) или к ссылочному типу. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Но тип, к которому делается приведение, обязательно должен входить в список типов для данного составного поля, иначе система выдаст ошибку.

приведет к ошибке. Такие конструкции возможны только на сервере.

Предположим, что стоит задача при нажатии на кнопку отобразить ИНН контрагента, выбранного на форме. Для решения поставленной задачи необходимо обратиться на сервер для получения требуемой информации(ИНН). Программный код может иметь вид:

При нажатии на кнопку ПолучитьИНН вызывается серверная функция ПолучитьИНННаСервере () . В единственном параметре передается контрагент, выбранный интерактивно пользователем. Функция получает ИНН через точку и сразу же возвращает значение обратно на клиент. Результат работы серверной функции помещается в переменную ИННКонтрагента и выводится пользователю с помощью метода Сообщить () .

Серверная функция является внеконтекстной ( &НаСервереБезКонтекста ). Это значит, что данные, содержащиеся в форме, не будут отсылаться на сервер, что уменьшит объем передаваемых данных и скорость возврата результата функции.

Внимание!

При работе с конфигурациями, в которые встроена библиотека стандартных подсистем, вместо получения реквизита через точку рекомендуется использовать функцию ЗначениеРеквизитаОбъекта () из общего модуля ОбщегоНазначения . Таким образом, строку

можно заменить на:

В случае, когда значение реквизита нужно только для визуального отображения пользователю, можно пойти другим путем: имеется возможность вывести реквизит от ссылочного значения на форму. При этом пользователь не сможет отредактировать этот реквизит.

Рассмотрим пример: на форме документа рядом с полем ввода контрагента должен выводиться его ИНН. Для этого перенесем реквизит ИНН на форму:

Выбор подчиненного реквизита

В пользовательском режиме при указании контрагента, его ИНН будет автоматически отображен на форме. Никакого программирования в этом случае не потребовалось.

Остались вопросы?
Спросите в комментариях к статье.

Читайте также: