Имя: Пароль:
1C
1С v8
Как в sql базе найти нужную запись только по ошибке отпочкования РИБ?
0 Обработка
 
25.08.21
12:09
Есть база Розница в скуле объем 96 ГБ
При отпочковании примерно 32 млн записей регистрируются.
И на  40% процесса отпочкования вываливается ошибка.
Ошибка в значении типа 'Дата'
Не удалось создать начальный образ по причине: Ошибка в значении типа "дата"
Дата '23.09.1190 0:00:00' не может быть записана в базу данных на MS SQL Server с нулевым смещением дат
1 Обработка
 
25.08.21
12:12
Есть ли возможность прямо в скуле искать эту траблу?
2 Ёпрст
 
25.08.21
12:13
(1) яя, натюрлих.
select date from table where date  = ....
3 Обработка
 
25.08.21
12:15
Я наверно при отпочковании забыл смещение установить 2000.
Но ведь дата видимо такая в реале 23.09.2119 0:00:00'
4 Обработка
 
25.08.21
12:15
Все равно искать и убрать к черту надо.
5 BeerHelpsMeWin
 
25.08.21
12:17
Кто-то уверенно ввел док 2119 годом вместо 2019?
6 Обработка
 
25.08.21
12:22
Было бы круто написать в скуле запрос поиск по полем типа дата значение равное больше определенного или на конкретное значение...
Но я особо не умею.
7 youalex
 
25.08.21
13:41
как то так можно, если по конкретному полю _Date_Time


declare tabname nvarchar(150)
declare t table (tabname nvarchar(150))
declare res table (tabname nvarchar(150), _Number nvarchar(150), _Date_Time datetime2(0))


insert into t (tabname)
select DISTINCT TOP 77  c.TABLE_NAME  from INFORMATION_SCHEMA.COLUMNS  c
where c.COLUMN_NAME = '_Date_Time'


SET tabname = (SELECT TOP 1 tabname from t)

WHILE tabname IS NOT NULL
BEGIN
    insert into res (tabname, _Number, _Date_Time)
    EXEC ('select top 77  ''' + tabname + ''' tabname, _Number, _Date_Time from ' +  tabname + ' where _Date_Time >= ''4021-12-01'' ')

    DELETE FROM t WHERE tabname = tabname
    SET tabname = (SELECT TOP 1 tabname from t)
END


select * from res
8 youalex
 
25.08.21
13:42
(7) движок сайта заменяет амперсанды на болд)
res
9 Обработка
 
25.08.21
14:14
(7) (8) Спасибо но ничего не понятно. ))
10 youalex
 
25.08.21
14:19
(9) в этом скрипте у переменных скуля tabname, res, t - должны быть амперсанды в начале
where _Date_Time >= ''4021-12-01''  - здесь условие по дате
top 77 - можно убрать
11 youalex
 
25.08.21
14:50
(10) т.е не амперсанд, а собачка "@"
https://savetext.ru/fDEjFBxG
12 Ёпрст
 
25.08.21
16:10
(7)  дык.. 77, не мало ?
13 Ёпрст
 
25.08.21
16:11
табличек жешь и больше могёт быть
+ и..тут может вообще все реквизиты с типом дата лучше проверить ?
14 youalex
 
25.08.21
16:11
(12) норм, мне хватило)
15 Обработка
 
26.08.21
06:33
Ошибка вылетело


Msg 207, Level 16, State 1, Line 2
Недопустимое имя столбца "_Number".
16 Обработка
 
26.08.21
06:33
Вот:

declare tabname nvarchar(150)
declare t table (tabname nvarchar(150))
declare res table (tabname nvarchar(150), _Number nvarchar(150), _Date_Time datetime2(0))


insert into t (tabname)
select DISTINCT TOP 77  c.TABLE_NAME  from INFORMATION_SCHEMA.COLUMNS  c
where c.COLUMN_NAME = '_Date_Time'

SET tabname = (SELECT TOP 1 tabname from t)

WHILE tabname IS NOT NULL
BEGIN
    insert into res (tabname, _Number, _Date_Time)
    EXEC ('select top
    100''' + tabname + ''' tabname, _Number, _Date_Time from ' +  tabname + ' where _Date_Time >= ''2118-12-01'' ')

    DELETE FROM t WHERE tabname = tabname
    SET tabname = (SELECT TOP 1 tabname from t)
END


select * from res
17 youalex
 
26.08.21
08:44
(16) вот этот должен искать по идее по всем полям (на тяжелых базах будет долго, т.к. запрос по каждому сочетанию таблица/колонка с типом дата)
https://savetext.ru/VDtUk5ag
18 Обработка
 
26.08.21
09:08
(17) Перевел с русского
получилось так
19 Обработка
 
26.08.21
09:08
declare tabname nvarchar ( 150 )
declare @colname nvarchar ( 150 )
declare table t (tabname nvarchar ( 150 ) , tabname nvarchar ( 150 ) )
declare @query nvarchar ( max )
declare table res (tabname nvarchar ( 150 ) , tabname nvarchar ( 150 ) , value  datetime2 )

set  NOCOUNT on

insert into t (tabname, datetime2 )
select DISTINCT  c.TABLE_NAME, c.COLUMN_NAME   from INFORMATION_SCHEMA.COLUMNS  c
where c.DATA_TYPE in ( 'datetime' , 'datetime2' )

select TOP 1 tabname = tabname, @colname = colname из t


WHILE @colname IS NOT NULL
BEGIN
      
        PRINT CONCAT ( tabname, '.' , @Colname )

        set @query = 'select top 1' 'tabname' 'tabname,' '@colname' 'colname, @colname value
        из tabname, где @colname> = ' ' 4300-12-01 ' ' '

        SET @query = replace ( @query, 'tabname' , tabname )
        SET @query = replace ( @query, '@colname' , @colname )
              
        insert intro res (tabname, _Number, _Date_Time)
        EXEC   ( @ запрос )

        Delete from t, WHERE tabname = tabname и colname = @colname
              
        SET @colname = null
        SELECT TOP 1 tabname = tabname, @colname = colname из t
      
END
select * from res
20 Обработка
 
26.08.21
09:09
По ходу ошибки:

Msg 156, Level 15, State 1, Line 3
Неправильный синтаксис около ключевого слова "table".
Msg 156, Level 15, State 1, Line 5
Неправильный синтаксис около ключевого слова "table".
Msg 1087, Level 15, State 2, Line 9
Необходимо объявить табличную переменную "@t".
Msg 102, Level 15, State 1, Line 13
Неправильный синтаксис около конструкции "из".
Msg 102, Level 15, State 1, Line 21
Неправильный синтаксис около конструкции "@tabname".
Msg 102, Level 15, State 1, Line 27
Неправильный синтаксис около конструкции "@res".
Msg 137, Level 15, State 2, Line 28
Необходимо объявить скалярную переменную "@".
Msg 1087, Level 15, State 2, Line 30
Необходимо объявить табличную переменную "@t".
Msg 102, Level 15, State 1, Line 33
Неправильный синтаксис около конструкции "из".
Msg 1087, Level 15, State 2, Line 36
Необходимо объявить табличную переменную "@res".
21 youalex
 
26.08.21
09:12
(18) >Перевел с русского
Не понял, где там русский, это скрипт tsql
22 acanta
 
26.08.21
09:16
Если это 7ка, то можно обойти, мд-шник заготовить без регистрации или с регистрацией только справочники, создать периферийную базу, затем заменить на мд-шник с обычной регистрацией и зарегистрировать нужные документы программно записать(), можно даже остатки с какого-то числа и первичку с какого-то числа. Глючный документ в периферийную не пойдет.
23 youalex
 
26.08.21
09:19
24 Обработка
 
26.08.21
09:25
(21) Ой пардон у меня браузер автоматом переводил оказывается. )))
25 Обработка
 
26.08.21
09:33
(21)(23) Спасибо запрос сработал. Но увы вывел кучу данных не понятнго.Там смещение дат не даст мне найти видимо надо в 1С искать

Вот
_AccumRg6494    _Period    4015-11-12 00:00:00.0000000
_AccumRg6503    _Period    4018-09-20 18:02:26.0000000
_AccumRg6536    _Period    4016-07-14 21:21:11.0000000
_AccumRg6557    _Period    4016-07-14 21:21:11.0000000
_AccumRg6602    _Period    4016-07-14 21:21:11.0000000
_AccumRg6620    _Period    4018-07-25 18:10:03.0000000
_AccumRg6640    _Period    4016-03-14 16:27:12.0000000
_AccumRg6655    _Period    4015-11-12 00:00:00.0000000
_AccumRg6697    _Period    4019-08-20 18:17:54.0000000
_AccumRg6731    _Period    4019-08-01 15:58:19.0000000
_AccumRg6747    _Period    4019-08-13 10:00:02.0000000
_AccumRg6768    _Period    4015-11-12 00:00:00.0000000
_AccumRg6865    _Fld7276    4015-12-24 20:06:38.0000000
26 Обработка
 
26.08.21
09:42
Перебил дату именно как у вас. Получилось такое


...........
..............

_AccumRgT7835    _Period    5999-11-01 00:00:00.0000000
_AccumRgT8714    _Period    5999-11-01 00:00:00.0000000
_AccumRgT8758    _Period    5999-11-01 00:00:00.0000000
_AccumRgT9757    _Period    5999-11-01 00:00:00.0000000
_Document9570    _Fld9574    5018-02-09 00:00:00.0000000
_Document9570    _Fld9578    5085-12-04 00:00:00.0000000
_InfoRg7551    _Fld7555    4306-07-09 00:00:00.0000000
_Reference48    _Fld7581    4707-04-19 00:00:00.0000000
27 youalex
 
26.08.21
09:43
(25) datetime - С января 1753 года до 31 декабря 9999 года

т.е. по идее тебе нужно искать даты (с учетом смещения 2000)
where @colname < '3753-01-01'

А потом через СтруктураХраненияИнформационнойБазы() смотреть что это
28 youalex
 
26.08.21
09:45
(27) или нет)
29 Обработка
 
26.08.21
09:50
(27) При таком условии вылезло 406 значений в разных таблицах.
Вот  отрывок

_AccumRg6494    _Period    4015-11-12 00:00:00.0000000
_AccumRg6503    _Period    4018-09-20 18:02:26.0000000
_AccumRg6536    _Period    4016-07-14 21:21:11.0000000
_AccumRg6557    _Period    4016-07-14 21:21:11.0000000
_AccumRg6602    _Period    4016-07-14 21:21:11.0000000
_AccumRg6620    _Period    4018-07-25 18:10:03.0000000
_AccumRg6640    _Period    4016-03-14 16:27:12.0000000
_AccumRg6655    _Period    4015-11-12 00:00:00.0000000
_AccumRg6697    _Period    4019-08-20 18:17:54.0000000
_AccumRg6731    _Period    4019-08-01 15:58:19.0000000
........................
........
_ScheduledJobs10669    _FinishTime    4021-04-01 10:00:28.0000000
_ScheduledJobs10669    _StartTime    4021-04-01 10:00:01.0000000
_Seq7118    _Period    4015-11-17 09:38:06.0000000
_SeqB7119    _Period    4021-05-31 23:59:59.0000000
_UsersWorkHistory    _Date    4018-01-25 12:50:24.0000000
Config    Creation    4019-09-06 15:27:01.0000000
Config    Modified    4019-09-06 15:27:01.0000000
Files    Creation    4016-01-29 14:33:53.0000000
Files    Modified    4016-11-17 05:44:23.0000000
Params    Creation    4017-03-27 16:10:36.0000000
Params    Modified    4017-03-27 16:10:36.0000000
v8users    Changed    4018-09-20 11:40:13.0000000
30 youalex
 
26.08.21
10:01
(29) как это? если 4018-09-20 никак не меньше 3753-01-01

тут по идее еще нужно учитывать пустые даты ,и типы где только время, навскидку будет такое условие,  с учетом текущего смещения 2000 (кавычки из скрипта)

where @colname between ''2001-01-02'' and ''3753-01-01''

Я у себя нашел даты рождения  11.11.0179 0:00:00 )
31 Обработка
 
26.08.21
10:10
(27) Я так и не понял почему я ищу именно в этом диапазоне

"datetime - С января 1753 года до 31 декабря 9999 года"

или же ''2001-01-02'' and ''3753-01-01''

Мне же нужно найти даты больше 2100 года хотя бы.
А если нарушения искать надо искать даты до 1920 года Ну не бывает дата рожение сотра до 1920
и то же не ложите в учет это все что больше 2025 года например.
32 Обработка
 
26.08.21
10:11
(30) При этом выходит

_Document7861    _Fld7865    2121-02-12 00:00:00.0000000
_Document7861    _Fld7868    2019-02-21 00:00:00.0000000
_Document9570    _Fld9574    2217-10-06 00:00:00.0000000
_Document9570    _Fld9578    2200-04-19 00:00:00.0000000
_InfoRg7551    _Fld7555    2003-03-03 00:00:00.0000000
_InfoRg7752    _Fld7758    2217-01-01 00:00:00.0000000
_InfoRg7752    _Fld7759    3019-12-31 00:00:00.0000000
_Reference103    _Fld1255    3196-05-11 00:00:00.0000000
_Reference48    _Fld7581    2002-06-23 00:00:00.0000000

Но по первых двум видам дока ищу таких документов в базе нет по описанию (((
33 Обработка
 
26.08.21
10:14
Из этого списка нашел 1 регистр и 2 справочника и все.
34 youalex
 
26.08.21
10:16
(31)
Я исходил из ошибки в (0)

"datetime - С января 1753 года до 31 декабря 9999 года" - это ограничение типа datetime, это то на что изначально ругалось в (0)
т.е. если перекатывать из базы со смещением 2000 в базу без смещения будет этот глючным диапазон
2001-01-02- в базе со смещением это 2 января 0001 года. Т.е. это не пустая дата, и не реквизит "только время"

(33) так не бывает, точно одна и та же база?
35 Обработка
 
26.08.21
10:18
(34) Условие в периоде понял. на счет 33 правы случайно не ту базу таблицы глянул ))
36 Обработка
 
26.08.21
10:35
Алексей, огромное спасибо за скрипт и за разъяснения.
Для структуры таблиц и полей раздобыл в гугле обработку еще.
Можно теперь всегда ковырять даты с грехами.

С меня магарыч тебе.
Питеру привет. Я там учился 5 лет...
37 youalex
 
26.08.21
11:02
(36) да не за что, развлёкся немного)