1с получить пустую ссылку по типу
Код 1C v 8.2 УП
Параметры:
(обязательный)
Тип: Строка.
Содержит полный путь до предопределенного значения, включая имя самого значения. Например, "ПланСчетов.Основной.Счет41".
Синтаксис описания предопределенного значения совпадает с синтаксисом оператора ЗНАЧЕНИЕ языка запросов:
..
Тип предопределенного значения> может быть:
Справочник (Catalog);
ПланВидовХарактеристик (ChartOfCharacteristicTypes);
ПланСчетов (ChartOfAccounts);
ПланВидовРасчета (ChartOfCalculationTypes);
Документ (Document) - только пустая ссылка;
Перечисление (Enum);
БизнесПроцесс (BusinessProcess) - только пустая ссылка и получение точек бизнес процесса;
Задача (Task) - только пустая ссылка.
В качестве указывается имя объекта метаданных, как оно задано в конфигураторе.
Для перечислений, определенных в конфигурации, указывается как имя соответствующего объекта метаданных типа ЗначениеПеречисления. Для всех остальных типов предопределенных значений указывается как имя предопределенного элемента данных, как оно указано в конфигураторе, или ПустаяСсылка для указания пустой ссылки.
Для точек маршрутов бизнес-процессов имя предопределенного значения имеет вид:
БизнесПроцесс..ТочкаМаршрута.
Также метод может быть использован для получения значения системного перечисления. В этом случае параметр формируется как:
.
Возвращаемое значение:
Тип: Ссылка на объект информационной базы.
Похожие FAQ
Еще в этой же категории
Как проверить ЭтоНовый() в управляемой форме? 11
Понятие ЭтоНовый() отсутствует в 8.2. Поэтому при необходимости определить, что создается новый элемент можно использовать следующую особенность управляемой формы. Как правило, любая управляемая форма содержит в себе реквизит " Объект" , поэтому Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П Заполнение реквизитов формы и объекта 6
Для реквизитов в документе обработке отчете: Объект.Реквизит = " значение" ; Для реквизитов на форме: ЭтаФорма.Реквизит = " значение" ; Как получить Макет? 6
НаСервере Функция ПолучитьМакетНаСервере(ИмяМакета) ЭтотОбъект=РеквизитФормыВЗначение(" Объект" ); Макет = ЭтотОбъект.ПолучитьМакет(ИмяМакета); Возврат Макет; КонецФункции НаСервере Процедура ВывестиМакет(ТД) Макет = Обработки.ОбработкаВ Как открыть внешнюю обработку или отчет программно 1С УП? 6
В версии 8.2 и старше: приложение не работает непосредственно с локальными файлами, расположенными на компьютере. Файлы должны находиться на сервере. Поэтому для открытия внешней обработки нужно выполнить следующую последовательность действий: Посмотреть все в категории Управляемое приложение, Тонкий клиент
Добрый день!
Пытаюсь сделать справочник "Объекты". В качестве значения реквизита "Тип расшифровки" нужна пустая ссылка на какой-либо объект конфигурации, которую можно было бы выбрать при создании элемента справочника "Объекты". Однако платформа просит выбрать конкретный элемент справочника.
Где что нужно сделать, чтобы в качестве значения реквизита можно было бы просто выбрать объект конфигурации (любые справочник, перечисление, документ)?
(4) да, но после выбора типа объекта платформа требует выбрать элемент. Аналогично, если просто галочку поставить на пункте "справочники"
(5) Отключите проверку заполнения этого реквизита. При создании нового элемента справочника заполняйте этот реквизит программно значением Справочники.Объекты.ПустаяСсылка().
Ожидаемо не работает (метод объекта не обнаружен).
И почему только справочники, если реквизит может быть любого типа?
(8) Ошибка скорее всего из-за того что слово "реквизит" у вас написано с двумя буквами вэ. Только справочники потому что в задаче вы указали, что по умолчанию нужна пустая ссылка, а если этого не сделать то значение будет Неопределено. Сам тип поставьте ЛюбаяСсылка, как советовали выше.
(10) Значит ваш справочник называется не Объекты, или вы прописали этот код не в процедуре ПриСозданииНаСервере.
(11) справочник называется не "Объекты", верно. Поставил название своего справочника. И опять появляется форма выбора объекта, и опять за ней следом - элемента этого объекта.
(12) А что должно появляться? Вам нужно хранить ссылку, или тип? После выбора типа открывается выбор объекта. Если его не осуществить, будет стоять пустая ссылка этого типа.
(13) мне нужно хранить выбранный тип, т.е. не ссылку на элемент какого-то объекта, а ссылку на сам объект. Т.е. при выборе справочника "Номенклатура" должно вставать значение "справочники.номенклатура.пустаяссылка()", при выборе справочника "Контрагенты" - "справочники.контрагенты.пустаяссылка()", при выборе перечисления "месяцы" - "перечисления.месяцы.пустаяссылка()"
(16) Я надеюсь, речь действительно идёт о реквизите справочника, а не каком-нибудь редакторе объектов. Ко второму вы не готовы.
Для платформ 1С-7.7 и 1С-8.x описаны простые способы выяснения того, является ли ссылочное значение ссылкой на несуществующий объект. Для обеих платформ выложены примеры реализации функции IsEmpty(), возвращающей признак пустого значения и флаг «битой ссылки».
Есть еще и такой способ:
begemot; Bunny; escape; Nicholas; SoulPower; Drivingblind; Babylka; yuraos; user631966_482672; EMelihoff; + 10 – Ответить
Всем доброе время суток!
Небольшое замечание по функции IsEmpty(), что в файлах поставки.
Функция имеет следующий синтаксис:
// Старая добрая функция ПустоеЗначение() из 1С77:
// проверка значения на "пустое" ++ дополнительные возможности
// СостояниеСсылки: -1 (нет объекта); 0 (пустая ссылка); +1 (есть объект); Null (значение - не ссылка)
Функция IsEmpty(Значение, ПоПустомуСодержанию = Истина, СостояниеСсылки = Null) Экспорт
Аргумент ПоПустомуЗначению определяет, считать ли пустым значение с "пустым содержанием":
- Для строк, если они состоят из не "значящих" символов;
- Для ссылок, если они "битая";
- Для таблиц и деревьев значений, если в нет строк, но есть колонки;
Через аргумент СостояниеСсылки возвращается признак,
определяющий является ли проверяемое значение ссылкой или нет.
Если да - то является она битой ссылкой или нет, согласно описанию в комментариях.
Как-то негуманно проверять битость ссылок через получение объекта да еще и в попытке.
Также можно просто проверить ссылку приведением к строке и поиском в ней (найти(Ссылка, "0), но это кривота, т.к. если запуститься на другом языке, то, наверняка представление будет другим.
Мне нравится проверять запросом:
Если результат запроса будет пустым - то ссылка - битая.
(2) Serj1C,
а лучше не наименование, а пометку удаления проверять. тогда будет универсальный запросик для справочников и документов, только имя таблицы подставить.
(2) Serj1C,
Как говорит мой ОДМИН - ЗАЧОТ .
ты открыл новый способ создания битых ссылок в базе.
ввел номенклатуру с наименованием """"
и вот тебе она - проклятая.
:)
Функция, позволяющая быстро определить битая ссылка или нет:
(3) yandextesting,
твой пример не совсем решает задачу поставленную в статье.
он не позволяет отличить пустую ссылку от битой .
для обеих ссылки не существуют объекты в базе.
но первая является специальным значением, означающим не выбранное значение ссылочного типа.
а вторая же является реальной ссылкой на объект, который был удален . ну или еще не создан.
:)
(8)
Тем не менее я решил взять твой вариант за основу.
и сравнить ее с моим вариантом в тестовой обработке (смотри вложение к посту).
для этого я его немного подправил, чтобы оба варианта возвращали одно и тоже.
---
---
результаты тестирования показали,
что покрайней мере по времени выполнения оба варианта примерно одинаковы.
обе функции выполняются где-то 15-16 msec (смотри скриншоты).
(9)
Сразу предвижу довод,
что с точки зрения использования ресурсов создание объекта более затратно.
возмозможно . хоть это и труднее проверить.
но для разовой проверки, думаю это не существенно.
--
ну а для проверки для списка в цикле, безусловно,
все нужные данные лутше расчитывать в запросе сразу для всего списка.
(9)
как видно мой вариант несколько компакней
.
а если результат одинаковый - зачем кодить больше.
:)
(11) мой вариант предпочтительнее использовать при проверке большого количества ссылок в цикле или идущих потоком, например, при загрузке данных, экономится значительный объем времени.
ну а для проверки для списка в цикле, безусловно,
все нужные данные лутше расчитывать в запросе сразу для всего списка.
вызов функции в цикле обработки
ни мой ни в твоем варианте не являются "оптимальными"
с точки общих рекомедаций разработки.
:)
(13) тем не менее, мне на практике приходилось сталкиваться с необходимостью выполнения таких проверок именно в таком виде, когда заведомо невозможно получить перечень всех ссылок, чтобы загнать их в один запрос или пакет запросов для выполнения сразу массовой проверки. Так что не всегда и везде возможно выполнять рекоммендации, да и разработчики 1С сами иногда непрочь "погрешить" в своем коде:-)
(14) ну чтож, yandextesting,
истины ради провел еще одно тестирование для имитации обработки в цикле списка ссылок.
результаты довольно любопытны
(смотри скриншоты, модифицированная тестовая обработка - во вложении).
---
мой вариант в случае "нормальной" ссылки раза в 4 лутше, а в случае "битой" - раза в 2.5 хуже.
PS
и если "битые" ссылки встречаются не так часто.
:)
(15) хм. интересно :) я в свое время эту тему на Мисте поднимал ( http://www.forum.mista.ru/topic.php?id=423487 ) под ником maxp77. Так вот, если память мне не изменяет, то на простых объектах (типа справочника, имеющего только код и наименование без кучи табличных частей и реквизитов) определение битой ссылки методом "
" будет отрабатывать по времени сопоставимом с определением ее "битости", указанным мною методом, а вот на бОльших объектах, имеющих несколько табличных частей с десятком реквизитов в каждой (а бывает и под сотню встречаются народные поделки), моя метода в цикле будет отрабатывать значительно быстрее.
(15)
Некорректная проверка. Нужно проверять для разных ссылок, а не одну и ту же 10000 раз, т.к. ПолучитьОбъект() кэширует результат в оперативную память на некоторое время (а также считывает из базы все реквизиты и табличные части, что абсолютно лишне).
в 8.2 у пустой ссылки Строка(Ссылка.УникальныйИдентификатор())="00000000-0000-0000-0000-000000000000"
у битой ссылки будут какие-то цифры-буквы
в 8.2 у пустой ссылки Строка(Ссылка.УникальныйИдентификатор())="00000000-0000-0000-0000-000000000000"
у битой ссылки будут какие-то цифры-буквы
в том то и проблемма, что у битой ссылки и у не битой не пустой ссылки
в ГУИД-е "будут какие-то цифры-буквы".
А вот какая из них "битая" - .
---
ЗЫ:
а пустую ссылку проще проверить по условию
Ссылка.Пустая() = Истина
без заморочек с ГУИД-ом.
:)
хорошая идея, сразу понравилась обработка, даже если и есть какие недочеты пока при использовании, не заметили))))
Есть еще и такой способ:
begemot; Bunny; escape; Nicholas; SoulPower; Drivingblind; Babylka; yuraos; user631966_482672; EMelihoff; + 10 – Ответить
Понятие "пустых" значений
В 1С:Предприятии 8 отсутствует такое понятие как "пустое" значение.
Существует значение Неопределено (типа Неопределено ). Оно применяется в основном как значение по умолчанию реквизитов (а также колонок таблиц значений и т.д.), имеющих составной тип. То есть, если в некотором реквизите могут содержаться значения более чем одного типа, то по умолчанию этот реквизит будет иметь значение Неопределено . Соответственно можно присвоить такому реквизиту значение Неопределено , как значение, обозначающее, отсутствие значения какого-либо другого из доступных типов. Такое значение будет иметь и объявленная переменная модуля пока ей не присвоили какое-либо значение. Заметим, что в объекте ОписаниеТипов фактически присутствует тип Неопределено , если в нем содержится более одного типа, так как если могут храниться значения двух типов, то всегда может быть и значение Неопределено . Таким образом, значение Неопределено обозначает отсутствие значения какого-либо определенного типа.
Существует значение Null (типа Null ). Оно обозначает отсутствие значения в выборке полученной из базы данных. Например, при выполнении левого и правого соединения поля невыбранных записей будут иметь значения Null . Кроме того, значение типа Null будут иметь реквизиты иерархического справочника для элементов-групп, если в метаданных указано, что этот реквизит используется только для элементов не являющихся группами. Аналогично и для элементов, значения Null будут иметь реквизиты доступные только для групп.
Заметим, что и значение Неопределено и значение Null имеют соответствующие типы и используются в специальных (описанных выше) случаях, а не в качестве "пустых" значений каких-либо типов.
Для большинства типов существуют значения по умолчанию, то есть значения, устанавливаемые системой в реквизите (колонке таблицы значений и т.д.) если для него задан соответствующий тип. Например, для числа – пустым значением является 0, для строки – строка, не содержащая ни одного символа, для даты – дата начала отсчета ('00010101').
Для типов ссылок на объекты базы данных существуют значения пустых ссылок. Их можно получить у соответствующих менеджеров вызовом метода ПустаяСсылка() . Именно это значение является значением по умолчанию для соответствующих типов. Заметим, что если реквизит имеет составной тип, включающий тип ссылки на объект базы данных, то данному реквизиту можно присвоить как значение Неопределено , так и значение соответствующей пустой ссылки. Соответственно в этих двух случаях будут храниться два разных значения. Решения, какое значение присваивать зависит от прикладного смысла. Например, если реквизит может иметь значения двух ссылочных типов и, исходя из значений других реквизитов, очевидно, что в нем должно быть значение определенного (одного из этих двух) ссылочного типа, но конкретная ссылка еще не выбрана пользователем, то можно присвоить значение пустой ссылки соответствующего типа. Например, это необходимо для того, чтобы поле ввода позволило бы пользователю ввести значение необходимого типа. А если, исходя из значений других реквизитов, этот реквизит вообще не должен быть заполнен, то тогда ему нужно присвоить значение Неопределено .
В 1С:Предприятии 8 используется понятие "незаполненного значения". Оно применяется для различных сервисных возможностей. Например, у измерений регистров можно установить свойство Запрет незаполненных значений . Тогда система при записи будет автоматически проверять заполнено соответствующее измерение или нет. Так же существуют свойства АвтоОтметкаНезаполненного и свойство АвтоВыборНезаполненного . Они управляют соответственно автоматическим подчеркиванием незаполненного значения и автоматическим началом выбора незаполненного значения.
Во всех случаях для проверки того заполнено значение или нет, используется единый принцип. Значение считается незаполненным, если оно равно значению по умолчанию для своего типа. Соответственно незаполненными значениями будет число 0, строка, не содержащая символов, пустая ссылка на элемент справочника и т.д.
Для строкового типа существует встроенная функция ПустаяСтрока() , однако, не следует считать, что он проверяет, является ли строковое значение значением по умолчанию. Данный метод проверяет, что строка не содержит ни одного значащего символа. При этом строка может содержать незначащие символы, такие как "пробел", "неразрывный пробел" и т.д.
Код 1C v 8.2 УП
Параметры:
(обязательный)
Тип: Строка.
Содержит полный путь до предопределенного значения, включая имя самого значения. Например, "ПланСчетов.Основной.Счет41".
Синтаксис описания предопределенного значения совпадает с синтаксисом оператора ЗНАЧЕНИЕ языка запросов:
..
Тип предопределенного значения> может быть:
Справочник (Catalog);
ПланВидовХарактеристик (ChartOfCharacteristicTypes);
ПланСчетов (ChartOfAccounts);
ПланВидовРасчета (ChartOfCalculationTypes);
Документ (Document) - только пустая ссылка;
Перечисление (Enum);
БизнесПроцесс (BusinessProcess) - только пустая ссылка и получение точек бизнес процесса;
Задача (Task) - только пустая ссылка.
В качестве указывается имя объекта метаданных, как оно задано в конфигураторе.
Для перечислений, определенных в конфигурации, указывается как имя соответствующего объекта метаданных типа ЗначениеПеречисления. Для всех остальных типов предопределенных значений указывается как имя предопределенного элемента данных, как оно указано в конфигураторе, или ПустаяСсылка для указания пустой ссылки.
Для точек маршрутов бизнес-процессов имя предопределенного значения имеет вид:
БизнесПроцесс..ТочкаМаршрута.
Также метод может быть использован для получения значения системного перечисления. В этом случае параметр формируется как:
.
Возвращаемое значение:
Тип: Ссылка на объект информационной базы.
Похожие FAQ
Еще в этой же категории
Как проверить ЭтоНовый() в управляемой форме? 11
Понятие ЭтоНовый() отсутствует в 8.2. Поэтому при необходимости определить, что создается новый элемент можно использовать следующую особенность управляемой формы. Как правило, любая управляемая форма содержит в себе реквизит " Объект" , поэтому Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П Заполнение реквизитов формы и объекта 6
Для реквизитов в документе обработке отчете: Объект.Реквизит = " значение" ; Для реквизитов на форме: ЭтаФорма.Реквизит = " значение" ; Как получить Макет? 6
НаСервере Функция ПолучитьМакетНаСервере(ИмяМакета) ЭтотОбъект=РеквизитФормыВЗначение(" Объект" ); Макет = ЭтотОбъект.ПолучитьМакет(ИмяМакета); Возврат Макет; КонецФункции НаСервере Процедура ВывестиМакет(ТД) Макет = Обработки.ОбработкаВ Как открыть внешнюю обработку или отчет программно 1С УП? 6
В версии 8.2 и старше: приложение не работает непосредственно с локальными файлами, расположенными на компьютере. Файлы должны находиться на сервере. Поэтому для открытия внешней обработки нужно выполнить следующую последовательность действий: Посмотреть все в категории Управляемое приложение, Тонкий клиент
Читайте также: