Как удалить из базы 1С:Бухгалтерия 7.7 документы и проводки по определенному субконто?

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

При ведении учета в программе 1С:Бухгалтерия 7.7 пользователи часто сталкиваются с необходимостью оптимизировать или очистить аналитику. Например, когда закрывается определенное направление деятельности (которое велось как Субконто 1 на счетах учета), и руководство требует «вычистить» из базы все упоминания об этих операциях. На первый взгляд задача кажется тривиальной: написать обработку, найти документы с этим субконто, распровести их и удалить. Однако на практике этот процесс скрывает множество подводных камней.

Самая серьезная преграда — это так называемые «смешанные» документы. Что делать, если в одном документе фигурирует как нужное (активное), так и ненужное (удаляемое) направление? Например, при внутреннем перемещении денежных средств или затрат между направлениями. Простое удаление или распроведение такого документа нарушит баланс и лишит «хорошее» направление части его корректной истории.

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

Метод 1. Методологический подход (Перенос остатков и закрытие аналитики)

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

Рассмотрим, как правильно решить задачу без изменения истории:

  1. Согласование с главным бухгалтером: Любые манипуляции с закрытием аналитики должны выполняться только с ведома и письменного согласия ответственного лица.
  2. Создание транзитной операции: В текущем (открытом) периоде создается документ Операция, который переносит все накопленные остатки с ненужного направления деятельности на новое, общее или вспомогательное направление.
  3. Блокировка использования: Чтобы пользователи больше не могли выбрать старое направление в документах, накладывается административный запрет (программный или через настройку прав доступа).

Этот способ гарантирует, что история за прошлые годы останется нетронутой, баланс не сойдется «в минус», а налоговые проверки не выявят расхождений с прошлыми периодами.

Метод 2. Прямая корректировка проводок через объект Операция (Без перепроведения)

Если задача стоит жестко — физически убрать субконто из прошлых периодов, стандартное групповое перепроведение документов использовать нельзя. При перепроведении модуль документа заново сформирует проводки по алгоритмам, заложенным в конфигурации, и снова подставит ненужное субконто из табличной части.

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


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

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

Метод 3. Транзитный метод для смешанных документов

Рассмотрим ситуацию, когда документ выполняет перевод средств между «хорошим» и «плохим» направлениями напрямую (например: Дт 51 [Направление_Нужное] — Кт 51 [Направление_Ненужное]). Если мы просто очистим или удалим Кредитовую часть проводки, у нас разорвется двойная запись, либо на «хорошем» направлении зависнет необоснованный остаток.

Для решения этой проблемы применяется транзитный метод:

  1. Прямая проводка разделяется на две составляющие через вспомогательный балансовый счет (например, счет 00 или 76 без аналитики по направлениям).
  2. Первая проводка: Дт 51 [Направление_Нужное] — Кт 00. Данная проводка сохраняется в базе, чтобы не нарушать баланс и обороты по нужному направлению.
  3. Вторая проводка: Дт 00 — Кт 51 [Направление_Ненужное]. Эта проводка подлежит удалению или обнулению.
  4. Образовавшееся на транзитном счете сальдо по согласованию с бухгалтером списывается в конце периода на финансовые результаты (счет 91 или 84) как прочие доходы или расходы.

Метод 4. Слияние (замена) субконто

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

Разберем алгоритм этого метода по шагам:

  1. В справочнике направлений деятельности создаем новый элемент с названием, например, «Архив (устаревшие направления)» или «Прочие направления».
  2. Запускаем специализированную обработку поиска и замены значений (стандартная обработка ПоискИЗаменаЗначений.ert).
  3. Указываем старое направление в качестве заменяемого значения, а новое «Архивное» — в качестве заменяющего.
  4. Обработка автоматически обойдет все документы, константы, справочники и проводки, заменив ссылки.
  5. После этого старый элемент справочника можно безболезненно удалить физически, так как ссылок на него в базе больше не останется. Баланс базы при этом останется идеальным.

Метод 5. Свертка базы данных с фильтрацией

Если база данных эксплуатируется много лет, оптимальным решением станет проведение процедуры свертки (например, на начало текущего года) с помощью типовой обработки WRAP.ert:

  1. На дату свертки формируются документы ввода остатков, а все исторические документы за прошлые годы физически удаляются из базы.
  2. При формировании остатков по счетам аналитика по удаляемому направлению деятельности игнорируется, либо автоматически переносится на транзитный счет или общее направление.
  3. В результате мы получаем «чистую» базу с актуальными остатками, в которой полностью отсутствует старая история и проблема смешанных документов прошлых периодов.

Метод 6. Прямое удаление на уровне базы данных (SQL / DBF)

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

В SQL-версии 1С 7.7 информация о проводках хранится в таблице _1SENTRY. Мы можем составить прямой SQL-запрос для очистки полей субконто. Выясним структуру таблицы и выполним обновление:


-- ПРИМЕР SQL-ЗАПРОСА ДЛЯ ОЧИСТКИ СУБКОНТО
-- Внимание: Перед запуском обязательно сделайте резервную копию базы данных!
UPDATE _1SENTRY
SET 
    SP1 = '     0   ' -- Заменяем ID субконто на пустое значение (зависит от настроек метаданных)
WHERE 
    SP1 = '   1AF3  ' -- ID удаляемого направления деятельности

Важное правило: После выполнения любых низкоуровневых операций в SQL или DBF (через внешние утилиты) обязательно необходимо запустить конфигуратор 1С в режиме Тестирование и исправление ИБ с обязательным выбором пунктов «Пересчет бухгалтерских итогов» и «Проверка ссылочной целостности». Это позволит системе перестроить таблицы итогов 1SBKTTL и убрать зависшие виртуальные остатки.

Метод 7. Установка защиты от будущих ошибок

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


// Фрагмент кода для модуля проведения документа
Процедура ОбработкаПроведения()
    // ... стандартный код проведения
    Если Субконто1 = УдаленноеНаправление Тогда
        Предупреждение("Выбранное направление деятельности закрыто и не может быть использовано!");
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
КонецПроцедуры

Проанализировав все представленные методы, мы видим, что задача очистки базы от определенного субконто требует взвешенного подхода. Если вы хотите сохранить полную финансовую историю и сдать корректирующие отчеты без проблем — используйте метод слияния аналитики (Метод 4) или перенос остатков в текущем периоде (Метод 1). Если же требуется радикальное удаление данных — используйте точечную очистку операций (Метод 2) в связке с транзитным разделением проводок (Метод 3), предварительно защитив базу от случайного перепроведения.

← На главную