|
v7: Подскажите про таблицу констант? | ☑ | ||
---|---|---|---|---|
0
Zhuravlik
24.05.13
✎
14:27
|
Добрый день. Понадобилось выбрать данные из _1S.CONST, вот читаю про ее структуру, не могу понять:
OBJID - ID объекта периодического реквизита (справочника) или периодической константы, для непериодических констант это поле равно ‘ 0 ’. Тип - Строка(9). Т.е. поле "OBJID" - это элемент, которому принадлежит установленное значение периодического реквизита? ------- ID - ID (идентификатор) константы или периодического реквизита справочника. Тип представлен в виде десятичного числа (_StrToID()). Тип - Число(int). Это вид объекта? Что значит "идентификатор периодического реквизита справочника", если это ссылка на значение пер. реквизита, то зачем это нужно, он ведь уже сохранен в VALUE (Значение константы или периодического реквизита. Для неопределенных типов по умолчанию заполняется «U». Тип- Строка(255).)? |
|||
1
Zhuravlik
24.05.13
✎
16:02
|
ап.. так и не разберусь... что такое OBJID и что такое ID, подскажите кто-нибудь...
|
|||
2
Zhuravlik
24.05.13
✎
16:02
|
+ Вернее, что такое OBJID уже понял, ID - не пойму.
|
|||
3
toypaul
гуру
24.05.13
✎
16:04
|
это ИД периодического реквизита
|
|||
4
toypaul
гуру
24.05.13
✎
16:05
|
||||
5
Zhuravlik
24.05.13
✎
16:06
|
(4) Спасибо огромное)
|
|||
6
toypaul
гуру
24.05.13
✎
16:06
|
ID нужен чтобы отличить записи по разным периодическим полям в справочнике.
|
|||
7
Zhuravlik
24.05.13
✎
16:15
|
(3) Т.е. это его "Вид()"? Я так подумал сначала (делал запрос выводил все поля, там строки длиной 4 символа), но отбор с фильтром по виду этого поля вернул пустую таблицу, а значения точно есть.
|
|||
8
Zhuravlik
05.06.13
✎
10:38
|
Подскажите пожалуйста, так и не разобрался что такое ID. В (4) написано "идентификатор периодического реквизита (идентификатор метаданных)", но я не понимаю как по нему условие делать в запросе.
Есть элемент справочника "Тест", у него периодический реквизит "пРеквизит". Я так понимаю что ID - это ссылка на "пРеквизит". Но как по нему поставить условие? Вот мне надо выбрать из таблицы констант значения для определенного реквизита. Я пишу: SELECT Константы.value as [Значение] FROM [_1S.CONST] as Константы WHERE Константы.OBJID = :Тест AND Константы.ID = 'пРеквизит' Условие "Константы.ID = 'пРеквизит'" - неправильное, просто у меня задача сделать фильтр по нему, а как его в значение фильтра передать - не пойму. Там строка 4 символа... |
|||
9
Mikeware
05.06.13
✎
10:42
|
(8) ты идентификатор от названия - отличаешь?
|
|||
10
hyperfocusin
05.06.13
✎
10:43
|
неужели кто-то ещё 7ку юзает
|
|||
11
Mikeware
05.06.13
✎
10:43
|
+(9) и там НЕ "строка 4 символа."
|
|||
12
Mikeware
05.06.13
✎
10:44
|
(10) стабильная система, устойчивая.
|
|||
13
viktor_vv
05.06.13
✎
10:44
|
(8) Это внутренний идентификатор реквизита в конфе, не значение которое там хранится.
В 1С++ в metadatawork можно получить его значение ИДРеквизитаСправочника(<?>) Синтаксис: ИДРеквизитаСправочника(<НомИмяСпр>,<НомИмяРекв>) Назначение: возвращает внутренний номер реквизита справочника по его идентификатору или порядковому номеру. Возвращаемое значение: (Число) внутренний ид реквизита справочника. Параметры: <НомИмяСпр> - (строка/число) идентификатор справочника или порядковый номер определяется от 1 до Метаданные.Справочник(); <НомИмяРекв> - (строка/число) идентификатор реквизита или порядковый номер определяется от 1 до Метаданные.Справочник(х).Реквизит(); |
|||
14
viktor_vv
05.06.13
✎
10:45
|
(10) А чем вызвано такое удивление ?
Или ЧСВ охота поднять, какой ты прогрессивный, и юзаешь восьмерку :). |
|||
15
Zhuravlik
05.06.13
✎
10:48
|
(9) Отличаю, я заведомо неправильно это написал, чтобы понятно было что я хочу.
(11) В запросе с условием на элемент справочника мне возвращается в поле ИД именно строка в 4 символа. Типа такого: " 4JR" (4) (13) А в самом запросе как-то можно на него указать? Наподобие :ВидСправочника.Тест ? |
|||
16
Zhuravlik
05.06.13
✎
10:51
|
(13) Спасибо)
|
|||
17
Zhuravlik
05.06.13
✎
10:55
|
(13) Это не то...
|
|||
18
Zhuravlik
05.06.13
✎
10:56
|
Попробовал, значения которое мне возвращает этот метод нет ни в одной ячейке id, в результате запроса с фильтром по элементу...
|
|||
19
Zhuravlik
05.06.13
✎
11:04
|
спр_ТС = СоздатьОбъект("Справочник.АВТ_ТранспортныеСредства");
спр_ТС.НайтиПоНаименованию("У 035 ОН 36", 0); База = СоздатьОбъект("SQLiteBase"); База.Открыть(":memory:"); Запрос = База.НовыйЗапрос(); ТекстЗапроса = " |SELECT | * |FROM | [_1S.CONST] as Константа |WHERE | Константа.OBJID = :ТС AND (1=1) |"; Мета = СоздатьОбъект("MetaDataWork"); ркОдометр = Мета.ИДРеквизитаСправочника("АВТ_ТранспортныеСредства", "прОдометр"); Сообщить("""" + ркОдометр + """"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "(1=1)", "Константа.ID = '" + ркОдометр + "'"); Запрос.Подставлять("ТС", спр_ТС.ТекущийЭлемент()); тз = Запрос.ВыполнитьЗапрос(ТекстЗапроса); ркОдометр - число, более 4 символов. А в тз в поле ID именно 4-символьные строки, и там понятное дело такой фильтр не проходит. Искал примеры на 1С++, что-то не нашел ничего... |
|||
20
Mikeware
05.06.13
✎
11:06
|
(17) это как раз то. Ид вида метаданных. он же - номер таблицы хранения.
|
|||
21
Zhuravlik
05.06.13
✎
11:08
|
(20) Я не понимаю( Почему тогда я в поле ИД вижу строку, а этот метод мне возвращает цифры?
|
|||
22
viktor_vv
05.06.13
✎
11:10
|
(19) Че-то я не пойму, все нормально работает.
ТекстЗапроса = " |Select TOP 100 | Константы.ObjID as [ТМЦ $Справочник.ТМЦ], | Константы.ID as ИДРек |From | _1Sconst as Константы |Where | Константы.ID = :ИДРек |"; ИДРек = глМетадата.ИДРеквизитаСправочника("ТМЦ","ЦенаПрайс"); Сообщить(""+ИДРек); глЗапросСКЛ.УстановитьТекстовыйПараметр("ИДРек",ИДРек); ТЗ = глЗапросСКЛ.ВыполнитьИнструкцию(ТекстЗапроса); ТЗ.ВыбратьСтроку(); В колонке | Константы.ID as ИДРек показывает число, котрое по сообщить выходит. |
|||
23
Zhuravlik
05.06.13
✎
11:10
|
(13), (20) Вот чего нашел:
http://infostart.ru/public/63125/ мд.ИДОбъекта(метаданные.Справочник("Цены").Реквизит("Цена")) |
|||
24
Zhuravlik
05.06.13
✎
11:12
|
(22) Это мои значения поля ID:
4JR 4JS 4K3 4K4 4KN 4KL HJ2 Q18 OF9 T4P XD9 Q18 4JR 4JS 4K0 4K3 4K4 4KN 4KL HJ2 |
|||
25
Zhuravlik
05.06.13
✎
11:12
|
+ Это ведь совсем не цифры?
|
|||
26
viktor_vv
05.06.13
✎
11:13
|
(25) А база у тебя скульная, хотя на это не должно влиять по идее.
|
|||
27
Zhuravlik
05.06.13
✎
11:16
|
(26) dbf, запросы на sqlite
|
|||
28
Zhuravlik
05.06.13
✎
11:17
|
(23) и так не выходит
|
|||
29
viktor_vv
05.06.13
✎
11:21
|
Да, в ДБФ походу это 16-ричное представление, или 36.
|
|||
30
Zhuravlik
05.06.13
✎
11:22
|
(29) Пробовал делать условие на Str2Id(Константа.ID) - тоже не проходит. Сейчас значит буду рыть как преобразовать число в 16-ричное и подставлю в запрос.
|
|||
31
Mikeware
05.06.13
✎
11:23
|
(29) с чего вдруг 16?
|
|||
32
Zhuravlik
05.06.13
✎
11:24
|
(31) С того, что у меня условие на Str2Id(Константа.ID) не прошло. Значит это 16...
|
|||
33
Mikeware
05.06.13
✎
11:28
|
(32) и "J" "R" - это,конечно, цифры 16-ричной системы....
|
|||
34
Ёпрст
05.06.13
✎
11:29
|
(32) ну и каша у тебя в бошке.
|
|||
35
Mikeware
05.06.13
✎
11:29
|
(32) посмотрел, лействительн, в ДБФ - это строк. неисповедимы пути нуралиева...
|
|||
36
Mikeware
05.06.13
✎
11:30
|
(34) ну, не самая уж страшная... мноние намного хуже...
|
|||
37
ЧеловекДуши
05.06.13
✎
11:30
|
(24) Нормальный цифры в 36-ричном виде :)
|
|||
38
viktor_vv
05.06.13
✎
11:30
|
(31) Да так предположил, правда оно там и не 16 и не 36.
(33) Упс, точно :). Пытаюсь понять как же его там получить, но не совпадает. ТекстЗапроса = " |Select | * | |From | [_1S.CONST] as Конст |Where | Конст.ObjID = :фасПоставщик |"; ИДРек = глМетадата.ИДРеквизитаСправочника("Поставщики","ДоГраницы"); ИДРек16 = глМетадата.ЧислоВСтроку(ИДРек,36) ; Сообщить(""+ИДРек + " "+ИДРек16); НовыйЗапрос = глБазаСКЛ.НовыйЗапрос(); НовыйЗапрос.Подставлять("ИДРек",ИДРек16) ; НовыйЗапрос.Подставлять("фасПоставщик",фасПоставщик) ; ТЗ = НовыйЗапрос.ВыполнитьЗапрос(ТекстЗапроса ) ; |
|||
39
Zhuravlik
05.06.13
✎
11:31
|
(34) Знаю. Расхлебываю потихоньку)
А почему тогда мне Str2Id(Константа.ID) возвращает не то? Синтаксис: str2id(СтрИД) Параметры: СтрИД: Строка представляющая число в 36ричной записи Возвращает: Целое число. Описание: Преобразует строку - запись числа в 36ричном формате в целое число. |
|||
41
Mikeware
05.06.13
✎
11:36
|
(39) странно. скорми строку _StrToId()
|
|||
42
Zhuravlik
05.06.13
✎
11:38
|
(41) no such function: _StrToId
|
|||
43
ADirks
05.06.13
✎
11:38
|
ID:
Прав(" "+МДВ.ЧислоВСтроку(МДВ.ИДОбъекта(Метаданные.Справочник("Сотрудники").Реквизит("Подразделение")), 36), 4) |
|||
44
Ёпрст
05.06.13
✎
11:40
|
(43) вот только автору, всё это не нужно в запросе, там и так всё есть
|
|||
45
Ёпрст
05.06.13
✎
11:40
|
:)
|
|||
46
Ёпрст
05.06.13
✎
11:40
|
просто это он еще не знает
|
|||
47
ADirks
05.06.13
✎
11:41
|
не, ну ему ж для начала понять надо, чё как. А так наглядней
|
|||
48
viktor_vv
05.06.13
✎
11:42
|
(43) Точно.
ТекстЗапроса = " |Select | * | |From | [_1S.CONST] as Конст |Where | Конст.ObjID = :фасПоставщик | and Trim(Конст.ID) = :ИДРек |"; ИДРек = глМетадата.ИДРеквизитаСправочника("Поставщики","ДоГраницы"); ИДРек36 = глМетадата.ЧислоВСтроку(ИДРек,36) ; Сообщить(""+ИДРек + " "+ИДРек36); НовыйЗапрос = глБазаСКЛ.НовыйЗапрос(); НовыйЗапрос.Подставлять("ИДРек",ИДРек36) ; НовыйЗапрос.Подставлять("фасПоставщик",фасПоставщик) ; ТЗ = НовыйЗапрос.ВыполнитьЗапрос(ТекстЗапроса ) ; //глЗапросСКЛ.УстановитьТекстовыйПараметр("ИДРек",ИДРек); //ТЗ = глЗапросСКЛ.ВыполнитьИнструкцию(ТекстЗапроса); // ТЗ.ВыбратьСтроку(); |
|||
49
Mikeware
05.06.13
✎
11:42
|
(42) _StrToId("4JR") = 5895
чянтд? |
|||
50
viktor_vv
05.06.13
✎
11:42
|
Лучше таки без Trim .
|
|||
51
Zhuravlik
05.06.13
✎
11:43
|
(43) Получилось!!
//====================================================================== Функция ВернутьИдРеквизита_36(ИмяСпр, ИмяРек) Мета = СоздатьОбъект("MetaDataWork"); Мета_Рек = Метаданные.Справочник(ИмяСпр).Реквизит(ИмяРек); Рез = Прав(" "+Мета.ЧислоВСтроку(Мета.ИДОбъекта(Мета_Рек), 36), 4); Возврат Рез; КонецФункции // ВернутьИдРеквизита_36 Процедура Сформировать() спр_ТС = СоздатьОбъект("Справочник.АВТ_ТранспортныеСредства"); спр_ТС.НайтиПоНаименованию("У 035 ОН 36", 0); База = СоздатьОбъект("SQLiteBase"); База.Открыть(":memory:"); Запрос = База.НовыйЗапрос(); ТекстЗапроса = " |SELECT | * |FROM | [_1S.CONST] as Константа |WHERE | Константа.OBJID = :ТС |AND | Константа.ID = :ркОдометр |"; ркОдометр = ВернутьИдРеквизита_36("АВТ_ТранспортныеСредства", "прОдометр"); Запрос.Подставлять("ТС", спр_ТС.ТекущийЭлемент()); Запрос.Подставлять("ркОдометр", ркОдометр); тз = Запрос.ВыполнитьЗапрос(ТекстЗапроса); гд_НаЭкран(тз); КонецПроцедуры |
|||
52
Zhuravlik
05.06.13
✎
11:46
|
(49) Не знаю, у меня ругалось на
SELECT _StrToId(Константы.ID) ... |
|||
53
Zhuravlik
05.06.13
✎
11:47
|
(52) ой...
|
|||
54
Ёпрст
05.06.13
✎
11:48
|
(51) да уж..
|
|||
55
Zhuravlik
05.06.13
✎
11:48
|
Спасибо всем за помощь)
|
|||
56
viktor_vv
05.06.13
✎
11:48
|
(52) Сейчас тебе Mikeware выдаст похвалу :).
|
|||
57
Zhuravlik
05.06.13
✎
11:50
|
(56) Скорее розгами)
|
|||
58
viktor_vv
05.06.13
✎
11:52
|
(54) От жеж оказывается че оно Михалыч :)
${ИсторияРеквизита|PropertyHistory}.<Справочник>. <ПериодическийРеквизит> = ХХХХ |
|||
59
Ёпрст
05.06.13
✎
11:52
|
select *
from 1sconst as Периодика where Периодика.objid = :ТС and Периодика.id = $ИсторияРеквизита.НужныйВидСправочника.НужныйРеквизитВЭтомСправочнике |
|||
60
Ёпрст
05.06.13
✎
11:53
|
(58) Этого нет в 1sqlite
|
|||
61
Zhuravlik
05.06.13
✎
11:54
|
(58)(59) Спасибо!
Вся проблема в невнимательном прочтении доки... ИсторияРеквизита / PropertyHistory Подстановка идентификатора указанного периодического реквизита справочника: :ИсторияРеквизита|PropertyHistory.ИмяСправочника.ИмяРеквизита[~] При нулевом модификаторе подставляется строка длиной 4 символа - идентификатор периодического реквизита в 36ричной записи При модификаторе 1 подставляется |
|||
62
Ёпрст
05.06.13
✎
11:54
|
(60) блин, про ПоследнееЗначение померещилось
|
|||
63
viktor_vv
05.06.13
✎
11:54
|
(60) Да, уже попробовал.
|
|||
64
viktor_vv
05.06.13
✎
11:56
|
Тьфу ты, а я с "$" пробовал, а надо с ":" :).
|
|||
65
Zhuravlik
05.06.13
✎
11:57
|
Мой конечный запрос:
Процедура Сформировать() спр_ТС = СоздатьОбъект("Справочник.АВТ_ТранспортныеСредства"); спр_ТС.НайтиПоНаименованию("У 035 ОН 36", 0); База = СоздатьОбъект("SQLiteBase"); База.Открыть(":memory:"); Запрос = База.НовыйЗапрос(); ТекстЗапроса = " |SELECT | * |FROM | [_1S.CONST] as Константа |WHERE | Константа.OBJID = :ТС |AND | Константа.ID = :ИсторияРеквизита.АВТ_ТранспортныеСредства.прОдометр |"; Запрос.Подставлять("ТС", спр_ТС.ТекущийЭлемент()); тз = Запрос.ВыполнитьЗапрос(ТекстЗапроса); гд_НаЭкран(тз); КонецПроцедуры |
|||
66
Ёпрст
05.06.13
✎
11:57
|
(64) это без разницы..
|
|||
67
Ёпрст
05.06.13
✎
11:57
|
+66 для 1sqlite
|
|||
68
viktor_vv
05.06.13
✎
12:01
|
(67) Так че-то не прокатило с "$"
ТекстЗапроса = " |Select | * | |From | [_1S.CONST] as Конст |Where | Конст.ObjID = :фасПоставщик | and Конст.ID = $ИсторияРеквизита.Поставщики.ДоГраницы |"; no such column: $ИсторияРеквизита.Поставщики.ДоГраницы тоже самое с ":" нормально отрабатывает. |
|||
69
Ёпрст
05.06.13
✎
12:41
|
(68) 1sqlite какой версии хоть ?
|
|||
70
Zhuravlik
05.06.13
✎
13:17
|
Помогите еще?..
Теперь не могу протипизировать значение (VALUE). Тип реквизита в базе задан как "Справочник.Сотрудники". Возвращается из таблицы констант строка 23 символа. Я понимаю, что надо лефт-джойн, и доставать оттуда либо 13-сим, либо 9-сим, а какую таблицу подключать? Вроде это в SPххх хранится, а как к ней обратиться? |
|||
71
Zhuravlik
05.06.13
✎
13:19
|
+ Сама строка - пробел + 2сим + Пробелы до конца
|
|||
72
Zhuravlik
05.06.13
✎
13:20
|
+ Типизация :Неопределенный ничего не дала, а получить оттуда substr(3, 12) - одни пробелы будут...
|
|||
73
Mikeware
05.06.13
✎
13:24
|
(72) протипизируцй $Справочник
(70) связывать надо с таблицей SP, а дальге цифры полученные переводом из 36 вв 10 первызх 4 смимворов из 13? f |
|||
74
Zhuravlik
05.06.13
✎
13:28
|
(72) Я делал $Справочник, пустота, значение есть точно. Про SP - не найду как ее подключить?
|
|||
75
Ёпрст
05.06.13
✎
13:30
|
substr(Периодика.value,1,9) [Вася :Справочник.НужныйВид]
|
|||
76
Zhuravlik
05.06.13
✎
13:34
|
(75) Получилось) Спасибо)
|
|||
77
Zhuravlik
05.06.13
✎
13:37
|
(75) Помогите мне разобраться с "кашей в голове"?
- Вот описание: 9 символов – определен тип и вид объекта (например «Справочник.Клиенты»), в ID включается только порядковый номер в 36-ричной системе исчисления. Под порядковый номер отводятся первые 6 символов, последние 3 символа зарезервированы под код базы УРБД. 13 символов – определен только тип объекта, вид не задан (например «Справочник»). Первые 4 символа – идентификатор вида (как он задан в метаданных), последующие 9 символов – по аналогии с предыдущим пунктом. 23 символа – не определен тип и вид объекта. В таком случае в первых 2 символах хранится тип объекта (будет рассмотрен ниже), следующие 13 символов формируются аналогично предыдущему пункту. - Почему сказано, что 9 - определен тип и вид, 13 - определен вид, 23 - не определен тип и вид? Т.е. почему размер поля больше, а инфы в нем хранится меньше? |
|||
78
Mikeware
05.06.13
✎
14:12
|
(77) с точностю до наеборот:
в видизированном и типизированном занчении (чар9) нам достаточно зранить только ид в типизированном - нам достаточно хранить вид и ид (чар4+чар9=чар13) в неопределенном мы вынужденв хранить и тип, и вид, и ид - получается, что онр чар23 - тип+вид+ид |
|||
79
viktor_vv
05.06.13
✎
14:17
|
(69) Может из-за версии, на которой пробовал 1.0.2.3 .
|
|||
80
Zhuravlik
05.06.13
✎
14:21
|
(78) Т.е. 2 символа в начале - это закодированная строка типа "Справочник"?
И почему, если в 23 символах хранятся и тип и вид и ид, то я в константах на выходе получал 2 символа + Пробелы? |
|||
81
Zhuravlik
05.06.13
✎
14:23
|
+ substr(Периодика.value,1,9) - значит именно в константах первые 9 символов это ИД? Или хранится как ИД+Вид+Тип?
|
|||
82
Ёпрст
05.06.13
✎
14:27
|
(81) :)))))))))
в value просто хранится значение реквизита, для строки - строка, для числа - число, для справочника - id (9 символов) для документа - iddoc, для справочника неопределенного вида - 13 , для неопределенного типа 23.. всё собственно. |
|||
83
viktor_vv
05.06.13
✎
14:28
|
(81) Ну это именно для поля Value в константах. Если у тебя реквизит определнного вида, то так и пишется.
9 символов – определен тип и вид объекта (например «Справочник.Клиенты») + "для периодического реквизита справочника", то в value пишется только ID с сначала. |
|||
84
Ёпрст
05.06.13
✎
14:28
|
Ты бы хоть описание от 1sconst прочитал бы что..ли
|
|||
85
viktor_vv
05.06.13
✎
14:30
|
(80) Два символа, это конкретный ID конкретного элемента справочника, максимум может быть девять символов, это если с РИБ.
|
|||
86
viktor_vv
05.06.13
✎
14:33
|
(80) Можешь еще дернуть какую-нибудь запись из 1Scrdoc и посмотреть в поле Paretntval, как представляется реквизит неопределнного вида. Там все немного по другому.
|
|||
87
Mikeware
05.06.13
✎
14:34
|
+(82) но если строка длиннее 23, то хранится только 23 символа из строки... или 22.
|
|||
88
Zhuravlik
05.06.13
✎
14:40
|
(84) Я его читал и перечитывал неоднократно в самых разных статьях. Если бы хоть в одной из них было написано как у вас в (82) я бы не задавал этих вопросов...
|
|||
89
Ёпрст
05.06.13
✎
14:41
|
(87) не, тут ты путаешь с доком, в константах, для скуля - это строка 255, для дбф - 23 (не помню только, разбивается она на блоки как в блобе или нет ?)
|
|||
90
Zhuravlik
05.06.13
✎
14:41
|
(87) А остальное в BLOB? Или в PARENTVAL?
|
|||
91
Mikeware
05.06.13
✎
14:41
|
(88) было написано. В многих.
в доке к 1с++ написано, в описании структуры на метапрог или скрипткодинг - тоже... |
|||
92
Mikeware
05.06.13
✎
14:42
|
(90) остального просто нет
|
|||
93
Ёпрст
05.06.13
✎
14:43
|
(90) в блобе её не будет по-определению.
Нет периодических строк неогр. длины |
|||
94
Zhuravlik
05.06.13
✎
14:46
|
Ясно) Только что слету написал три разных запроса к таблицам констант с разными условиями, без вашей помощи я бы так быстро всего этого не уразумел. Спасибо огромное за науку))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |