При работе в крупных и давно ведущихся базах данных «1С:Управление производственным предприятием» (УПП) пользователи и бухгалтеры иногда сталкиваются с удивительным поведением стандартных отчетов. В один прекрасный день при формировании отчетов Анализ счета или Оборотно-сальдовая ведомость по счету 68.02 в них начинают отображаться обороты между счетами 51 и 62 или 62 и 90. При этом, если дважды кликнуть по строке отчета и провалиться до карточки счета или проводки, система показывает абсолютно корректные записи типа Дт 51 - Кт 62 или Дт 62 - Кт 90, в которых счет 68 вообще отсутствует!
Попытки запустить стандартное Тестирование и исправление (ТиС) с флагом «Пересчет итогов» в таких ситуациях не приносят результата — база объемом в десятки гигабайт тестируется часами, но после этого отчеты продолжают выводить неверные данные. Проанализируем, почему возникает эта иллюзия неисправности базы данных и как быстро и безболезненно исправить ситуацию.
Для того чтобы понять природу этой ошибки, нам необходимо разграничить два механизма платформы 1С: запись движений в регистр бухгалтерии и построение иерархических отчетов.
Проводки (например, Дт 51 - Кт 62) физически записываются в основной регистр бухгалтерии. Там они хранятся в неизменном виде. Счета учета указываются непосредственно в субконто и измерениях проводки. Именно поэтому при детализации отчета (двойном клике) и переходе к карточке счета платформа считывает напрямую физические записи регистра и показывает нам правильные проводки.
Однако стандартные бухгалтерские отчеты (Анализ счета, ОСВ, Анализ субконто) работают по иерархическому принципу «сверху вниз». Строя отчет по счету 68, система обращается к метаданным плана счетов Хозрасчетный и проверяет, какие счета являются подчиненными (субсчетами) для счета 68. Если по какой-то причине в режиме «1С:Предприятие» счет 62 (или один из его субсчетов) оказался подчинен счету 68 (то есть у счета 62 в поле Родитель был прописан счет 68), система воспримет счет 62 как субсчет 68-го счета.
В результате при агрегации итогов платформа суммирует все обороты по «субсчету» 62 и включает их в общие итоги по «родителю» 68. Так в анализе счета 68 появляются «фантомные» обороты с 51 и 90 счетами.
Чаще всего нарушение иерархии в плане счетов происходит по следующим причинам:
62 внутрь группы 68. Визуально это легко не заметить, особенно если список счетов отсортирован по коду, а не по иерархии.Родитель у предопределенных счетов может перезаписаться некорректным значением.Прежде чем исправлять данные, нам нужно точно определить, у какого именно счета нарушена иерархия подчинения. Сделать это «глазами» в большом плане счетов бывает трудно. Лучше всего использовать консоль запросов. Напишем простой запрос к таблице плана счетов Хозрасчетный, который выявит все аномалии подчинения.
Выполним следующий запрос:
ВЫБРАТЬ
Хозрасчетный.Ссылка КАК Счет,
Хозрасчетный.Код КАК КодСчета,
Хозрасчетный.Родитель КАК Родитель,
Хозрасчетный.Родитель.Код КАК КодРодителя
ИЗ
ПланСчетов.Хозрасчетный КАК Хозрасчетный
ГДЕ
Хозрасчетный.Родитель <> ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ПустаяСсылка)
Проанализируем результаты выполнения запроса. Мы должны обратить внимание на строки, где код дочернего счета не начинается с кода родительского счета. Например, если в строке выводится счет 62.01, а в поле «Код родителя» указано 68.02 — это и есть наша критическая ошибка.
Для автоматизации этого процесса мы можем написать небольшой программный скрипт во внешней обработке, который проверит соответствие кодов:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Хозрасчетный.Ссылка КАК Счет,
| Хозрасчетный.Код КАК Код,
| Хозрасчетный.Родитель КАК Родитель,
| Хозрасчетный.Родитель.Код КАК КодРодителя
|ИЗ
| ПланСчетов.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Родитель <> ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ПустаяСсылка)";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
ДлинаРодителя = СтрДлина(Выборка.КодРодителя);
// Проверяем левые символы кода дочернего счета на равенство коду родителя
Если Лев(Выборка.Код, ДлинаРодителя) <> Выборка.КодРодителя Тогда
Сообщить("ВНИМАНИЕ! Нарушена иерархия счета: " + Выборка.Код +
" (Родитель: " + Выборка.КодРодителя + ")", СтатусСообщения.Важное);
КонецЕсли;
КонецЦикла;
После того как конкретный проблемный счет обнаружен (допустим, это счет 62.01 или группа счетов 62, у которой родителем назначен 68), исправим ошибку.
Рассмотрим по шагам интерактивный способ исправления:
62 или его субсчета).Родитель).62) там ошибочно указан счет 68, очистим это поле (нажатием на кнопку «крестик» или клавишу Shift + F4) либо укажем правильного родителя.Если интерактивное редактирование родителя заблокировано на уровне прав доступа или настроек конфигуратора, мы можем выполнить исправление программным кодом. Для этого воспользуемся внешней обработкой и напишем следующий код в модуле:
// Сброс некорректного родителя у счета 62
СчетОбъект = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62").ПолучитьОбъект();
Если СчетОбъект <> Неопределено Тогда
// Устанавливаем пустого родителя для счета верхнего уровня
СчетОбъект.Родитель = ПланыСчетов.Хозрасчетный.ПустаяСсылка();
СчетОбъект.Записать();
Сообщить("Иерархия счета 62 успешно восстановлена!");
КонецЕсли;
В некоторых случаях даже после исправления родителя в плане счетов отчеты могут продолжать выводить ошибочные данные по иерархии. Это связано с тем, что структура планов счетов кэшируется как на стороне клиента, так и на сервере 1С:Предприятия.
Чтобы гарантировать полное применение изменений, выполним следующие действия:
/ClearCache, либо удалив и заново добавив базу в списке запуска 1С.Для исключения повторения таких инцидентов рекомендуется настроить систему разграничения прав доступа. В типовой конфигурации УПП право на изменение плана счетов должно быть только у Администратора и Главного бухгалтера. Обычным пользователям и бухгалтерам на участках необходимо ограничить доступ к изменению карточек счетов и структуры плана счетов.