Почему в 1С 7.7 периодически отменяется проведение документа и как это исправить

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет
← На главную

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

Метод 1. Внедрение скрытого логирования через текстовый файл

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

Разберем по шагам, как настроить систему тотального контроля за конкретным документом. Нам необходимо внести изменения в модуль того вида документа, который доставляет проблемы (например, Выписка).

Найдем в модуле документа предопределенную процедуру ОбработкаУдаленияПроведения. Если её нет, её нужно создать. Вставим в неё код, который будет записывать данные о пользователе и времени в отдельный текстовый файл, который находится за пределами папки с базой данных (чтобы злоумышленник или скрипт не нашел его сразу).


Процедура ОбработкаУдаленияПроведения()
    // Укажем путь к скрытому логу
    ПутьКЛогу = "C:\Temp\debug_unpost_log.txt";
    Текст = СоздатьОбъект("Текст");
    Если ФС.СуществуетФайл(ПутьКЛогу) = 1 Тогда
        Текст.Открыть(ПутьКЛогу);
    КонецЕсли;
    
    Стр = "" + ТекущаяДата() + " " + ТекущееВремя() + " | ";
    Стр = Стр + "Пользователь: " + ИмяПользователя() + " | ";
    Стр = Стр + "Компьютер: " + ИмяКомпьютера() + " | ";
    Стр = Стр + "Документ: " + ТекущийДокумент().НомерДок + " от " + ТекущийДокумент().ДатаДок;
    
    Текст.ДобавитьСтроку(Стр);
    Текст.Записать(ПутьКЛогу);
    
    // Опционально: можно вызвать паузу или окно, чтобы остановить выполнение скрипта
    // Предупреждение("Внимание! Происходит отмена проведения документа!", 5);
КонецПроцедуры

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

Метод 2. Проверка алгоритмов «Клиент-Банка»

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

Часто в коде таких обработок прописана логика: перед перезаписью данных снять документ с проведения (СделатьНеПроведенным()), записать новые строки и провести заново. Если на этапе записи новых строк происходит ошибка (например, не заполнено обязательное субконто или заблокирован период), документ так и остается в статусе «не проведен». Рассмотрим, почему это происходит раз в месяц: возможно, бухгалтер раз в месяц случайно загружает старый файл kl_to_1c.txt, оставшийся в папке обмена, или запускает загрузку за период, который перекрывает уже введенные вручную данные.

Выясним причину, проверив настройки путей в обработке загрузки. Нужно убедиться, что у каждого пользователя настроена индивидуальная папка для файлов обмена, и старые файлы удаляются или архивируются.

Метод 3. Контроль запуска внешних обработок

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

Проанализируем ситуацию с правами доступа. Рекомендуется временно (или постоянно) отключить право Использование внешних обработок у всех пользователей, кроме администратора. Если после этого «самопроизвольные» отмены прекратятся, значит, источник проблемы — одна из обработок в папке ExtForms или файл, запускаемый пользователем вручную через меню «Файл — Открыть».

Также стоит проверить справочник Произвольные отчеты или Дополнительные возможности. Иногда вредоносный или просто некорректный код прячется там. Проведите аудит всех файлов в каталоге V77\каталог_базы\ExtForms на наличие строк СделатьНеПроведенным() или УдалитьПроведение().

Метод 4. Проверка целостности данных и дублей IDDOC

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

Если у двух документов (даже разных видов) совпадают идентификаторы, то проведение одного из них может привести к повреждению флага проведения у другого. Выполним следующие действия для диагностики:

  1. Запустите конфигуратор и выполните «Тестирование и исправление ИБ» с включенными галочками «Проверка логической целостности» и «Переиндексация».
  2. Если база файловая, попробуйте физически удалить все файлы с расширением .cdx в папке базы и запустить монопольно для полной переиндексации.
  3. В особо сложных случаях используйте утилиты для проверки DBF-файлов на наличие «фантомных» записей или записей, помеченных на удаление, но не вычищенных физически (паковка таблицы).

Метод 5. Скрытые триггеры в глобальном модуле

Иногда код, отменяющий проведение, находится не в самом документе, а в Глобальном модуле. Проанализируем процедуры ПриНачалеРаботыСистемы и ПриЗавершенииРаботыСистемы. Бывали случаи, когда программисты встраивали туда «регламентные» задачи, которые должны были чистить временные документы, но из-за ошибок в фильтрах (например, по номеру или дате) затрагивали реальные выписки.

Ищите в глобальном модуле запросы к документам или использование метода ВыбратьДокументы(). Особое внимание уделите коду, который обернут в условие по дате или имени пользователя. Например:


Если (ИмяПользователя() = "Робот") И (ТекущаяДата() = КонецМесяца(ТекущаяДата())) Тогда
    // Скрытый код очистки или перепроведения
КонецЕсли;

Метод 6. Влияние даты запрета редактирования

Проанализируем настройки даты запрета. В 1С 7.7 дата запрета часто проверяется только в визуальных формах. Программная отмена проведения через Объект.СделатьНеПроведенным() может игнорировать дату запрета, если в коде обработки нет явной проверки функции глПроверитьДатуЗапрета() (или аналогичной в вашей конфигурации). Таким образом, даже если период закрыт, криво написанная обработка обмена может «распровести» документ прошлых лет. Выясним, установлена ли проверка даты запрета в самом модуле документа в процедуре ПриОтменеПроведения (для интерактивных действий) и в обработке Клиент-Банк.

Резюме и рекомендации

Чтобы окончательно решить проблему, мы рекомендуем комбинированный подход: Во-первых, обязательно внедрите лог в текстовый файл, как показано в Методе 1. Это даст вам 100% доказательство того, КТО или ЧТО инициирует процедуру. Во-вторых, проверьте права на запуск внешних обработок. В-третьих, обратите внимание на документы-клоны. Если вы создали копию документа, и она тоже была отменена, значит, алгоритм «вредителя» ищет цель не по внутреннему ID, а по реквизитам: Номер, Дата, Сумма или Расчетный счет. Это сужает круг поиска до обработок загрузки данных или регламентных процедур очистки.

Помните, что 1С 7.7 — система прозрачная для программиста, и чудес в ней не бывает. Любое действие оставляет след, если правильно расставить «ловушки» в коде.

← На главную