Всем привет! Не уверен, что пишу в правильный раздел, но я уже устал пытаться понять причину возникновения проблем, а похожей обсуждаемой темы не нашел.
Исходные данные: ИБ на базе бух 7.7 в формате SQL (2005), размер около 5-6 Гб, сильно переделанная на прямые запросы - в основном отчеты конечно, но также используются классы прямых бух.запросов при проведении документов. Запись данных в базу через прямые запросы почти не используется. Ну и еще из вероятно важного - юзеры частенько жалуются на тормоза при проведении больших объемов документов.
Проблема: периодически появляются "невидимые" документы, в подавляющем большинстве случаев - ручные операции, которые есть в базе, проведены, остатки в стандартных отчетах обычно правильные, но мои отчеты с прямыми запросами их не видят. Выяснение причины проблемы на одном конкретном примере показало что происходит - класс AccountsRecordset в условиях соединения для получения вида документа использует такое условие:
INNER JOIN _1SJOURN AS _1SJOURN_vt WITH (NOLOCK) ON (_1SENTRY_vt.DATE_TIME_DOCID = _1SJOURN_vt.DATE_TIME_IDDOC)
Формально условие конечно правильное, но именно оно отсекает у меня нужные ручные операции, которые почему-то периодически меняют свое время... Это случается крайне редко, но в базе у меня есть такие операции, которые не только старые (2006 года), но и периодически возникают новые.
Вот такой простейший запрос выдает мне список таких операций:
select
o.date_time_docid dto,
j.date_time_iddoc dtj,
o.docid [Документ $Документ],
j.iddocdef Документ_вид
from _1SOPER o (NOLOCK)
inner join _1SJOURN j (NOLOCK) ON j.iddoc = o.docid
where (j.date_time_iddoc <> o.date_time_docid)
order by o.date_time_docid
И возвращает вот такой пример:
dto | dtj | Документ |
20100601EAGG40 8RG9 | 20100601EAEAY8 8RG9 | Операция 07722 (01.06.10) |
Т.е. получается, что в журнале документов данный документ (ручная операция) имеет одно время, а в списке операций - другое... Почему такое происходит я не знаю, но примерно могу догадаться, проанализировав значение времени:
20100601EAEAY8 = 01.06.2010 23:59:59
20100601EAGG40 = 01.06.2010 23:59:59 + 10 секунд
Получается, что в журнале документов время правильное, т.к. оно не может быть больше 23:59:59, а вот в операции хранится неверное значение date_time_docid и откуда оно берется непонятно. Может быть пользователи пытаются сдвинуть время документа вперед на стандартный интервал +10 секунд? Или 1С это делает сама?
Кстати, если найти эту операцию, открыть и нажать "ОК", т.е. "перепровести", то проблема исчезает... Как-то раз при пересчете бух.итогов мне это вылилось в проблему на всю ночь - 1Ска пыталась вставить разные записи в таблицу _1SCRDOC с нарушением уникальности индекса по ID документа...
В общем вопрос такой - кто-нибудь с таким сталкивался? Не знаете причины возникновения и как исправить? Конечно самое простое - переделать класс AccountsRecordset и заменить условие соединение по DATE_TIME_DOCID на соединение просто по DOCID, но это не очень правильный вариант решения проблемы...