При ведении учета в программе 1С:Бухгалтерия 7.7 пользователи часто сталкиваются с необходимостью оптимизировать или очистить аналитику. Например, когда закрывается определенное направление деятельности (которое велось как Субконто 1 на счетах учета), и руководство требует «вычистить» из базы все упоминания об этих операциях. На первый взгляд задача кажется тривиальной: написать обработку, найти документы с этим субконто, распровести их и удалить. Однако на практике этот процесс скрывает множество подводных камней.
Самая серьезная преграда — это так называемые «смешанные» документы. Что делать, если в одном документе фигурирует как нужное (активное), так и ненужное (удаляемое) направление? Например, при внутреннем перемещении денежных средств или затрат между направлениями. Простое удаление или распроведение такого документа нарушит баланс и лишит «хорошее» направление части его корректной истории.
В этой статье мы подробно рассмотрим, как правильно решить эту задачу методологически и технически, разберем несколько эффективных сценариев и приведем примеры программного кода для автоматизации процесса.
С точки зрения классического бухгалтерского учета, физическое удаление исторических данных с проводками — это грубое нарушение методологии. Если по удаляемому направлению деятельности уже сдавалась отчетность в прошлых периодах, любое изменение документов «задним числом» приведет к расхождению сданных деклараций с данными в информационной базе.
Рассмотрим, как правильно решить задачу без изменения истории:
Операция, который переносит все накопленные остатки с ненужного направления деятельности на новое, общее или вспомогательное направление.Этот способ гарантирует, что история за прошлые годы останется нетронутой, баланс не сойдется «в минус», а налоговые проверки не выявят расхождений с прошлыми периодами.
Если задача стоит жестко — физически убрать субконто из прошлых периодов, стандартное групповое перепроведение документов использовать нельзя. При перепроведении модуль документа заново сформирует проводки по алгоритмам, заложенным в конфигурации, и снова подставит ненужное субконто из табличной части.
Для обхода этой проблемы мы можем использовать техническую особенность платформы 1С:Предприятие 7.7: возможность напрямую редактировать бухгалтерские проводки операции, не затрагивая сам документ. Проанализируем пример кода, который находит проводки с определенным субконто и очищает его или заменяет на пустое значение.
// Пример очистки субконто непосредственно в проводках операций
Процедура ОчиститьСубконтоВПроводках(УдаляемоеСубконто)
выбДок = СоздатьОбъект("Документ");
ОперацияОБ = СоздатьОбъект("Операция");
// Выбираем документы за интересующий нас период
выбДок.ВыбратьДокументы(ДатаНач, ДатаКон);
Пока выбДок.ПолучитьДокумент() = 1 Цикл
// Проверяем, есть ли у документа бухгалтерская операция
Если ОперацияОБ.НайтиОперацию(выбДок.ТекущийДокумент()) = 1 Тогда
Изменено = 0;
ОперацияОБ.ВыбратьПроводки();
Пока ОперацияОБ.ПолучитьПроводку() = 1 Цикл
// Анализируем субконто дебета
Для НомерСубк = 1 По ОперацияОБ.Дебет.Счет.КоличествоСубконто() Цикл
Если ОперацияОБ.Дебет.Субконто(НомерСубк) = УдаляемоеСубконто Тогда
// Очищаем субконто (присваиваем пустое значение)
ОперацияОБ.Дебет.Субконто(НомерСубк, ПолучитьПустоеЗначение("Справочник.НаправленияДеятельности"));
Изменено = 1;
КонецЕсли;
КонецЦикла;
// Анализируем субконто кредита
Для НомерСубк = 1 По ОперацияОБ.Кредит.Счет.КоличествоСубконто() Цикл
Если ОперацияОБ.Кредит.Субконто(НомерСубк) = УдаляемоеСубконто Тогда
ОперацияОБ.Кредит.Субконто(НомерСубк, ПолучитьПустоеЗначение("Справочник.НаправленияДеятельности"));
Изменено = 1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
// Записываем изменения в операцию, если были корректировки
Если Изменено = 1 Тогда
ОперацияОБ.Записать();
Сообщить("Успешно скорректирована операция документа: " + выбДок.ТекущийДокумент());
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важное предупреждение: При использовании этого метода ни в коем случае нельзя запускать групповое перепроведение документов за этот период. В противном случае все ваши ручные изменения в операциях будут стерты, и система вернет исходные проводки из модулей документов.
Рассмотрим ситуацию, когда документ выполняет перевод средств между «хорошим» и «плохим» направлениями напрямую (например: Дт 51 [Направление_Нужное] — Кт 51 [Направление_Ненужное]). Если мы просто очистим или удалим Кредитовую часть проводки, у нас разорвется двойная запись, либо на «хорошем» направлении зависнет необоснованный остаток.
Для решения этой проблемы применяется транзитный метод:
00 или 76 без аналитики по направлениям).Дт 51 [Направление_Нужное] — Кт 00. Данная проводка сохраняется в базе, чтобы не нарушать баланс и обороты по нужному направлению.Дт 00 — Кт 51 [Направление_Ненужное]. Эта проводка подлежит удалению или обнулению.91 или 84) как прочие доходы или расходы.Если физическое удаление проводок слишком рискованно, программисты часто выбирают более безопасный путь — объединение (слияние) аналитики. Вместо полного удаления проводок, мы переносим всю историю удаляемого элемента на один обобщенный архивный элемент справочника.
Разберем алгоритм этого метода по шагам:
ПоискИЗаменаЗначений.ert).Если база данных эксплуатируется много лет, оптимальным решением станет проведение процедуры свертки (например, на начало текущего года) с помощью типовой обработки WRAP.ert:
В крупных базах данных проведение подобных корректировок через штатный интерфейс 1С может занимать десятки часов или вызывать переполнение транзакционного лога. Опытные разработчики выполняют зачистку на низком уровне.
В SQL-версии 1С 7.7 информация о проводках хранится в таблице _1SENTRY. Мы можем составить прямой SQL-запрос для очистки полей субконто. Выясним структуру таблицы и выполним обновление:
-- ПРИМЕР SQL-ЗАПРОСА ДЛЯ ОЧИСТКИ СУБКОНТО
-- Внимание: Перед запуском обязательно сделайте резервную копию базы данных!
UPDATE _1SENTRY
SET
SP1 = ' 0 ' -- Заменяем ID субконто на пустое значение (зависит от настроек метаданных)
WHERE
SP1 = ' 1AF3 ' -- ID удаляемого направления деятельности
Важное правило: После выполнения любых низкоуровневых операций в SQL или DBF (через внешние утилиты) обязательно необходимо запустить конфигуратор 1С в режиме Тестирование и исправление ИБ с обязательным выбором пунктов «Пересчет бухгалтерских итогов» и «Проверка ссылочной целостности». Это позволит системе перестроить таблицы итогов 1SBKTTL и убрать зависшие виртуальные остатки.
После того как база данных была успешно очищена, необходимо предотвратить повторное появление удаленного субконто. Для этого выполните следующие действия:
ВводНового() справочника направлений деятельности или в модулях проведения ключевых документов добавьте программную проверку:
// Фрагмент кода для модуля проведения документа
Процедура ОбработкаПроведения()
// ... стандартный код проведения
Если Субконто1 = УдаленноеНаправление Тогда
Предупреждение("Выбранное направление деятельности закрыто и не может быть использовано!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецПроцедуры
Проанализировав все представленные методы, мы видим, что задача очистки базы от определенного субконто требует взвешенного подхода. Если вы хотите сохранить полную финансовую историю и сдать корректирующие отчеты без проблем — используйте метод слияния аналитики (Метод 4) или перенос остатков в текущем периоде (Метод 1). Если же требуется радикальное удаление данных — используйте точечную очистку операций (Метод 2) в связке с транзитным разделением проводок (Метод 3), предварительно защитив базу от случайного перепроведения.