Почему отчет по партиям в 1С:Управление торговлей 10.3 показывает неверные остатки и как это исправить?

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

Каждый специалист по сопровождению систем на платформе 1С рано или поздно сталкивается с ситуацией, когда отчет по партионному учету начинает выводить «странные» числа. Например, по конкретной номенклатуре отображается остаток в несколько тысяч единиц, привязанный к старому документу оприходования, хотя в самом документе указано совершенно другое количество. Ещё более удивительным кажется поведение системы, когда при распроведении этого приходного документа строка в отчете не исчезает, а продолжает отображать те же остатки, но уже без указания документа-источника.

В этой статье мы подробно разберем, почему возникает подобная проблема в конфигурации «Управление торговлей 10.3», проанализируем механизмы работы партионного учета и предоставим пошаговое руководство по диагностике и исправлению таких ошибок.

Анализ исходного запроса и логики работы отчета

Рассмотрим структуру запроса, который используется в проблемном отчете СКД. Он обращается к виртуальной таблице остатков регистра накопления ПартииТоваровНаСкладах:


ВЫБРАТЬ
    ПартииТоваровНаСкладахОстатки.Номенклатура КАК Film,
    ПартииТоваровНаСкладахОстатки.Склад КАК Storage,
    ПартииТоваровНаСкладахОстатки.ДокументОприходования.Дата КАК InStockSince,
    ПартииТоваровНаСкладахОстатки.ДокументОприходования,
    ПартииТоваровНаСкладахОстатки.Заказ.Контрагент.CustomerCode.ПолнНаимен КАК Customer,
    РАЗНОСТЬДАТ(ПартииТоваровНаСкладахОстатки.ДокументОприходования.Дата, &Дата, ДЕНЬ) КАК DaysInStock,
    ПартииТоваровНаСкладахОстатки.КоличествоОстаток КАК Quantity,
    ПартииТоваровНаСкладахОстатки.СтоимостьОстаток КАК Amount_RR,
    ПартииТоваровНаСкладахОстатки.Номенклатура.Наименование КАК НоменклатураНаименование,
    ПартииТоваровНаСкладахОстатки.ДокументОприходования.Комментарий КАК Comment
ИЗ
    РегистрНакопления.ПартииТоваровНаСкладах.Остатки(&Дата, ) КАК ПартииТоваровНаСкладахОстатки
ГДЕ
    ПартииТоваровНаСкладахОстатки.КоличествоОстаток > 0
УПОРЯДОЧИТЬ ПО
    НоменклатураНаименование

Этот запрос выбирает остатки товаров в разрезе номенклатуры, складов и документов оприходования (партий). Если отчет показывает некорректные данные, которые совпадают с показателями стандартного отчета «Ведомость по партиям товаров на складах», но расходятся с физическим документом поступления, это означает, что проблема кроется не в коде отчета, а в самих данных регистра накопления.

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

Шаг 1. Диагностика движений по конкретной партии

Распространенная ошибка начинающих разработчиков и аналитиков — проверять движения только самого документа оприходования. Если открыть движения этого документа по регистру ПартииТоваровНаСкладах, там действительно будут указаны верные цифры. Откуда же берутся лишние тысячи единиц?

В партионном учете 1С измерение ДокументОприходования является обычным разрезом аналитики (измерением регистра). Это означает, что любой другой документ в системе может сделать запись в этот регистр, указав в качестве партии наш документ оприходования. Это могут быть:

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


ВЫБРАТЬ
    ПартииРегистр.Период КАК Период,
    ПартииРегистр.Регистратор КАК Регистратор,
    ПартииРегистр.ВидДвижения КАК ВидДвижения,
    ПартииРегистр.Количество КАК Количество,
    ПартииРегистр.Стоимость КАК Стоимость,
    ПартииРегистр.Склад КАК Склад
ИЗ
    РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииРегистр
ГДЕ
    ПартииРегистр.Номенклатура = &ПроблемнаяНоменклатура
    И ПартииРегистр.ДокументОприходования = &ДокументОприходования
УПОРЯДОЧИТЬ ПО
    Период

Этот запрос выведет полную хронологическую цепочку событий. Почти наверняка в списке регистраторов обнаружится документ (например, возврат или перемещение), который ошибочно зафиксировал приход крупной партии со ссылкой на наш документ поступления.

Шаг 2. Разгадка поведения при распроведении документа

Почему при распроведении прихода строка с остатком в 6000 единиц не исчезает из отчета, а лишь теряет ссылку на документ оприходования? Этому есть три логических объяснения:

  1. Зависание остатков по пустой партии. Если сторонние документы списывали товар без указания партии (или по пустой ссылке), в регистре образовался отрицательный остаток по «пустой» партии. При распроведении основного документа оприходования его положительный остаток исчезает, оголяя накопленные некорректные движения других документов.
  2. Наличие битых ссылок (объект не найден). Если другой документ ссылался на этот приход, но в базе данных произошел сбой или некорректное удаление элементов, ссылка превращается в «битую». В регистре остается запись с уникальным идентификатором (GUID) несуществующего документа. При распроведении связь окончательно теряется, и система может интерпретировать это как пустую партию.
  3. Расхождение оперативного и партионного учета. В УТ 10.3 количественный остаток хранится в регистре Товары на складах, а партионный — в Партии товаров на складах. Если ведомость по остаткам товаров (первый регистр) показывает правильное количество, а ведомость по партиям (второй регистр) — неверное, значит, нарушена последовательность проведения документов.

Шаг 3. Физическое исправление файловой базы данных (chdbfl.exe)

Поскольку база данных файловая, причиной искажения итогов в виртуальных таблицах часто становится нарушение физической целостности индексов или таблиц базы данных (файл .1CD). Штатное «Тестирование и исправление» (ТиИ) из конфигуратора не всегда справляется с этой проблемой, если повреждена структура файла.

Выполним процедуру физического восстановления по шагам:

  1. Полностью завершите работу всех пользователей и закройте Конфигуратор.
  2. Обязательно сделайте резервную копию файла базы данных (1Cv8.1CD)!
  3. Перейдите в каталог установленной платформы 1С (например, C:\Program Files\1cv8\<номер_версии>\bin\).
  4. Запустите утилиту chdbfl.exe.
  5. Укажите путь к файлу вашей базы данных 1Cv8.1CD.
  6. Установите флаг «Исправлять обнаруженные ошибки» и нажмите кнопку «Выполнить».
  7. После завершения работы утилиты запустите Конфигуратор, откройте меню Администрирование -> Тестирование и исправление. Настройте параметры: выберите «Реиндексация таблиц» и «Пересчет итогов», после чего запустите процесс.

Шаг 4. Восстановление партионной последовательности

В «1С:Управление торговлей 10.3» очень часто используется настройка отложенного проведения по партиям. Если флаг «Списывать партии при проведении документов» в настройках параметров учета снят, то при проведении реализации количество списывается только по регистру Товары на складах. Регистр партий при этом не изменяется до запуска регламентной процедуры.

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

  1. Перейдем в раздел меню Сервис -> Проведение документов -> Восстановление последовательностей.
  2. Выберем последовательность «Партионный учет».
  3. Установим дату начала восстановления (она должна быть как минимум на день раньше даты первого обнаруженного расхождения — в нашем примере это конец 2018 года).
  4. Запустим обработку «Проведение по партиям». Обратите внимание, что на больших базах этот процесс может занять значительное время, поэтому его рекомендуется выполнять во внерабочие часы.

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

← На главную