gifts2017

Выяснение ID'а объекта в базе SQL по его внутреннему идентификатору 1С

Опубликовал Mihail R (born85) в раздел Программирование - Практика программирования

Обработка позволяет узнать ID в базе SQL конкретного агрегатного объекта конфигурации (метаданных) 1С 7.7.

Обработка позволяет узнать ID в базе SQL конкретного агрегатного объекта конфигурации (метаданных) 1С 7.7.
Иногда бывает необходимость исключить или наоборот включить какой - либо элемент справочника в запрос, по наименованию или коду это сделать можно, но будет крайне не надежно, а вот по идентификатору - самое оно, его вручную простой пользователь не сможет изменить.

В обработке выбираем тип метаданных, с которым работаем (например, справочник), далее выбираем конкретный агрегатный объект (элемент) справочника, и в результате получаем его SQL ID. Остается только добавить лидирующие пробелы и можно использовать в запросах.

Скачать файлы

Наименование Файл Версия Размер
ID_sql 10
.rar 11,90Kb
27.03.12
10
.rar 11,90Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

0. Mihail R (born85) 27.03.12 14:10
Обработка позволяет узнать ID в базе SQL конкретного агрегатного объекта конфигурации (метаданных) 1С 7.7.


Перейти к публикации

1. Сергей Рудаков (fishca) 27.03.12 14:10
(0) можно поподробнее про практическую ценность обработки расписать, где применять и в каких случаях?

В обработке выбираем тип метОданных с которым работаем - поправь :)
2. Mihail R (born85) 27.03.12 14:24
Поправить орфографическую ошибку в описании не сложно - а так же потом ждать пока промодерируют (проверят публикацию, некоторое время данная публикация будет недоступна).
Думаю не будет сильно критичным если пока останется так ?!
Если есть замечания по функционалу я с удовольствием выслушаю.

Отвечу Вам так, если вы программист - вам будет полезна данная обработка для отладки и для написания запросов.
Если вы обычный пользователь - то думаю Вам она не понадобится.

Для программиста:
Практическая ценность данной обработки в написании запросов на языке sql, к примеру когда нет возможности использовать метапарсер любезно предоставленный 1c++ библиотекой (1cpp.dll), а нужно напрямую взять данные из соседней базы исключив определенной значение. Вот как раз Id этого значения вы можете получить с помощью данной обработки. Мне часто помогает в 1с 7.7 или SQL Server Management Studio при написании запросов использование данной обработки.

Думаю что программистам 1с, которые пишут частенько для версии 7.7 - тоже будет полезна обработка.
3. Юрий Осипов (yuraos) 27.03.12 16:20
(2) born85, почему только SQL ???
Вот ето работает для любой базы:

//*******************************************
Функция ПолучитьВнутреннийКод(Объект,v7="") Экспорт
	Если ТипЗначенияСтр(v7)="OLE" Тогда
		Стр = v7.ValueToStringInternal(Объект); //для объектов ОЛЕ
	Иначе
		Стр = ЗначениеВСтрокуВнутр(Объект);
	КонецЕсли;
	Код = СтрЗаменить(Стр, ",", РазделительСтрок);
	Код = СокрЛП(СтрПолучитьСтроку(Код, СтрКоличествоСтрок(Код)));
	Код = Прав(СтрЗаменить(Код,"""}",""),13);
	Префикс = СтрЗаменить(Прав(Код,3)," ","_");
	Код = Число(Лев(Код,СтрДлина(Код)-3));
	Код = Прав("______"+СокрЛ(_idtostr(Код)),6);
	ВыхЗнач = Код+Префикс;
	Возврат ВыхЗнач;
КонецФункции //ПолучитьВнутреннийКод()
...Показать Скрыть


причем адаптировано (как видно) и для объектов полученных по OLE.
4. Юрий Осипов (yuraos) 27.03.12 16:26
(1) fishca,
с моей точки зрения,
основная практическая значимость - синхронизация объектов в разных базах по внутренним идентификаторам
(а не по кодам и номерам, доступных юзерам для изменения).
5. Юрий Осипов (yuraos) 27.03.12 16:35
(2) born85,
Писать запросы, используя внутренние 1с-овские имена таблиц и полей - это ЖЕСТЬ!
Склоняю голову пред вашим усердием!
:))))))))))
А что за проблемы с 1с++ ???
6. Сергей Рудаков (fishca) 27.03.12 16:53
(4) а внутренние идентификаторы в разных базах разве могут быть гарантированно одинаковые для двух элементов справочника?
7. Mihail R (born85) 27.03.12 16:57
(5) yuraos,

Я пользуюсь метапарсером, любезно предоставленным 1с++, но иногда возникает нужда заглянуть в до базу, а то и в 3-4 базы (разные БД SQL 1с 7.7) и проверить некоторые данные. Как Вам будет известно уважаемый "yuraos", в 3х базах в обработке вызываемой в 1й бд 1с, невозможно использовать метапарсер, или что то поменялось и Вы можете использовать метапарсер используя 2 и более разных баз SQL в одном запросе? в вызываемой обработке в 1(первой бд 1с) ?? о_О

Простейший пример, для наглядности (основной запрос на метапарсере, а вот ид (скриншот №2 "

Работа со справочником") и название таблицы в условие из др базы получен обработкой в топике)

тз = rs1c.ВыполнитьИнструкцию("

Select
Ном.id [$Справочник.Номенклатура]
From $Справочник.Номенклатура Ном (nolock)

Where Ном.Descr = (Select N.descr From 'Путь до др бд '.SC84 N (nolock) where N.id = ' 2КАЙ ')

");
8. Mihail R (born85) 27.03.12 17:00
(6) fishca, Нет в каждой бд - иды уникальны в рамках этой бд ! Для этого и обработка, что бы посмотреть в конкретной (в которой запускаете обработку) бд - ид того или иного элемента, а также название таблицы!
9. Сергей Рудаков (fishca) 27.03.12 17:20
10. Mihail R (born85) 27.03.12 17:46
11. Юрий Осипов (yuraos) 28.03.12 18:13
(6) fishca,
в 1С-7.7 (в отличии от 1С-8.х)
поле ID уникально в рамках одной БД и одной таблицы данных (одного справочника).
В других базах и таблицах справочников значения ID естественно могут повторяться.

Тем не менее эти значения ID можно использовать для синхронизации объектов разных баз,
сохраняя его в реквизите синхронизуемого объекта,
а лутше в реквизите специального справочника
( регистра сведений, если синхронизуются объекты из базы 1С-8.х с базой 1С-7.7 )
хранящего соответствие ссылок на объектов в базе с объектами других баз.

PS
В 1С-8.x в качестве значений полей ID используются значения GUID (128-битные случайные числа).
Соответственно их уникальность определяется уникальностью этих GUID.
Как говорят, если генирить GUID раз в секунду,
то СРЕДНЕСТАТИСТИЧЕСКИ они станут повторяться где-то через миллион лет.
Хотя 100% гарантии уникальности GUID нет (вероятность повторения хоть очень мала но отлична от нуля)
они активно использяются в базах данных для генерации уникальных идентификаторов.
---
Вот будет прикольно при, если кому-то здорово не повезет
и у него будет два разных объекта с одним значением ссылки в восьмерошной базе.
:)))
12. Юрий Осипов (yuraos) 28.03.12 18:19
(7) born85, ну ты крут!!!
;)))
Кстати, если метапарсер не нужен (в запросах использованы только внутренние имена)
прямые запросы к другим БД можно делать не через 1с++, а через ADO.
ЗЫ:
Правда это все равно ЖЕСТЬ!
Добавил справочник или константу и
с большой вероятностью внутренние имена используемые
в запросе уже изменятся при реорганизации данных.
13. Юрий Осипов (yuraos) 28.03.12 18:23
(7) born85, слушай ...
...а запросы к итогам по регистрам ты тоже через внутренние имена делаешь
(когда их надо цапнуть из другой базы) ???
14. Mihail R (born85) 28.03.12 18:44
С регистрами из др базы не приходилось работать. А в той базе, где запускали обработку или различные процедуры надобность было сделать - писал через метапарсер 1с++.

Проблемы работы с регистрами и в др базе, если взять с помощью этой обработки названия таблиц и прочее не вижу...
15. Саня Пупкин (pupkinSana) 29.03.12 10:09
Я пользуюсь Айди объекта для восстановления Объектов которые непосредственно удалили. http://infostart.ru/public/104414/
Теоретически конечно можно и перекачки прямыми реализовать. Все возможно теперь в 1с77, благодаря формекс, 1с++.
16. Епрст (Ёпрст) 29.03.12 12:11
Я пользуюсь метапарсером, любезно предоставленным 1с++, но иногда возникает нужда заглянуть в до базу, а то и в 3-4 базы (разные БД SQL 1с 7.7) и проверить некоторые данные. Как Вам будет известно уважаемый "yuraos", в 3х базах в обработке вызываемой в 1й бд 1с, невозможно использовать метапарсер, или что то поменялось и Вы можете использовать метапарсер используя 2 и более разных баз SQL в одном запросе? в вызываемой обработке в 1(первой бд 1с)


Да уж.. Это означает всего лишь, что вы не знакомы с всеми возможностями 1срр
И никакой трудности в использовании метапарсера в запросе к сторонней базе нет, что в SQL , что DBF варианте ИБ.
Он прекрасно работает, более того, его можно использовать для запросов, которые обращаются одновременно к табличкам из разных баз.

Так что, ценность вашей поделки минимальна, тем более, баян про ЗначениеВСтрокуВнутр и получение ИД, которое еще с незапамятных времён валялось на синьёре
http://my1c-archive.narod.ru/knowhow/get_id.html
17. Mihail R (born85) 29.03.12 13:22
(16) Ёпрст, Уважаемый, вы бы выложили полноценный пример с базами и продемонстрировали свои знания. А так я вижу лишь пример кода, к тому же написанный не Вами.
И к тому же, никто не заставляет Вас пользоваться чем то чужим, напишите свое - лучше, и выложите в сеть,а мы оценим ).
18. Епрст (Ёпрст) 29.03.12 18:01
(17) Если вы чего то не знаете, то это не означает, что этого нет.
Примеры к запросам в сторонней базе я неоднократно выкладывал на других ресурсах.
Да и поиск по форуму http://www.1cpp.ru/forum/YaBB.pl?board=query рулит

А код получения ИД с синьёры я привёл в качестве бояна, который известен еще с начала зарождения семёрки
19. Епрст (Ёпрст) 29.03.12 18:28
Вот пример для дбф базы - получает клиентосов в сторонней базе с синхронизацией по коду:
Для скуля всё гораздо проще.
Прикрепленные файлы:
_ЗапросКВнешнейБазеСинхронизацияПоКоду.ert
20. Mihail R (born85) 29.03.12 18:37
1) После запуска вашей обработки:
глОлеДБ = СоздатьОбъект("OLEDBData");
{C:\_ЗАПРОСКВНЕШНЕЙБАЗЕСИНХРОНИЗАЦИЯПОКОДУ.ERT(40)}: Неудачная попытка создания объекта (OLEDBData)

2) Даже исправив ошибку обработка не позволила ОДНОВРЕМЕННО (акцент на одновременно) использовать метапарсер в нескольких разных бд sql.

3) Если Вам что то не нравится - это Ваша личная беда. :)
21. Епрст (Ёпрст) 29.03.12 18:49
(20) читаем вниматочно:
"пример для дбф базы "
22. Епрст (Ёпрст) 29.03.12 18:50
для скуля всего лишь нужно ПрисоединитьИБ + ПрисоединитьМД использовать
23. Mihail R (born85) 29.03.12 18:51
(21) Ёпрст, Здесь, в теме идет речь о Sql бд вообще то хD
24. Епрст (Ёпрст) 29.03.12 18:52
25. Епрст (Ёпрст) 29.03.12 18:54
формат ИБ не имеет никакого отношения к получению ИД объекта и уж темболее, к выполнению запрроса к сторонней базе с использованием метапарсера.
И уж подавно, имена табличек никто руками не пишет.
Разве что запрос в адо или руками пишется текст хранимки (хотя его проще с помощью той же 1cpp написать)
26. Mihail R (born85) 29.03.12 18:58
(25) Ёпрст, Уважаемый ! Речь идет о SQL БД + 1с 7.7 в данной публикации.
А вы говорите совершенно про др вещи.

В прочем. Это все го лишь Ваш спам ). Если у вас будут адекватные пожелания и предложения - я с удовольствием их выслушаю, а обсуждать бредятину - уж увольте, тратить время свое нет не желания, ни смысла.

Всего Вам хорошего. С уважением автор публикации.

П\С: Прошу не выражаться нецензурными выражениями (что вы выше ругаетесь ) и соблюдать порядок - это Вас не красит, а весьма негативное впечатление складывается о Вас, как о человеке и разработчике .
27. Епрст (Ёпрст) 29.03.12 19:09
Ну че тут сказать, раз ты не в силе осмыслить работу с методом ПрисоединитьМД+ОбрМетаSQL

то селяви - дураков учитьт - только портить

Можешь и дальше мои сообщения в спам отправлять
Мне лень пример для скуля писать
28. Mihail R (born85) 29.03.12 19:12
(27) Ёпрст, Уважаемый, вы даже не показали на метапарсере простейший пример обращения к неск базам sql одновременно в подтверждение своих слов. Думаю тут и так понятно что вы не отвечаете за свои слова. В прочем действительно - что вас учить :). Всего доброго ).
29. Епрст (Ёпрст) 29.03.12 19:29
На, только не плачь

И это - RTFM


Процедура Сформировать()
	
	
	рс=создатьОбъект("ODBCRecordSet");
	
 	ТекстЗапроса = "
	|SELECT
	|    СпрНаш.DESCR as КлиентосВЭтойбазе  -- наименование клиентоса в  этой базе, можно и не присоединять справочник, а просто типизировать
	|    ,Спр.DESCR as КлиентосВУдаленнойБазе --наименование клиентоса в удаленной базе
	|FROM $Справочник.Контрагенты СпрНаш
	|left join dataBase2.dbo.@Справочник.Контрагенты Спр on СпрНаш.Code = Спр.Code
	|";	
	глМД = СоздатьОбъект("MetaDataWork");
	ТекстЗапроса=глМД.ОбрМетаСКЛ(ТекстЗапроса);
	глМД2 = СоздатьОбъект("MetaDataWork");
	ПутьКБазе2 = "D:\полный путьк базе данных\";
	глМД2.ПрисоединитьМД(ПутьКБазе2+"1Cv7.md");
	ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"@","$");
	ТекстЗапроса=глМД2.ОбрМетаСКЛ(ТекстЗапроса);
	
    Т = рс.ВыполнитьИнструкцию(ТекстЗапроса);
	Т.ВыбратьСтроку();

КонецПроцедуры
...Показать Скрыть
30. Mihail R (born85) 29.03.12 20:25
(29) Ёпрст, Если у тебя будет более 2х то получается так же не совсем удобно....
31. Епрст (Ёпрст) 29.03.12 21:24
(30) Что именно не удобно ?!
смотрим пример в (19) .. оборачиваем пример в (29) в функцию по-аналогии и хоть 100 баз в одном тексте запроса.
И НИГДЕ имена табличек и полей в явном виде не указываются.

Тем самым достигается максимальная универсиализация..
А твой код в любой другой базе можно в топку выкинуть - имена полей то руктями заданы.
В общем - прошлый век и времена забытого ado
32. Mihail R (born85) 30.03.12 04:30
(31) Ёпрст, Если вам потребуется в других нескольких баз исключить по иду элементы в выборке, что вы будите делать? Вот как раз к этой обработке же и обратитесь что бы посмотреть ид элемента.

Да код в др базе не будет работать - потому как явно указываются иды элементов. Так это пишется по конкретно свою бд обычно, а никто не говорил про универсальность - универсальность это сама обработка которая будет работать в любой sql бд и показывать иды интересующих объектов.
33. Епрст (Ёпрст) 30.03.12 13:44
(32) :))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

Ну ясно, с 1cpp ты вообще не знаком.

других нескольких баз исключить по иду элементы в выборке, что вы будите делать


Соберу их в список значений и установлю в качестве параметра запроса.
34. Епрст (Ёпрст) 30.03.12 13:46
Более того, сделаю МФ прямо на форме.
И будет фиолетово, объект какой базы будет в этом МФ.

И уж поверь мне, знать id элемента справочника (или iddoc документа) и тем более, прописывать его явно в коде даже в голову не взбредёт.
35. Mihail R (born85) 30.03.12 18:50
(34) Ёпрст, Ну парься таким образом, а вот мне когда нужно исключить пару объектов, или условия поставить ( а базы у нас не меняются хД) то проще по быстрому ид узнать - намного по времени быстрее будет.

Твой пример заслуживает внимания. Но в маштабах единого предприятия с несколькими базами - твоя идея пуста.

А пользоваться или нет обработкой - так тебя никто не заставляет. Так что СеЛяви.
36. Епрст (Ёпрст) 02.04.12 09:13
Но в маштабах единого предприятия с несколькими базами - твоя идея пуста.


Слив засчитан
37. Mihail R (born85) 02.04.12 09:29
(36) Ёпрст, Да мне как то пофиг на "твои сливы", не нравится не пользуйся (тебе еще в начале об этом писалось) - люди +ют значит востребовано!
38. Епрст (Ёпрст) 02.04.12 09:59
Дурилка, тебя всего лишь ткнули носом в твоё не знание возможностей компоненты 1cpp.dll
с помощью которой отсутствует необходимость получения имён полей руктями, ибо всё это делает метапарсер.

Вот и учи вас потом опосля этого.
39. Mihail F (ghoster) 15.07.12 07:33
Хорошая обработка, плюсую..
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа