В практике сопровождения старых систем на платформе 1С:Предприятие 7.7 (особенно SQL-версий) встречается классическая архитектурная коллизия. При реорганизации плана счетов, когда пользователь или программист решает добавить субсчета к уже существующему счету, по которому накоплены значительные обороты, конфигуратор может автоматически превратить основной счет в группу. В результате мы получаем "счет-группу" с ненулевыми остатками. Согласно логике 1С, проводки по группе запрещены, и стандартные отчеты перестают корректно отображать данные или блокируют работу. Рассмотрим, как выйти из этой ситуации, когда объем данных (сотни тысяч документов) не позволяет выполнить перепроведение.
В 1С 7.7 каждый объект плана счетов имеет свой внутренний идентификатор (ID). Когда вы создаете субсчета в конфигураторе, система меняет статус существующего счета. Если ранее счет 004 был обычным счетом, а вы создали для него субсчета 004.1 и 004.2, конфигуратор делает счет 004 группой. Однако в таблице проводок (_1SENTRY) все исторические записи продолжают ссылаться на ID того самого объекта, который теперь стал группой. В интерфейсе программы мы видим группу, по которой нельзя бить проводки, но на которой "висят" огромные суммы. Полный пересчет итогов в этом случае может длиться часами, а перепроведение — днями, что неприемлемо для работающего бизнеса.
Для исправления ситуации нам потребуется доступ к MS SQL Server Management Studio и понимание структуры хранения данных 1С 7.7. Основными таблицами для нас будут:
_1SACCS — таблица плана счетов._1SENTRY — журнал проводок.В таблице _1SACCS ключевыми полями являются:
ID — внутренний уникальный идентификатор счета (9 символов).SCHKOD — код счета (например, "004 ").ISFOLDER — признак группы. Значение 1 означает группу, значение 2 — счет или субсчет.LEVEL — уровень вложенности.PARENTID — ссылка на идентификатор родителя.Этот метод наиболее эффективен, так как он не меняет структуру плана счетов, созданную конфигуратором, а просто переносит "деньги" (ссылки в проводках) со старого идентификатора (теперь группы) на новый идентификатор (субсчет). Выясним последовательность действий:
Шаг 1: Идентификация объектов. Нам нужно найти ID старого счета 004 и нового субсчета 004.1. Выполним поисковый запрос:
SELECT ID, SCHKOD, DESCR, ISFOLDER
FROM _1SACCS
WHERE SCHKOD LIKE '004%'
Допустим, мы выяснили, что ID группы 004 — это ' 123 ', а ID нового субсчета 004.1 — ' ABC '.
Шаг 2: Обновление проводок. Теперь нам нужно заменить ссылки во всех исторических проводках. В таблице _1SENTRY счет дебета хранится в поле ACCDTID, а счет кредита — в ACCCRTID. Напишем и выполним два запроса:
-- Обновляем дебет
UPDATE _1SENTRY
SET ACCDTID = ' ABC ' -- ID субсчета 004.1
WHERE ACCDTID = ' 123 ' -- ID группы 004
-- Обновляем кредит
UPDATE _1SENTRY
SET ACCCRTID = ' ABC ' -- ID субсчета 004.1
WHERE ACCCRTID = ' 123 ' -- ID группы 004
Важный нюанс: Если счет является валютным или по нему ведется количественный учет, убедитесь, что настройки нового субсчета 004.1 в конфигураторе полностью идентичны старому счету 004 (количество субконто, типы субконто, флаги валютного и количественного учета). В противном случае после прямого SQL-обновления вы получите битые итоги по аналитике.
Если вы опасаетесь напрямую править таблицу проводок _1SENTRY из-за её огромного размера, можно пойти по пути временного обмана системы. Проанализируем этот вариант:
_1SACCS находим запись счета 004.ISFOLDER с 1 на 2.ISFOLDER = 1 в SQL.Этот способ дольше, чем прямой UPDATE, но безопаснее с точки зрения контроля ссылочной целостности внутри самой 1С.
Любые прямые правки в SQL (будь то изменение проводок или признака группы) приводят к тому, что таблицы итогов (_1SBKTTL и др.) становятся неактуальными. После выполнения SQL-запросов необходимо выполнить штатную процедуру "Управление итогами — Полный пересчет итогов" в режиме "Монопольно".
Как отметил автор темы, на больших базах это может занять несколько часов. Чтобы оптимизировать процесс, некоторые администраторы баз данных практикуют предварительную очистку таблиц итогов перед запуском пересчета:
TRUNCATE TABLE _1SBKTTL;
TRUNCATE TABLE _1SBKTTLC;
Внимание: Делайте это только при наличии актуального бэкапа и глубокого понимания структуры базы. После очистки этих таблиц запуск пересчета итогов из конфигуратора обязателен, иначе отчеты будут показывать нулевые остатки.
Рассмотрим правила, которые помогут избежать потери данных при выполнении подобных операций:
_1SACCS рекомендуется перезагрузить SQL-сервер или как минимум перезайти в 1С на всех рабочих станциях, чтобы система перечитала план счетов.Таким образом, мы выяснили, что превращение счета в группу — это не фатальная ошибка, а следствие особенностей работы конфигуратора 7.7. С помощью прямых SQL-запросов проблема решается за считанные минуты, исключая необходимость многодневного перепроведения документов.