1с проверить существование ссылки
Суть во внешней БД (Приемник) создается элемент(или документ) по ГУИД базы Источника. И соответственно нужно проверить это новая ссылка или уже есть такой объект. Проверяю так:
СсылкаПриемник = ПолучитьВнешниюСсылкуПоГУИД(пВидВПриемнике,пГУИД_Источника);
Если СсылкаПриемник.ПолучитьОбъект() = Неопределено Тогда
.
Может есть какой другой способ проверить, не нравится использования тяжелого метода ПолучитьОбъект(), тем более объект и не нужен, нужна проверка.
(2) если объект не новый, то гарантированно быстрее. ПолучитьОбъект() тянет на клиента все реквизиты и табличные части объекта.
Но вообще, такие вещи в цикле делать не надо.
(5) На какого клиента тянет? вся обработка выполняется в модуле объекта на сервере. И как без цикла ? Запросом выбираются нужные данные, и в цикле обходит выборку проверят создан объект в Приемнике или нет. Не создан, создает, все ссылочные реквизиты создаются рекурсивно, поэтому выбрать сразу ссылки для проверки нет возможности
(0) Пройдись первый раз без записи, просто накопи ГУИДы в разрезе видов объектов, запроси их в базе, результат сохрани в Соответствии, но даже я бы забил и остановился на (1)
90% времени у тебя будет тратится на повторную обработку уже обработанного, если нет кэша (12)
Проверяй по номеру документа. Если такого документа нет, то и реквизиты полученной ссылки будут не заполнены:
Если НЕ ЗначениеЗаполнено(СсылкаПриемник.Номер) Тогда
.
(22) Я уже удивлен, что ещё никто не предложил проверенный временем способ:
(24) Ну хорошо, убедил:
Если Найти(Ссылка, "Объект не найден") > 0 Или Найти(Ссылка, "Object not found") > 0 Тогда
Пойдет? Я теперь всегда так писать буду!
Рефакторинг - процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и имеющий целью облегчить понимание её работы
(32) Извиняюсь сразу не весь код развернул, поэтому в (20) комментировал "Ссылка.Метаданные().ПолноеИмя()". Но а так тоже самое что и в (1), но все равно спасибо.
(25) Кстати, вы в курсе, что неявное приведение к булево быстрее сравнения на количество в среднем на 5-7%:
(7) ну, значит, - на сервер приложений, а не на клиента.
Без цикла - собрать все ссылки в таблицу значений, эту таблицу значение один раз в запросе соединить левым соединением с основной таблицей документа и получить за один запрос по всем статус новый/старый.
Если перечень ссылок для проверки известен до цикла, то проверять их запросов в цикле - грубейшая ошибка
(36) Нет слов. Воспользуюсь словами другого человека:
Боль в меня вгрызалась змеей голодной,
И хочу, чтоб ангел с душой холодной
Отравился ядом моей любви.
(37) Идет цикл по созданию документов ПриходТМЦ, в нем заполняется в тч Номенклатура, ищет в кэше есть ли такая Номенкл. нету пытается получить по ГУИД источника, нету создает новую Номенклатуру, у которой может быть 100500 ссылочных реквизитов по такому же принципу рекурсивно находит или создает ссылки.
можно конечно этот цикл прогнать один раз для сбора ТЗ для проверки на сущ. объекты, а второй уже создавать объекты. Но не думаю, что это будет для производительности лучше. Через точку гонять два цикла в COM-базе, точно не лучше
(23) это тупо. номенклатура с наименованием, содержащим слова "объект не найден" нагибнёт всю механизьму. Опять же - это такой же ухлебансткий запрос в цикле.
(39) ну, ты перед этим циклом сделай запрос по номенклатуре, создай недостающие, а внутри цикла уже ни чего не проверяй и не создавай. Быстрее будет в 100500 и ни какие кэши в крен не сдались.
(41) В Номенклатуре есть много реквизитов ссылочного типа и на все делать запросы? и по каждому виду потом отдельный цикл, потомучто ГУИД запросом не получить (если специально не хранить отдельно).Тем более код по скорости полностью меня устраивает, интересно было узнать альтернативу ПолучитьОбъект. Пару тысяч документов со справочниками за 1 минуту в полне для фон. задания на один раз в день
просто нахрена было приходить сюда и спрашивать совета, чтобы потом всех убеждать, что ты в советах не нуждаешься и тебя и так всё устраивает?
(47) на вопрос (0) получил ответ, всем за это спасибо. Но потом ушло в другую степь и мне не понятно как без цикла можно обойтись в этой конкретной задачи. Сделал запрос в Источнике по Номенклатуре и теперь как связать с Приемником чтобы определить что есть, а чего нет в Приемнике? Только цикл с получением ГУИД источника и проверкой его в Приемнике через ПолучитьСсылку. Делать этот цикл только для создания ТЗ для проверки по всем ссылкам, загонять это ТЗ во временную таблицу. выгружать запрос опять в ТЗ для поиска во втором цикле. Мне просто не кажется что это рациональней, тем более запросов может быть много в зависимости от кол-ва видов справочников зависимых.
В данных печати не всегда есть "ДокументОснование.ЗаказКлиента", поэтому вылезает ошибка "Поле объекта не обнаружено (ДокументОснование)".
Нужна проверка "если этих полей не существует".. Помогите
PS: ЗначениеЗаполнено естественно не работает
Проверка на существование треугольника, вычисление площади и периметра
Необходимо написать программу, вообщем сгенерировать три случайных числа (стороны треугольника).
Проверка на существование Задачи
Подскажите пожалуйста, как можно проверить существует ли уже эта задача, перед записью новой
Существование обьекта и получение ссылки
Доброго времени суток. Есть приложение, в котором вызываются dll(№1). В приложении подключена.
Проверка на существование
есть таблица Client со столбцами (Name,LastName,MobilePhoneNumber,Email) и нужно проверить на.
Burkaton, вообще проверка на пустую ссылку в реквизите ссылочного типа, проверяется следующем образом.
Но у вас ДокументОснование составной тип (Скорее всего, проверьте конфигураторе). Вам необходимо с начало отобрать все документы которые имеют реквизит ЗаказКлиента. А потом уже обращаться к данному реквизиту.
Не получается. А нельзя что-то типа такого?:
ДанныеПечати.Ссылка.Найти("ДокументОснование.ЗаказКлиента")
или
ДанныеПечати.Ссылка.Свойство("ДокументОснование.ЗаказКлиента ")
вы вопрос до конца дочитали?
Проверка на заполненность значения подразумевает, что ссылка ТОЧНО есть. А вопрос был в том, как проверить есть-ли она или нет?
Откуда такой вывод? Volexovich, дал дельный совет, да и dggrom, дал правильное направление
Если ЗначениеЗаполнено(ДанныеПечати.Ссылка.ДокументОснование) И ТипЗнч(ДанныеПечати.Ссылка.ДокументОснование) = Тип("ДокуменТСсылка.ЗаказКлиента") Тогда
Если НЕ ДанныеПечати.Ссылка.ДокументОснование.ЗаказКлиента = Документы.ЗаказКлиента.ПустаяСсылка();
Тогда // ух тогда
КонецЕсли;
КонецЕсли;
Да нельзя обращаться к ДанныеПечати.Ссылка.ДокументОснование ! Потому, как если его фактически нет, то будет ошибка! Только если попытаться найти его.
Решение
Если ДанныеПечати.Ссылка.Метаданные().Реквизиты.Найти("ДокументОс нование")<>Неопределено // Есть ли реквизит ДокументОснование
Проверка на существование
Есть один txt-файл. В нем построчно написаны файлы и их вес в байтах. Пример: files.rar 12345678.
Проверка файла на существование
Добрый день! Подскажите пожалуйста как проверить файл на существование по пути, прописанному в.
Проверка на существование переменной
Всем доброго времени суток! Подскажи существует ли в JS аналог проверки на существование.
Проверка на существование треугольника
Не знаю, как сделать проверку, внутри кнопки try не работает,как можно сделать её? private void.
Проверка листа на существование
Ребята подскажите как узнать существует лист или нет. Делаю так: Sub Добавление_листа() .
Проверка на существование БД MySQL
Здравствуйте! Подскажите пожалуйста. Я создаю базу MySQL с помощью mysql_create_db. А как.
Для платформ 1С-7.7 и 1С-8.x описаны простые способы выяснения того, является ли ссылочное значение ссылкой на несуществующий объект. Для обеих платформ выложены примеры реализации функции IsEmpty(), возвращающей признак пустого значения и флаг «битой ссылки».
К сожалению, у обеих платформ нет встроенных средств, позволяющих непосредственно узнать, является ли ссылка «битой» или нет.
Сразу хочется заметить, что кроме «битых ссылок» в системе имеются специальные значения «пустых ссылок» и их следует отличать друг от друга.
Предлагаю простые решения этой задачи (без построения запросов к базе данных), полученные эмпирическим путём:
1) Для платформы 1С-7.7:
- Для «битой» ссылки метод Ссылка . Выбран () и функция ПустоеЗначение () возвращают ноль;
- Для «пустой» ссылки метод Ссылка . Выбран () возвращает ноль, а функция ПустоеЗначение () единицу;
- Для «нормальной» ссылки метод Ссылка . Выбран () возвращает единицу, а функция ПустоеЗначение () ноль;
Таким образом, с точки зрения 1С-7.7 «битая» ссылка – это не пустое значение, которое не является выбранным .
2) Для платформы 1С-8.x:
Все обстаит несколько сложней.
В обоих случаях (для «битых» и «нормальных» ссылок) метод Ссылка . Пустая () и функция ЗначениеЗаполнено () ведут себя одинаково:
первый возвращает Ложь , а второй Истина .
Простоте решение было найдено случайно, при отладке ошибок времени исполнения:
- Для «битой» ссылки метод Ссылка . ПолучитьОбъект () возвращает значение Неопределено;
- Для «пустой» ссылки» метод Ссылка . ПолучитьОбъект () выбрасывает исключение:
«Ошибка при вызове метода контекста (ПолучитьОбъект): Элемент не выбран!» ;
- Для «нормальной» ссылки метод Ссылка . ПолучитьОбъект () возвращает значение согласно документации;
Таким образом, с точки зрения 1С-8.х «битая» ссылка – это не пустое значение ссылочного типа,
для которого возвращается значение объекта равное Неопределено .
При этом особняком стоят ссылки на значения перечислений. У них нет метода Ссылка . ПолучитьОбъект () .
И трудно вообще представить себе ситуацию, когда ссылка на перечисление может оказаться «битой».
Например, если удалить значение в конфигураторе, то при восстановлении значения функцией ЗначениеИзФайла () возвращается пустая ссылка.
Поэтому будем считать любые ссылки на перечисления «небитыми».
В архиве файла поставки находятся текстовые файлы с примерами реализации функции IsEmpty () для платформ 1С-7.7 и 1С-8.x,
возвращающей признак пустого значения и флаг «битой ссылки» для произвольного значения.
2. Если Вы знаете что удалили, то можете сразу нажать кнопку Создать Объект Из GUID - Пункт 4.
3. Если Вы не знаете что удалили, тогда вам нужно поднять архивную копию базы, открыть там обработку и вставить полученный GUID в поле GUID.
далее нажать Ссылку -> и в правом поле отобразится необходимый Вам объект(в моем случае Попов Роман Владимирович).
Открыв его, узнаем что это справочник Сотрудники и всю содержащуюся в справочнике информацию. Возвращаемся в базу, где необходимо восстановить объект и жмем кнопку Создать Объект Из GUID
4. Из открывшегося списка выбираем Справочник Сотрудники, в открывшейся форме заполняем все поля данными из архивной базы и жмем OK. Все, данный объект восстановлен.
Для программиста:
Для получения уникального идентификатора объекта, используйте код вида:
Код 1C v 8.х
Для того чтобы преобразовать (84:bf5600145e3710ab11dda4c605dbe824) в УникальныйИдентификатор (GUID)
Код 1C v 8.х
Для получения ссылки по уникальному идентификатору, используйте код:
Код 1C v 8.х
Создать объект документ или справочник и установить ему свой Уникальный идентификатор
Код 1C v 8.х
еще можно получить ИдентификаторДокумента при OLE доступе:
Код 1C v 7.x
Еще посмотрите метод:
ЗначениеВСтрокуВнутр();
Синтаксис:
ЗначениеВСтрокуВнутр()
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
- значение объекта агрегатного типа данных которое нужно преобразовать.
Подробнее см. в документации, глава ''Системные процедуры и функции''
Похожие FAQ
Еще в этой же категории
Когда объект был удален непосредственно, то все ссылки на него в справочниках, в документах, в регистрах стали битыми и отображаются следующим образом: (16:bca8000c6efdd52111d8eaba7c9706eb)
Битая ссылка не является пустой. Т.е. метод Пустая() возвращает Ложь. Определить, что ссылка битая можно так:
Код 1C v 8.х
Код 1C v 8.х
И последний вариант для проверки в запросах:
ГДЕ Объект.РеквизитОбъекта ЕСТЬ NULL И Не Объект=&ПустаяСсылкаОбъекта
Ниже дана программа для удаления записей регистров, у которых регистратор - битая ссылка, т.е. не существует в базе.
Похожие FAQ
Еще в этой же категории
Значения NULL ( ЕСТЬ NULL и ЕСТЬNULL()) 48
NULL – отсутствующие значения. Не путать с нулевым значением! NULL – это не число, не равно пробелу, пустой ссылке, Неопределено. NULL – типообразующее значение, т.е. есть тип NULL и единственное значение этого типа. NULL значения появляются в 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ Нарастающий итог в запросе 23
Необходимо использовать левое соединение таблицы с самой собой. ВЫБРАТЬ Обороты.Период, Обороты.Номенклатура, Обороты.Количество ПОМЕСТИТЬ ВТдвижения ИЗ РегистрНакопления.Обороты КАК Обороты ; //////////////////////////////////////////////// Полезные сведения о языке запросов 1С 8.х 22
В статье приведены полезные приемы при работе с запросами 1С v.8.2, а также сведения, которые не так хорошо известны о языке запросов. Я не стремлюсь дать полное описание языка запросов, а хочу остановиться лишь на некоторых моментах, которые для ко Оператор ПОДОБНО 19
ПОДОБНО - Оператор проверки строки на подобие шаблону. Аналог LIKE в SQL. Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если з Посмотреть все в категории Запросы
Читайте также: