В платформе 1С:Предприятие 7.7 разработчики и администраторы иногда сталкиваются с ситуацией, когда после изменения реквизита в проведенном документе и его повторного проведения значение измерения в регистре накопления (например, в регистре ПартииТоваров) остается прежним. Выясним причину такого поведения системы и разберем практические способы исправления данных.
Проанализируем механику работы партионного учета и формирований движений в 1С 7.7. Существует несколько основных причин, почему простое перепроведение приходной накладной не обновляет измерение (например, СправкаА):
Партии. При первом проведении документ создает новую запись в справочнике или находит существующую. При повторном проведении программа обращается к уже созданной партии и берет Справку А из ее карточки. Изменение значения в документе не перезаписывает реквизиты уже созданной партии автоматически.СправкаА в модуле самого документа или в модуле формы, то можете их не обнаружить. В 1С 7.7 алгоритмы формирования движений по регистрам обычно вынесены в общие процедуры Глобального модуля (например, глПровестиПриход или глДвижениеРегистра).Рассмотрим самый простой способ решения проблемы штатными средствами платформы. Если алгоритм проведения при поиске партии ориентируется на реквизиты документа, последовательность действий будет следующей:
Важное замечание: В некоторых конфигурациях 1С 7.7 для документа может быть отключено автоматическое удаление движений при отмене проведения. Убедимся, что при отмене проведения старые записи регистра действительно очистились.
Разберем по шагам ситуацию, когда измерение регистра подтягивается из справочника:
Партии (или соответствующий справочник справок/ГТД) и найдем позицию, сформированную данным документом прихода.Справка А на корректное.ПартииТоваров.Для детального анализа алгоритма заполнения регистра перейдем в конфигуратор и выполним поиск по Глобальному модулю:
ПартииТоваров или названию процедуры проведения прихода.СправкаА.Если документов с ошибочными измерениями много или период закрыт для перепро проведения, можно воспользоваться внешними обработками для прямой корректировки движений регистров либо выполнить прямой SQL-запрос (при использовании 1С 7.7 в режиме MS SQL Server с внешними компонентами вроде 1С++):
Посмотрим на пример логики прямого обновления значения в таблице регистра с помощью 1С++:
// Пример обновления значения измерения регистра через 1С++
Запрос = СоздатьОбъект("1CPP.Запрос");
ТекстЗапроса = "
| UPDATE $Регистр.ПартииТоваров
| SET $Регистр.ПартииТоваров.СправкаА = :НоваяСправка
| WHERE $Регистр.ПартииТоваров.СправкаА = :СтараяСправка
| AND IDDOC = :ИДДокумента
|";
Запрос.УстановитьТекстовыйПараметр("НоваяСправка", НовоеЗначениеСправки);
Запрос.УстановитьТекстовыйПараметр("СтараяСправка", СтароеЗначениеСправки);
Запрос.УстановитьТекстовыйПараметр("ИДДокумента", ДокументСсылка.ИденТификатор);
Запрос.Выполнить(ТекстЗапроса);
Предупреждение: Использование прямого редактирования таблиц базы данных и обработок прямого изменения движений требует особой осторожности. Перед выполнением любых операций прямого изменения данных обязательно создадим резервную копию информационной базы.
Проанализируем возможные последствия корректировки измерений регистра «задним числом». Если после ошибочного прихода уже производилось списание данного товара (расходные накладные, перемещения, списания), то изменение Справки А в приходе приведет к расхождению остатков. Чтобы избежать отрицательных остатков и пересортицы по справкам, потребуются следующие действия: