Имя: Пароль:
1C
1C 7.7
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
Ясно) Только что слету написал три разных запроса к таблицам констант с разными условиями, без вашей помощи я бы так быстро всего этого не уразумел. Спасибо огромное за науку))
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший