Как получить уникальный идентификатор в запросе 1с
Перейти к содержимому

Как получить уникальный идентификатор в запросе 1с

  • автор:

1С 8.3 Получить УИД в запросе — Программист 1С Минск. Автоматизация бизнеса.

ПРИМЕРЫ КОДА 1С

Перейти в раздел примеры кода 1С 8.3:

В версии платформы 1С 8.3.22 в язык запросов (и в язык выражений СКД) доблена функция УникальныйИдентификатор(Ссылка). Функция возвращает уникальный идентификатор переданной ссылки (или NULL, если передано значение NULL). П араметр Ссылка это выражение, результатом которого является ссылка (за исключением ссылок на таблицы внешних источников данных).

Получение Уникального ИДентификатора от ссылки в запросе в 1С 8.3:

&НаСервере
Процедура УИДвЗапросе ( ТЗ_МатериалыНаСкладе ) // Таблица значений

// Создание выборки
Запрос = Новый Запрос ( «ВЫБРАТЬ
| ТЗ_МатериалыНаСкладе.Наименование КАК НаименованиеEn,
| ТЗ_МатериалыНаСкладе.УникальныйИдентификатор КАК УникальныйИдентификатор
|ПОМЕСТИТЬ ВТ_МатериалыНаСкладе
|ИЗ
| &ТЗ_МатериалыНаСкладе КАК ТЗ_МатериалыНаСкладе
|;
|
|ВЫБРАТЬ
| Материалы.Код КАК Код,
| Материалы.Наименование КАК Наименование,
| ВТ_МатериалыНаСкладе.НаименованиеEn КАК НаименованиеEn
|ИЗ
| Справочник.Материалы КАК Материалы
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_МатериалыНаСкладе КАК ВТ_МатериалыНаСкладе
| ПО УникальныйИдентификатор(Материалы.Ссылка) = ВТ_МатериалыНаСкладе.УникальныйИдентификатор» );

Запрос . УстановитьПараметр ( «ТЗ_МатериалыНаСкладе » , ТЗ_МатериалыНаСкладе );
РезультатЗапроса = Запрос . Выполнить ();
Если Не РезультатЗапроса . Пустой () Тогда // Такая проверка рекомендуется фирмой 1С
Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Иначе // Сообщить(«Данные отсутствуют!»);
КонецЕсли;

Получение Уникального ИДентификатора от битой ссылки в 1С 8.3:

&НаСервереБезКонтекста
Функция ПолучитьГУИДБитойССылкиНаСервере ( СсылкаНаОбъект ) // Вариант 1

Возврат XMLСтрока ( СсылкаНаОбъект );

&НаСервереБезКонтекста
Функция ПолучитьГУИДБитойССылкиЗапросомНаСервере ( СсылкаНаОбъект ) // Вариант 2 (запросом)

Запрос = Новый Запрос ;
Запрос . Текст = «ВЫБРАТЬ
| УНИКАЛЬНЫЙИДЕНТИФИКАТОР(&СсылкаНаОбъект) КАК ГУИД» ;

Запрос . УстановитьПараметр ( «СсылкаНаОбъект» , СсылкаНаОбъект );
РезультатЗапроса = Запрос . Выполнить ();
Записи = РезультатЗапроса . Выбрать ();

Если Записи . Следующий () Тогда
УИ = Записи . ГУИД ;
Иначе
УИ = XMLСтрока ( Справочники . Материалы . ПустаяСсылка ());
КонецЕсли;

Возврат XMLСтрока ( СсылкаНаОбъект );

&НаСервереБезКонтекста
Функция ПолучитьГУИДБитойССылки ( ГУИДОбъекта ) // Вариант 3 (самопис)

ГУИДСтр = СтрЗаменить ( ГУИДОбъекта , » (» , «» );
ГУИДСтр = СтрЗаменить ( ГУИДСтр , «)» , «» );
ГУИДСтр = СтрЗаменить ( ГУИДСтр , «0x» , «» );
ГУИДСтр = Сред ( ГУИДСтр , Найти ( ГУИДСтр , «:» )+ 1 , СтрДлина ( ГУИДСтр ));

// Преобразуем GUID
ГУИД = Сред ( ГУИДСтр , 25 , 8 )+ «-» + Сред ( ГУИДСтр , 21 , 4 )+ «-» + Сред ( ГУИДСтр , 17 , 4 )+ «-» + Сред ( ГУИДСтр , 1 , 4 )+ «-» + Сред ( ГУИДСтр , 5 , 12 );

Как получить уникальный идентификатор в запросе 1с

Программно можно добраться до уникального идентификатора так

А можно ли получить его в запросе SQL ?

Имелось ввиду в SQL запросе.

Это нужно при репликации с другой базой(не 1С).
По номеру и времени не предлагать, т.к. они могут изменится, а GUID не меняется.

нужно проверить есть ли документ с
GUID=»b2d33b65-7a92-11d9-b797-505054503030″ в базе.

Или это решается только добавлением в документы своих полей и последующее их использование?

(2) т.е. у тебя будет запрос к СУБД не из 1с, так?
(2) Поле _IDRRef
(4) Это если выбирать из родной скулевской таблицы.

Тогда другой вопрос.
Как узнать название таблицы РегистрБухгалтерии.Хозрасчетный?

Конфигурация БП 2.0.27.10

(6) См. справку по ПолучитьСтруктуруХраненияБазыДанных()

Я правильно понял, что средствами 1С получить ИЗ SQL запроса нельзя?

(8) Можно. Через СОМ. 🙂
(9) Через COM в SQL запросе?

(10) Язык запросов 1С не предоставляет доступа к полю _IDRRef, известному также как «Уникальный идентификатор». Через скульный запрос данное поле получить можно. В 1С создаем СОМ-коннектор к серверу баз данных. Для этого потребуется знать адрес сервера/имя сервера/имя пользователя/пароль/имя бд. Выполняем запрос, получаем результат. Короче, мечта проктолога. Потому и смайлик.

АДО, какой нафиг COM

(8) Можешь в самом запросе средствами SQL преобразовать binary в varchar. А потом из полученную строку средствами 1С составить УникальныйИдентификатор.
Только не могу понять — зачем тебе это надо?

(12) Что, такая большая разница? 🙂
> Microsoft’s ActiveX Data Objects (ADO) is a set of Component Object Model (COM) objects for accessing data sources.

Как получить уникальный идентификатор в запросе 1с

Сейчас приходится получать ссылки потом обходить результат запроса и получать уже уникальные идентификаторы, что не очень красиво и не очень производительно на больших выборках.

(9) Тебе запрос в любом случае придется обходить. Так что не вижу выйгрыша нигде.
(9)для накуа тебе уид?

Для передачи через веб сервис, если бы можно было получить в запросе то тогда СериализаторXDTO.ЗаписатьXDTO(Запрос.Выполнить().Выгрузить()) и все

(12)Не судьба. Придется пробегать выборку.
(12) Так у тя итак гуиды там будут
(14)сериализация ссылки и ее стрового гуида не одно и тоже

(10) Т. е. обходим результат запроса один раз — при обработке результата вызова веб-сервиса. Выигрыш в 2 раза.

(13) как бы этого избежать??
(16) Во напридумывал)) «выгрыш в 2 раза», ты замерь.

(18) Я имею в виду вместо необходимости 2 раза обходить таблицу значений, можно было бы ее обходить один раз. А если там тысячи строк?

(17) Хочешь в модуле объекта вычисляй УИД и тыкай его в отдельный реквизит, хочешь тож самое ток в регистр сведений, хош получай выборку (не выгружая) и обходи её заполняя свой XDTO объект (там эта функция которая гуид возвращает вообще почти ни че не делает)

Как получить уникальный идентификатор в запросе 1с

Загрузка. Пожалуйста, подождите.

X

Сообщение сайта

(Сообщение закроется через 2 секунды)

lensky —> lensky

Просмотр профиля

Найти сообщения пользователя

12.10.17, 10:15

Здравствуйте братье и сестры!

Помогите выцепить запросом УИД Контрагента. Вот сам собственно сам запрос ниже, а как вытащить УИД, я понятия не имею. Заранее спасибо!

ВЫБРАТЬ 
ВзаиморасчетыСКонтрагентами.Регистратор.Контрагент КАК РегистраторКонтрагент,
КонтактнаяИнформация.Объект.Ссылка,
КонтактнаяИнформация.Поле2,
КонтактнаяИнформация.Поле4,
КонтактнаяИнформация.Поле6,
КонтактнаяИнформация.Поле7

ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами
ПО КонтактнаяИнформация.Объект.Ссылка = ВзаиморасчетыСКонтрагентами.Регистратор.Контрагент.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
ПО КонтактнаяИнформация.Вид.Ссылка = ВидыКонтактнойИнформации.Ссылка
ГДЕ
ВзаиморасчетыСКонтрагентами.Регистратор.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ВзаиморасчетыСКонтрагентами.Регистратор.Проведен
И ВзаиморасчетыСКонтрагентами.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
И КонтактнаяИнформация.Вид.Ссылка = &Ссылка

СГРУППИРОВАТЬ ПО
ВзаиморасчетыСКонтрагентами.Регистратор.Контрагент,
КонтактнаяИнформация.Объект.Ссылка,
КонтактнаяИнформация.Поле2,
КонтактнаяИнформация.Поле4,
КонтактнаяИнформация.Поле6,
КонтактнаяИнформация.Поле7

УПОРЯДОЧИТЬ ПО
РегистраторКонтрагент

Сообщение отредактировал Vofka — 12.10.17, 12:20

ipsclass->input[‘t’] тема —>

Flexy —> Flexy

Просмотр профиля

Найти сообщения пользователя

12.10.17, 10:18
lensky @ Сегодня, 10:15 ,
В запросе — никак.

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

Сообщение отредактировал Flexy — 12.10.17, 10:33

Спасибо сказали: lensky,

ipsclass->input[‘t’] тема —>

lensky —> lensky

Просмотр профиля

Найти сообщения пользователя

12.10.17, 11:40

Flexy @ Сегодня, 11:18 ,

А как отобрать по данным КА из ТЗ (запрос выгружен в ТЗ) УИД и добавить отдельной колонкой. Прошу прощение за наглость, конечно, но я начинающий.

ipsclass->input[‘t’] тема —>

python —> python

Просмотр профиля

Найти сообщения пользователя

12.10.17, 11:51

lensky @ Сегодня, 12:40 ,
1. Добавить колонку в ТЗ
2. Обойти ТЗ в цикле и добавленную колонку заполнить значением.

Спасибо сказали: lensky,

ipsclass->input[‘t’] тема —>

Flexy —> Flexy

Просмотр профиля

Найти сообщения пользователя

12.10.17, 11:56
Цитата(lensky @ 12.10.17, 11:40)

А как отобрать по данным КА из ТЗ (запрос выгружен в ТЗ) УИД и добавить отдельной колонкой. Прошу прощение за наглость, конечно, но я начинающий.

Т = Запрос.Выполнить().Выгрузить();
Т.Колонки.Добавить("УИД");
Для Каждого Стр Из Т Цикл
Стр.УИД = Стр.Контрагент.УникальныйИдентификатор();
КонецЦикла;

Сообщение отредактировал Flexy — 12.10.17, 11:56

Спасибо сказали: lensky,

ipsclass->input[‘t’] тема —>

lensky —> lensky

Просмотр профиля

Найти сообщения пользователя

12.10.17, 13:04

Flexy @ Сегодня, 12:56 ,

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *