Имя: Пароль:
1C
 
Прямые запросы 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
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, только и всего
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn