|
Прямые запросы SQL. Раскапываем дальше ... | ☑ | ||
|---|---|---|---|---|
|
0
Невский Александр
16.11.10
✎
08:07
|
Есть таблица _AccumReg2920, содержит в себе данные записей РН "_ТоварыВСмене". В этой таблице есть 2 поля - "_RecorderTRef" и "_RecorderRRef".
1. В поле "_RecorderTRef" хранится массив - {0,0,0,109}. Вот здесь все понятно - "_Document109" - это таблица документов "РеализацияТоваровУслуг", и регистратором данной записи является именно этот документ. Только вот почему впереди 3 нуля стоят? Почему не просто {109}? 2. В поле "_RecorderRRef" хранится массив из чисел, в моем случае - 16 чисел. Для чего служит это поле? |
|||
|
1
YHVVH
16.11.10
✎
08:20
|
а зачем капать?
|
|||
|
2
Егор Сергеевич
16.11.10
✎
08:22
|
(0) для решения каких задач используются прямые запросы?
|
|||
|
3
Guk
16.11.10
✎
08:25
|
(2) да. если не знаешь как работать со штатными запросами...
|
|||
|
4
Невский Александр
16.11.10
✎
08:26
|
(2) Свертка информационной базы - пометка на удаление документов + удаление движений из регистров накопления средствами SQL
|
|||
|
5
YHVVH
16.11.10
✎
08:27
|
вот откуда ноги растут
v8: Подскажите про пометку на удаление |
|||
|
6
Невский Александр
16.11.10
✎
08:27
|
Вчера остановился на том, что при очистке записей из таблиц регистров накопления нужно очищать от вида документа-регистратора (то есть в-зависимости от того, что находится в поле "_RecorderTRef")
|
|||
|
7
Невский Александр
16.11.10
✎
08:28
|
(5) точно
|
|||
|
8
Егор Сергеевич
16.11.10
✎
08:28
|
(3) у нас в филиале программист сделал возможность просмотра остатков на web-сайте для клиентов. Посмотрел код: он остатки получал прямым запросом к sql.
|
|||
|
9
Егор Сергеевич
16.11.10
✎
08:28
|
+(8) к sql-ной базе 1С Торговли.
|
|||
|
10
YHVVH
16.11.10
✎
08:29
|
вообщем автор взялся за дело в котором ничего не понимает.
|
|||
|
11
Невский Александр
16.11.10
✎
08:30
|
SQL_ТекстЗапроса = "UPDATE _Document109 SET _Document109._Marked = 1 WHERE _Document109._Date_Time >="+"'"+Формат(ДатаНачала,"ДЛФ=DT")+"' and _Document109._Date_Time<='"+Формат(ДатаОкончания,"ДЛФ=DT")+"'"+Символы.ПС+
" UPDATE _Document109 SET _Document109._Posted = 0 WHERE _Document109._Date_Time >="+"'"+Формат(ДатаНачала,"ДЛФ=DT")+"' and _Document109._Date_Time<='"+Формат(ДатаОкончания,"ДЛФ=DT")+"'"+Символы.ПС; - это запрос на пометку удаления + отмена проведения SQL_ТекстЗапроса = " SELECT _AccumReg2920.* FROM _AccumReg2920 WHERE _AccumReg2920._Period >="+"'"+Формат(ДатаНачала,"ДЛФ=DT")+"' and _AccumReg2920._Period<='"+Формат(ДатаОкончания,"ДЛФ=DT")+"'"+" and "+ " 109 IN (SELECT _AccumReg2920._RecorderTRef FROM _AccumReg2920)"+Символы.ПС; - это запрос (возможно составлен неправильно) - на выборку записей регистра - в данном случае условие - 109 входит в поле _RecorderTRef в MS SQL я практически "0", подскажите, кто чем может :)) |
|||
|
12
Невский Александр
16.11.10
✎
08:31
|
(10) все мы чему-то учимся
|
|||
|
13
YHVVH
16.11.10
✎
08:34
|
(11) я думаю тут народу мало найдется знающих толк в таблицах 1с 8.x
а вообще я бы пошел по пути запустил бы профайлер sql, из 1с попытался удалить документ и посморел какие команды выполняет sql. |
|||
|
14
sda553
16.11.10
✎
08:36
|
_RecorderTRef - длина 4 байта, не понимаю почему массив, хранит идентификатор типа документа-регистратора в шестнадцатеричном виде. Т.е. запись вида 0x0000009F означает что тип документа из таблицы _Document159 (9F это 159 в десятичной)
_RecorderRRef - хранит GUID документа-регистратора. Например _RecorderRRef = 0xbf54aecf9480e0f44a9288fbf6536a94 означает документ с ГУИД f6536a94-88fb-4a92-bf54-aecf9480e0f4 Для свертки средствами sql конечно хорошо, но лучше не лезьте средствами SQL в таблицы итогов, быстрее и проще сделать в конце свертки пересчет итогов |
|||
|
15
sda553
16.11.10
✎
08:39
|
Из полученного ГУИД можно получить сам документ средствами 1С
Документы.<ВидДокумента>.ПолучитьСсылку(Новый УникальныйИдентификатор("f6536a94-88fb-4a92-bf54-aecf9480e0f4 ")) Обратная операция(из документа ссылки вытянуть его ГУИД) ДокументСсылка.УникальныйИдентификатор() |
|||
|
16
sda553
16.11.10
✎
08:41
|
Копать там нечего, все уже раскопано до вас
|
|||
|
17
Невский Александр
16.11.10
✎
08:42
|
(13) тогда может найдется кто MS SQL хорошо знает, мне просто нужно узнать
- SQL_ТекстЗапроса = "DELETE FROM _AccumReg2920 WHERE _AccumReg2920._Period >="+"'"+Формат(ДатаНачала,"ДЛФ=DT")+"' and _AccumReg2920._Period<='"+Формат(ДатаОкончания,"ДЛФ=DT")+"'"+" and "+ " 109 IN (SELECT _AccumReg2920._RecorderTRef FROM _AccumReg2920)"+Символы.ПС; Правильно ли написано? "109 IN (SELECT _AccumReg2920._RecorderTRef FROM _AccumReg2920)" - в поле _RecorderTRef (массив) должно находиться число с номером 109 |
|||
|
18
sda553
16.11.10
✎
08:43
|
Нет неправильно
|
|||
|
19
Невский Александр
16.11.10
✎
08:43
|
(16) я знаю, я для себя :)
|
|||
|
20
VladZ
16.11.10
✎
08:44
|
(0) Переходи на 7.7... Там с прямыми запросами проще. :)
|
|||
|
21
sda553
16.11.10
✎
08:44
|
SQL_ТекстЗапроса = "DELETE FROM _AccumReg2920 WHERE _AccumReg2920._Period >="+"'"+Формат(ДатаНачала,"ДЛФ=DT")+"' and _AccumReg2920._Period<='"+Формат(ДатаОкончания,"ДЛФ=DT")+"'"+" and _AccumReg2920._RecorderTRef"+Символы.ПС;
В вашем случае удалятся все записи регистра, если есть хоть один документ 109 |
|||
|
22
Рыжий Лис
16.11.10
✎
08:45
|
(0) В статье на ИТС: Особенности хранения составных типов данных есть описание полей. http://its.1c.ru/db/metod81#content:1828:1
|
|||
|
23
sda553
16.11.10
✎
08:46
|
SQL_ТекстЗапроса = "DELETE FROM _AccumReg2920 WHERE _AccumReg2920._Period >="+"'"+Формат(ДатаНачала,"ДЛФ=DT")+"' and _AccumReg2920._Period<='"+Формат(ДатаОкончания,"ДЛФ=DT")+"'"+" and _AccumReg2920._RecorderTRef=0x0000006D;
|
|||
|
24
rsv
16.11.10
✎
08:46
|
(0) Все просто. В поле _RecorderTRef содержится тип регистратора (документа). Во втором поле "_RecorderRRef содержится собственно ссылка на табличку регистратора.
|
|||
|
25
rsv
16.11.10
✎
08:47
|
+(24) Откуда там массивы ???...... непонятно . Типы данных - бинарники.
|
|||
|
26
Ненавижу 1С
гуру
16.11.10
✎
08:47
|
В поле "_RecorderTRef" хранится массив - {0,0,0,109}
Ну да массив байт, но лучше его представить как целое int, тоже кстати 4 байта: cast(_RecorderTRef as int) |
|||
|
27
Sammo
16.11.10
✎
08:48
|
Имхо, достаточно быстро работают стандартные 1с-овские механизмы, например очистка записей регистра накопления по регистратору
Особенно при отключенных итогах и ОбменДанными.Загрузка = Истина + емнип, там есть тонкость при рассчитанных итогах по месяцам |
|||
|
28
rsv
16.11.10
✎
08:49
|
+(25)Массивы взял баааа в кавычки . Откуда там "массивы" непонятно.
|
|||
|
29
Невский Александр
16.11.10
✎
08:53
|
(28) Возможно я ошибся ...
SQL_ТекстЗапроса = " SELECT _AccumReg2920.* FROM _AccumReg2920 WHERE _AccumReg2920._Period >="+"'"+Формат(ДатаНачала,"ДЛФ=DT")+"' and _AccumReg2920._Period<='"+Формат(ДатаОкончания,"ДЛФ=DT")+"'"; Command.CommandText = SQL_ТекстЗапроса; Command.CommandType = 1; RS = Command.execute(); RS.MoveFirst(); ДанныеПолей = RS.Fields; Пока НЕ RS.EOF() Цикл ДанныеПолей = RS.Fields; RS.MoveNext(); КонецЦикла; Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; RS.Fiels(1).Value (это "_RecorderTRef") - в отладчике показал тип ComSafeArray - отсюда и написал "массив" |
|||
|
30
Невский Александр
16.11.10
✎
08:53
|
(23) Спасибо :)
|
|||
|
31
Ненавижу 1С
гуру
16.11.10
✎
08:54
|
(17) написан бред
тогда уж так: SQL_ТекстЗапроса = "DELETE FROM _AccumReg2920 WHERE _AccumReg2920._Period >="+"'"+Формат(ДатаНачала,"ДЛФ=DT")+"' and _AccumReg2920._Period<='"+Формат(ДатаОкончания,"ДЛФ=DT")+"'"+" and "+ " cast(_RecorderTRef as int)=109"+Символы.ПС; |
|||
|
32
sda553
16.11.10
✎
08:56
|
Вы вначале в Query Analyzer запрос отладьте, а потом уже пытайтесь облечь его в язык 1С.
|
|||
|
33
rsv
16.11.10
✎
08:56
|
(29) Понял.
|
|||
|
34
rsv
16.11.10
✎
09:03
|
(31) На самом деле с интами можно не изголятся. Прокатывает и явное указание значения типа регистратора "как оно видится в QA"
|
|||
|
35
Grusswelle
16.11.10
✎
09:10
|
(0) Ну хватит информационным онанизмом заниматься, ну ей богу... Есть же книги Радченко, например...
|
|||
|
36
Ненавижу 1С
гуру
16.11.10
✎
09:25
|
(34) ну мне приятней видеть int, только и всего
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |