Имя: Пароль:
1C
1C 7.7
v7: 1с 7.7. ТиИ. Зависание при проверке логической целостности
0 kissolo
 
16.07.20
09:47
Дано: sql server 2005 на отдельном компе. Там базы 1с 7.7.
Каталоги баз - на другом сервере, он же контроллер домена.
ПОльзователи подключаются по сети, часть - через терминальные серверы.
Время от времени бывают проблемы с отключением от баз (например, проблемы с сетью, пару раз в последнее время зависали серваки, и пользователи, ессно, отваливаются).
В настоящее время, в одной из баз (самописная на основе базы бухгалтерии) время от времени выдается скульная ошибка duplicate key.
Скрин мне скинули - погуглил, нашел документ со скрина, отменил проведение, провел - все в порядке, никаких глюков.
Странно, решил на всякий случай сделать ТиИ на копии (средствами скуля сделал выгрузку, загрузил в копию, тоже скульную).
При ТиИ (логической целостности) база зависает (Утилита ConfStat показывает, что зависает на проверка справочника сотрудников (100 элементов обработала- и все)).
Выгрузка/загрузка не помогает.
Решил попробовать в DBF версии, свернул частично (база слишком большая, без свертки не загрузится в DBF).
Проблема аналогичная, зависание при ТиИ при проверке логической целостности.
Ждал отвисания около недели, а может и больше, база в фоне висела, я время от времени поглядывал просто на нее. ConfStat так ничего нового не показал.

Если ТиИ делать в режиме просто тестирования, обе базы, и скульная и дбф-ная, выдают кучу ошибок:

Проверка содержания справочников. Сотрудники. Элемент 234. Реквизит Подразделение. Значение на 03.05.02. Неразрешенная ссылка. Тип - Справочник Подразделения
Проверка содержания справочников. Сотрудники. Элемент 252. Реквизит Подразделение.  Значение на 01.04.02. Неразрешенная ссылка. Тип - Справочник Подразделения
Проверка содержания справочников. Сотрудники. Элемент 4141. Реквизит Подразделение. Значение на 01.04.02. Неразрешенная ссылка. Тип - Справочник Подразделения
...
(самое интересно, что в справочнике  сотрудников всего 430 строк, откуда там элемент 4141 может появиться? Я же правильно понимаю, что 4141 - это номер строки в файле справочника сотрудников?)..
...
Проверка содержания справочников. КомплектацияМ. Элемент     1. Изменено подчинение
Проверка содержания справочников. КомплектацияМ. Элемент     1. Изменено подчинение
Проверка содержания справочников. КомплектацияМ. Элемент     1. Изменено подчинение
...
(Справочник КомплектацияМ подчинен справочнику Материалы, нумерация в пределах подчинения)
...
Проверка содержимого документов. ТребованиеНакладнаяПроизводство. Номер ТМ011461. Реквизит Продукты в строке 44. Неразрешенная ссылка. Тип - Справочник Продукты
Проверка содержимого документов. ТребованиеНакладнаяПроизводство. Номер ТМ011462. Реквизит Продукты в строке 44. Неразрешенная ссылка. Тип - Справочник Продукты
....
Проверка типовых операций. Изменен шаблон типовой операции Акт о продаже и отпуске столовая                                                
Проверка типовых операций. Изменен шаблон типовой операции Аренда ПТЦ                                                                      
Проверка типовых операций. Изменен шаблон типовой операции Взаимозачеты ПТЦ                                                                
Проверка типовых операций. Изменен шаблон типовой операции Инкассация и касса 91 магазин                                                  
...
Все строки приводить не стал, они однотипные.

Что с этим делать?

Попробовал вручную почистить ссылки у сотрудников (нашел, в каком ДБФ-файле хранятся сотрудники, нашел нужную строку по номеру, посмотрел код элемента, нашел в режиме предприятия нужный элемент, почистил всю историю (реквизит Подразделение - периодический) у них... Но мало того, что некоторые номера строк слишком длинные, так удаление истории ничем не помогло, последующее ТиИ выдало такую же ошибку. (Или надо было сделать перед ТиИ логической целостности - упаковку базы?)

Впрочем, это все равно не очень поможет, потому что рабочая база же на скуле, и, по идее, надо править ошибки именно на скуле.

ЧекДБ на скуле у тестовой базы делал - ошибок нет.

Что еще можно сделать?
1 uno-group
 
16.07.20
10:05
Периодика в 1с конст хранится пойтись по нему
2 kissolo
 
16.07.20
10:18
(1) Ничего не путаешь? 1sconst хранит константы, судя по 1Cv7.DD
3 Ёпрст
 
гуру
16.07.20
10:27
(2) тебя ждет еще много открытий
4 Ёпрст
 
гуру
16.07.20
10:28
(0) забыть про ТиИ раз и навсегда, это, для начала
5 Ёпрст
 
гуру
16.07.20
10:34
в скуле проверки делать обработками по типу этой
https://www.1cpp.ru/forum/YaBB.pl?num=1228926967
и привет

Написать свои не долго, и для проверки периодики, и для проверки подчинения, и для проверки циклических ссылок (из-за которых ваше тии может не проходить). И для проверки битых id справочника
6 kissolo
 
16.07.20
11:20
(3) это о чем? всегда везде писали, что надо для ДБФ смотреть этот файл (DD). А теперь оказывается, что это не так?
(4) почему забыть про ТиИ?
(5) Спасибо, посмотрю.
7 Дегенератор идей
 
16.07.20
11:30
(6) кроме констант, там хранятся и периодические, и длинные строки..
а так всё правильно
8 Ёпрст
 
гуру
16.07.20
11:32
(6) потому, что ты не ведаешь, что оно делает. И при неудачном исходе - запортишь данные, которые можно было поправить руками. Ну и трата времени.
9 Дегенератор идей
 
16.07.20
11:33
в (7) наврал немного:
1SCONST
Содержит значения констант, периодических реквизитов справочников и бухгалтерских счетов.

1SBLOB
Содержит значения реквизитов справочников, документов, счетов имеющих тип "Строка неограниченной длины". Также содержит описание шаблонов типовых операций.
10 kissolo
 
16.07.20
16:07
(5) Написать свою такую - долго ))))
Но попробовал эту. Кое-где ошибки были в коде, поправил, в силу своего разумения. Там ошибок нет.
Ошибки были только на п.5. (Проверяет что элемент-справочник или документ с максимальным ID существует в соответствуюшей таблице справочника или в журнале документов).
Ошибки разные, но что с ними делать, я не понимаю. Ну вот например:

ОШИБКА Неверное число строк   = 1 для справочника  = Валюты
Тип строки = 1
Знач в таблице справочника = '     2   '
---
ОШИБКА в справочнике = МестаХранения код по базе = SC135
Максимал знач по справочнику  id = '    HL   '
Максимал знач по таблице _1suidctl  id = '    HM   '
---
ОШИБКА Неверное число строк   = 1 для справочника  = СтатьиЗатратНаПроизводство
Тип строки = 1
Знач в таблице справочника = '    17ЦИБ'
---
ОШИБКА Неверное число строк   = 1 для справочника  = МатериальныеЗатраты
Тип строки = 1
Знач в таблице справочника = ''
---
ОШИБКА в справочнике = Тара код по базе = SC30881
Максимал знач по справочнику  id = '   2IV   '
Максимал знач по таблице _1suidctl  id = '   2IW   '
---
ОШИБКА Неверное число строк   = 1 для справочника  = ЕдИзмНоменклатуры
Тип строки = 1
Знач в таблице справочника = ''
---
ОШИБКА Неверное число строк   = 1 для справочника  = КомплектацияН
Тип строки = 1
Знач в таблице справочника = ''


Что с этим делать дальше, и как проверить, правильно ли она выдала ошибки?
11 Djelf
 
гуру
16.07.20
17:19
(10) Последний ответ в теме Создание с нуля файла 1SUIDCTL.DBF

1suidctl предназначена для быстрого получения нового кода, т.е. вот это
ОШИБКА в справочнике = Тара код по базе = SC30881
Максимал знач по справочнику  id = '   2IV   '
Максимал знач по таблице _1suidctl  id = '   2IW   '

видимо означает, что кто-то пытался создать элемент в справочнике SC30881 и не смог
Можно посмотреть трассировку в sql, скорее всего там примерно такой запрос будет
select MAX(id)
from SC30881
where id >= (select maxid from  _1suidctl where TYPEID = %ID_SC30881%)

Это не критичные ошибки.

Судя по ошибкам в (0) похоже, что кто-то, когда-то, подменил md без конфигуратора, а потом, когда посыпались ошибки, вернул старый назад, но было уже поздно.
12 kissolo
 
16.07.20
18:15
(11) Ясно, спасибо за понятный ответ.
Тогда возникает вопрос, что делать с ошибками из (0)? Как исправить?
13 Djelf
 
гуру
16.07.20
18:31
(12) Если я прав про подмену md, это будет не просто.
Тут нужна тяжелая артерия типа (Ёпрст)`а.
14 Djelf
 
гуру
16.07.20
18:33
(13) +Артиллерия, кончено ;) Пить кровь из Ёпрст`а не советую ;)
15 kissolo
 
17.07.20
13:48
(13) Вполне возможно, что вы правы.
Скажите, а поможет в таким случае перенос справочников и остатков? Это, конечно, как крайний вариант, потому что документов делается очень много, и оставлять в базе нужно достаточно большой период, а свободен для программистов достаточно небольшой период, примерно 9 часов в субботу, и все.
16 Злопчинский
 
17.07.20
19:37
(15) в принципе - да.
стоит ли это делать - хз, тут надо смотреть самим вам подробнее
17 Злопчинский
 
17.07.20
19:38
"выдают кучу ошибок" - кучу это сколько ... 5-0-6 - это куча, 1000-10000 - тоже куча.
если ошибок реально мало - то "дешевле", наверное, будет поправить, если много и они однотипные - то тоже поправить может быть дешевле...
18 kissolo
 
28.07.20
10:41
(17) Пардон за задержку, приболел.
11 одной ошибки -
Проверка содержания справочников. Сотрудники. Элемент 60601. Реквизит Подразделение. Значение на 18.09.03. Неразрешенная ссылка. Тип - Справочник Подразделения
(причем странный номер - в справочние всего 430 позиций, а номер строки вон какой).

Порядка 380 второй:
Проверка содержания справочников. КомплектацияМ. Элемент     1. Изменено подчинение
(этот справочник подчинен справочнику материалов, нумерация уникальна в пределах подчинения)

216 третьей:
Проверка содержимого документов. ТребованиеНакладнаяПроизводство. Номер ТМ011461. Реквизит Продукты в строке 44. Неразрешенная ссылка. Тип - Справочник Продукты

Ну и 13 таких:
Проверка типовых операций. Изменен шаблон типовой операции Акт о продаже и отпуске столовая                                                
Но это вообще хвосты от исходной бухгалтерии (изначально мои предшественники взяли бух, и на ее основе написали свое), и это не надо вообще.

Если хотите, могу полный лог выложить.
это лог тестирования локальной базы, но в скульной, в принципе, то же самое.

И хотелось бы все же чтото сделать именно с текущей рабочей базой, а не выгружать остатки в новую.. Геморроя не оберешься :(
19 Ёпрст
 
гуру
28.07.20
11:38
(18)
1.подразделение периодический ? Поправить табличку 1sconst
2.подчинение поправить обработкой, если не верный владелец или битая ссылка в владельце
3. неразрешенную ссылку поправить руками, окрыв документ и посмотрев че там
4. типовые операции просто грохнуть целиком, если не используются
20 kissolo
 
28.07.20
12:51
(19)
1. Периодический.

спасибо, буду думать
21 tgu82
 
30.07.20
08:26
Да, меня только скуль ожидает. Так все замечательно на ДБФ.
Да и вообще - 1С это уже не бизнес-язык. На нем и музыку пишут и игры и джейсоны парсят )
22 Злопчинский
 
30.07.20
09:27
(21) но вот возведения в степень - нет... а мне разок понадобилось...
23 Ёпрст
 
гуру
30.07.20
09:38
(22) всё есть
24 Ёпрст
 
гуру
30.07.20
09:42
25 Ёпрст
 
гуру
30.07.20
09:42
Чебур, ты точно с другой планеты, раз такие баяны тебе не знакомы..
26 kissolo
 
04.08.20
12:42
(21) Рабочая база на скуле. Конечно, можно попробовать ее свернуть и исправить ошибки уже на DBF (cейчас база слишком большая для DBF)..
27 kissolo
 
04.08.20
12:43
(19) 2.подчинение поправить обработкой, если не верный владелец или битая ссылка в владельце
Есть где-то примеры, как это делать? на DBF или скуле?
28 Ёпрст
 
гуру
04.08.20
13:22
(27) дык проверить, что
а) владелец не пустой
б) parentext записанного владельца соответствует id нужного справочника.
всё это примитивным запросом
29 kissolo
 
04.08.20
13:33
(28) спасибо, я что-то после короны торможу, ну или всегда соображалки не хватало))).
Насчет parentext и id справочника загуглю, раньше не использовал.
30 kissolo
 
31.08.20
16:39
Вернулся к этой задаче.
(19). 1. От подразделений избавился проще - все периодические значения почистил, там везде пусто было, как будто принудительно удалили какие-то подразделения, на которые ссылки были.
4. Типовые операции грохнул. Тоже все ок.
А вот с остальным пока не очень понятно.
Написал такой запрос на 1с++
    ТекстЗапроса = "
    |    SELECT
    |    СпрКомплМ.DESCR As Рецептура
    |FROM
    |    $Справочник.КомплектацияМ As СпрКомплМ
    |WHERE
    |СпрКомплМ.PARENTEXT IS NULL
    |";

Ничего не выдалось. Я так понимаю, пустых владельцев нет?
А вот с (28) "б) parentext записанного владельца соответствует id нужного справочника." затык, я не понимаю, как это сделать.
Сумел сделать такой запрос:
    ТекстЗапроса = "
    |    SELECT
    |    СпрМ.DESCR As Наименование,
    |    СпрКомплМ.DESCR As Рецептура
    |FROM
    |    $Справочник.КомплектацияМ As СпрКомплМ
    |LEFT OUTER JOIN $Справочник.Материалы As СпрМ ON СпрМ.ID = СпрКомплМ.ParentExt
    |WHERE
    |СпрМ.ISFOLDER = 2
    |";

Но он мне тупо выдает список комплектаций с их владельцами, а как понять, что там "не соответствует"?, торможу что-то...
31 Злопчинский
 
31.08.20
16:47
|СпрКомплМ.PARENTEXT IS NULL

я сомневаюсь что это эквивалентно найти с пустой ссылкой на справочник Материалы/Номенклатура
32 Ёпрст
 
гуру
31.08.20
20:21
(30) сравнивать нужно с $ПустойИД а не с NULL,
NULL там никогда не будет, по определению
33 kissolo
 
01.09.20
15:22
(32) Эх, были у меня сомнения, были))))
    ТекстЗапроса = "
    |    SELECT
    |    СпрКомплМ.DESCR As Рецептура
    |FROM
    |    $Справочник.КомплектацияМ As СпрКомплМ
    |WHERE
    |СпрКомплМ.PARENTEXT = $ПустойИД
    |";
такой вариант тоже строки не показал. Но код правильный?

И что делать с (28) б)?
34 Ёпрст
 
гуру
01.09.20
15:31
(33)
select * from $Справочник.Подчиненный where
PARENTEXT not in (select id from $Справочник.ВидВладельца)
35 Ёпрст
 
гуру
01.09.20
15:32
ну и еще проверить, что парентекст не группа
36 kissolo
 
01.09.20
16:23
ТекстЗапроса = "
    |    SELECT *
    |FROM
    |    $Справочник.КомплектацияМ As СпрКомплМ
    |WHERE
    |(СпрКомплМ.PARENTEXT not in (select id from $Справочник.Материалы)    )
    |";

Ни одной строки.
37 Ёпрст
 
гуру
01.09.20
17:34
(36) ну и радуйся тогда, что нет битого владельца.
проверь еще, что в парентекст не группа
38 kissolo
 
02.09.20
12:11
(37) Радоваться, конечно, можно было бы, но ведь ошибки-то не исчезли! Часть убрал, попробую, конечно, опять сделать ТиИ в режиме исправления, вдруг на этот раз не зависнет?
39 Mikeware
 
02.09.20
12:50
(38) ну тебе ж написали (4).
40 Злопчинский
 
02.09.20
12:55
(39) не, а чего.. на маленьких базах я делаю иногда. за ради перфекционизма...
41 Mikeware
 
02.09.20
12:59
(40) ну если только без исправления. Но у меня что-то маленьких баз давненько не было...
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс