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