|
Прямое замешательство в БД (не бойтесь!) | ☑ | ||
---|---|---|---|---|
0
Вуглускр1991
14.10.11
✎
11:37
|
Эта тема не скажет ничего нового маститым 1Сникам, пользователям EnterpIntegratora или тем паче его создателям. Это скорее ободрение для тех, кто тщится попробовать изменение таблиц на живой базе.
Итак. Случилось мне перегружать номенклатуру 53000 позиций с ошибкой. Долларовую цену выгрузил в рублях. Обнаружил поздно. Вариантов решений было два: 1. Средствами встроенного языка пересчитать цены и долго мучиться в пустом и неинформативном обмене РИБ, где будет выгружено почти 0,5 гигабайта несжатого XML-я ... 2. Либо. Включаем запись технологического журнала. Выполняем запрос: ВЫБРАТЬ СПР.ССЫЛКА ИЗ СПРАВОЧНИК.НОМЕНКЛАТУРА КАК СПР ГДЕ СПР.ЭТОГРУППА = ЛОЖЬ И СПР.НАЦЕНКА = 0 Читаем файл технологического журнала. Находим в нем что-то типа SELECT R95.IDRRef FROM Reference95 R95 WHERE R95.Fld121 = 0 AND R95.Folder = .. Останавливаем сервер 1С (service srv1cv82 stop или из консоли служб в MS) db2 select R95.* from Reference95 R95 fetch first 10 rows only > ~/kusoktabla.txt и прочитав содержимое kusoktabla.txt db2 update Reference95 R95 set R95.FLD107 = R95.FLD107\/33 where \(R95.FLD107 \> 0\) and \(R95.Fld121 = 0\) (update Reference95 R95 set R95.FLD107 = R95.FLD107/33 where (R95.FLD107 > 0) and (R95.Fld121 = 0) - в человеческом виде без палок при спец символах для баша) Все то же самое для MS можно сделать в QA После чего я запустил сервер, тестирование / исправление базы в части восстановления индексов (на изменяемом поле был индекс), Все. |
|||
1
Санта
14.10.11
✎
11:38
|
Если по чесноку, сколько времени ты на это потратил всего?
|
|||
2
asady
14.10.11
✎
11:40
|
(0) ай молодца ....
это у тебя цена в номенклатуре сидит - а конфа какая? |
|||
3
Вуглускр1991
14.10.11
✎
11:40
|
(1) Полтора часа.
со всеми колебаниями, и подбором синтаксиса в SQL запросах. |
|||
4
Вуглускр1991
14.10.11
✎
11:41
|
2 Цена в номенклатуре сидит для подбора. Есть РС с ценами, но связь в подборе тормозит, поэтому инфа туда дублируется при изменении данных в РС (переоценки всякие).
|
|||
5
shuhard
14.10.11
✎
11:41
|
(3) единственный комментарий,
в MS SQL кроме ТЖ есть профайлер для получения запроса, в остальном ты всё сделал верно |
|||
6
Ёпрст
14.10.11
✎
11:41
|
да уж.. и нафига для этого запускать технологический журнал было ??
Имена табличек и так доступны стандартным методом, а написать простой запрос на update в qa особенного ума не надо. |
|||
7
Ёпрст
14.10.11
✎
11:42
|
>>>, и подбором синтаксиса в SQL запросах.
:))))) |
|||
8
Вуглускр1991
14.10.11
✎
11:43
|
(6) -> (3) QA для "белых".
|
|||
9
ZanderZ
14.10.11
✎
11:43
|
(0) зачем Тех Журнал - есть же ПолучитьСтруктуруХраненияБазыДанных
|
|||
10
Ёпрст
14.10.11
✎
11:44
|
вот если б, кто написал вк для снеговика с нормальным метопарсером и типизацией..
это было бы хорошо. |
|||
11
Вуглускр1991
14.10.11
✎
11:44
|
(7) :) Ну палки в шеле надо было ж расставить, тупил долго.
|
|||
12
Вуглускр1991
14.10.11
✎
11:45
|
(9) Вот оно. Обмен опытом! Спасибо.
|
|||
13
H A D G E H O G s
14.10.11
✎
11:45
|
1) Полгига несжатого XML - это смехуечки.
2) Profiler - это да 3) Есть РС с ценами, но связь в подборе тормозит - проверить hands.dll - не растут ли они из ass.sys |
|||
14
Ёпрст
14.10.11
✎
11:49
|
(12) на вот поделку (не моя), для "обмена опытом"
http://webfile.ru/5603679 |
|||
15
Вуглускр1991
14.10.11
✎
11:52
|
(13) 3) Не боись, начну ставить задачу по ценообразованию - все вопросы отпадут.
Лови запрос: ВЫБРАТЬ СправНоменклатура.Ссылка КАК Номенклатура, СправНоменклатура.Код, СправНоменклатура.Артикул, СправНоменклатура.Единица, СправНоменклатура.ЭтоГруппа, СправНоменклатура.НаценкаИндивидуально, ЕСТЬNULL(НаличиеСвернуто.КолВоОстаток, 0) - ЕСТЬNULL(РезервСвернуто.КолВоОстаток, 0) КАК СвобОстаток, ВЫБОР КОГДА СправНоменклатура.ЭтоГруппа ТОГДА 0 КОГДА (НЕ ЦеныПрайсаСрезПоследних.Цена ЕСТЬ NULL ) И СправНоменклатура.НаценкаИндивидуально = 1 ТОГДА ВЫРАЗИТЬ(ЦеныПрайсаСрезПоследних.Цена * &КурсРубляКВалюте КАК ЧИСЛО(15, 2)) КОГДА ЦеныПрайсаТекСклад.Цена ЕСТЬ NULL И ЦеныПрайсаОснСклад.Цена ЕСТЬ NULL ТОГДА ВЫРАЗИТЬ(ЦеныПрайсаСрезПоследних.Цена * &КурсДоллараКВалюте КАК ЧИСЛО(15, 2)) КОГДА ЦеныПрайсаТекСклад.Цена ЕСТЬ NULL ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ЦеныПрайсаОснСклад.Цена, 0) * &КурсДоллараКВалюте * (100 + &Процент) / 100 КАК ЧИСЛО(15, 0)) ИНАЧЕ ВЫРАЗИТЬ(ЦеныПрайсаТекСклад.Цена * &КурсДоллараКВалюте * (100 + &Процент) / 100 КАК ЧИСЛО(15, 2)) КОНЕЦ КАК Цена, НаличиеСвернуто.КолВоОстаток, РезервСвернуто.КолВоОстаток КАК РезервОстаток ИЗ Справочник.Номенклатура КАК СправНоменклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Резерв.Остатки(, Склад В (&СпСклад)) КАК РезервСвернуто ПО СправНоменклатура.Ссылка = РезервСвернуто.Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Наличие.Остатки(, Склад В (&СпСклад)) КАК НаличиеСвернуто ПО СправНоменклатура.Ссылка = НаличиеСвернуто.Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныПрайса.СрезПоследних КАК ЦеныПрайсаСрезПоследних ПО СправНоменклатура.Ссылка = ЦеныПрайсаСрезПоследних.Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныПрайсаСклад.СрезПоследних(, Склад = &СкладТекНаценки) КАК ЦеныПрайсаТекСклад ПО СправНоменклатура.Ссылка = ЦеныПрайсаТекСклад.Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныПрайсаСклад.СрезПоследних(, Склад = &СкладОснНаценки) КАК ЦеныПрайсаОснСклад ПО СправНоменклатура.Ссылка = ЦеныПрайсаОснСклад.Номенклатура Может ass.sys в отделе маркетинга, а может где-то в платформе индексы все расставлены. Основная таблица "Номенклатура", динамическое считывание. |
|||
16
zladenuw
14.10.11
✎
11:52
|
(14) спс
|
|||
17
Вуглускр1991
14.10.11
✎
11:55
|
(14) СПС.
(13) Это не нифига не смешно. Оно в родную-то базу загружается пол-дня. А мне его в 7.7 УРБД транслировать. |
|||
18
H A D G E H O G s
14.10.11
✎
12:00
|
(15) Да. Без временных таблиц в динамическом списке - тяжко.
|
|||
19
H A D G E H O G s
14.10.11
✎
12:09
|
бгг, забавно.
|
|||
20
H A D G E H O G s
14.10.11
✎
12:09
|
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка ПОМЕСТИТЬ ФильтрованнаяНоменклатура ИЗ Справочник.Номенклатура КАК Номенклатура ИНДЕКСИРОВАТЬ ПО Ссылка ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ФильтрованнаяНоменклатура.Ссылка, ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена ИЗ ФильтрованнаяНоменклатура КАК ФильтрованнаяНоменклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних( , Номенклатура В (ВЫБРАТЬ ФильтрованнаяНоменклатура.Ссылка ИЗ ФильтрованнаяНоменклатура КАК ФильтрованнаяНоменклатура)) КАК ЦеныНоменклатурыСрезПоследних ПО ФильтрованнаяНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура |
|||
21
H A D G E H O G s
14.10.11
✎
12:10
|
Вот такой текст запроса введите
и откройте конструктором |
|||
22
H A D G E H O G s
14.10.11
✎
12:12
|
И при выполнении
Ошибка при выполнении запроса. Ошибка при выполнении запроса. по причине: Поле не найдено "DeletionMark" у всех так? |
|||
23
H A D G E H O G s
14.10.11
✎
12:12
|
Надо написать на партнерский, чтобы впилили ВТ в дин. список
|
|||
24
milan
14.10.11
✎
12:14
|
А в консоли запросов обработать результат никак ?
53К это, в принципе, семечки. |
|||
25
Вуглускр1991
14.10.11
✎
12:19
|
(24) Там ещё пришлось бы смотреть на тему: "а если в процессе обработки что-то сдохнет" и половина позиций будет с уже правильной ценой, а половина с ещё нет. То есть придется гондобить учет того, что сделано на случай факапа и потом этот учет убирать, после того, как все пройдет.
Я собирался так сделать, но потом ретивое взыграло. И обмены опять же... |
|||
26
Вуглускр1991
14.10.11
✎
12:28
|
(21) А куда ввести в дин список или в консоль или просто в модуль?
В конструкторе (из модуля) пока не ругается. |
|||
27
ДенисЧ
14.10.11
✎
12:28
|
шото я не понял...
Справочник обновил... А в РИБ кто будет выгружать? Или на остальные базы плевать? |
|||
28
Вуглускр1991
14.10.11
✎
12:30
|
(27) В остальных базах правильно, так случилось.
|
|||
29
Вуглускр1991
14.10.11
✎
12:32
|
(26+) В консоли запросов прокатило.
Два результата БД файловая, клиент тонкий, релиз 13.последний. |
|||
30
H A D G E H O G s
14.10.11
✎
12:34
|
(29) В произвольный запрос динамического списка, и выбрать Номенклдатура основной таблицей
|
|||
31
H A D G E H O G s
14.10.11
✎
12:35
|
(29) В консоли - конечно покатит
|
|||
32
H A D G E H O G s
14.10.11
✎
12:36
|
(29) В конструкторе запросов динамического списка - нет закладки по которой можно добавить запросы (несколько запросов).
А вот если текст написать - закладки появляются. Бага. |
|||
33
Вуглускр1991
14.10.11
✎
12:47
|
(32) М-м! Читал я на ИТС про ограничения ДС, но сейчас не помню среди ограничений есть ВТ, судя по тому, что нет закладок - их убрали не случайно.
|
|||
34
H A D G E H O G s
14.10.11
✎
12:55
|
(33) Щас посмотрю, какой он SQL запрос строит, что
Поле не найдено "DeletionMark" |
|||
35
Fragster
гуру
14.10.11
✎
13:04
|
а что, ПолучитьСтруктуруХраненияБазыДанных() уже не модно?
|
|||
36
H A D G E H O G s
14.10.11
✎
13:05
|
(35) Кто здесь?
|
|||
37
Fragster
гуру
14.10.11
✎
15:02
|
(36) не, ну риальне, автор нам рассказал, как получить текст запроса для обновления таблицы... в (35) способ попроще, ИМХО
|
|||
38
DmitrO
14.10.11
✎
15:13
|
а у меня другие два вопроса:
1.зачем было останавливать сервер 1С? 2.зачем было после этого переиндексировать базу? |
|||
39
acsent
14.10.11
✎
15:13
|
Склад - первое измерение в регистре
|
|||
40
МихаилМ
14.10.11
✎
15:28
|
+ (38)
меня ещё слово "тщится" пугает |
|||
41
Вуглускр1991
14.10.11
✎
20:35
|
(39) В моем второе. Надо сделать?
"Индексировать" на складе стоит. (38) А вот и хозяева ie. Я не знаю, что именно платформа реализует свойством "Индексировать", может это индекс в базе данных, но (я же не знаю) вдруг (ВНЕЗАПНО) кроме индекса в базе это доп. таблица с какой-нибудь НЕХ, ибо стандартные индексы разработчиков 1С могут не устроить. Вот поэтому. Если ты мне скажешь, что платформа всегда будет использовать индексы в том и ровно в том смысле в котором они существуют при таблицах сервера баз данных, я готов поверить и не останавливать и потом не переиндексировать. (40) Это пройдет. |
|||
42
Grusswelle
14.10.11
✎
21:02
|
(0) 20 см видно издалека, молодец! :-)
|
|||
43
H A D G E H O G s
14.10.11
✎
22:13
|
(41) Не очкуй. Стандартные индексы.
|
|||
44
дущ
14.10.11
✎
23:05
|
(0) А слабо так на файловой сделать? :D
|
|||
45
Drx211
14.10.11
✎
23:17
|
(0)Издалека попахивает извращенством. Пытливый ум виден, но кривые руки так-же в наличии :) Лучше бы почитал, как с планами обмена работать. Не знаю, что там за конфа, но не допускать создания гигабайтного XML при выгрузке, путем фильтрации ненужных записей об изменении - это гораздо проще и надежнее, чем то - что ты наваял :)
|
|||
46
Вуглускр1991
14.10.11
✎
23:31
|
(45) Капитан очевидность. Подите туда там все будет.
Если начать играть с планом обмена, то после возвращения его в исходные настройки (а оно надо! ибо как было правильно), все элементы снова будут помечены "к выгрузке". "Не знаю, что там за конфа" "кривые руки" я, конечно? не сахарный и клал с прибором. Самому все нормально? |
|||
47
DrShad
14.10.11
✎
23:48
|
"все элементы снова будут помечены "к выгрузке""
а снять регистрацию уже не модно? в (0) конечно нормально все, но есть ведь пути и попроще |
|||
48
Вуглускр1991
15.10.11
✎
00:09
|
(47) А вот пример того, что ментальность семерочника вставляет в колеса палки.
Да ты прав. Для 8-ки это можно. Я выбирал по времени, что я смог бы сделать быстрее. Использовать запрос update или перебрать элементы, перезаписать, выгрузить полгига и подменить пакет очистив <data> элемент. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |