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

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

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

1. Архитектурная особенность флага проведения и таблиц движений

В базе данных 1С признак проведения документа хранится как отдельное поле в таблице журнала документов (1SJOURN). Сами движения регистров записываются в отдельные таблицы движений (RA*.DBF) и итогов (RG*.DBF). Связь между ними обеспечивает встроенный язык платформы и логика конфигурации. Если в процессе работы программы или записи объекта произошел сбой, признак проведения может остаться установленным, даже если в таблицах регистров строки отсутствуют или были очищены.

2. Изменение проведенного документа без перепроведения

Проанализируем распространенную ситуацию: пользователь провел документ (например, с пустой табличной частью или с одними данными), затем открыл форму, внес изменения или добавил строки и нажал кнопку сохранения вместо проведения.

  1. Настройки прав пользователей: перейдем в Конфигуратор на вкладку «Права», откроем требуемый набор прав и проверим права на документ. Если включено право «Изменение документов без перепроведения» или «Корректировка», пользователь может перезаписать проведенный документ без вызова механизма переформирования проводок и движений.
  2. Программный контроль в модуле формы: если конфигурация самописная, для принудительного обновления движений при любом сохранении документа в модуле формы используется специальный метод. Разберем пример его вызова в предопределенной процедуре:

Процедура ПриОткрытии()
    // Принудительно перепроводить документ при записи, если он уже проведен
    ПриЗаписиПерепроводить(1);
КонецПроцедуры

3. Логические ошибки в модуле документа

Выясним причину возможного отсутствия движений непосредственно в коде процедуры ОбработкаПроведения:

  1. Преждевременный выход из процедуры: наличие условий с оператором Возврат; до блока формирования регистровых записей. Если условие срабатывает, алгоритм прекращает работу, не вызывая очистку флага проведения или отмену транзакции.
  2. Разделение на оперативное и неоперативное проведение: в процедуре проведения могут проверяться параметры режима проведения. Если движения создаются только при оперативном проведении (на момент точки актуальности — ТА), то при проведении задним числом или при групповой обработке движений создано не будет.
  3. Проверка остатков с жесткой привязкой к ТА: если в коде вызывается метод Регистр.ИмяРегистра.Остаток(...) без учета позиции документа, при проведении задним числом остаток может определиться как нулевой, и цикл создания движений просто будет пропущен.

4. Сбои файловой системы и повреждение индексов DBF

В сетевом файловом режиме при аварийном завершении работы программы или сбоях сети табличные файлы и индексы могут рассинхронизироваться. Повреждение индексных файлов (*.CDX) приводит к тому, что запросы и выборки отчетов перестают видеть существующие записи регистров.

Для устранения этой проблемы выполним регламентные действия:

  1. Запустим Конфигуратор в монопольном режиме.
  2. Выберем меню «Администрирование» — «Тестирование и исправление информационной базы».
  3. Установим флаги «Реиндексация», «Проверка физической целостности» и «Пересчет итогов».
  4. Альтернативный способ полной переиндексации: завершить работу всех пользователей, удалить из каталога базы данных все файлы с расширением *.CDX и запустить 1С Предприятие в монопольном режиме для автоматического перестроения индексов.
  5. Проверим состояние точки актуальности через меню «Сервис» — «Управление оперативными итогами» и при необходимости пересчитаем итоги.

5. Поиск документов без движений с помощью программной обработки

Посмотрим на пример обработки для автоматического поиска всех проведенных накладных, у которых отсутствуют движения по регистру:


Процедура НайтиДокументыБезДвижений()
    Перем Док, Рег;
    Док = СоздатьОбъект("Документ.Накладная");
    Рег = СоздатьОбъект("Регистр.ОстаткиТоваров");
    
    Док.ВыбратьДокументы();
    Пока Док.ПолучитьДокумент() = 1 Цикл
        Если Док.Проведен() = 1 Тогда
            // Проверяем наличие движений по документу в регистре
            Рег.ВыбратьДвиженияДокумента(Док.ТекущийДокумент());
            Если Рег.ПолучитьДвижение() = 0 Тогда
                Сообщить("Документ без движений: " + глПредставлениеДокумента(Док.ТекущийДокумент()) + 
                         " от " + Док.ДатаДок);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

← На главную