Почему в отчете «Ведомость по товарам на складах» двоятся документы и как это исправить?

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

В практике работы с конфигурацией «1С:Управление торговлей» пользователи периодически сталкиваются с неприятной ситуацией: в складских отчетах (например, в отчете «Ведомость по товарам на складах») один и тот же документ отображается дважды, искусственно завышая приход или расход. При этом в журнале документов объект присутствует в единственном экземпляре, а после его ручного перепроведения дублирующая строка из отчета пропадает. Разберем подробно, почему возникает такое поведение системы и какими способами можно восстановить корректность данных.

Причины расхождения данных между журналом документов и регистрами

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

  1. Рассинхронизация и сбой таблиц итогов регистра накопления: аварийное завершение работы сервера, сбои электропитания или некорректная работа транзакций могут приводить к нарушению целостности промежуточных итогов в таблицах СУБД.
  2. Ошибки в программном коде при записи наборов записей: если движения формируются сторонней обработкой или доработанным модулем с флагом Замещать = Ложь, новые строки дописываются к уже существующим без их предварительной очистки. При обычном интерактивном перепроведении типовой механизм очищает движения и записывает их заново, поэтому дубль временно исчезает.
  3. Специфика загрузки данных через планы обмена: при использовании свойства ОбменДанными.Загрузка = Истина стандартные обработчики проведения не выполняются. Если правила переноса повторно загружают набор записей без замещения, в регистре накапливаются идентичные строки с одинаковым регистратором.
  4. Скрытые группировки и измерения отчета: документ может содержать две разные строки с одной и той же номенклатурой, но с разными характеристиками, сериями или качеством. Если в настройках отчета эти измерения не выведены, строки визуально схлопываются под одним регистратором и создают иллюзию дублирования документа.

Способ 1. Выполнение тестирования и исправления информационной базы

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

  1. Создадим полную резервную копию информационной базы (выгрузка в файл .dt или бэкап средствами СУБД).
  2. Запустим программу в режиме «Конфигуратор» под учетной записью с административными правами.
  3. В главном меню перейдем в раздел Администрирование → Тестирование и исправление....
  4. Установим флажки напротив проверок:
    1. Реиндексация таблиц информационной базы;
    2. Пересчет итогов (критически важно для регистров накопления);
    3. Проверка логической целостности информационной базы;
    4. Проверка ссылочной целостности информационной базы.
  5. В переключателях обработки ошибок выберем режим Создавать объекты или Очищать ссылки в зависимости от принятого регламента администрирования.
  6. Нажмем кнопку Выполнить и дождемся завершения служебных сообщений в окне служебных сообщений.

Способ 2. Анализ движений проблемного документа в регистре

Чтобы точно локализовать источник проблемы перед перепроведением, проверим реальное содержимое регистра накопления:

  1. Откроем главное меню: Операции → Регистры накопления → Товары на складах.
  2. Установим отбор по полю Регистратор, выбрав наш проблемный документ поступления.
  3. Проанализируем количество строк, значения колонок НомерСтроки, ХарактеристикаНоменклатуры, СерияНоменклатуры, Склад и Качество.
  4. Если в регистре действительно присутствуют две абсолютно одинаковые строки с одинаковыми номерами строк или скрытыми измерениями, проверим табличную часть самого документа поступления на наличие повторяющихся позиций.

Способ 3. Проверка программного кода и подписок на события

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


// Очищаем существующие движения по регистру перед формированием новых
Движения.ТоварыНаСкладах.Очистить();

Для Каждого СтрТаблицы Из ТабличнаяЧастьТовары Цикл
    Движение = Движения.ТоварыНаСкладах.ДобавитьПриход();
    Движение.Период = Дата;
    Движение.Номенклатура = СтрТаблицы.Номенклатура;
    Движение.Склад = Склад;
    Движение.Количество = СтрТаблицы.Количество;
КонецЦикла;

// Записываем набор записей с установленным признаком замещения
Движения.ТоварыНаСкладах.Записать(Истина);

Убедимся, что при вызове метода Записать() первым параметром передается значение Истина, предотвращающее дописывание данных к старым записям регистратора. Также проверим свойства самого документа в дереве метаданных: свойство Автоматическое удаление движений должно находиться в значении Удалять автоматически.

Регламентное обслуживание и очистка клиентского кэша

Для предотвращения повторного возникновения ошибок с расчетом итогов рекомендуется регулярно выполнять профилактические мероприятия:

  1. Очистка временных файлов платформы: удалим локальный кэш пользователя (каталоги 1cv8 внутри папок %LOCALAPPDATA%\1C\ и %APPDATA%\1C\), так как повреждение кэшированных метаданных может вызывать графические артефакты и ошибки в отчетах.
  2. Обслуживание таблиц СУБД: при использовании клиент-серверного варианта настроим регулярное выполнение регламентных заданий по дефрагментации индексов и обновлению статистики таблиц AccumRg и AccumRgT.
  3. Управление итогами: через меню Операции → Управление итогами проконтролируем, чтобы дата актуальности итогов регистров соответствовала текущему рабочему периоду.
← На главную