В практике работы с конфигурацией «1С:Управление торговлей» пользователи периодически сталкиваются с неприятной ситуацией: в складских отчетах (например, в отчете «Ведомость по товарам на складах») один и тот же документ отображается дважды, искусственно завышая приход или расход. При этом в журнале документов объект присутствует в единственном экземпляре, а после его ручного перепроведения дублирующая строка из отчета пропадает. Разберем подробно, почему возникает такое поведение системы и какими способами можно восстановить корректность данных.
Проанализируем природу механизма проведения в платформе 1С. Документы сами по себе являются лишь регистраторами — источниками первичной информации. Отчеты же строятся не по табличным частям документов, а по таблицам регистров накопления (в данном случае по регистру ТоварыНаСкладах). Раздвоение строк в отчетах обычно вызывается следующими факторами:
Замещать = Ложь, новые строки дописываются к уже существующим без их предварительной очистки. При обычном интерактивном перепроведении типовой механизм очищает движения и записывает их заново, поэтому дубль временно исчезает.ОбменДанными.Загрузка = Истина стандартные обработчики проведения не выполняются. Если правила переноса повторно загружают набор записей без замещения, в регистре накапливаются идентичные строки с одинаковым регистратором.Если проблема вызвана повреждением таблиц итогов или системных индексов, наиболее надежным способом решения является запуск штатных процедур восстановления целостности данных. Разберем по шагам порядок действий:
.dt или бэкап средствами СУБД).Чтобы точно локализовать источник проблемы перед перепроведением, проверим реальное содержимое регистра накопления:
Регистратор, выбрав наш проблемный документ поступления.НомерСтроки, ХарактеристикаНоменклатуры, СерияНоменклатуры, Склад и Качество.В случаях, когда дублирование регулярно повторяется после работы внешних обработок или обменов, исследуем программный код формирования движений. Рассмотрим пример корректной записи движений регистра накопления в модуле документа:
// Очищаем существующие движения по регистру перед формированием новых
Движения.ТоварыНаСкладах.Очистить();
Для Каждого СтрТаблицы Из ТабличнаяЧастьТовары Цикл
Движение = Движения.ТоварыНаСкладах.ДобавитьПриход();
Движение.Период = Дата;
Движение.Номенклатура = СтрТаблицы.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = СтрТаблицы.Количество;
КонецЦикла;
// Записываем набор записей с установленным признаком замещения
Движения.ТоварыНаСкладах.Записать(Истина);
Убедимся, что при вызове метода Записать() первым параметром передается значение Истина, предотвращающее дописывание данных к старым записям регистратора. Также проверим свойства самого документа в дереве метаданных: свойство Автоматическое удаление движений должно находиться в значении Удалять автоматически.
Для предотвращения повторного возникновения ошибок с расчетом итогов рекомендуется регулярно выполнять профилактические мероприятия:
1cv8 внутри папок %LOCALAPPDATA%\1C\ и %APPDATA%\1C\), так как повреждение кэшированных метаданных может вызывать графические артефакты и ошибки в отчетах.AccumRg и AccumRgT.