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