Как исправить ситуацию, когда счет в 1С 7.7 стал группой, но на нем остались остатки

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

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

Проанализируем причину возникновения проблемы

В 1С 7.7 каждый объект плана счетов имеет свой внутренний идентификатор (ID). Когда вы создаете субсчета в конфигураторе, система меняет статус существующего счета. Если ранее счет 004 был обычным счетом, а вы создали для него субсчета 004.1 и 004.2, конфигуратор делает счет 004 группой. Однако в таблице проводок (_1SENTRY) все исторические записи продолжают ссылаться на ID того самого объекта, который теперь стал группой. В интерфейсе программы мы видим группу, по которой нельзя бить проводки, но на которой "висят" огромные суммы. Полный пересчет итогов в этом случае может длиться часами, а перепроведение — днями, что неприемлемо для работающего бизнеса.

Разберем структуру SQL-таблиц для решения задачи

Для исправления ситуации нам потребуется доступ к MS SQL Server Management Studio и понимание структуры хранения данных 1С 7.7. Основными таблицами для нас будут:

  1. _1SACCS — таблица плана счетов.
  2. _1SENTRY — журнал проводок.

В таблице _1SACCS ключевыми полями являются:

Способ 1: Прямой перенос проводок через SQL (Рекомендуемый)

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

Шаг 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-обновления вы получите битые итоги по аналитике.

Способ 2: Временное снятие признака группы

Если вы опасаетесь напрямую править таблицу проводок _1SENTRY из-за её огромного размера, можно пойти по пути временного обмана системы. Проанализируем этот вариант:

  1. В таблице _1SACCS находим запись счета 004.
  2. Меняем значение поля ISFOLDER с 1 на 2.
  3. После этого 1С начнет воспринимать 004 как обычный счет (несмотря на наличие субсчетов).
  4. Теперь в режиме "1С:Предприятие" мы можем воспользоваться стандартной обработкой "Поиск и замена значений" (из состава типовых или с ИТС).
  5. Заменяем счет 004 на 004.1 во всех документах. Программа позволит это сделать, так как 004 технически больше не группа.
  6. После завершения замены возвращаем ISFOLDER = 1 в SQL.

Этот способ дольше, чем прямой UPDATE, но безопаснее с точки зрения контроля ссылочной целостности внутри самой 1С.

Пересчет итогов — обязательный финал

Любые прямые правки в SQL (будь то изменение проводок или признака группы) приводят к тому, что таблицы итогов (_1SBKTTL и др.) становятся неактуальными. После выполнения SQL-запросов необходимо выполнить штатную процедуру "Управление итогами — Полный пересчет итогов" в режиме "Монопольно".

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


TRUNCATE TABLE _1SBKTTL;
TRUNCATE TABLE _1SBKTTLC;

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

Рекомендации по безопасности

Рассмотрим правила, которые помогут избежать потери данных при выполнении подобных операций:

Таким образом, мы выяснили, что превращение счета в группу — это не фатальная ошибка, а следствие особенностей работы конфигуратора 7.7. С помощью прямых SQL-запросов проблема решается за считанные минуты, исключая необходимость многодневного перепроведения документов.

← На главную