Почему после замены ссылок документ продолжает удерживать номенклатуру при удалении помеченных объектов

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

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

Анализ механизма поиска ссылок и олицетворения необъектных данных

Для понимания источника проблемы проанализируем поведение функции НайтиПоСсылкам. Платформа 1С оперирует как ссылочными типами данных (справочники, документы), так и необъектными данными (записи регистров сведений, накопления, бухгалтерии, расчета).

Когда поиск ссылок обнаруживает удаляемый объект в наборе записей подчиненного регистра, платформа не может вернуть ссылку на отдельную строку регистра, так как строка регистра не является ссылочным объектом. В соответствии с архитектурой платформы, в качестве места использования возвращается значение, являющееся олицетворением необъектного объекта метаданных — то есть ссылка на документ-регистратор (реквизит Регистратор). В случае независимых регистров сведений платформа возвращает объект типа КлючЗаписиРегистраСведений.

Таким образом, если в документе выполнена замена номенклатуры только в табличной части, но подчиненные регистры (например, регистр сведений «Цены номенклатуры» или регистры накопления) не были перезаписаны или пересчитаны, документ продолжит удерживать старую ссылку через свои движения.

Специфика задачи замены номенклатуры на связку «Номенклатура + Характеристика»

Стандартные инструменты, такие как типовая обработка «Поиск и замена дублей» из состава БСП, выполняют строгую замену ссылок вида «один к одному». Они не позволяют одновременно с подменой ссылки заполнить дополнительное поле (например, установить реквизит Характеристика). Поэтому переход от отдельных позиций номенклатуры к учету с использованием характеристик всегда требует индивидуальных программных алгоритмов.

Перед выполнением подобной обработки обязательно убедимся, что у целевой номенклатуры или ее вида включено использование характеристик (индивидуальных или общих для вида номенклатуры). В противном случае платформа очистит значение характеристики при записи или выдаст ошибку валидации данных.

Способы корректного обновления данных в базе

Разберем основные подходы к исправлению ситуации в зависимости от ограничений учетной системы и закрытия периодов.

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

Если документы находятся в открытом периоде и их перепроведение допустимо, самым надежным способом является замена номенклатуры с заполнением характеристики в табличной части и последующее проведение документа. В этом случае логика проведения заново сформирует все движения по регистрам сведений и накопления с актуальными данными.

Рассмотрим пример кода для обработки документов через проведение:


ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();

Для Каждого СтрокаТЧ Из ДокументОбъект.Товары Цикл
    Если СтрокаТЧ.Номенклатура = СтараяНоменклатура Тогда
        СтрокаТЧ.Номенклатура = НоваяНоменклатура;
        СтрокаТЧ.Характеристика = НужнаяХарактеристика;
    КонецЕсли;
КонецЦикла;

ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

Способ 2. Прямая модификация движений регистратора без перепроведения

Если документы относятся к закрытым периодам и повторное проведение может привести к нежелательным пересчетам себестоимости, взаиморасчетов или регистров учета НДС, необходимо напрямую скорректировать наборы записей подчиненных регистров.

Разберем по шагам алгоритм прямой перезаписи движений:

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

Посмотрим на пример программной обработки регистра сведений, подчиненного регистратору:


// 1. Обновляем табличную часть документа
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокументОбъект.ОбменДанными.Загрузка = Истина;

Для Каждого СтрТЧ Из ДокументОбъект.Товары Цикл
    Если СтрТЧ.Номенклатура = СтараяНоменклатура Тогда
        СтрТЧ.Номенклатура = НоваяНоменклатура;
        СтрТЧ.Характеристика = НужнаяХарактеристика;
    КонецЕсли;
КонецЦикла;

ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);

// 2. Обновляем движения подчиненного регистра сведений (например, ЦеныНоменклатуры)
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
НаборЗаписей.Прочитать();

БылИзменен = Ложь;
Для Каждого Запись Из НаборЗаписей Цикл
    Если Запись.Номенклатура = СтараяНоменклатура Тогда
        Запись.Номенклатура = НоваяНоменклатура;
        Запись.Характеристика = НужнаяХарактеристика;
        БылИзменен = Истина;
    КонецЕсли;
КонецЦикла;

Если БылИзменен Тогда
    НаборЗаписей.ОбменДанными.Загрузка = Истина;
    НаборЗаписей.Записать();
КонецЕсли;

Способ 3. Обработка независимых регистров сведений

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

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

← На главную