Как изменить значение измерения регистра в 1С 7.7, если перепроведение документа не помогает?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

В платформе 1С:Предприятие 7.7 разработчики и администраторы иногда сталкиваются с ситуацией, когда после изменения реквизита в проведенном документе и его повторного проведения значение измерения в регистре накопления (например, в регистре ПартииТоваров) остается прежним. Выясним причину такого поведения системы и разберем практические способы исправления данных.

Почему перепроведение документа не меняет измерение регистра

Проанализируем механику работы партионного учета и формирований движений в 1С 7.7. Существует несколько основных причин, почему простое перепроведение приходной накладной не обновляет измерение (например, СправкаА):

  1. Значение привязано к элементу справочника: В типовых и отраслевых конфигурациях 1С 7.7 измерение регистра партий чаще всего заполняется не напрямую из табличной части документа, а считывается из реквизита справочника Партии. При первом проведении документ создает новую запись в справочнике или находит существующую. При повторном проведении программа обращается к уже созданной партии и берет Справку А из ее карточки. Изменение значения в документе не перезаписывает реквизиты уже созданной партии автоматически.
  2. Код проведения находится в Глобальном модуле: Если вы пытаетесь найти обработку проведения и реквизит СправкаА в модуле самого документа или в модуле формы, то можете их не обнаружить. В 1С 7.7 алгоритмы формирования движений по регистрам обычно вынесены в общие процедуры Глобального модуля (например, глПровестиПриход или глДвижениеРегистра).
  3. Использование подчиненных документов: В некоторых конфигурациях данные по справкам «А» и «Б» или ГТД фиксируются с помощью отдельных документов (например, регистраций справок к ТТН), введенных на основании приходной накладной.

Способ 1. Отмена проведения и повторное проведение документа

Рассмотрим самый простой способ решения проблемы штатными средствами платформы. Если алгоритм проведения при поиске партии ориентируется на реквизиты документа, последовательность действий будет следующей:

  1. Снимем приходный документ с проведения (сделаем его непроведенным).
  2. Проверим и при необходимости подкорректируем реквизиты табличной части документа.
  3. Проведем документ заново.

Важное замечание: В некоторых конфигурациях 1С 7.7 для документа может быть отключено автоматическое удаление движений при отмене проведения. Убедимся, что при отмене проведения старые записи регистра действительно очистились.

Способ 2. Редактирование карточки в справочнике «Партии»

Разберем по шагам ситуацию, когда измерение регистра подтягивается из справочника:

  1. Откроем справочник Партии (или соответствующий справочник справок/ГТД) и найдем позицию, сформированную данным документом прихода.
  2. Откроем карточку элемента и вручную изменим значение реквизита Справка А на корректное.
  3. Сохраним изменения в карточке партии.
  4. Перепроведем приходный документ. Теперь при проведении система считает обновленное значение из справочника и корректно запишет его в регистр ПартииТоваров.

Способ 3. Поиск кода движения в Глобальном модуле

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

  1. Откроем Глобальный модуль конфигурации.
  2. Используем поиск по наименованию регистра ПартииТоваров или названию процедуры проведения прихода.
  3. Проанализируем модуль с помощью отладки: установим точку останова в процедуре проведения и проследим, из какого источника подтягивается значение для измерения СправкаА.

Способ 4. Корректировка с помощью прямого SQL-запроса или внешней обработки

Если документов с ошибочными измерениями много или период закрыт для перепро проведения, можно воспользоваться внешними обработками для прямой корректировки движений регистров либо выполнить прямой SQL-запрос (при использовании 1С 7.7 в режиме MS SQL Server с внешними компонентами вроде 1С++):

Посмотрим на пример логики прямого обновления значения в таблице регистра с помощью 1С++:


// Пример обновления значения измерения регистра через 1С++
Запрос = СоздатьОбъект("1CPP.Запрос");
ТекстЗапроса = "
| UPDATE $Регистр.ПартииТоваров
| SET $Регистр.ПартииТоваров.СправкаА = :НоваяСправка
| WHERE $Регистр.ПартииТоваров.СправкаА = :СтараяСправка
|   AND IDDOC = :ИДДокумента
|";
Запрос.УстановитьТекстовыйПараметр("НоваяСправка", НовоеЗначениеСправки);
Запрос.УстановитьТекстовыйПараметр("СтараяСправка", СтароеЗначениеСправки);
Запрос.УстановитьТекстовыйПараметр("ИДДокумента", ДокументСсылка.ИденТификатор);
Запрос.Выполнить(ТекстЗапроса);

Предупреждение: Использование прямого редактирования таблиц базы данных и обработок прямого изменения движений требует особой осторожности. Перед выполнением любых операций прямого изменения данных обязательно создадим резервную копию информационной базы.

Отображение результатов и возможные последствия

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

  1. Проверим движение партии после даты исправляемого документа прихода.
  2. Последовательно перепроведем цепочку расходных документов по данной номенклатуре.
← На главную