&НаСервере
Функция ПодключитьБазуНаСервере(Соединение = "")
Объект.ФайловаяБазаДанных=Ложь;
Объект.Сервер="srv1с";
Объект.База="buh";
Объект.ИмяПользователя="Obmen";
Объект.Пароль="1qaz";
// Подключение к 1С
Если Объект.ФайловаяБазаДанных Тогда
СтрокаПодключения = "file='" + Объект.ПутьКБазе + "'; usr='" + Объект.ИмяПользователя + "'; pwd='" + Объект.Пароль + "';";
Иначе
СтрокаПодключения = "srvr='" + Объект.Сервер + "'; ref='" + Объект.База + "'; usr='" + Объект.ИмяПользователя + "'; pwd='" + Объект.Пароль + "';";
КонецЕсли;
Попытка
V8 = Новый COMObject("V83.COMConnector");
Соединение = V8.Connect(СтрокаПодключения);
ЕстьСоединение = Истина;
Исключение
ЕстьСоединение = Ложь;
Сообщить(ОписаниеОшибки());
КонецПопытки;
Возврат Соединение;
КонецФункции
&НаСервере
Процедура ОбновитьДанныеПлатежейНаСервере()
Соединение = ПодключитьБазуНаСервере();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Ссылка КАК Ссылка,
|ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.ОснованиеПлатежа КАК ОснованиеПлатежа,
|ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Сумма КАК Сумма
|ИЗ
|Документ.ПоступлениеБезналичныхДенежныхСредств.РасшифровкаПлатежа КАК ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа
|ГДЕ
|НЕ ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.ОснованиеПлатежа ССЫЛКА Документ.ЗаказКлиента";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
УИД = ВыборкаДетальныеЗаписи.Ссылка.УникальныйИдентификатор();
СсылкаНаДок = Соединение.Документы.ПоступлениеНаРасчетныйСчет.ПолучитьСсылку(Соединение.NewObject("УникальныйИдентификатор",Строка(УИД)));
//Сообщить(СсылкаНаДок.Номер);
Для каждого СтрокаИсточник Из СсылкаНаДок.РасшифровкаПлатежа Цикл
//Сообщить("Счет: "+Строка(СтрокаИсточник.СчетНаОплату.Номер));
УИД = Соединение.String(СтрокаИсточник.СчетНаОплату.УникальныйИдентификатор());
текДок= Документы.ЗаказКлиента.ПолучитьСсылку(Новый УникальныйИдентификатор(УИД));
Если ЗначениеЗаполнено(текДок) Тогда
Сообщить(текДок);
текОбъект=ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
текОбъект.РасшифровкаПлатежа[0].ОснованиеПлатежа= текДок;
текОбъект.РасшифровкаПлатежа[0].Заказ= текДок;
текОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьДанныеПлатежей(Команда)
ОбновитьДанныеПлатежейНаСервере();
КонецПроцедуры
30.06.11 – 12:07
Есть идентификатор вида : 209:971a0018f34e121411e03c1de5b80387
Хочу найти что за объект в базе ему соответствует. Как?
1 – 30.06.11 – 12:09
А где ты его берешь?
2 – 30.06.11 – 12:09
шерстить каждый объект отдельно
3 – 30.06.11 – 12:10
209 – идентификатор типа, остальное – перемиксованный объект УникальныйИдентификатор
4 – 30.06.11 – 12:10
(1) Да после обмена делаю ТИИ оно говорит:
Проверка логической целостности. Последовательность.Взаиморасчеты <Объект не найден> (209:971a0018f34e121411e03c1de5b80387)
Неверная ссылка на регистратор.
5 – 30.06.11 – 12:10
НовыйGUID = Новый УникальныйИдентификатор(ТвойГуид);
СсылкаГУИД=Документы.ВидДок.ПолучитьСсылку(НовыйGUID);
6 – 30.06.11 – 12:11
(4)Если <Объект не найден> , то с чего ты взял, что ты его найдешь если база не нашла?
7 – 30.06.11 – 12:11
(5) щас попробую
8 – 30.06.11 – 12:12
(6) Ну я же на копии, у меня есть и оригинал, где обмен не запускал …
9 – 30.06.11 – 12:12
(5) читай ветку
(4) блииин. сделай запрос по регистру “Взаиморасчеты” примерно такой
Выбрать
Взаиморасчеты.Регистратор
Из
РегистрНакопления.Взаиморасчеты
Где
Взаиморасчеты.Регистратор.Номер Есть NULL
получишь твою ссылку. потом по ней отбор набора записей и запись пустого набора
10 – 30.06.11 – 12:13
ну а вообще – после обмена – это нормально, если криво правила настроены, или не криво, но это заложено в логику
11 – 30.06.11 – 12:14
(9)<Объект не найден> <> NULL
12 – 30.06.11 – 12:14
+ Ссылка не пустая. Она битая
13 – 30.06.11 – 12:15
(10) Самое прикольное, что это стандартный обмен БП 2.0 по организации. Там постоянно вылезают такие бяки
14 – 30.06.11 – 12:16
Выбрать Регистратор Из Последовательность.Взаиморасчеты где Регистратор.Ссылка есть NULL
Но что ты в базе собрался искать, если проблема как раз в том, что в базе его нет?
15 – 30.06.11 – 12:16
(11) я там не зря написал “.Номер”
16 – 30.06.11 – 12:18
(11) А не является ли “.Номер” неявным левым соединением?
Варианты ответа:
1) да, является.
2) нет, является.
17 – 30.06.11 – 12:19
(11) и кстати, да:
NULL <> NULL
18 – 30.06.11 – 12:20
раз объект не найден, то нет его нигде. Если база SQL, восстанавливай бекап, ищи в SQL таблицах средствами SQL, по таблице и поймешь что за объект
19 – 30.06.11 – 12:21
(18) в копии он может и оказаться, почему же нигде?
20 – 30.06.11 – 12:22
(18) Ащета запрос из (9) дает тебе готовую ссылку. У которой даже и тип имеется. Для зачем что-то по таблицам SQL искать?
21 – 30.06.11 – 12:23
+(19) В том и дело, что он где-то есть: либо в базе до обмена, либо в узле откуда обмен принимали …
Вот и хочу найти что это было и почему объект удалился, а из последовательности не изьялся …
22 – 30.06.11 – 12:24
(20) В запросе (9) обращаемся к регистру накопления, но ТИИ не нашла в нем ссылок на несуществующие объекты …
23 – 30.06.11 – 12:24
(20) Не увидел 4 сообщение. Думал вообще ничего не известно, кроме гуида
24 – 30.06.11 – 12:25
(22) ну удали из последовательности
25 – 30.06.11 – 12:41
(22) Ну, ять, в (14) Посмотри. БОЛЬШАЯ разница, ага…
26 – 30.06.11 – 12:45
(25) Да разница-то небольшая, только что там в последовательности-то найдешь? Ну найдешь битые записи, а что за объект был все равно не известно …
27 – 30.06.11 – 12:53
ПЦ
28 – 30.06.11 – 13:23
(26) рукалицо…
29 – 30.06.11 – 13:30
(17) (NULL IS NULL) = TRUE
30 – 30.06.11 – 13:51
ТЗ = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого Строка Из ТЗ Цикл
Если Не ЗначениеЗаполнено(Строка.ИмяТаблицы) Тогда Продолжить; КонецЕсли;
ПозТочки = Найти(Строка.ИмяТаблицыХранения, “.”);
Если ПозТочки > 0 Тогда
Продолжить;
ИмяТаблицы = Лев(Строка.ИмяТаблицыХранения, ПозТочки – 1);
КонецЕсли;
ИтоговоеЧисло = “”;
Для Сч = 1 По СтрДлина(Строка.ИмяТаблицыХранения) Цикл
Символ = Сред(Строка.ИмяТаблицыХранения, Сч, 1);
Если Найти(“0123456789”, Символ) > 0 Тогда
ИтоговоеЧисло = ИтоговоеЧисло + Символ;
КонецЕсли;
КонецЦикла;
Если ИтоговоеЧисло = “209” Тогда
Сообщить(Строка.ИмяТаблицы);
КонецЕсли;
КонецЦикла;
31 – 30.06.11 – 13:53
(30) А что *это* делает?
32 – 30.06.11 – 13:58
(30) поможет узнать имя объекта по типу 209..
33 – 30.06.11 – 14:01
(31) это запустить в базе где отсутствует
(30)+
потом в базе источнике запустить
Поз = Найти(СтрокаОбъекта, “:”);
Тип = Лев(СтрокаОбъекта, Поз – 1);
СтрокаУИД = Сред(СтрокаОбъекта, Поз + 1);
СтрокаУИД = Сред(СтрокаУИД, 24, 8) + “-” + Сред(СтрокаУИД, 20, 4) + “-” + Сред(СтрокаУИД, 16, 4) + “-” + Сред(СтрокаУИД, 1, 4) + “-” + Сред(СтрокаУИД, 5, 12);
Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаУИД));
справочники.номенклатура. заменить на имятипа что покажет в обработке
34 – 30.06.11 – 14:01
(32) см (14)
35 – 30.06.11 – 14:03
(34) и что это покажет? что “объект не найден <209:971a0018f34e121411e03c1de5b80387>”?? а как понять что за объект конкретно?
36 – 30.06.11 – 14:06
(35) ссылка будет на конкретный объект метаданных
37 – 30.06.11 – 14:06
(35) рукалицо…
Запрос = Новый Запрос;
Запрос.Текст = "Выбрать РАЗЛИЧНЫЕ Регистратор Из Последовательность.Взаиморасчеты где Регистратор.Ссылка есть NULL";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(ТипЗнч(Выборка.Регистратор));
КонецЦикла;
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Строка(Док.Ссылка); |
Вариант применения в заметке «Сделать из элемента справочника группу»