Почему в анализе счета 68.2 отражаются обороты по 51 и 62 счетам в 1С:УПП и как это исправить?

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет
← На главную

При работе в крупных и давно ведущихся базах данных «1С:Управление производственным предприятием» (УПП) пользователи и бухгалтеры иногда сталкиваются с удивительным поведением стандартных отчетов. В один прекрасный день при формировании отчетов Анализ счета или Оборотно-сальдовая ведомость по счету 68.02 в них начинают отображаться обороты между счетами 51 и 62 или 62 и 90. При этом, если дважды кликнуть по строке отчета и провалиться до карточки счета или проводки, система показывает абсолютно корректные записи типа Дт 51 - Кт 62 или Дт 62 - Кт 90, в которых счет 68 вообще отсутствует!

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

Выясняем причину: как устроен механизм иерархии в отчетах 1С

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

Проводки (например, Дт 51 - Кт 62) физически записываются в основной регистр бухгалтерии. Там они хранятся в неизменном виде. Счета учета указываются непосредственно в субконто и измерениях проводки. Именно поэтому при детализации отчета (двойном клике) и переходе к карточке счета платформа считывает напрямую физические записи регистра и показывает нам правильные проводки.

Однако стандартные бухгалтерские отчеты (Анализ счета, ОСВ, Анализ субконто) работают по иерархическому принципу «сверху вниз». Строя отчет по счету 68, система обращается к метаданным плана счетов Хозрасчетный и проверяет, какие счета являются подчиненными (субсчетами) для счета 68. Если по какой-то причине в режиме «1С:Предприятие» счет 62 (или один из его субсчетов) оказался подчинен счету 68 (то есть у счета 62 в поле Родитель был прописан счет 68), система воспримет счет 62 как субсчет 68-го счета.

В результате при агрегации итогов платформа суммирует все обороты по «субсчету» 62 и включает их в общие итоги по «родителю» 68. Так в анализе счета 68 появляются «фантомные» обороты с 51 и 90 счетами.

Почему это происходит?

Чаще всего нарушение иерархии в плане счетов происходит по следующим причинам:

  1. Человеческий фактор (Drag-and-Drop): В конфигурациях на обычных формах (таких как УПП) дерево плана счетов открыто для интерактивного изменения. Бухгалтер или неопытный пользователь может случайно зажать левую кнопку мыши и перетащить счет 62 внутрь группы 68. Визуально это легко не заметить, особенно если список счетов отсортирован по коду, а не по иерархии.
  2. Программные сбои при обмене данными (РИБ): При синхронизации распределенных баз данных или загрузке метаданных из внешних систем реквизит Родитель у предопределенных счетов может перезаписаться некорректным значением.
  3. Неверная работа внешних обработок: Использование обработок для переноса данных или свертки базы, написанных без контроля ссылочной целостности планов счетов.

Шаг 1. Локализация ошибки с помощью Консоли запросов

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

Выполним следующий запрос:


ВЫБРАТЬ
    Хозрасчетный.Ссылка КАК Счет,
    Хозрасчетный.Код КАК КодСчета,
    Хозрасчетный.Родитель КАК Родитель,
    Хозрасчетный.Родитель.Код КАК КодРодителя
ИЗ
    ПланСчетов.Хозрасчетный КАК Хозрасчетный
ГДЕ
    Хозрасчетный.Родитель <> ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ПустаяСсылка)

Проанализируем результаты выполнения запроса. Мы должны обратить внимание на строки, где код дочернего счета не начинается с кода родительского счета. Например, если в строке выводится счет 62.01, а в поле «Код родителя» указано 68.02 — это и есть наша критическая ошибка.

Для автоматизации этого процесса мы можем написать небольшой программный скрипт во внешней обработке, который проверит соответствие кодов:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Хозрасчетный.Ссылка КАК Счет,
    |   Хозрасчетный.Код КАК Код,
    |   Хозрасчетный.Родитель КАК Родитель,
    |   Хозрасчетный.Родитель.Код КАК КодРодителя
    |ИЗ
    |   ПланСчетов.Хозрасчетный КАК Хозрасчетный
    |ГДЕ
    |   Хозрасчетный.Родитель <> ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ПустаяСсылка)";

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл
    ДлинаРодителя = СтрДлина(Выборка.КодРодителя);
    // Проверяем левые символы кода дочернего счета на равенство коду родителя
    Если Лев(Выборка.Код, ДлинаРодителя) <> Выборка.КодРодителя Тогда
        Сообщить("ВНИМАНИЕ! Нарушена иерархия счета: " + Выборка.Код + 
                 " (Родитель: " + Выборка.КодРодителя + ")", СтатусСообщения.Важное);
    КонецЕсли;
КонецЦикла;

Шаг 2. Исправление иерархии в режиме предприятия

После того как конкретный проблемный счет обнаружен (допустим, это счет 62.01 или группа счетов 62, у которой родителем назначен 68), исправим ошибку.

Рассмотрим по шагам интерактивный способ исправления:

  1. Откроем меню Операции — Планы счетов — Хозрасчетный.
  2. Найдем в списке проблемный счет (например, 62 или его субсчета).
  3. Нажмем кнопку Изменить (F2), чтобы открыть карточку счета в режиме редактирования.
  4. Обратим внимание на реквизит Подчинен счету (в коде конфигурации это реквизит Родитель).
  5. Если для группы счетов верхнего уровня (например, 62) там ошибочно указан счет 68, очистим это поле (нажатием на кнопку «крестик» или клавишу Shift + F4) либо укажем правильного родителя.
  6. Нажмем кнопку ОК для сохранения изменений.

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


// Сброс некорректного родителя у счета 62
СчетОбъект = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62").ПолучитьОбъект();
Если СчетОбъект <> Неопределено Тогда
    // Устанавливаем пустого родителя для счета верхнего уровня
    СчетОбъект.Родитель = ПланыСчетов.Хозрасчетный.ПустаяСсылка();
    СчетОбъект.Записать();
    Сообщить("Иерархия счета 62 успешно восстановлена!");
КонецЕсли;

Шаг 3. Очистка кэша метаданных и проверка результатов

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

Чтобы гарантировать полное применение изменений, выполним следующие действия:

Профилактика подобных ошибок в будущем

Для исключения повторения таких инцидентов рекомендуется настроить систему разграничения прав доступа. В типовой конфигурации УПП право на изменение плана счетов должно быть только у Администратора и Главного бухгалтера. Обычным пользователям и бухгалтерам на участках необходимо ограничить доступ к изменению карточек счетов и структуры плана счетов.

← На главную