Имя: Пароль:
1C
1С v8
УТ 10.3 мистика с остатками товаров
0 Stanislav1C
 
11.08.15
14:38
По регистру "Товары на складах" по выбранной номенклатуре и выбранному значится два движения: приход от 30.07.13 и расход от 14.07.15.

Тем не менее, запрос с нижеследующим текстом на любую дату до 30.07.13 (даже какой-нибудь 2000 год, когда учет, понятное дело, в базе еще не велся) выдает КоличествоОстаток = -1

ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Номенклатура,
    ТоварыНаСкладахОстатки.КоличествоОстаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК ТоварыНаСкладахОстатки


ТиИ пока не делал в виду большого объема базы (точка встанет на N часов)
1 Stanislav1C
 
11.08.15
14:43
Пересчет итогов может помочь?
2 ОбычныйЧеловек
 
11.08.15
14:47
Больше похоже не на мистику а на сказку...
Отмени эти 2 движения и посмотри результат запроса...а еще глянь даты - там точно "30.07.13" а не какой нить 30.07.0013?!
3 Stanislav1C
 
11.08.15
14:51
(2) год точно 13й, к тому же там приход. Все-таки пересчет попробовал запустить, он должен минут за 5 отработать, потом попробую отменить эти движения. Хотя маловероятно, что причина в них.
4 Stanislav1C
 
11.08.15
14:54
Мда, пересчет итогов выдал мне:
Ошибка СУБД:
Ошибка SQL: запись значения NULL в поле, не допускающее NULL 'FLD7842_TYPE'
5 Stanislav1C
 
11.08.15
16:05
В регистре имеется пара десятков "пустых" записей. Соответственно, удалить их я не могу, потому что отбор по регистратору с типом "неопределено" сделать не получится. Вот такие дела...
6 ДенисЧ
 
11.08.15
16:06
(5) Получится...
7 ДенисЧ
 
11.08.15
16:06
ТОлько не неопределено
8 Stanislav1C
 
11.08.15
16:18
(6) и какой отбор устанавливать?
Попробовал так:


    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ТоварыНаСкладах.Регистратор
        |ИЗ
        |    РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
        |ГДЕ
        |    ТоварыНаСкладах.Период < &Период";
    Запрос.УстановитьПараметр("Период", Дата("20060101"));
    Результат = Запрос.Выполнить();

    Выборка = Результат.Выбрать();
   N = 1;
   Пока Выборка.Следующий() Цикл
       Набор = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
       Набор.Отбор.Регистратор.Установить(Выборка.Регистратор);
       Набор.Записать();
       Сообщить ("Запись " + N + " Удалена");
       N = N + 1;
КонецЦикла;

Ругается
9 ДенисЧ
 
11.08.15
16:21
(8) где регистратор.ссылка есть NULL
и потом по найденным битым ссылкам и беги
10 Gbpltw
 
11.08.15
16:23
ТиИ + пересчет итогов = счастье)
11 Злопчинский
 
11.08.15
16:25
или тупо создать битые объекты обработкой и потом уже по ним шарится? (обработки есть готовые такие для восстановления битых ссылок)
12 Stanislav1C
 
11.08.15
16:25
(9) Дело в том, что у меня этот запрос и так выдает нужные записи. Ругается при остановке отбора
13 Stanislav1C
 
11.08.15
16:27
(11) Ссылки не битые, их вообще нет
14 Зеленый пень
 
11.08.15
16:28
В выходной - выгрузка/загрузка.
15 Stanislav1C
 
11.08.15
16:31
Нашел способ: снять галку с одного из регистраторов, обновить БД и вернуть галочку обратно. Якобы при реструктуризации регистра эти записи сами пропадут. Но способ работал то ли на 8.1, то ли даже на 8.0. У меня же не дает принять изменения в виду того, что есть дублирующие записи с одинаковым регистратором :)
16 Stanislav1C
 
11.08.15
16:32
(14) Выходных не бывает...и ТЦ обязует отключать компьютеры на ночь.
17 Леха Дум
 
11.08.15
16:40
(13) создать копию регистра накопления по структуре и по документам движения, в него перенести все нормальные записи, старый регистр после переноса грохнуть, новому присвоить имя старого регистра
18 Stanislav1C
 
11.08.15
16:40
(10) ну придется тормозить работу отдела на время ТиИ. А если не поможет, заново распределенный узел создавать. Других вариантов не вижу...
19 Леха Дум
 
11.08.15
16:42
+ (17) еще вариант при наличии сервера SQL - лезть напрямую в таблицу движений на сервере и чистить ручками
20 Stanislav1C
 
11.08.15
17:07
(19) SQL сервера нет. Думал через tool_1cd можно как-то удалить записи, но не додумал)