1с как найти документ по уид

&НаСервере

Функция ПодключитьБазуНаСервере(Соединение = "")

Объект.ФайловаяБазаДанных=Ложь;

Объект.Сервер="srv1с";

Объект.База="buh";

Объект.ИмяПользователя="Obmen";

Объект.Пароль="1qaz";

// Подключение к 1С

Если Объект.ФайловаяБазаДанных Тогда

СтрокаПодключения = "file='" + Объект.ПутьКБазе + "'; usr='" + Объект.ИмяПользователя + "'; pwd='" + Объект.Пароль + "';";

Иначе

СтрокаПодключения = "srvr='" + Объект.Сервер + "'; ref='" + Объект.База + "'; usr='" + Объект.ИмяПользователя + "'; pwd='" + Объект.Пароль + "';";

КонецЕсли;

Попытка

V8 = Новый COMObject("V83.COMConnector");

Соединение = V8.Connect(СтрокаПодключения);

ЕстьСоединение = Истина;

Исключение

ЕстьСоединение = Ложь;

Сообщить(ОписаниеОшибки());

КонецПопытки;

Возврат Соединение;

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

&НаСервере

Процедура ОбновитьДанныеПлатежейНаСервере()

Соединение = ПодключитьБазуНаСервере();

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

|ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Ссылка КАК Ссылка,

|ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.ОснованиеПлатежа КАК ОснованиеПлатежа,

|ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Сумма КАК Сумма

|ИЗ

|Документ.ПоступлениеБезналичныхДенежныхСредств.РасшифровкаПлатежа КАК ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа

|ГДЕ

|НЕ ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.ОснованиеПлатежа ССЫЛКА Документ.ЗаказКлиента";

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

УИД = ВыборкаДетальныеЗаписи.Ссылка.УникальныйИдентификатор();

СсылкаНаДок = Соединение.Документы.ПоступлениеНаРасчетныйСчет.ПолучитьСсылку(Соединение.NewObject("УникальныйИдентификатор",Строка(УИД)));

//Сообщить(СсылкаНаДок.Номер);

Для каждого СтрокаИсточник Из СсылкаНаДок.РасшифровкаПлатежа Цикл

//Сообщить("Счет: "+Строка(СтрокаИсточник.СчетНаОплату.Номер));

УИД = Соединение.String(СтрокаИсточник.СчетНаОплату.УникальныйИдентификатор());

текДок= Документы.ЗаказКлиента.ПолучитьСсылку(Новый УникальныйИдентификатор(УИД));

Если ЗначениеЗаполнено(текДок) Тогда

Сообщить(текДок);

текОбъект=ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();

текОбъект.РасшифровкаПлатежа[0].ОснованиеПлатежа= текДок;

текОбъект.РасшифровкаПлатежа[0].Заказ= текДок;

текОбъект.Записать(РежимЗаписиДокумента.Проведение);

КонецЕсли;

КонецЦикла;

КонецЦикла;

КонецПроцедуры

&НаКлиенте

Процедура ОбновитьДанныеПлатежей(Команда)

ОбновитьДанныеПлатежейНаСервере();

КонецПроцедуры

   YF

30.06.11 – 12:07

Есть идентификатор вида : 209:971a0018f34e121411e03c1de5b80387

Хочу найти что за объект в базе ему соответствует. Как?

   Amiralnar

1 – 30.06.11 – 12:09

А где ты его берешь?

   Axel2009

2 – 30.06.11 – 12:09

шерстить каждый объект отдельно

   Fragster

3 – 30.06.11 – 12:10

209 – идентификатор типа, остальное – перемиксованный объект УникальныйИдентификатор

   YF

4 – 30.06.11 – 12:10

(1) Да после обмена делаю ТИИ оно говорит:

Проверка логической целостности. Последовательность.Взаиморасчеты <Объект не найден> (209:971a0018f34e121411e03c1de5b80387)

   Неверная ссылка на регистратор.

   Рэйв

5 – 30.06.11 – 12:10

НовыйGUID = Новый УникальныйИдентификатор(ТвойГуид);

СсылкаГУИД=Документы.ВидДок.ПолучитьСсылку(НовыйGUID);

   Рэйв

6 – 30.06.11 – 12:11

(4)Если <Объект не найден> , то с чего ты взял, что ты его найдешь если база не нашла?

   YF

7 – 30.06.11 – 12:11

(5) щас попробую

   YF

8 – 30.06.11 – 12:12

(6) Ну я же на копии, у меня есть и оригинал, где обмен не запускал …

   Fragster

9 – 30.06.11 – 12:12

(5) читай ветку

(4) блииин. сделай запрос по регистру “Взаиморасчеты” примерно такой

Выбрать

 Взаиморасчеты.Регистратор

Из

 РегистрНакопления.Взаиморасчеты

Где

 Взаиморасчеты.Регистратор.Номер Есть NULL

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

   Fragster

10 – 30.06.11 – 12:13

ну а вообще – после обмена – это нормально, если криво правила настроены, или не криво, но это заложено в логику

   Рэйв

11 – 30.06.11 – 12:14

(9)<Объект не найден>  <> NULL

   Рэйв

12 – 30.06.11 – 12:14

+ Ссылка не пустая. Она битая

   YF

13 – 30.06.11 – 12:15

(10) Самое прикольное, что это стандартный обмен БП 2.0 по организации. Там постоянно вылезают такие бяки

   Defender aka LINN

14 – 30.06.11 – 12:16

Выбрать Регистратор Из Последовательность.Взаиморасчеты где Регистратор.Ссылка есть NULL

Но что ты в базе собрался искать, если проблема как раз в том, что в базе его нет?

   Fragster

15 – 30.06.11 – 12:16

(11) я там не зря написал “.Номер”

   Defender aka LINN

16 – 30.06.11 – 12:18

(11) А не является ли “.Номер” неявным левым соединением?

Варианты ответа:

1) да, является.

2) нет, является.

   Fragster

17 – 30.06.11 – 12:19

(11) и кстати, да:

NULL <> NULL

   SalavatUlaev

18 – 30.06.11 – 12:20

раз объект не найден, то нет его нигде. Если база SQL, восстанавливай бекап, ищи в SQL таблицах средствами SQL, по таблице и поймешь что за объект

   luckyluke

19 – 30.06.11 – 12:21

(18) в копии он может и оказаться, почему же нигде?

   Defender aka LINN

20 – 30.06.11 – 12:22

(18) Ащета запрос из (9) дает тебе готовую ссылку. У которой даже и тип имеется. Для зачем что-то по таблицам SQL искать?

   YF

21 – 30.06.11 – 12:23

+(19) В том и дело, что он где-то есть: либо в базе до обмена, либо в узле откуда обмен принимали …

Вот и хочу найти что это было и почему объект удалился, а из последовательности не изьялся …

   YF

22 – 30.06.11 – 12:24

(20) В запросе (9) обращаемся к регистру накопления, но ТИИ не нашла в нем ссылок на несуществующие объекты …

   SalavatUlaev

23 – 30.06.11 – 12:24

(20) Не увидел 4 сообщение. Думал вообще ничего не известно, кроме гуида

   Fragster

24 – 30.06.11 – 12:25

(22) ну удали из последовательности

   Defender aka LINN

25 – 30.06.11 – 12:41

(22) Ну, ять, в (14) Посмотри. БОЛЬШАЯ разница, ага…

   YF

26 – 30.06.11 – 12:45

(25) Да разница-то небольшая, только что там в последовательности-то найдешь? Ну найдешь битые записи, а что за объект был все равно не известно …

   Fragster

27 – 30.06.11 – 12:53

ПЦ

   Defender aka LINN

28 – 30.06.11 – 13:23

(26) рукалицо…

   Amiralnar

29 – 30.06.11 – 13:30

(17) (NULL IS NULL) = TRUE

   Axel2009

30 – 30.06.11 – 13:51

ТЗ = ПолучитьСтруктуруХраненияБазыДанных();

   Для Каждого Строка Из ТЗ Цикл

       Если Не ЗначениеЗаполнено(Строка.ИмяТаблицы) Тогда Продолжить; КонецЕсли;

       ПозТочки = Найти(Строка.ИмяТаблицыХранения, “.”);

       Если ПозТочки > 0 Тогда

           Продолжить;

           ИмяТаблицы = Лев(Строка.ИмяТаблицыХранения, ПозТочки – 1);

       КонецЕсли;

       ИтоговоеЧисло = “”;

       Для Сч = 1 По СтрДлина(Строка.ИмяТаблицыХранения) Цикл

           Символ = Сред(Строка.ИмяТаблицыХранения, Сч, 1);

           Если Найти(“0123456789”, Символ) > 0 Тогда

               ИтоговоеЧисло = ИтоговоеЧисло + Символ;

           КонецЕсли;

       КонецЦикла;

       Если ИтоговоеЧисло = “209” Тогда

           Сообщить(Строка.ИмяТаблицы);

       КонецЕсли;

   КонецЦикла;

   Defender aka LINN

31 – 30.06.11 – 13:53

(30) А что *это* делает?

   Axel2009

32 – 30.06.11 – 13:58

(30) поможет узнать имя объекта по типу 209..

   Axel2009

33 – 30.06.11 – 14:01

(31) это запустить в базе где отсутствует

(30)+

потом в базе источнике запустить

   Поз = Найти(СтрокаОбъекта, “:”);

   Тип = Лев(СтрокаОбъекта, Поз – 1);

   СтрокаУИД = Сред(СтрокаОбъекта, Поз + 1);

   СтрокаУИД = Сред(СтрокаУИД, 24, 8) + “-” + Сред(СтрокаУИД, 20, 4) + “-” + Сред(СтрокаУИД, 16, 4) + “-” + Сред(СтрокаУИД, 1, 4) + “-” + Сред(СтрокаУИД, 5, 12);

   Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаУИД));

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

   Defender aka LINN

34 – 30.06.11 – 14:01

(32) см (14)

   Axel2009

35 – 30.06.11 – 14:03

(34) и что это покажет? что “объект не найден <209:971a0018f34e121411e03c1de5b80387>”?? а как понять что за объект конкретно?

   Fragster

36 – 30.06.11 – 14:06

(35) ссылка будет на конкретный объект метаданных

   Defender aka LINN

37 – 30.06.11 – 14:06

(35) рукалицо…

Запрос = Новый Запрос;
Запрос.Текст = "Выбрать РАЗЛИЧНЫЕ Регистратор Из Последовательность.Взаиморасчеты где Регистратор.Ссылка есть NULL";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(ТипЗнч(Выборка.Регистратор));
КонецЦикла;
   Fragster

38 – 30.06.11 – 14:06

хоть и отсутствующий

  

Axel2009

39 – 30.06.11 – 14:13

(37) был не прав.

Функция ПолучитьСсылкуПоИД(ИД, Тип = Неопределено)

Если ИД = “” и Тип <> Неопределено Тогда

// Тип известен, элемент явно пустой, значит нужно вернуть пустую ссылку

спр = Метаданные.Справочники.Найти(Тип);

Если спр <> Неопределено Тогда

Возврат Справочники[Тип].ПустаяСсылка();

КонецЕсли;

док = Метаданные.Документы.Найти(Тип);

Если док <> Неопределено Тогда

Возврат Документы[Тип].ПустаяСсылка();

КонецЕсли;

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

КонецЕсли;

Попытка

УИД = Новый УникальныйИдентификатор(ИД);

Исключение

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

КонецПопытки;

// Если тип известен, то ищем только в одной таблице

Если Тип <> Неопределено Тогда

спр = Метаданные.Справочники.Найти(Тип);

Если спр <> Неопределено Тогда

Ссылка = Справочники[Тип].ПолучитьСсылку(УИД);

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

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

КонецЕсли;

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

КонецЕсли;

док = Метаданные.Документы.Найти(Тип);

Если док <> Неопределено Тогда

Ссылка = Документы[Тип].ПолучитьСсылку(УИД);

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

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

КонецЕсли;

КонецЕсли;

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

КонецЕсли;

// Если тип неизвестен, то перебираем все справочники и документы.

// Это долго. Поэтому тип очень хочется получить.

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

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

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

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

КонецЕсли;

КонецЦикла;

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

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

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

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

КонецЕсли;

КонецЦикла;

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

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

При организации обмена данными между двумя информационными базами зачастую возникает задача получения ссылки объекта по его Уникальному идентификатору (УИД).

Для поиска и получения ссылки объекта по его Уникальному идентификатору служит такая конструкция:

ИскомоеПодразделение = Справочники.Подразделения.ПолучитьСсылку(Новый УникальныйИдентификатор("3accfd60-3247-4862-ab79-e9aced2515"))
Информация о материале
Автор: Максим Донецкий
Категория: Программирование 1С

Опубликовано: 28 февраля 2018

высокое-качество

Пример уникального идентификатора: 4bf85396-cc7a-11ea-9ef0-c86000245adb

   //

   //Узнать уникальный идентификатор

   ГУИД = КонтрагентСсылка.УникальныйИдентификатор();

   //Создаём уникальный идентификатор из строки

   СтрокаGUID = “4bf85396-cc7a-11ea-9ef0-c86000245adb”;

   НовыйGUID = Новый УникальныйИдентификатор(СтрокаGUID);

   //Можно не указывать СтрокаGUID. Программа сгенерирует сама

   НовыйGUID = Новый УникальныйИдентификатор();

   //

   //Получить ссылку на на объект, зная его GUID

   СсылкаПП = Документы.ПлатежноеПоручениеВходящее.ПолучитьСсылку(НовыйGUID);

   //Создать документ и присвоить ему ГУИД

   СтрокаGUID = “4bf85396-cc7a-11ea-9ef0-c86000245adb”;

   Док = Документы.ПлатежноеПоручениеВходящее.СоздатьДокумент();

   СсылкаДок = Документы.ПлатежноеПоручениеВходящее.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID));

   Док.УстановитьСсылкуНового(СсылкаДок);    

   //

   //Получить ГУИД из COM-объекта

   V83COMConnector = Новый COMОбъект(“V83.COMConnector”);

   БД = V83COMConnector.Connect(ПараметрыПодключения);  

   СтрокаГУИД = БД.XMLСтрока(Док.Ссылка);

Вариант применения в заметке «Сделать из элемента справочника группу»

Добавить комментарий