Как удалить запись из подчиненного регистра сведений в 1С:ЗУП 3.0?

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

При переходе на конфигурацию «Зарплата и управление персоналом» (версия 3) для ввода исторических данных часто используется документ Перенос данных. В определенных версиях конфигурации разработчики добавляют новые регистры (например, регистр сведений Реестр отпусков) и переносят в них данные из старых регистров (например, Фактические отпуска). Если в исходных данных присутствовала ошибочная запись, она дублируется в новый регистр. Рассмотрим подробнее, как корректно удалить такую запись, если регистр подчинен регистратору.

Анализ проблемы и особенности работы подчиненных регистров

В платформе 1С:Предприятие регистры сведений могут иметь режим записи «Подчинение регистратору». Это означает следующие правила:

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

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

Решение проблемы через пользовательский интерфейс (штатный способ)

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

  1. Перейдем в список записей регистра сведений Реестр отпусков (через меню Функции для специалиста или настройки навигации).
  2. Найдем ошибочную строку и откроем документ-регистратор, щелкнув по ссылке в колонке Регистратор. Откроется документ Перенос данных.
  3. На командной панели документа Перенос данных нажмем кнопку «Настройка состава регистров».
  4. В появившемся окне настройки перейдем на вкладку с регистрами сведений и установим флажок напротив регистра Реестр отпусков. Нажмем «ОК».
  5. После этого в документе появится новая закладка (табличная часть), соответствующая регистру Реестр отпусков.
  6. Перейдем на эту закладку, найдем лишнюю строку и удалим ее из табличной части.
  7. Запишем и проведем документ. Изменения сохранятся, и запись пропадет из регистра.

Важность синхронного удаления записей и риски рассинхронизации

Проанализируем риски при редактировании регистров кадрового учета. В ЗУП 3.0 данные о фактически использованных отпусках учитываются сразу в нескольких механизмах. Если удалить запись только из регистра Реестр отпусков, но оставить ее в регистре Фактические отпуска (или наоборот), возникнет рассинхронизация данных.

Это может привести к следующим последствиям:

  1. При выходе очередного обновления конфигурации служебные процедуры перерасчета могут снова прочитать данные из Фактические отпуска и автоматически создать запись в Реестр отпусков.
  2. В отчетах по остаткам отпусков и кадровой справке начнут выводиться некорректные данные из-за расхождения между регистрами учета.

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

Программное удаление через Набор Записей (для разработчиков)

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

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


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

// Устанавливаем отбор по конкретному документу-регистратору
Набор.Отбор.Регистратор.Установить(СсылкаНаПереносДанных);

// Читаем существующие записи документа из базы данных
Набор.Прочитать();

// Выгружаем данные в таблицу значений для обработки
ТаблицаЗаписей = Набор.Выгрузить();

// Ищем и удаляем нужную строку по условию
Индекс = 0;
Пока Индекс < ТаблицаЗаписей.Количество() Цикл
    Строка = ТаблицаЗаписей[Индекс];
    Если Строка.Сотрудник = НужныйСотрудник И Строка.ДатаНачала = ДатаУдаляемойЗаписи Тогда
        ТаблицаЗаписей.Удалить(Строка);
        // Не увеличиваем индекс, так как элементы сдвинулись
        Продолжить;
    КонецЕсли;
    Индекс = Индекс + 1;
КонецЦикла;

// Загружаем скорректированную таблицу обратно в набор и записываем
Набор.Загрузить(ТаблицаЗаписей);
Набор.Записать();

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

← На главную