При работе в программе «1С:Бухгалтерия предприятия» (особенно в редакции 2.0, но проблема также актуальна и для современных конфигураций на платформе «1С:Предприятие 8.3») бухгалтеры и технические специалисты иногда сталкиваются со странным поведением отчетов. В общей Оборотно-сальдовой ведомости (ОСВ) полностью отсутствуют остатки и обороты по счету 01 (или его субсчетам, например, 01.01), при этом амортизация по счету 02 начисляется исправно, документы по учету основных средств проведены с суммами, а отдельный отчет ОСВ по счету 01.01 формируется абсолютно корректно и показывает реальные остатки.
Проведение стандартного Тестирования и исправления (ТИИ) информационной базы, пересчет итогов, перепроведение документов и даже выгрузка/загрузка базы данных в формате .dt в большинстве случаев не приносят никаких результатов. В этой статье мы подробно разберем, почему возникает этот сбой, проанализируем скрытые симптомы проблемы и рассмотрим три практических способа ее решения.
Описанная ситуация представляет собой классический случай повреждения иерархической структуры (сбившейся подчиненности) в плане счетов Хозрасчетный. На практике это выглядит так: предопределенный субсчет 01.01 «Организация в организации» (или любой другой субсчет) каким-то образом теряет своего законного родителя — счет 01 «Основные средства» — и привязывается к совершенно чужому счету. Например, в рассмотренном случае на форуме субсчет 01.01 оказался подчинен счету 68.14 «Налог на имущество».
Давайте разберем основные причины, по которым в системе может произойти подобный технический сбой:
26 уходил под 79, а 62.01 оказывался внутри 45.01).Родитель для предопределенного элемента.Проанализируем поведение программы в момент возникновения такой ошибки, чтобы вы могли безошибочно ее идентифицировать:
01.01 в общей оборотке суммируются и выводятся внутри родительского («чужого») счета (в нашем примере — внутри счета 68). Из-за этого на самом счете 01 в общей ОСВ образуется пустота, а баланс организации визуально перестает сходиться, так как активы «прячутся» внутри обязательств.01.01 и выводит их на экран.Поскольку счет 01.01 является предопределенным (он создан разработчиками на уровне конфигуратора), система накладывает жесткие ограничения на его изменение в пользовательском режиме («1С:Предприятие»). Если вы попытаетесь вручную зайти в карточку счета 01.01 через План счетов, чтобы исправить поле «Подчинен счету», программа заблокирует это действие и выдаст предупреждение: «Нельзя изменить подчиненность предопределенных счетов».
При этом в самом Конфигураторе структура иерархии может выглядеть абсолютно правильной, так как сбой произошел на уровне записей СУБД в режиме предприятия. Ниже мы рассмотрим три способа решения этой проблемы.
Для обхода стандартных ограничений интерфейса нам потребуется написать небольшой скрипт на встроенном языке 1С. Этот метод позволяет принудительно перезаписать реквизит Родитель у объекта плана счетов, отключив проверку бизнес-логики формы.
Для выполнения этого способа создайте внешнюю обработку в Конфигураторе (или воспользуйтесь встроенной обработкой «Групповая обработка справочников и документов» / «Групповое изменение реквизитов», если конфигурация позволяет выполнять произвольный код).
Рассмотрим по шагам программный код, который решает эту задачу:
// Шаг 1: Находим объект сбившегося счета по его коду в базе данных
СчетОбъект = ПланыСчетов.Хозрасчетный.НайтиПоКоду("01.01").ПолучитьОбъект();
Если СчетОбъект <> Неопределено Тогда
// Шаг 2: Находим правильного родителя для нашего субсчета
НовыйРодитель = ПланыСчетов.Хозрасчетный.НайтиПоКоду("01");
Если НовыйРодитель <> ПланыСчетов.Хозрасчетный.ПустаяСсылка() Тогда
// Устанавливаем правильную подчиненность
СчетОбъект.Родитель = НовыйРодитель;
// Шаг 3: Включаем режим загрузки данных, чтобы обойти жесткие проверки в процедуре ПередЗаписью
СчетОбъект.ОбменДанными.Загрузка = Истина;
// Записываем исправленный объект в базу данных
Попытка
СчетОбъект.Записать();
Сообщить("Подчиненность счета 01.01 успешно восстановлена!");
Исключение
Сообщить("Не удалось записать изменения: " + ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Не найден родительский счет 01!");
EndIf;
Иначе
Сообщить("Не найден субсчет 01.01!");
КонецЕсли;
Важное примечание к коду: Использование свойства ОбменДанными.Загрузка = Истина критически важно. Оно сообщает платформе, что запись производится в режиме обмена, благодаря чему встроенные обработчики событий (такие как ПередЗаписью в модуле плана счетов) не будут выполнять стандартные проверки на запрет изменения предопределенных элементов.
В некоторых версиях конфигураций «1С:Предприятие 8» разработчики предусмотрели штатный механизм восстановления предопределенных настроек. Попробуем воспользоваться им без программирования:
Обратите внимание: Этот метод может сбросить пользовательские настройки предопределенных счетов, если вы вручную меняли их свойства (например, виды субконто). Перед выполнением этого действия обязательно сделайте резервную копию базы данных.
Иногда платформа не позволяет записать изменения в плане счетов из-за наличия активных движений (бухгалтерских проводок) по данному счету в регистрах. В таком случае мы можем применить обходной маневр с временным переносом итогов:
01.99) с аналогичными субконто и свойствами.01.01 на временный счет 01.99. В результате счет 01.01 станет абсолютно чистым и не будет содержать движений.01.01 вручную (без проводок система может позволить сделать это стандартными средствами).01.01 подчинён 01), выполните обратную замену значений в обработке: перенесите все движения со счета 01.99 обратно на исправленный счет 01.01.01.99.После реализации любого из предложенных способов обязательно зайдите в раздел Операции -> Управление итогами, установите период расчета итогов на текущий месяц и выполните полный пересчет итогов. Затем откройте общую Оборотно-сальдовую ведомость и убедитесь, что счет 01 и его субсчет 01.01 вернулись на свое законное место, а показатели общей ОСВ отображаются корректно.