Ситуация, когда после отмены проведения документа или установки пометки на удаление движения в регистрах остаются «висеть» в базе, а сам документ в журнале отображается как непроведенный, является серьезным признаком нарушения целостности данных. В SQL-версии платформы 1С:Предприятие 7.7 это часто сопровождается ошибкой Ошибка обновления записи при попытке перепровести документ или изменить его время. Разберем, как диагностировать и устранить эту проблему.
Первым делом необходимо убедиться, что проблема заключается именно в рассинхронизации таблиц. В SQL-версии 1С ключевым полем для отслеживания связей является DATE_TIME_IDDOC и флаги в таблице _1sjourn. Проверьте, соответствуют ли данные в журнале операциям и регистрам.
Для обнаружения «зависших» движений используйте SQL-запросы, сравнивающие записи в регистрах с состоянием документов в журнале. Если у документа в поле CLOSED стоит значение, указывающее на непроведенное состояние, но в таблицах регистра Ra* есть записи с тем же iddoc, значит, произошел сбой транзакции или вмешательство в структуру базы.
Если вы локализовали «мусорные» записи, их необходимо удалить. Для этого можно воспользоваться прямым SQL-запросом. Пройдите по всем регистрам и удалите записи, не соответствующие проведенным документам:
Для ном = 1 по Метаданные.Регистр() Цикл
Рег = Метаданные.Регистр(ном);
ТекстЗапроса = "DELETE FROM $Регистр." + Рег.Идентификатор +
" WHERE iddoc IN (SELECT Жур.iddoc FROM _1sjourn Жур WHERE Жур.closed & 1 <> 1)";
Запрос.ВыполнитьСкалярный(ТекстЗапроса);
КонецЦикла;
Аналогичные действия необходимо выполнить для таблиц проводок _1soper, если вы используете компоненту «Бухгалтерский учет».
Если даже после очистки движений система выдает ошибку Ошибка обновления записи при попытке сохранить документ (например, при смене времени), проблема, вероятнее всего, кроется в словаре данных DDS. Частой причиной является создание пользователями дополнительных индексов в таблице _1sjourn.
Важное примечание: Если вы добавляете свои индексы через внешние скрипты, их порядок в файле 1cv7.dds имеет критическое значение. Платформа 1С очень чувствительна к структуре файла словаря. Попробуйте переместить описание вашего индекса после системного блока #----Indexes------ или убедитесь, что он не конфликтует со штатными индексами.
Порядок индексов в файле словаря должен выглядеть примерно так:
#----Indexes------
# Name |Descr |Unique|Indexed fields
I=PK__1SJOURN |ROW_ID |1 |ROW_ID
I=IDDOC |Id Doc |1 |IDDOC
I=ACDATETIME |Date+Time+ID |1 |DATE_TIME_IDDOC
При использовании 1С 7.7 в SQL часто возникает необходимость принудительной синхронизации флагов. Если вы решили полностью отказаться от использования какой-либо компоненты (например, бух. учета), необходимо корректно проставить признаки в _1sjourn:
UPDATE _1sjourn SET closed = closed & 1;
UPDATE _1sjourn SET appcode = appcode & 1;
Эти команды сбрасывают флаги принадлежности документа к операциям бухгалтерского учета, оставляя только признаки оперативного учета. После этого рекомендуется выполнить TRUNCATE таблиц _1soper и _1scrdoc (если они больше не используются), чтобы исключить конфликты при записи.
Cast(Left(DATE_TIME_IDDOC, 8) AS datetime) в запросах к SQL-таблицам. Это полностью отключает индексы и вызывает сканирование всей таблицы, что при больших объемах данных приводит к зависанию сервера.DDS или прямые SQL-запросы сначала отрабатывайте на полной резервной копии базы. Никогда не вносите правки в рабочую базу «на лету».Соблюдая эти правила и поддерживая структуру словаря в актуальном состоянии, вы избавитесь от ошибок несоответствия данных и обеспечите стабильную работу вашей системы.