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

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

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

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

Ограничения платформы 1С для подчиненных регистров сведений

Проанализируем ключевые особенности регистров сведений с режимом записи Подчинен регистратору:

  1. Недоступность менеджера записи: Вызов метода СоздатьМенеджерЗаписи() для подчиненных регистров не поддерживается платформой и вызывает ошибку. Менеджер записи предназначен исключительно для независимых регистров.
  2. Ограничения отбора в наборе записей: Минимальной единицей записи для подчиненного регистра является весь набор движений конкретного документа. В свойстве Отбор объекта НаборЗаписей платформенно доступна установка отбора только по полю Регистратор. Попытка установить отбор по отдельным измерениям (например, по номенклатуре, подразделению или контрагенту) вызовет ошибку выполнения.

Вариант 1. Очистка движений регистратора через набор записей

Если задача заключается в полном удалении всех движений конкретного документа-регистратора через код, мы используем объект НаборЗаписей. Разберем по шагам, как очистить движения документа:

Сначала мы создаем набор записей, устанавливаем отбор по нужному регистратору, считываем существующие данные и очищаем их:


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

При вызове метода Записать(Истина) пустой набор записей замещает предыдущие движения документа в базе данных.

Вариант 2. Точечное удаление отдельных строк из набора записей

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


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

МассивУдаляемых = Новый Массив;

Для Каждого Запись Из НаборЗаписей Цикл
    Если Запись.Показатель = ИскомыйПоказатель Тогда
        МассивУдаляемых.Добавить(Запись);
    КонецЕсли;
КонецЦикла;

Для Каждого ЗаписьДляУдаления Из МассивУдаляемых Цикл
    НаборЗаписей.Удалить(ЗаписьДляУдаления);
КонецЦикла;

НаборЗаписей.Записать(Истина);

Разберем важную деталь: удаляемые строки рекомендуется предварительно собирать в отдельный массив, чтобы не нарушать итерацию по коллекции во время работы цикла Для Каждого.

Вариант 3. Редактирование через документ-регистратор (рекомендуемый способ)

В типовых конфигурациях (таких как 1С:ERP Управление предприятием или 1С:Зарплата и управление персоналом) большинство регистров сведений, например ИсторияПоказателейПоШтатномуРасписанию, жестко связаны с табличными частями документов (например, Утверждение штатного расписания).

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

Проанализируем правильный алгоритм решения задачи в прикладных решениях:

  1. Выполняем отмену проведения документа-регистратора (например, Утверждение штатного расписания).
  2. Удаляем ненужную строку из табличной части самого документа.
  3. Повторно проводим документ. При проведении система автоматически сформирует корректный набор записей в регистре сведений.

Если операцию необходимо автоматизировать, мы можем работать с документом программно через объект ДокументОбъект:


ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);

// Удаляем ненужную строку из табличной части
ИндексСтроки = ДокументОбъект.Показатели.Индекс(НайденнаяСтрока);
Если ИндексСтроки <> Неопределено Тогда
    ДокументОбъект.Показатели.Удалить(ИндексСтроки);
КонецЕсли;

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

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

← На главную