Как по guid найти ссылку

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

Скачать архив с обработками можно по ссылке: Полезные обработки 1С.zip

Чтобы запустить обработку:

1. Запустите «1С Предприятие» в режиме «Обычное приложение». Для этого используйте дополнительный параметр запуска:

/RunModeOrdinaryApplication

2. В меню Файл выберите пункт Открыть и в открывшемся окне выберите нужный файл.

Обработка «Поиск объекта 1С по GUID»

Обработка позволяет:

  • определить GUID любого объекта 1С (записи справочника, документа и пр.);
  • по заданному GUID найти ссылку на объект 1С (запись справочника документа и пр.).

Чтобы определить GUID объекта 1С:

1. Запустите обработку «Поиск ссылки по GUID».

2. В поле Ссылка нажмите на кнопку T, выберите тип объекта.

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

4. Нажмите на кнопку Показать GUID. В результате в поле GUID отобразится уникальный идентификатор объекта 1С.


 

Чтобы определить ссылку на объект 1С, введите уникальный идентификатор объекта в поле GUID и нажмите на кнопку Найти ссылку. Таким образом в поле Ссылка отобразится найденный объект из базы данных. Кнопка  позволяет открыть карточку текущего объекта.

Обработка «Консоль запросов»

Обработка позволяет составить и выполнить запрос на языке запросов 1С. Используется для написания вычислений в событии коннектора «При выгрузке из 1С».

Рассмотрим, как выполняется обработка на примере запроса по получению юридического адреса контрагента:

1. Запустите обработку «Консоль запросов».

2. В основное окне обработки добавьте текст запроса:

ВЫБРАТЬ
  КИ.Представление КАК Адрес
ИЗ
  РегистрСведений.КонтактнаяИнформация КАК КИ
ГДЕ
  КИ.Объект = &Объект
  И КИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
  И КИ.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресКонтрагента)

Запрос можно составить самостоятельно или с помощью конструктора запросов (пункт контекстного меню Конструктор запросов):


В тексте запроса, как правило, используются параметры. В нашем примере используется параметр &Объект, через который в запрос передается ссылка на запись справочника Контрагенты. Значения параметров задаются в левом нижнем окне обработки.

3. Чтобы выполнить запрос, нажмите кнопку Выполнить (F7). Результат выполнения запроса отобразится в правом нижнем окне.

Обработка «Выполнение произвольного кода»

Обработка позволяет быстро проверить вычисления на языке 1С, не создавая новую обработку в конфигурации 1С.

Чтобы проверить вычисление:

1. Запустите обработку «Выполнение произвольного кода».

2. В окне редактора напишите код вычислений:

3. Для выполнения кода нажмите на кнопку Выполнить.

Ниже рассмотрим примеры использования обработки «Выполнение произвольного кода».

Пример 1

Необходимо написать вычисления для события коннектора «При выгрузке из 1С» по получению юридического адреса контрагента. Текст события представляет собой xml-текст, в котором задаются вычисляемые реквизиты 1С. Подробнее см. в справке Коннектор к «1С:Предприятие 8» События и фильтры.

Ранее с помощью обработки «Консоль запросов» мы создали и отладили запрос:

ВЫБРАТЬ
  КИ.Представление КАК Адрес
ИЗ
  РегистрСведений.КонтактнаяИнформация КАК КИ
ГДЕ
  КИ.Объект = &Объект
  И КИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
  И КИ.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресКонтрагента)

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


Для отладки вычислений добавьте определение переменной Источник:

Источник = Справочники.Контрагенты.НайтиПоКоду("000000007");

И вывод результата:

Сообщить(Значение);

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

В итоге событие «При выгрузке из 1С» будет выглядеть следующим образом:

<Свойства>
  <Свойство>
    <Код>60</Код>
    <Наименование>Выч_ЮридическийАдрес</Наименование>
    <Порядок>60</Порядок>
    <Источник/>
    <Приемник Имя="Выч_ЮридическийАдрес" Вид="Реквизит" Тип="Строка"/>
    <ПриВыгрузке>Запрос = Новый Запрос("ВЫБРАТЬ 
                                        |  КИ.Представление КАК Адрес 
                                        |ИЗ 
                                        |  РегистрСведений.КонтактнаяИнформация КАК КИ 
                                        |ГДЕ 
                                        |  КИ.Объект = &amp;Объект 
                                        |  И КИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес) 
                                        |  И КИ.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресКонтрагента)"); 
                          Запрос.УстановитьПараметр("Объект", Источник); 
                          Выборка = Запрос.Выполнить().Выбрать();  
                            Значение = ?(Выборка.Следующий(), СокрЛП(Выборка.Адрес), "");
    </ПриВыгрузке>
  </Свойство>
</Свойства>

Пример 2

Необходимо на форму 1С добавить кнопку, при нажатии на которую будет запускаться сценарий DIRECTUM. В сценарий требуется передать один параметр. При завершении сценария получить результат его выполнения.

Для этого выполните отладку вычисления, в котором запускается сценарий DIRECTUM по кнопке из 1С:

Обработка «Регистрация изменений для обмена»

Обработка включена в большинство конфигураций 1С. С ее помощью можно просматривать или редактировать записи о регистрации объектов в плане обмена 1С, в том числе:

  • просматривать список метаданных, участвующих в обмене;
  • просматривать список объектов, для которых зарегистрированы изменения;
  • добавлять и снимать регистрацию для объектов, а также использовать запросы для выбора данных;
  • просматривать данные в формате XML.

Рассмотрим возможности обработки наглядно в 1С:

1. Запустите обработку «Регистрация изменений для обмена».

2. В верхнем поле выберите узел обмена, например, DIRECTUM.

В результате в нижней области отобразятся все объекты, включенные в План обмена. В колонке Авторегистрация – текущее состояние авторегистрации изменений и количество зарегистрированных в данный момент объектов.

К объектам можно применить действия:

Обработка «Выгрузка и загрузка данных XML»

Универсальная обработка позволяет выполнить полную или частичную выгрузку данных информационной базы в xml-файл. Обработку можно использовать для миграции данных из 1С.

Сценарии использования обработки:

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

Обработка может выгружать записи объектов:

  • Константы;
  • Справочники;
  • Документы;
  • Последовательности;
  • ПланыВидовХарактеристик;
  • ПланыСчетов;
  • ПланыВидовРасчета;
  • РегистрыСведений;
  • РегистрыНакопления;
  • РегистрыБухгалтерии;
  • РегистрыРасчета;
  • БизнесПроцессы;
  • Задачи;
  • ПланыОбмена.


 

Особенности обработки:

  • Фильтр можно накладывать на любой из реквизитов справочника. Например, настроить фильтрацию по справочнику Внутренние документы по полю ВидДокумента = Договор.
  • Вместе с основным справочником можно выгружать связанные записи других справочников. Например, настроить выгрузку, чтобы вместе с внутренними документами выгружались связанные записи справочника Корреспонденты.

Обработка «Массовая регистрация изменений для обмена»

Обработку удобно использовать при тестировании интеграции с 1С.

Обработка позволяет зарегистрировать в плане обмена нужное количество записей для указанного справочника:

1. Запустите обработку «Массовая регистрация изменений для обмена».

2. Выберите необходимый справочник и нажмите на кнопку Выполнить.


 

Битая ссылка, <Объект не найден>, Уникальный Идентификатор, GUID 74
Когда кто-то удаляет данные из базы без проверки ссылок на эти объекты, то везде где этот объект использовался появляется сообщение вида: Объект не найден (84:bf5600145e3710ab11dda4c605dbe824) .
https://helpf.pro/uploads/img/_1-46z7I4U7Ww.png
В


Битая ссылка, , Уникальный Идентификатор, GUID — Управляемые формы 4
Переделал обработки из статей Битая ссылка, Объект не найден, Уникальный Идентификатор, GUID и Поиск в базе битых ссылок — объект не найден под Управляемые формы. Скачать


Блокировка записей, невозможно изменить или удалить из регистра. Конфликт блокировок MS SQL + 1C 4
При попытке удалить запись из регистра сведений — получаю ошибку: она заблокирована, ошибка блокировок и т.д. Отключил всех пользователей, перезапустил сервер, пробую удалить — опять ошибка блокировки :( Путем тестов было вяснено, что проблема


В учетной политике не указан вид тарифа страховых взносов. Как указать? 0
Создайте новую запись учетной политики с начала года — Например 01.01.2013
В учетной смотрите дату начала учетной политики. Поставьте дату начала года (например 01.01.13) закладка появиться должна.
Проверьте Тариф страховых взносов: Меню Зарпла


Выгрузка результата запроса в текстовый файл с разделителями 1
Запрос = Новый Запрос();
Запрос.УстановитьПараметр(» ДатаНач» ,НачалоДня(ДатаНач));
Запрос.УстановитьПараметр(» ДатаКон» ,КонецДня(ДатаКон));
Запрос.УстановитьПараметр(» Организация» ,Организация);
Запрос.Текст = » ВЫБРАТЬ
| ПоступлениеТоваровУ


Посмотреть все результаты поиска похожих

   Гений 1С

07.06.07 — 12:36

А то метод ПолучитьСсылку работает только для конкретного менеджера.

А если я не знаю тип?

Функция обНайтиСсылкуПоГУИД(ГУИД) Экспорт

   Перем РезСсылка;

   Для Каждого МД Из Метаданные.Справочники Цикл

       РезСсылка=Справочники[МД.Имя].ПолучитьСсылку(ГУИД);

       Если РезСсылка.ПолучитьОбъект()<>Неопределено Тогда

           Возврат РезСсылка;

       КонецЕсли;

   КонецЦикла;

   Для Каждого МД Из Метаданные.Документы Цикл

       РезСсылка=Документы[МД.Имя].ПолучитьСсылку(ГУИД);

       Если РезСсылка.ПолучитьОбъект()<>Неопределено Тогда

           РезСсылка.ПолучитьОбъект();

           Возврат РезСсылка;

       КонецЕсли;

   КонецЦикла;

   Возврат Неопределено;

КонецФункции

   ТелепатБот

1 — 07.06.07 — 12:36

   Гений 1С

2 — 07.06.07 — 18:23

ап

   Ferz

3 — 08.06.07 — 09:10

только через SQL

   FLENDGER

4 — 08.06.07 — 10:13

офф:

гениальное решение — сразу пиши в книгу знаний…

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

   FLENDGER

5 — 08.06.07 — 10:30

+4
создаем рег. сведений, в который пишем при записи объектов ссылки и в качестве ресурса — тип объекта или имя из метаданных…
а потом просто ищем ссылку в этом регистре… :)

   Гений 1С

6 — 08.06.07 — 10:46

(5) Хахаха…. А про транзакционную нагрузку на базу ты подумал? К тому же это не универсальное и даже вредное явление. Яйца курицу учат? Гыгыгы

   MRAK

7 — 08.06.07 — 10:58

(5) ужос

   PowerBoy

8 — 08.06.07 — 11:13

(0) Тоже, искал решение и не нашел. Делал перебором из списка.

Кстати

РезСсылка.ПолучитьОбъект()

работает очень, очень медленно.

Строка(РезСсылка) = «»

работает в два раза быстрей, но тоже медленно.

   НЕА123

9 — 08.06.07 — 12:01

(0) ОФФ

Справочники[МД.Имя] в контексте можно просто МД.

   FLENDGER

10 — 08.06.07 — 14:59

то (6)
Вот в (4) такая же бредовая хрень, как и в (0)… Особенно в плане того, чтобы пихать подобные хрени в КЗ… А вот теперь иди и считай, сколько такой хрени ты занес в КЗ, где неопытные вместо того, чтобы найти что-нибудь стоящее, забивают голову ерундой…
P.S. какова задача — такого решение… чтобы получить запросом данные по гуиду, надо чтобы он был там в той форме, куда позволяет доставать запрос… отсюда и решение (4) ;)
а теперь попробуй доказать, что на данный момент есть еще решение, при котором ты ЗАПРОСОМ вытянешь ссылку по гуиду…

PPS а про курицу мне понравилось… :)

   dolter

11 — 08.06.07 — 15:08

А откуда взят ГУИД? если из таблицы, то можно для ускорения перебора узнать ограничения типа…

   НЕА123

12 — 08.06.07 — 15:16

НайтиПоСсылкам(<Список ссылок>)

Параметры:

<Список ссылок> (обязательный)

Тип: Массив. Массив со списком ссылок на объекты, ссылки на которые нужно найти.

Возвращаемое значение:

Тип: ТаблицаЗначений. Возвращает ссылки на найденные объекты в виде ТаблицаЗначений, состоящей из колонок с индексами: 0 — искомая ссылка; 1 — ссылка на объект, если найденная ссылка соответствует объектной таблице или значение, идентифицирующее запись необъектной таблицы; 2 — объект метаданных, которому соответствуют данные, в которых найдена ссылка.

Описание:

Осуществляет поиск ссылок на объекты, переданные в параметре <Список ссылок>.

   НЕА123

13 — 08.06.07 — 15:18

(12)-точно, бред. не читать.:((

   Леха Дум

14 — 08.06.07 — 15:27

(11) а какая разница, нам ведь нужно гениальное решение. гы куриц всегда с динозаврами сравниваю — после просмотра фильма «парк юрского периода»

   Гений 1С

15 — 08.06.07 — 15:27

(13) я так и понял.

(10) ваш бред не осилил.

При чем здесь запросом.

Задача четкая — есть GUID, нужно найти объект.

НАпример, если данные пришли из журнала регистрации.

Для универсальности ищу решение, когда вид ссылки неизвестен.

   Wladimir_spb

16 — 08.06.07 — 15:36

Запросом можно, но не уверен, что будет быстрее, чем (0).

   Гений 1С

17 — 08.06.07 — 16:07

(16) да, запросом можно, но тоже не уверен, а если сразу по всем тэйблам, можно напороться на ошибку 255 таблиц. ;-) или только порциями по 255 таблиц, тогда можно. ;-)

   FarFar

18 — 08.06.07 — 16:55

(0) Интересно,в 8.1 упростили поиск по ГУИДу?

   Гений 1С

19 — 08.06.07 — 16:56

(18) с чего бы это, гыгыгы…

   oleg_km

20 — 08.06.07 — 17:43

В запросах ГУИД тоже недоступен, только в объекте

   Гений 1С

21 — 08.06.07 — 17:47

(20) а да, точно. ;-)

   РазДва

22 — 09.06.07 — 09:37

(15) Если говорить про универсальность, то может быть ситуация, когда два элемента РАЗНЫХ справочников или документов имеют одинаковый ГУИД.

   Ferz

23 — 09.06.07 — 10:38

(22) нужно проверить.. вероятность ничтожна

   РазДва

24 — 09.06.07 — 10:50

(23) Если вы напишете при создании элемнетов УстановитьСсылкуНового(ОдинаковыйГУИД), то вероятность будет 100%.

На вероятность нельзя полагаться при универсальном решении.

   НЕА123

25 — 09.06.07 — 10:50

(22)+

ЗначениеВСТрокуВнутр(Объект.Ссылка) выдает нечто1.

Объект.Ссылка.УникальныйИдентийикатор() тоже выдает нечто2.

Нечто2 являнтся подмножеством Нечто1. (все перетасовано, но видно).

   Immortal

26 — 09.06.07 — 11:35

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

   Immortal

27 — 09.06.07 — 11:37

искать то есть..

   Immortal

28 — 09.06.07 — 11:38

в гуиде есть информация о таблице в которой храниццо элемент или нет?

   НЕА123

29 — 09.06.07 — 11:43

(28)  — судя по (25) — нет. +(РазДва).

   Immortal

30 — 09.06.07 — 11:46

мдамс.. странно.

   Гений 1С

31 — 09.06.07 — 11:52

(28) Ничего странного, так задумано. В GUID нет типа объекта, иначе бы не хватило места на уникальность.

   Immortal

32 — 09.06.07 — 12:18

(31) ты неправ.. есть там привязка или нет к таблице при формировании гуида

никак не скажется на уникальности.

если только на очень больших объёмах записей(~триллионы)

   FLENDGER

33 — 09.06.07 — 12:52

Если есть задача оптимизировать данную процедуру в (0), если возможность не использовать ПолучитьОбъект, который работает очень медленно, кроме того обращается к базе и требует от пользователя дополнительных прав на объекты…

В качестве альтернативы можно использовать подобную функцию

Функция ПроверитьСсылку(Знач Ссылка, Знач Гуид)

   Перем Результат;

   Результат = Истина;

   
       //Получаем из ГУИДа ссылку в том формате, который использует сама 1С

   ТекстГуид = «» + ГУИД;

   СсылкаИзГУИД = «»;

   ПозицияТире = Найти(ТекстГуид, «-«);

   к = 0;

   Пока ПозицияТире > 0 И к <= 2 Цикл

       СсылкаИзГУИД = Лев(ТекстГуид, ПозицияТире-1) + СсылкаИзГУИД;

       ТекстГуид = Сред(ТекстГуид, ПозицияТире+1);

       ПозицияТире = Найти(ТекстГуид, «-«);

       к = к + 1;

   КонецЦикла;

   СсылкаИзГУИД = СтрЗаменить(ТекстГуид, «-«, «») + СсылкаИзГУИД;

   
   //Проверяем, есть в полученной ссылке системные строки

       Если Найти(«» + Ссылка, «Объект не найден») > 0 И Найти(«» + Ссылка, СсылкаИзГУИД) > 0 Тогда

       Результат = Ложь;

   КонецЕсли;

   
   Возврат Результат;

КонецФункции

Алгоритм не оптимален, но в принципе довольно надежен…

  

Гений 1С

34 — 09.06.07 — 15:34

(33) клево, слушай, а разве запрос в представлении не вернет для несущетвующего объекта Объект не найден? Тогда можно и запросом шебуршать, строго порциями по 255 таблиц, гыгыгы…

Недавно после нестандартного обмена данными я увидел знакомое <Объект не найден>  в полях некоторых элементов базы-приемника и задался вопросом, как можно быстро в базе-источнике найти объект, от которого уехал только ID ? Особенно если реквизит в базе-приемнике составного типа или вообще его тип не ясен… И в ответ написал обработку.

Итак, обработка позволяет по ID определить, какому объекту базы данных он принадлежит. Поддерживаются все ссылочные типы базы данных.

Реализовано три режима: поиск ссылки, создание объекта БД и получение ссылки для объекта БД.

Поиск ссылки

Идентификатор, вводимый в поле «Известный GUID» может иметь различные виды:

1. Объект не найден (25:888ba76e-9ccf-aed3-4a2f-1d8152ba0f17)

Обычно такие ссылки, они же «битые» появляются в результате обмена данными, когда ссылка на объект выгрузилась, а сам объект — нет.

2. 25:888ba76e-9ccf-aed3-4a2f-1d8152ba0f17

Частный случай пункта 1.

3. 888ba76e-9ccf-aed3-4a2f-1d8152ba0f17

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

4. 888ba76e9ccfaed34a2f1d8152ba0f17

Тоже, что и в пункте 3, без дефисов.

Можно вводить (копипастить) в любом формате. Следует отметить, что если в ID присутствует номер таблицы из структуры хранения БД, то объект определяется из этой таблицы. Например, здесь это номер «25» — число перед «:» в идентификаторе.

Далее — нажимаем кнопку «Найти ссылку» и в поле «Результат» появится ссылка на объект БД (если он найдется, если нет, то «битая»). Если объект не найден, то его можно создать — на второй закладке.

Итак, поиск осуществляется:

— если есть номер таблицы, то сразу в этой таблице;

— если номера нет, то по порядку во всех ссылочных типах БД.

Создание объекта

Все тоже самое, только кнопка другая — «Создать объект». Система пытается создать объект и установить для него введенный ID. Если удалось, то пользователю предлагается заполнить форму этого объекта и записать его в БД.

Опять же, если в идентификаторе есть номер таблицы, то создаем объект сразу в этой таблице. Если нет, то выбираем тип создаваемого объекта руками.

Получение ссылки

По выбранной ссылке на объект БД система получает ее уникальный идентификатор в 3-х вариантах (для удобства).

Также определяется название таблицы хранения объекта, которому принадлежит выбранная ссылка.

Области использования обработки

Сколько раз я видел у клиентов криво настроенный обмен, в результате которого появлялась куча битых ссылок. При анализе таких обменов (особенно XML) важно понимать, что за объект скрывается за битой ссылкой в базе-источнике. Особенно когда реквизит приемника составного типа или вообще любая ссылка. Эта обработка быстро ответит на данный вопрос. Без нее нудно тратилось время на выяснение сего момента, зачастую набивая код в «табло», т.к. нужно было быстро понять, в чем дело, а обработку писать не хотелось.

Также, например, в регистре «Соответствие объектов информационных баз» хранится это самое соответствие. Объект в текущей базе ясен, а вот что там за ID лежит — вопрос. Хотя, конечно, тут тип можно определить быстро.

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

Полезно использовать мою обработку вместе с обработками поиска битых ссылок. 

Обработка написана под 8.2, но можно использовать и для 8.1 с предварительной конвертацией. Формы — обычные.

Планируемые доработки

1. Получение ID для любой ссылки. Реализовано.

2. Возможность передавать список ID-шников для поиска ссылок в базе-источнике.

3. Получение ID ссылки на объект в другой базе через COM-соединение и наоборот.

Понравилась статья? Поделить с друзьями:
  • Как составить хорошее объявление на авито
  • Как найти директорию линукс
  • Как найти бомбу липучку
  • Как найти доп заработок в интернете
  • Как найди пароль от вифи