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



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

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

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

39 Comments

  1. born85

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

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

    Reply
  2. fishca

    (0) можно поподробнее про практическую ценность обработки расписать, где применять и в каких случаях?

    В обработке выбираем тип метОданных с которым работаем — поправь 🙂

    Reply
  3. born85

    Поправить орфографическую ошибку в описании не сложно — а так же потом ждать пока промодерируют (проверят публикацию, некоторое время данная публикация будет недоступна).

    Думаю не будет сильно критичным если пока останется так ?!

    Если есть замечания по функционалу я с удовольствием выслушаю.

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

    Если вы обычный пользователь — то думаю Вам она не понадобится.

    Для программиста:

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

    Думаю что программистам 1с, которые пишут частенько для версии 7.7 — тоже будет полезна обработка.

    Reply
  4. yuraos

    (2) почему только SQL ???

    Вот ето работает для любой базы:

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

    Показать

    причем адаптировано (как видно) и для объектов полученных по OLE.

    Reply
  5. yuraos

    (1) fishca,

    с моей точки зрения,

    основная практическая значимость — синхронизация объектов в разных базах по внутренним идентификаторам

    (а не по кодам и номерам, доступных юзерам для изменения).

    Reply
  6. yuraos

    (2)

    Писать запросы, используя внутренние 1с-овские имена таблиц и полей — это ЖЕСТЬ!

    Склоняю голову пред вашим усердием!

    :))))))))))

    А что за проблемы с 1с++ ???

    Reply
  7. fishca

    (4) а внутренние идентификаторы в разных базах разве могут быть гарантированно одинаковые для двух элементов справочника?

    Reply
  8. born85

    (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КАЙ ‘)

    «);

    Reply
  9. born85

    (6) fishca, Нет в каждой бд — иды уникальны в рамках этой бд ! Для этого и обработка, что бы посмотреть в конкретной (в которой запускаете обработку) бд — ид того или иного элемента, а также название таблицы!

    Reply
  10. fishca

    (8) спасибо.

    Reply
  11. born85

    (9) fishca, На здоровье!

    Reply
  12. yuraos

    (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 нет (вероятность повторения хоть очень мала но отлична от нуля)

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



    Вот будет прикольно при, если кому-то здорово не повезет

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

    :)))

    Reply
  13. yuraos

    (7) ну ты крут!!!

    ;)))

    Кстати, если метапарсер не нужен (в запросах использованы только внутренние имена)

    прямые запросы к другим БД можно делать не через 1с++, а через ADO.

    ЗЫ:

    Правда это все равно ЖЕСТЬ!

    Добавил справочник или константу и

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

    в запросе уже изменятся при реорганизации данных.

    Reply
  14. yuraos

    (7) слушай …

    …а запросы к итогам по регистрам ты тоже через внутренние имена делаешь

    (когда их надо цапнуть из другой базы) ???

    Reply
  15. born85

    С регистрами из др базы не приходилось работать. А в той базе, где запускали обработку или различные процедуры надобность было сделать — писал через метапарсер 1с++.

    Проблемы работы с регистрами и в др базе, если взять с помощью этой обработки названия таблиц и прочее не вижу…

    Reply
  16. pupkinSana

    Я пользуюсь Айди объекта для восстановления Объектов которые непосредственно удалили. http://infostart.ru/public/104414/

    Теоретически конечно можно и перекачки прямыми реализовать. Все возможно теперь в 1с77, благодаря формекс, 1с++.

    Reply
  17. Ёпрст
    Я пользуюсь метапарсером, любезно предоставленным 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

    Reply
  18. born85

    (16) Ёпрст, Уважаемый, вы бы выложили полноценный пример с базами и продемонстрировали свои знания. А так я вижу лишь пример кода, к тому же написанный не Вами.

    И к тому же, никто не заставляет Вас пользоваться чем то чужим, напишите свое — лучше, и выложите в сеть,а мы оценим ).

    Reply
  19. Ёпрст

    (17) Если вы чего то не знаете, то это не означает, что этого нет.

    Примеры к запросам в сторонней базе я неоднократно выкладывал на других ресурсах.

    Да и поиск по форуму http://www.1cpp.ru/forum/YaBB.pl?board=query рулит

    А код получения ИД с синьёры я привёл в качестве бояна, который известен еще с начала зарождения семёрки

    Reply
  20. Ёпрст

    Вот пример для дбф базы — получает клиентосов в сторонней базе с синхронизацией по коду:

    Для скуля всё гораздо проще.

    Reply
  21. born85

    1) После запуска вашей обработки:

    глОлеДБ = СоздатьОбъект(«OLEDBData»);

    {C:\_ЗАПРОСКВНЕШНЕЙБАЗЕСИНХРОНИЗАЦИЯПОКОДУ.ERT(40)}: Неудачная попытка создания объекта (OLEDBData)

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

    3) Если Вам что то не нравится — это Ваша личная беда. 🙂

    Reply
  22. Ёпрст

    (20) читаем вниматочно:

    «пример для дбф базы «

    Reply
  23. Ёпрст

    для скуля всего лишь нужно ПрисоединитьИБ + ПрисоединитьМД использовать

    Reply
  24. Ёпрст

    (23) Какая нах разница ?!

    Reply
  25. Ёпрст

    формат ИБ не имеет никакого отношения к получению ИД объекта и уж темболее, к выполнению запрроса к сторонней базе с использованием метапарсера.

    И уж подавно, имена табличек никто руками не пишет.

    Разве что запрос в адо или руками пишется текст хранимки (хотя его проще с помощью той же 1cpp написать)

    Reply
  26. born85

    (25) Ёпрст, Уважаемый ! Речь идет о SQL БД + 1с 7.7 в данной публикации.

    А вы говорите совершенно про др вещи.

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

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

    ПС: Прошу не выражаться нецензурными выражениями (что вы выше ругаетесь ) и соблюдать порядок — это Вас не красит, а весьма негативное впечатление складывается о Вас, как о человеке и разработчике .

    Reply
  27. Ёпрст

    Ну че тут сказать, раз ты не в силе осмыслить работу с методом ПрисоединитьМД+ОбрМетаSQL

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

    Можешь и дальше мои сообщения в спам отправлять

    Мне лень пример для скуля писать

    Reply
  28. born85

    (27) Ёпрст, Уважаемый, вы даже не показали на метапарсере простейший пример обращения к неск базам sql одновременно в подтверждение своих слов. Думаю тут и так понятно что вы не отвечаете за свои слова. В прочем действительно — что вас учить :). Всего доброго ).

    Reply
  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.ОбрМетаСКЛ(ТекстЗапроса);
    
    Т = рс.ВыполнитьИнструкцию(ТекстЗапроса);
    Т.ВыбратьСтроку();
    
    КонецПроцедуры

    Показать

    Reply
  30. born85

    (29) Ёпрст, Если у тебя будет более 2х то получается так же не совсем удобно….

    Reply
  31. Ёпрст

    (30) Что именно не удобно ?!

    смотрим пример в (19) .. оборачиваем пример в (29) в функцию по-аналогии и хоть 100 баз в одном тексте запроса.

    И НИГДЕ имена табличек и полей в явном виде не указываются.

    Тем самым достигается максимальная универсиализация..

    А твой код в любой другой базе можно в топку выкинуть — имена полей то руктями заданы.

    В общем — прошлый век и времена забытого ado

    Reply
  32. born85

    (31) Ёпрст, Если вам потребуется в других нескольких баз исключить по иду элементы в выборке, что вы будите делать? Вот как раз к этой обработке же и обратитесь что бы посмотреть ид элемента.

    Да код в др базе не будет работать — потому как явно указываются иды элементов. Так это пишется по конкретно свою бд обычно, а никто не говорил про универсальность — универсальность это сама обработка которая будет работать в любой sql бд и показывать иды интересующих объектов.

    Reply
  33. Ёпрст

    (32) :))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

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

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

    Соберу их в список значений и установлю в качестве параметра запроса.

    Reply
  34. Ёпрст

    Более того, сделаю МФ прямо на форме.

    И будет фиолетово, объект какой базы будет в этом МФ.

    И уж поверь мне, знать id элемента справочника (или iddoc документа) и тем более, прописывать его явно в коде даже в голову не взбредёт.

    Reply
  35. born85

    (34) Ёпрст, Ну парься таким образом, а вот мне когда нужно исключить пару объектов, или условия поставить ( а базы у нас не меняются хД) то проще по быстрому ид узнать — намного по времени быстрее будет.

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

    А пользоваться или нет обработкой — так тебя никто не заставляет. Так что СеЛяви.

    Reply
  36. Ёпрст
    Но в маштабах единого предприятия с несколькими базами — твоя идея пуста.

    Слив засчитан

    Reply
  37. born85

    (36) Ёпрст, Да мне как то пофиг на «твои сливы», не нравится не пользуйся (тебе еще в начале об этом писалось) — люди +ют значит востребовано!

    Reply
  38. Ёпрст

    Дурилка, тебя всего лишь ткнули носом в твоё не знание возможностей компоненты 1cpp.dll

    с помощью которой отсутствует необходимость получения имён полей руктями, ибо всё это делает метапарсер.

    Вот и учи вас потом опосля этого.

    Reply
  39. ghoster

    Хорошая обработка, плюсую..

    Reply

Leave a Comment

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