При работе с регистрами сведений в платформе 1С:Предприятие разработчики часто сталкиваются с ситуацией, когда необходимо точечно изменить или удалить записи. Однако подход к изменению данных принципиально зависит от режима записи регистра. Если независимый регистр сведений позволяет работать с отдельными записями напрямую через менеджер записи, то для подчиненного регистратору регистра действуют жесткие платформенные ограничения.
Рассмотрим подробно особенности работы с подчиненными регистрами сведений, разберем типичные ошибки и выясним, как правильно решить задачу удаления или изменения движений на примере конфигурации 1С:ERP Управление предприятием.
Проанализируем ключевые особенности регистров сведений с режимом записи Подчинен регистратору:
СоздатьМенеджерЗаписи() для подчиненных регистров не поддерживается платформой и вызывает ошибку. Менеджер записи предназначен исключительно для независимых регистров.Отбор объекта НаборЗаписей платформенно доступна установка отбора только по полю Регистратор. Попытка установить отбор по отдельным измерениям (например, по номенклатуре, подразделению или контрагенту) вызовет ошибку выполнения.Если задача заключается в полном удалении всех движений конкретного документа-регистратора через код, мы используем объект НаборЗаписей. Разберем по шагам, как очистить движения документа:
Сначала мы создаем набор записей, устанавливаем отбор по нужному регистратору, считываем существующие данные и очищаем их:
НаборЗаписей = РегистрыСведений.ИсторияПоказателейПоШтатномуРасписанию.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
НаборЗаписей.Прочитать();
НаборЗаписей.Очистить();
НаборЗаписей.Записать(Истина);
При вызове метода Записать(Истина) пустой набор записей замещает предыдущие движения документа в базе данных.
Когда необходимо удалить только часть строк из набора записей регистратора без отмены проведения документа, мы можем отфильтровать коллекцию записей перед сохранением. Посмотрим на пример кода:
НаборЗаписей = РегистрыСведений.ИсторияПоказателейПоШтатномуРасписанию.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
НаборЗаписей.Прочитать();
МассивУдаляемых = Новый Массив;
Для Каждого Запись Из НаборЗаписей Цикл
Если Запись.Показатель = ИскомыйПоказатель Тогда
МассивУдаляемых.Добавить(Запись);
КонецЕсли;
КонецЦикла;
Для Каждого ЗаписьДляУдаления Из МассивУдаляемых Цикл
НаборЗаписей.Удалить(ЗаписьДляУдаления);
КонецЦикла;
НаборЗаписей.Записать(Истина);
Разберем важную деталь: удаляемые строки рекомендуется предварительно собирать в отдельный массив, чтобы не нарушать итерацию по коллекции во время работы цикла Для Каждого.
В типовых конфигурациях (таких как 1С:ERP Управление предприятием или 1С:Зарплата и управление персоналом) большинство регистров сведений, например ИсторияПоказателейПоШтатномуРасписанию, жестко связаны с табличными частями документов (например, Утверждение штатного расписания).
Риск рассинхронизации данных: Если изменить набор записей регистра напрямую в обход документа, данные регистра перестанут соответствовать табличной части документа. При первом же перепроведении документа штатные алгоритмы системы заново сформируют движения и полностью перезапишут регистр, из-за чего все прямые правки будут утрачены.
Проанализируем правильный алгоритм решения задачи в прикладных решениях:
Утверждение штатного расписания).Если операцию необходимо автоматизировать, мы можем работать с документом программно через объект ДокументОбъект:
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
// Удаляем ненужную строку из табличной части
ИндексСтроки = ДокументОбъект.Показатели.Индекс(НайденнаяСтрока);
Если ИндексСтроки <> Неопределено Тогда
ДокументОбъект.Показатели.Удалить(ИндексСтроки);
КонецЕсли;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Такой подход гарантирует полную целостность данных в информационной базе и исключает сбои при последующей работе пользователей с документом.