Почему в общей ОСВ нет счета 01.01, хотя в ОСВ по счету он отображается с суммами?

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

При работе в программе «1С:Бухгалтерия предприятия» (особенно в редакции 2.0, но проблема также актуальна и для современных конфигураций на платформе «1С:Предприятие 8.3») бухгалтеры и технические специалисты иногда сталкиваются со странным поведением отчетов. В общей Оборотно-сальдовой ведомости (ОСВ) полностью отсутствуют остатки и обороты по счету 01 (или его субсчетам, например, 01.01), при этом амортизация по счету 02 начисляется исправно, документы по учету основных средств проведены с суммами, а отдельный отчет ОСВ по счету 01.01 формируется абсолютно корректно и показывает реальные остатки.

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

Выясняем причину: сбой иерархии плана счетов

Описанная ситуация представляет собой классический случай повреждения иерархической структуры (сбившейся подчиненности) в плане счетов Хозрасчетный. На практике это выглядит так: предопределенный субсчет 01.01 «Организация в организации» (или любой другой субсчет) каким-то образом теряет своего законного родителя — счет 01 «Основные средства» — и привязывается к совершенно чужому счету. Например, в рассмотренном случае на форуме субсчет 01.01 оказался подчинен счету 68.14 «Налог на имущество».

Давайте разберем основные причины, по которым в системе может произойти подобный технический сбой:

  1. Ошибки при обновлении конфигурации. При масштабном обновлении метаданных или переходе на новые релизы платформы может произойти некорректное сопоставление предопределенных элементов. В истории разработки 1С зафиксированы баги платформы, когда предопределенные счета базы данных случайным образом переподчинялись другим группам (например, счет 26 уходил под 79, а 62.01 оказывался внутри 45.01).
  2. Сбои при распределенном обмене данными (РИБ). Если учет ведется в нескольких узлах распределенной информационной базы или настроен регулярный обмен с другими конфигурациями (например, «1С:ЗУП»), то в процессе XML-сериализации и десериализации данных у принимающей стороны может произойти сбой записи реквизита Родитель для предопределенного элемента.
  3. Ошибки ручного администрирования. Сбой может быть вызван неосторожными действиями пользователей или неопытных специалистов при программном изменении структуры плана счетов или при попытке ручной настройки субсчетов в режиме иерархического просмотра.

Как сбой проявляется в системе (симптомы)

Проанализируем поведение программы в момент возникновения такой ошибки, чтобы вы могли безошибочно ее идентифицировать:

Техническая сложность исправления

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

При этом в самом Конфигураторе структура иерархии может выглядеть абсолютно правильной, так как сбой произошел на уровне записей СУБД в режиме предприятия. Ниже мы рассмотрим три способа решения этой проблемы.


Способ 1. Программное исправление через внешнюю обработку (Рекомендуемый)

Для обхода стандартных ограничений интерфейса нам потребуется написать небольшой скрипт на встроенном языке 1С. Этот метод позволяет принудительно перезаписать реквизит Родитель у объекта плана счетов, отключив проверку бизнес-логики формы.

Для выполнения этого способа создайте внешнюю обработку в Конфигураторе (или воспользуйтесь встроенной обработкой «Групповая обработка справочников и документов» / «Групповое изменение реквизитов», если конфигурация позволяет выполнять произвольный код).

Рассмотрим по шагам программный код, который решает эту задачу:


// Шаг 1: Находим объект сбившегося счета по его коду в базе данных
СчетОбъект = ПланыСчетов.Хозрасчетный.НайтиПоКоду("01.01").ПолучитьОбъект();

Если СчетОбъект <> Неопределено Тогда
    // Шаг 2: Находим правильного родителя для нашего субсчета
    НовыйРодитель = ПланыСчетов.Хозрасчетный.НайтиПоКоду("01");
    
    Если НовыйРодитель <> ПланыСчетов.Хозрасчетный.ПустаяСсылка() Тогда
        // Устанавливаем правильную подчиненность
        СчетОбъект.Родитель = НовыйРодитель;
        
        // Шаг 3: Включаем режим загрузки данных, чтобы обойти жесткие проверки в процедуре ПередЗаписью
        СчетОбъект.ОбменДанными.Загрузка = Истина;
        
        // Записываем исправленный объект в базу данных
        Попытка
            СчетОбъект.Записать();
            Сообщить("Подчиненность счета 01.01 успешно восстановлена!");
        Исключение
            Сообщить("Не удалось записать изменения: " + ОписаниеОшибки());
        КонецПопытки;
    Иначе
        Сообщить("Не найден родительский счет 01!");
    EndIf;
Иначе
    Сообщить("Не найден субсчет 01.01!");
КонецЕсли;

Важное примечание к коду: Использование свойства ОбменДанными.Загрузка = Истина критически важно. Оно сообщает платформе, что запись производится в режиме обмена, благодаря чему встроенные обработчики событий (такие как ПередЗаписью в модуле плана счетов) не будут выполнять стандартные проверки на запрет изменения предопределенных элементов.


Способ 2. Восстановление стандартных настроек плана счетов

В некоторых версиях конфигураций «1С:Предприятие 8» разработчики предусмотрели штатный механизм восстановления предопределенных настроек. Попробуем воспользоваться им без программирования:

  1. Перейдите в меню Предприятие -> План счетов -> План счетов бухгалтерского учета (или найдите его через все функции/функции для технического специалиста).
  2. В верхней командной панели формы списка (или в меню кнопки «Еще» / «Действия») найдите пункт «Установить стандартные настройки» (в некоторых релизах этот пункт называется «Обновить план счетов»).
  3. Подтвердите действие. Программа принудительно прочитает структуру предопределенных счетов из макета конфигурации и перезапишет свойства и связи счетов в пользовательской базе данных.

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


Способ 3. Временный перенос движений (если система блокирует изменения)

Иногда платформа не позволяет записать изменения в плане счетов из-за наличия активных движений (бухгалтерских проводок) по данному счету в регистрах. В таком случае мы можем применить обходной маневр с временным переносом итогов:

  1. Создайте временный транзитный счет в плане счетов (например, субсчет 01.99) с аналогичными субконто и свойствами.
  2. Используя универсальную обработку «Поиск и замена значений» (ее можно скачать на портале ИТС), замените во всех проводках счет 01.01 на временный счет 01.99. В результате счет 01.01 станет абсолютно чистым и не будет содержать движений.
  3. Примените Способ 1 или измените подчиненность пустого счета 01.01 вручную (без проводок система может позволить сделать это стандартными средствами).
  4. После восстановления правильной привязки (01.01 подчинён 01), выполните обратную замену значений в обработке: перенесите все движения со счета 01.99 обратно на исправленный счет 01.01.
  5. Удалите временный субсчет 01.99.

После реализации любого из предложенных способов обязательно зайдите в раздел Операции -> Управление итогами, установите период расчета итогов на текущий месяц и выполните полный пересчет итогов. Затем откройте общую Оборотно-сальдовую ведомость и убедитесь, что счет 01 и его субсчет 01.01 вернулись на свое законное место, а показатели общей ОСВ отображаются корректно.

← На главную