Почему не удаляются движения документа при распроведении в 1С 7.7 SQL?

Программист 1С v7.7 Управленческий учет IT и автоматизация бизнеса
← На главную

Ситуация, когда после отмены проведения документа или установки пометки на удаление движения в регистрах остаются «висеть» в базе, а сам документ в журнале отображается как непроведенный, является серьезным признаком нарушения целостности данных. В SQL-версии платформы 1С:Предприятие 7.7 это часто сопровождается ошибкой Ошибка обновления записи при попытке перепровести документ или изменить его время. Разберем, как диагностировать и устранить эту проблему.

Шаг 1: Диагностика и проверка согласованности данных

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

Для обнаружения «зависших» движений используйте SQL-запросы, сравнивающие записи в регистрах с состоянием документов в журнале. Если у документа в поле CLOSED стоит значение, указывающее на непроведенное состояние, но в таблицах регистра Ra* есть записи с тем же iddoc, значит, произошел сбой транзакции или вмешательство в структуру базы.

Шаг 2: Очистка зависших записей

Если вы локализовали «мусорные» записи, их необходимо удалить. Для этого можно воспользоваться прямым SQL-запросом. Пройдите по всем регистрам и удалите записи, не соответствующие проведенным документам:


Для ном = 1 по Метаданные.Регистр() Цикл
    Рег = Метаданные.Регистр(ном);
    ТекстЗапроса = "DELETE FROM $Регистр." + Рег.Идентификатор + 
                   " WHERE iddoc IN (SELECT Жур.iddoc FROM _1sjourn Жур WHERE Жур.closed & 1 <> 1)";
    Запрос.ВыполнитьСкалярный(ТекстЗапроса);
КонецЦикла;

Аналогичные действия необходимо выполнить для таблиц проводок _1soper, если вы используете компоненту «Бухгалтерский учет».

Шаг 3: Анализ структуры таблиц и индексов (DDS)

Если даже после очистки движений система выдает ошибку Ошибка обновления записи при попытке сохранить документ (например, при смене времени), проблема, вероятнее всего, кроется в словаре данных 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

Шаг 4: Синхронизация полей состояния

При использовании 1С 7.7 в SQL часто возникает необходимость принудительной синхронизации флагов. Если вы решили полностью отказаться от использования какой-либо компоненты (например, бух. учета), необходимо корректно проставить признаки в _1sjourn:


UPDATE _1sjourn SET closed = closed & 1;
UPDATE _1sjourn SET appcode = appcode & 1;

Эти команды сбрасывают флаги принадлежности документа к операциям бухгалтерского учета, оставляя только признаки оперативного учета. После этого рекомендуется выполнить TRUNCATE таблиц _1soper и _1scrdoc (если они больше не используются), чтобы исключить конфликты при записи.

Рекомендации по профилактике

  1. Не используйте функции в WHERE: Никогда не применяйте конструкции типа Cast(Left(DATE_TIME_IDDOC, 8) AS datetime) в запросах к SQL-таблицам. Это полностью отключает индексы и вызывает сканирование всей таблицы, что при больших объемах данных приводит к зависанию сервера.
  2. Соблюдайте транзакционность: В 1С 7.7 нельзя использовать вложенные транзакции. Все операции по распроведению и записи документа должны выполняться как единый логический блок.
  3. Тестируйте на копии: Любые изменения в словаре DDS или прямые SQL-запросы сначала отрабатывайте на полной резервной копии базы. Никогда не вносите правки в рабочую базу «на лету».

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

← На главную