Почему двоятся или не сворачиваются остатки по партиям на счете 10 в 1С:Бухгалтерия 3.0?

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

При ведении учета материально-производственных запасов на счете 10 в конфигурации «1С:Бухгалтерия предприятия 3.0» пользователи нередко сталкиваются с ситуацией, когда при списании материалов программа выдает ошибку о нехватке остатков либо списывает партии, по которым в стандартных отчетах остатков нет. Если проанализировать виртуальную таблицу остатков или сформировать отчет с максимальной детализацией, можно увидеть, что по одной и той же номенклатуре и партии одновременно висят положительные и отрицательные остатки одинакового объема, которые не «схлопываются» между собой.

Рассмотрим природу возникновения этой ошибки, разберем методы диагностики проблемы в базе данных и пошагово изучим способы восстановления корректного учета.

Причина проблемы: коллизия типов NULL и пустой ссылки

Главная техническая причина подобного поведения кроется в особенностях работы платформы «1С:Предприятие» с небалансовыми измерениями регистра бухгалтерии Хозрасчетный, в частности с измерением Подразделение.

На уровне СУБД и внутренней логики платформы значение NULL (полное отсутствие значения в поле) и пустая ссылка определенного ссылочного типа (Справочник.Подразделения.ПустаяСсылка) представляют собой два принципиально разных значения. Когда для конкретного счета бухгалтерского учета или конфигурации в целом отключен учет по подразделениям (например, база работает в редакции ПРОФ, где нет учета по обособленным подразделениям на счетах затрат и ТМЦ), платформа ожидает, что в измерении Подразделение будет записано строго значение NULL.

Если в результате некорректных действий или сбоев часть движений была сформирована со значением NULL, а часть — с пустой ссылкой на справочник подразделений, виртуальная таблица остатков регистра бухгалтерии группирует записи по каждому уникальному значению измерения отдельно. Для платформы строка с NULL и строка с пустой ссылкой не являются идентичными, поэтому остатки по приходу и расходу не сворачиваются в ноль. При попытке списания алгоритм проведения по ФИФО видит положительное сальдо по строке с одним значением измерения и списывает его, порождая новые разрывы.

Откуда в измерении берется пустая ссылка

Проанализируем типовые сценарии, приводящие к появлению пустых ссылок вместо NULL:

  1. Переход с версии КОРП на версию ПРОФ (или временное включение функционала): если в базе ранее велся учет по обособленным подразделениям, а затем конфигурация была переведена на версию ПРОФ или функциональная опция была отключена, в накопленных проводках сохраняются заполненные или пустые ссылки. Автоматической конвертации таких полей в NULL при изменении настроек не происходит.
  2. Документы ручного ввода: при создании проводок через документ «Операция, введенная вручную» реквизиты проводки могут автоматически заполняться пустыми ссылками вместо системного NULL, если пользователь или модуль формы не выполнил явную очистку.
  3. Ошибки обменов данными: при переносе документов из внешних систем (например, «1С:Управление торговлей» или самописных баз) правила конвертации данных могут инициализировать измерения ссылочным типом по умолчанию.
  4. Программное формирование наборов записей: доработки конфигурации, внешние обработки или расширения, записывающие данные напрямую в РегистрБухгалтерииНаборЗаписей без проверки признаков учета по счету, могут подставлять пустое значение ссылки.

Шаг 1. Диагностика и поиск некорректных записей

Для выявления документов-регистраторов, сформировавших неверные проводки, выполним запрос не к виртуальной таблице остатков, а напрямую к физической таблице движений регистра бухгалтерии. Запустим консоль запросов и выполним следующий текст:


ВЫБРАТЬ
    Хозрасчетный.Регистратор КАК Документ,
    Хозрасчетный.Период КАК Период,
    Хозрасчетный.СчетДт КАК СчетДт,
    Хозрасчетный.ПодразделениеДт КАК ПодразделениеДт,
    Хозрасчетный.СчетКт КАК СчетКт,
    Хозрасчетный.ПодразделениеКт КАК ПодразделениеКт
ИЗ
    РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
ГДЕ
    (Хозрасчетный.СчетДт В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы))
        ИЛИ Хозрасчетный.СчетКт В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы)))
    И (Хозрасчетный.ПодразделениеДт = ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка)
        ИЛИ Хозрасчетный.ПодразделениеКт = ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка))

Результат запроса покажет список документов, в проводках которых присутствует пустая ссылка вместо требуемого системой значения NULL.

Шаг 2. Исправление через тестирование и исправление (ТиИ)

Самым надежным штатным способом устранения нестыковок логической структуры данных является процедура тестирования и исправления информационной базы.

  1. Обязательно создадим полную резервную копию информационной базы перед выполнением любых регламентных операций.
  2. Запустим базу в режиме Конфигуратор.
  3. Перейдем в главное меню: Администрирование → Тестирование и исправление...
  4. Установим переключатель в положение Тестирование и исправление, а в блоке параметров при наличии ошибок выберем вариант Исправлять ошибки.
  5. Отметим флажком пункт Проверка логической целостности информационной базы.
  6. Нажмем кнопку Выполнить.

В окне сообщений в ходе проверки платформа найдет несоответствия типов и выведет служебные сообщения: «Значение должно быть NULL. Сохранено значение NULL». Платформа самостоятельно заменит пустые ссылки на NULL в соответствии с метаданными счета.

Шаг 3. Программная корректировка записей (альтернативный вариант)

Если информационная база имеет большой объем и регламент обслуживания не позволяет остановить работу пользователей для полного тестирования и исправления, устраним расхождение программно с помощью внешней обработки. Разберем пример кода, перезаписывающего движения с установкой признака обмена данными:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	Хозрасчетный.Регистратор КАК Регистратор
    |ИЗ
    |	РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
    |ГДЕ
    |	(Хозрасчетный.ПодразделениеДт = ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка)
    |		ИЛИ Хозрасчетный.ПодразделениеКт = ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка))";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
    НаборЗаписей.Прочитать();
    
    Модифицирован = Ложь;
    Для Каждого Запись Из НаборЗаписей Цикл
        Если Запись.ПодразделениеДт = Справочники.Подразделения.ПустаяСсылка() Тогда
            Запись.ПодразделениеДт = NULL;
            Модифицирован = Истина;
        КонецЕсли;
        
        Если Запись.ПодразделениеКт = Справочники.Подразделения.ПустаяСсылка() Тогда
            Запись.ПодразделениеКт = NULL;
            Модифицирован = Истина;
        КонецЕсли;
    КонецЦикла;
    
    Если Модифицирован Тогда
        НаборЗаписей.ОбменДанными.Загрузка = Истина;
        НаборЗаписей.Записать();
    КонецЕсли;
КонецЦикла;

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

Шаг 4. Пересчет итогов регистра бухгалтерии

После того как значения в физических записях регистра приведены к NULL, выполним обязательный пересчет итогов. Без пересчета итогов виртуальные таблицы продолжат выдавать неактуальные данные.

Для этого в режиме «1С:Предприятие» перейдем в раздел Администрирование → Обслуживание → Регламентные операции → Управление итогами и агрегатами. Выберем регистр Хозрасчетный и нажмем Пересчитать итоги (либо запустим режим пересчета итогов через утилиту «Тестирование и исправление» в Конфигураторе).

После завершения пересчета партии на счете 10 схлопнутся, а списание материалов при проведении документов начнет выполняться штатно.

← На главную