1с как определить тип реквизита справочника

Как определить тип реквизита?

Я
   Evlanov

01.11.10 — 18:51

В 1С:Предприятие7.7 есть свойства метаданных Тип и Вид.

Например,

Тип = «Справочник»

Вид = «Номенклатура»

В 1С:Предприятие8 есть аналогичное свойство Тип.

Например,

Метаданные.Справочники.ВидыОплатОрганизаций.Реквизиты.ДоговорКонтрагента.Тип = «Договоры контрагентов»

Как определить что есть «Договоры контрагентов» — справочник, документ или что-либо еще?

  

Партнерская программа EFSOL Oblako

   abitfrosty

1 — 01.11.10 — 18:53

ТипЗнч(ДоговорКонтрагента) возвращает тип СправочникСсылка.ДоговорыКонтрагентов

   Живой Ископаемый

2 — 01.11.10 — 19:00

тут внезапно может быть полезной функция XMLТипЗнч(<Значение>)
вот такой вот ассиметричный ответ

   Evlanov

3 — 01.11.10 — 19:08

Результат = ТипЗнч(Метаданные.Справочники.ВидыОплатОрганизаций.Реквизиты.ДоговорКонтрагента.Тип)

Результат = «Описание типов», но не «СправочникСсылка.ДоговорыКонтрагентов»

   Defender aka LINN

4 — 01.11.10 — 19:08

(2) Извращенец.
Документы.ТипВсеСсылки().СожержитТип(НужныйТип).
Надо только помнить, что «Метаданные.Справочники.ВидыОплатОрганизаций.Реквизиты.ДоговорКонтрагента.Тип» — это ОписаниеТипов, а не собственно тип.

   Defender aka LINN

5 — 01.11.10 — 19:09

*»СожержитТип» = «СодержитТип», конечно.

   Живой Ископаемый

6 — 01.11.10 — 19:09

2(4) вот не нравится мне так… с самого первого дня не нравилось когда я узнал как это делается в в8

   Defender aka LINN

7 — 01.11.10 — 19:11

(6) Еще раз: Метаданные.Справочники.ВидыОплатОрганизаций.Реквизиты.ДоговорКонтрагента.Тип — НЕ тип. И даже не ссылка.

   Живой Ископаемый

8 — 01.11.10 — 19:13

я знаю, но мой шаблончик такого не может выдержать и постоянно идет по шву…

   Evlanov

9 — 01.11.10 — 19:23

Результат = ТипЗнч(Метаданные.Справочники.ВидыОплатОрганизаций.Реквизиты.ДоговорКонтрагента)
Результат = «Объект метаданных»

Как определить какой тип у объекта «Метаданные.Справочники.ВидыОплатОрганизаций.Реквизиты.ДоговорКонтрагента»?

   Defender aka LINN

10 — 01.11.10 — 19:32

(9) В (0) есть.

   Evlanov

11 — 01.11.10 — 19:35

(10) В (0) есть вопрос.

   Живой Ископаемый

12 — 01.11.10 — 22:07

главное не пробовать ничего из предложенного… тогда со временем само должно получится… ну… наверное… да?

   Defender aka LINN

14 — 01.11.10 — 22:16

(11) Метаданные.Справочники.ВидыОплатОрганизаций.Реквизиты.ДоговорКонтрагента.Тип <— это и есть тип реквизита.

   Evlanov

15 — 02.11.10 — 09:30

(14) Правильно. Тип = «Договоры контрагентов».
А что такое «Договоры контрагентов» — справочник, документ, план счетов или еще что-нибудь?

   Ненавижу 1С

16 — 02.11.10 — 09:33

(15) Документы.ТипВсеСсылки().СожержитТип(Метаданные.Справочники.ВидыОплатОрганизаций.Реквизиты.ДоговорКонтрагента.Тип.Типы[0])

   Defender aka LINN

17 — 02.11.10 — 09:33

(15) Если Тип = «Договоры контрагентов», то Тип — строка.

   Живой Ископаемый

18 — 02.11.10 — 10:31

рассматривай это как часть заговора 1С против тебя лично… Опять твари изобретают неудобный тебе велосипед.

  

Evlanov

19 — 02.11.10 — 15:23

Вот на форуме http://devtrainingforum.v8.1c.ru/ посоветовали. Работает.
НеПонятноЧтоЭто = Метаданные.Справочники.ВидыОплатОрганизаций.Реквизиты.ДоговорКонтрагента.Тип;
НеПонятноЧтоСУточнеммымТипом = НеПонятноЧтоЭто.Типы()[0]; // тип может быть составным,
                                                         // если он не составной то там будет один элемент возмем его;
ВсеПонятно = Метаданные.НайтиПоТипу(НеПонятноЧтоСУточнеммымТипом).ПолноеИмя(); // полное имя обекта как оно задано в конфигураторе;
ВсеПонятноНачалоИмени = Лев(ВсеПонятно,Найти(ВсеПонятно,».»)-1); // тут получим что это «справочник», «документ» ….
                                                                // в виде текстовотой строки

Или такой:

ТипПолный = Метаданные.НайтиПоТипу(Метаданные.Справочники.ВидыОплатОрганизаций.Реквизиты.ДоговорКонтрагента.Тип.Типы()[0]).ПолноеИмя();
Тип1 = Лев(ТипПолный,Найти(ТипПолный,».»)-1);

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

Сегодня мы поговорим подробнее про типы объектов конфигурации 1С (тип документа 1С, тип справочника 1С и др.)

Так как в программном коде мы работаем со значениями, то периодически требуется знать их тип. Тип 1С всегда указывается в метаданных у реквизитов — в справочниках, документах.

Работа с типами 1С часто используется:

  • Условия в программе
    Разные действия в зависимости от типа значения 1С в конструкции «Если … Тогда …»
  • Ограничения при работе в интерфейсе
    Запрет или разрешение пользователю вводить в поле на форме значения определенных типов 1С.
  • Определение фактического параметра функции/процедуры
    Если параметр функции/процедуры может быть любого типа 1С, то нужно его определить, чтобы правильно получить значение.

Тип 1С можно получить:

  • Определить тип фактического значения 1С
  • Значения-объекты имеют свойства, в которых указан разрешенный тип 1С (например типы 1С разрешенные в колонке таблицы, в поле на форме, в метаданных) или методы, которые возвращают эти типы 1С
  • Из метаданных – можно получить тип 1С так, как он указан в метаданных в конфигураторе.

Типы 1С можно разделить на три вида:

  • Базовые типы 1С
  • Типы 1С базы данных (ссылочные, объекты)
  • Типы 1С.

Определение типа 1С и сравнение типов 1С

Узнать тип значения 1С можно с помощью функции ТипЗнч(Переменная)

Чтобы понять какой тип 1С эта функция вернула – нужно указать нужный нам Тип(«ИмяТипа»)

Например, определение (сравнение) типа 1С переменной:
Если ТипЗнч(Переменная) = Тип("ИмяТипа") Тогда

Какие типы писать в качестве ИмяТипа?

Базовые типы

Базовые типы 1С — число, строка, дата, булево.

Например:
Знч = 12;
Если ТипЗнч(Знч) = Тип("Число") Тогда
ИначеЕсли Знч = Тип("Строка") Тогда
ИначеЕсли Знч = Тип("Дата") Тогда
ИначеЕсли Знч = Тип("Булево") Тогда
КонецЕсли;

Типы базы данных

1С хранит данные в базе данных, но не в виде отдельных записей, а в виде объектов.

Большинство сохраняемых объектов (в том числе: справочники, документы, перечисления, бизнес-процессы, задачи) доступны в виде Объекта (для изменения и записи) и в виде Ссылки (для чтения). Подробнее см. «Ссылки и объекты».

Например:
Знч = Справочники.Организации.ПустаяСсылка();
Если ТипЗнч(Знч) = Тип("СправочникСсылка.Организации") Тогда
ИначеЕсли Знч = Тип("СправочникОбъект.Организации") Тогда
ИначеЕсли ТипЗнч(Знч) = Тип("ДокументСсылка.ПоступлениеТоваров") Тогда
ИначеЕсли Знч = Тип("ДокументОбъект.ПоступлениеТоваров") Тогда
КонецЕсли;

Регистры могут быть представлены различными типами. Имя типа регистра составное:
РегистрТипрегистраТипдоступа.ИмяРегистра

Типы 1С регистров:

  • Сведений
  • Накопления
  • Бухгалтерии
  • Расчета.

Типов доступов к регистру несколько. Чаще всего используются:

  • НаборЗаписей
  • Список
  • Выборка
  • Запись
  • КлючЗаписи.

Итого, пример:
Если ТипЗнч(Знч) = Тип("РегистрСведенийСписок.ИмяРегистра") Тогда
ИначеЕсли Знч = Тип("РегистрНакопленияНаборЗаписей.ИмяРегистра") Тогда
КонецЕсли;

Типы 1С

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

Такие типы 1С указываются по их названию (одним словом, без пробелов). Например:
Если ТипЗнч(Знч) = Тип("Массив") Тогда
ИначеЕсли Знч = Тип("СписокЗначений") Тогда
КонецЕсли;

Определение значения ссылочного типа 1С

Работа со всеми объектами базы данных (справочники, документы…) ведется через ссылки. Например, если мы хотим в документе сделать реквизит – справочник, то его тип 1С будет «СправочникСсылка.ИмяСправочника».

Мы можем определить является ли ссылка справочником или документом с помощью метода ТипВсеСсылки()

Например:
Значение = Справочники.Организации.ПустаяСсылка();
Если Справочники.ТипВсеСсылки().Содержит( ТипЗнч(Значение) ) Тогда
     //это справочник
ИначеЕсли Документы.ТипВсеСсылки().Содержит( ТипЗнч(Значение)) Тогда
     //это документ
КонецЕсли;

Работа с типами 1С в запросе

В запросе тип 1С можно проверить двумя способами.

Первый – аналогично описанному, но в имени типа 1С не указывается «Ссылка» или «Объект», то есть вместо «СправочникСсылка.Организации» пишем «Справочник.Организации»

Получение доступных типов 1С

У множества объектов есть свойство .ТипЗначения, которое содержит список типов 1С:

  • Поле на форме толстого клиента
    ЭлементыФормы.ИмяПоля.ТипЗначения
  • Поле на форме тонкого клиента (исключение: называется ДоступныеТипы)
    Элементы.ИмяПоля.ДоступныеТипы
  • Колонка таблицы значений, дерева значений
  • Реквизит формы
  • Элемент отбора

Как работать с этим списком типов 1С в поле .ТипЗначения – см. «ОписаниеТипов» в разделе «Язык 1С».

Работа с типами 1С реквизитов в метаданных конфигурации

При добавлении и редактировании реквизитов в конфигураторе программист указывает тип(ы) 1С реквизита. В программном коде на языке 1С можно получить (узнать) тип(ы) 1С реквизита.

Подробнее про работу с метаданными см. далее «Работа с метаданными».

Основные методы:

  • У объекта 1С вызвать метод Метаданные(), который возвращает метаданные конкретного объекта и далее работать со списком реквизитов (и реквизитов табличной части)
    Документы.ПоступлениеТоваров.ПустаяСсылка().Метаданные().Реквизиты
  • Использовать глобальную переменную «Метаданные», которая возвращает все метаданные конфигурации, и далее выйти на реквизиты конкретного объекта
    Метаданные.Документы.ПоступлениеТоваров.Реквизиты

У реквизита есть свойство .Тип, которое содержит список типов 1С, установленный в конфигураторе у этого реквизита.

Как работать с этим списком типов 1С – см. «ОписаниеТипов» в разделе «Язык 1С».

Указать фильтр типов 1С

У многих объектов возможно указать фильтр типов значений 1С, возможных к использованию, например:

  • Список значений (.ДоступныеЗначения)
  • Поле формы управляемого клиента (.ДоступныеТипы)

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

Чтобы указать список типов 1С для фильтра – используется список типов 1С, как с ним работать – см. «Описание типов» в разделе «Язык 1С».

Загрузка…

Подскажите, как получить тип реквизита справочника в форме строки?

1C
1
2
3
    Для каждого реквизит Из Метаданные.Справочники.Номенклатура.Реквизиты Цикл
        Сообщить(реквизит.тип);
    КонецЦикла;

Например, если реквизит с именем «БазоваяЕдиницаИзмерения» имеет тип «СправочникСсылка.КлассификаторЕдиницИзмерения «, то у меня в сообщении он выдает просто синоним справочника, на который ссылается реквизит: «Классификатор единиц измерения».
А нужно получить строку со значением «СправочникСсылка.КлассификаторЕдиницИзмерения «.

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

Например, задачи, которые в 1С:Предприятии 7.7 решал тип Документ решаются теперь несколькими типами. Они разделены по своему назначению.

Тип ДокументСсылка используется для хранения ссылок на объект базы данных в реквизитах других объектов.

Тип ДокументОбъект используется для записи и удаления отдельных документов.

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

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

Во-вторых, 
во встроенном языке нет двух понятий — Тип и Вид. Для каждого объекта конфигурации имеется свой набор типов используемых во встроенном языке для работы с описываемым им прикладным объектом. То есть при использовании конфигурации не будет существовать такого типа как ДокуменСсылка, а будут существовать конкретные типы, например, ДокументСсылка.Счет, ДокументОбъект.Счет, ДокументСсылка.Накладная, и т.д.

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

Чтобы проверить тип значения переменной нужно определить ее тип функцией ТипЗнч() и использовать функцию Тип() для получения типа по имени.

Например:

Если ТипЗнч(Основание) = Тип("ДокументСсылка.ПриходнаяНакладная") Тогда 
 ...
КонецЕсли; 

Разберем методы, при помощи которых, в 1С 8.3 можно определить тип значения переменной (или реквизита какого-нибудь объекта). Причем, эти методы могут работать со всеми типами: примитивными, объектными и коллекциями значений.

Для работы с типами, в платформе 1С имеется специальный тип, который так и называется Тип. Этот тип необходим для идентификации типов значений различных данных. Значения типа Тип возвращают только две функции Тип и ТипЗнч.

Функция ТипЗнч в 1С

Разберем функцию ТипЗнч. Эта функция принимает в качестве параметра любое значение и возвращает тип этого значения.

Рассмотрим пример:  будем использовать в качестве параметра этой функции число, таблицу значений и объект какого-нибудь справочника.

п_Число           = 124.56;
п_ТаблицаЗначений = Новый ТаблицаЗначений;
п_Объект          = Справочники.Товары.СоздатьЭлемент();

тип_ч      = ТипЗнч(п_Число);
тип_ТЗ     = ТипЗнч(п_ТаблицаЗначений);
тип_Объект = ТипЗнч(п_Объект);

Посмотрим в отладке, что вернет этот метод.

Функция ТипЗнч в 1С

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

Функция Тип в 1С

Функция тип имеет один параметр имя получаемого типа в строковом представлении, возвращает тип Тип.

Переделаем предыдущий пример: будем получать типы значений, используя функцию Тип.

тип_ч      = Тип("Число");
тип_ТЗ     = Тип("ТаблицаЗначений");
тип_Объект = Тип("СправочникОбъект.Товары");

В переменных будут те же значения, что и в прошлый раз.

Функция Тип в 1С

Чтобы быстро получить название какого-то типа,  достаточно «задержаться» в написании после первой кавычки, или нажать комбинацию клавиш Ctrl+Пробел.

Функция Тип в 1С

Появится выпадающий список всех названий типов, где набирая первые символы названия можно быстро найти нужный тип.

Функция Тип в 1С

Обе функции Тип и ТипЗНЧ возвращают значения одного типа – Тип. Но, если в случае функции ТипЗнч мы не можем точно знать, что вернет эта функция (поскольку, иногда, возникают ситуации, когда точно не известно какого тип та или иная переменная), то при работе с функцией Тип, мы точно знаем, какое значение вернет эта функция, поскольку сами указали строковое представление  типа в параметре.  

Как проверить тип значения

Для того, чтобы проверить какой тип значения у той или иной переменой, достаточно использовать обе этих функции (Тип и ТипЗнч) вместе: сравнивая, что возвращает функция ТипЗнч, в параметре которой указано какое-либо значение, с функцией Тип, в параметре которой мы указали конкретный тип.

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

МассивТипов = Новый Массив;
МассивТипов.Добавить("Какая-то строка");
МассивТипов.Добавить(23445.11);
МассивТипов.Добавить(Дата(2012,01,02));
МассивТипов.Добавить(Новый СписокЗначений);

ГСЧ = Новый ГенераторСлучайныхЧисел;
СлучайныйИндекс = ГСЧ.СлучайноеЧисло(0,3);

ЭлементМассива = МассивТипов[СлучайныйИндекс];
Сообщить("Номер элемента массива: " + СлучайныйИндекс);

Если ТипЗнч(ЭлементМассива) = Тип("Строка") Тогда
    Сообщить("Это строка");
ИначеЕсли ТипЗнч(ЭлементМассива) = Тип("Число") Тогда
    Сообщить("Это число");
ИначеЕсли ТипЗнч(ЭлементМассива) = Тип("Дата") Тогда
    Сообщить("Это дата");
ИначеЕсли ТипЗнч(ЭлементМассива) = Тип("СписокЗначений") Тогда
    Сообщить("Это список значений");
КонецЕсли;

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

Проверить тип значения в 1С

Статьи о примитивных типах в 1С:

Примитивный тип Строка

Примитивный тип Булево

Примитивный тип Дата

Примитивный тип Число

Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»

Программировать в 1С за 11 шагов

Книга написана понятным и простым языком — для новичка.

  1. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  2. Научитесь понимать архитектуру 1С;
  3. Станете писать код на языке 1С;
  4. Освоите основные приемы программирования;
  5. Закрепите полученные знания при помощи задачника.

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

Основы разработки в 1С такси
  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog


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

можно оплатить вручную:

Яндекс.Деньги — 410012882996301
Web Money — R955262494655

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

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

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

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

01

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

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

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

ВЫБРАТЬ
    Наименование,
    Вкус,
    ТИПЗНАЧЕНИЯ(Вкус)
ИЗ
    Справочник.Еда

02

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

ВЫБРАТЬ
    Наименование,
    ТИПЗНАЧЕНИЯ(Наименование)
ИЗ
    Справочник.Еда

03

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

04

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

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

05

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

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

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

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

06

Здесь строкой:

07

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

09

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

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

ВЫБРАТЬ
    Наименование,
    ОтличительныйПризнак,
    ТИПЗНАЧЕНИЯ(ОтличительныйПризнак)
ИЗ
    Справочник.Города

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

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

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

Идём дальше.

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

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

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

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

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

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

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

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

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

Функция ТИП

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

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

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

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

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

ВЫБРАТЬ
    Наименование,
    ОтличительныйПризнак,
    ТИПЗНАЧЕНИЯ(ОтличительныйПризнак)
ИЗ
    Справочник.Города
ГДЕ
    ТИПЗНАЧЕНИЯ(ОтличительныйПризнак) = ТИП(СТРОКА)

01

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

ВЫБРАТЬ
    Наименование,
    ОтличительныйПризнак,
    ТИПЗНАЧЕНИЯ(ОтличительныйПризнак)
ИЗ
    Справочник.Города
ГДЕ
    ТИПЗНАЧЕНИЯ(ОтличительныйПризнак) = ТИП(Справочник.Цвета)

02

Отступление

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

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

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

ВЫБРАТЬ
    Наименование,
    ОтличительныйПризнак,
    ТИПЗНАЧЕНИЯ(ОтличительныйПризнак)
ИЗ
    Справочник.Города
ГДЕ
    ОтличительныйПризнак ЕСТЬ NULL

03

Отлично.

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

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

ВЫБРАТЬ
    Наименование,
    ОтличительныйПризнак,
    ТИПЗНАЧЕНИЯ(ОтличительныйПризнак)
ИЗ
    Справочник.Города
ГДЕ
    ОтличительныйПризнак = НЕОПРЕДЕЛЕНО

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

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

ВЫБРАТЬ
    Наименование,
    ОтличительныйПризнак
ИЗ
    Справочник.Города
ГДЕ
    ОтличительныйПризнак ЕСТЬ НЕ NULL

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

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

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

ВЫБРАТЬ
    Наименование,
    ОтличительныйПризнак,
    ТИПЗНАЧЕНИЯ(ОтличительныйПризнак)
ИЗ
    Справочник.Города
ГДЕ
    ОтличительныйПризнак ССЫЛКА Справочник.Вкусы

05

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

ВЫБРАТЬ
    Наименование,
    ОтличительныйПризнак,
    ТИПЗНАЧЕНИЯ(ОтличительныйПризнак)
ИЗ
    Справочник.Города
ГДЕ
    ТИПЗНАЧЕНИЯ(ОтличительныйПризнак) = ТИП(Справочник.Вкусы)

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

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

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

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

ВЫБРАТЬ
    Наименование,
    ОтличительныйПризнак
ИЗ
    Справочник.Города

06

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

ВЫБРАТЬ
    Наименование,
    ЕСТЬNULL(ОтличительныйПризнак, "Такого реквизита нет!")
ИЗ
    Справочник.Города

08

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

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

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

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

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

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

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

ВЫБРАТЬ
    Наименование,
    ВЫРАЗИТЬ(ОтличительныйПризнак КАК Справочник.Цвета)
ИЗ
    Справочник.Города

09

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

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

Пройдите тест

а) Напишите запрос, который запрашивает из справочника Города реквизиты Наименование и Мэр, а также тип значения, которое находится в составном поле Мэр:

Для определения типа значения в 1С существуют специальные методы и конструкции встроенного языка программирования и языка запросов.

На встроенном языке

Функция ТипЗнч(<Значение>) по значению возвращает тип.
Функция Тип(<Строка>) по описанию возвращает тип.

Если ТипЗнч(Значение) = Тип("Число") Тогда
Сообщить("Тип значения - Число");ИначеЕсли ТипЗнч(Значение) = Тип("Строка") Тогда
Сообщить("Тип значения - Строка");ИначеЕсли ТипЗнч(Значение) = Тип("Дата") Тогда
Сообщить("Тип значения - Дата");ИначеЕсли ТипЗнч(Значение) = Тип("Булево") Тогда
Сообщить("Тип значения - Булево");ИначеЕсли ТипЗнч(Значение) = Тип("СправочникСсылка.Справочник1") Тогда
Сообщить("Тип значения - Справочник1");ИначеЕсли ТипЗнч(Значение) = Тип("ДокументСсылка.Документ1") Тогда
Сообщить("Тип значения - Документ1");//...
//...
//...

КонецЕсли;

В запросах

Для определения типа значения можно применить оператор ССЫЛКА или воспользоваться функциями языка заросов ТИПЗНАЧЕНИЯ() и ТИП().

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗарплатаКВыплате.Сотрудник,
| ЗарплатаКВыплате.СуммаКВыплате
|ИЗ
| РегистрНакопления.ЗарплатаКВыплате КАК ЗарплатаКВыплате
|ГДЕ
| ЗарплатаКВыплате.Регистратор ССЫЛКА Документ.ВозвратНДФЛ"
;

Запрос

= Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗарплатаКВыплате.Сотрудник,
| ЗарплатаКВыплате.СуммаКВыплате
|ИЗ
| РегистрНакопления.ЗарплатаКВыплате КАК ЗарплатаКВыплате
|ГДЕ
| ТИПЗНАЧЕНИЯ(ЗарплатаКВыплате.Регистратор) = ТИП(Документ.ВозвратНДФЛ)"
;

В 1С:Предприятии все значения имеют определенный тип. Во встроенном языке есть специальные методы для приведения типа значения.

Понравилась статья? Поделить с друзьями:
  • 1с как получить реквизиты всего справочника
  • 1с как получить реквизиты формы справочника
  • 1с как проверить заполнение реквизита формы
  • 1с как проверить реквизит в всех документах
  • 1с как узнать есть ли реквизит у документов