Проверка актуальности итогов регистров накоплений

Иногда возникают ситуации, когда с остатками происходит что-то непонятное. Остаток на начало + Оборот != Остаток на конец. После пересчета итогов проблема уходит. Но как узнать вовремя, что что-то не так?

Если пересчет итогов не занимает много времени, то можно просто время от времени пересчитывать итоги.

А вот если пересчет итогов по одному регистру занимает несколько часов, то уже возникает вопрос, как же быть уверенным, что с итогами все нормально.

Для себя закрыл вопрос написав обработку и включив ее в регламент. Теперь каждую ночь обработка проверяет регистры накопления и шлет письмо, если что-то не так.

Как работает? Сверяет обороты по с периодичностью "запись" с оборотами без периодичности. Проверяет последний год от текущей даты. Проверяет все регистры накоплений.

Механизм проверки выглядит так:

 Для Каждого Рег Из Метаданные.РегистрыНакопления Цикл

ТекстЗапроса =
"ВЫБРАТЬ
  | РегОбороты.Измерение,
  | СУММА(РегОбороты.Ресурс) КАК РесурсПериод,
  | 0 КАК Ресурс
  |ПОМЕСТИТЬ ТаблицаДанных
  |ИЗ
  | РегистрНакопления.ИмяРегистра.Обороты(&D1, &D2, Запись, ) КАК РегОбороты
  |
  |СГРУППИРОВАТЬ ПО
  | РегОбороты.Измерение
  |
  |ОБЪЕДИНИТЬ ВСЕ
  |
  |ВЫБРАТЬ
  | РегОбороты.Измерение,
  | 0,
  | СУММА(РегОбороты.Ресурс)
  |ИЗ
  | РегистрНакопления.ИмяРегистра.Обороты(&D1, &D2, , ) КАК РегОбороты
  |
  |СГРУППИРОВАТЬ ПО
  | РегОбороты.Измерение
  |;
  |
  |////////////////////////////////////////////////////////////////////////////////
  |ВЫБРАТЬ
  | ТаблицаДанных.Измерение,
  | СУММА(ТаблицаДанных.РесурсПериод) КАК РесурсПериод,
  | СУММА(ТаблицаДанных.Ресурс) КАК Ресурс
  |ПОМЕСТИТЬ ТаблицаДанныхГрупп
  |ИЗ
  | ТаблицаДанных КАК ТаблицаДанных
  |
  |СГРУППИРОВАТЬ ПО
  | ТаблицаДанных.Измерение
  |;
  |
  |////////////////////////////////////////////////////////////////////////////////
  |ВЫБРАТЬ
  | ТаблицаДанныхГрупп.Измерение,
  | ТаблицаДанныхГрупп.РесурсПериод,
  | ТаблицаДанныхГрупп.Ресурс
  |ИЗ
  | ТаблицаДанныхГрупп КАК ТаблицаДанныхГрупп
  |ГДЕ
  | ТаблицаДанныхГрупп.Ресурс <> ТаблицаДанныхГрупп.РесурсПериод
  |";

ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Измерение", Рег.Измерения[0].Имя);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Ресурс", "" + Рег.Ресурсы[0].Имя + "Оборот");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИмяРегистра", Рег.Имя);

Если есть проблема по какому-то регистру, пересчитываем этот регистр:

РегистрыНакопления[ИмяРег].ПересчитатьИтоги()

P.S. Обработка протестирована на релизе 1С:Предприятие 8.2 (8.2.19.130). Должна работать на любых релизах 8.2-8.3.

17 Comments

  1. PerlAmutor

    Задумался сегодня на эту тему, попробовал реализовать свой вариант «на коленке» и вот что немного смутило в процессе.

    Рег.Ресурсы[0].Имя
    

    Тут мы берем первый попавшийся ресурс регистра накопления. С одной стороны это быстро и голову ломать не нужно. А с другой стороны, это может быть ресурс, который просто напросто не используется прикладным решением исходя из настроек какой-нибудь функциональной опции и всегда имеет значение 0. В то время как ошибка может засесть в других ресурсах того же самого регистра.

    Reply
  2. CheBurator

    Костыль.

    Понятно, что с костылем кловылять всяко лучше чем без костыля, но хотелось бы не допускать травматизма.

    То бишь — причины такого разбегания в чем? как устранить эти причины?

    Reply
  3. dmt

    (1) Гм. С новыми конфигурациями слабо знаком. Там такое действительно есть? Можно пример? Или это теория?

    Reply
  4. dmt

    (2) Самому интересно. Ходят слухи, что это связанно с демоническим обновлением, но я не верю.

    Reply
  5. PerlAmutor

    (3) Теория. Но если брать на вскидку такой ресурс как СтоимостьНУ. То у нас в базе, например, налоговый учет не ведется и этот ресурс всегда 0.

    Reply
  6. PerlAmutor

    (2) Причины практически те же, что и в случаях, когда в базе появляются объекты с одинаковым GUIDом из-за обмена или переноса данных. Когда проведенный документ не имеет движений там где они быть должны. Когда непроведенный документ имеет движения. Когда помеченный на удаление документ имеет движения. Когда в подчиненных справочниках появляются элементы без владельца.

    В 1С гарантий нет ни от чего. С кривыми итогами встречаюсь периодически в своей базе. Раньше раз в неделю делал реструктуризацию базы вручную, бонусом и итоги пересчитывались и фрагментация таблиц снижалась. Теперь такая возможность пропала. Позавчера включал пересчет итогов, так как отчеты стали врать. Помогло. В БСП не обнаружил регламентных заданий по пересчету итогов.

    Reply
  7. dmt

    (5)

    ) Теория. Но если брать на вскидку такой ресурс как СтоимостьНУ. То у нас в базе, например, налоговый учет не ведется и этот ресурс всегда 0.

    Понятно. Если еще кто-нибудь из коллег присоединится к мнению, что такая проблема существенна, перепишу обработку.

    Reply
  8. CheBurator

    (6) «когда в базе появляются объекты с одинаковым GUIDом из-за обмена или переноса данных.»

    — ну это еще, допустим, чисто технологическая заморочка, совпадение гуидов еще может быть вроде как, 100% гарантии здесь нет

    «Когда проведенный документ не имеет движений там где они быть должны. Когда непроведенный документ имеет движения. Когда помеченный на удаление документ имеет движения. Когда в подчиненных справочниках появляются элементы без владельца.»

    — это следствие чего-то? кривого кода? сбоя в механизмах платформы? насколько мне известно — технологически в 8-ке совсем не запрещено иметь движения у непроведенных документов.. и у помеченных на удаление… Так в результате чего такие «нестыковки»..?

    Reply
  9. PerlAmutor

    (8)

    Так в результате чего такие «нестыковки»..?
    ОбменДанными.Загрузка = Истина;
    Reply
  10. dmt

    (6), (8), (9) Что-то вы намешали, коллеги.

    Проблемы с итогами, это ИМХО, проблемы платформы.

    Проблемы с кодом «ОбменДанными.Загрузка = Истина» это уже проблемы конфигурации и/или программиста.

    На самом деле, не все так плохо с 8-кой. На нормально обслуживаемой базе, с нормальным железом, проблемы типа (0) происходят довольно редко. Я даже и не помню когда была предыдущая подобная ситуация, год или два назад.

    Самое-то неприятное, что проблему обычно выявляют пользователи, через какой-то промежуток времени после возникновения ситуации. И тогда:

    1. Непонятно когда вообще наступил час Х.

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

    Reply
  11. aegoncharov

    Я что-то не понял… Виртуальная таблица «Обороты» для регистров типа «Остатки» вроде как читает только таблицу реальных записей, то есть никакие таблицы итогов не читаются в принципе, и результат от сбитых итогов не может зависеть. Эта обработка что ли только для оборотных регистров?

    Цитата из книги:

    Алгоритм, применяемый системой для получения оборотов регистра накопления остатков.

    Для построения виртуальной таблицы оборотов регистра накопления остатков всегда используются данные таблицы движений регистра (из базы данных).
    Reply
  12. dmt

    (11) Хм. Похоже на то.

    Словил проблему на РП «Продажи». Написал (0) для проверки результата. Поймал проблему еще на одном (самописном) оборотном регистре…

    Косяк. Ввел коллег в заблуждение.

    Reply
  13. aegoncharov

    Вообще, конечно, идея хорошая, сам недавно нарвался на базе заказчика на сбитые итоги. Сначала по регистру бухгалтерии, причем у них около пяти месяцев была эта проблема и они в оборотках видели нереальные остатки, и закрывали счета исходя из неверных остатков. Пересчет итогов привел к тому, что в оборотках изменились остатки по закрытым периодам (то есть отразились реальные остатки), счета 26, 20, 40 раскрылись, в общем ужас-ужас. Потом, там же, нарвался на слетевшие итоги в регистре УчетЗатратРегл. Полный пересчет итогов, конечно, помог, но надежный инструмент диагностики для быстрого выявления проблем хотелось бы иметь.

    Reply
  14. aegoncharov

    Причем по регистру бухгалтерии сбитые итоги выглядели так: видимо был какой-то документ с проводками, эти проводки были учтены в таблицах итогов, потом сам документ с проводками пропал, а в таблицах итогах все осталось как с этими проводками.

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

    Reply
  15. dmt

    (14) О, я правильно понял? Если грохнуть документ на SQL, не трогая движения, и потом прогнать (0), если покажет различия, то механизм годный?

    Reply
  16. aegoncharov

    (15) Если движения и таблицу итогов не трогать, то итоги продолжат соответствовать движениям, то есть с итогами как таковыми все нормально будет.

    Чтобы создать проблему, нужно в MSSQL зайти в таблицу итогов и поправить там циферки, вот тогда будет проблема и можно тестировать обработку.

    Reply
  17. dmt

    (16) Тогда этого немного долго проверять.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *