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