Как программно удалить данные и вкладки регистров в документе «Перенос данных» в 1С:ЗУП 3.1

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

При работе с конфигурацией «1С:Зарплата и управление персоналом 3.1» (КОРП) часто возникает необходимость программной корректировки или полной очистки документов ПереносДанных. Этот документ является универсальным инструментом (своего рода универсальная корректировка регистров), который используется при миграции данных из старых систем (например, ЗУП 2.5 или БЭСТ5). Особенность его в том, что он не имеет фиксированной структуры табличных частей для данных — его интерфейс и состав закладок формируются динамически (например, когда выполняется корректировка регистра «Зарплата к выплате») на основании специальных служебных таблиц. В этой статье мы разберем, как правильно и полностью удалить программно информацию из этого документа, чтобы не оставить «фантомных» закладок или скрытых движений.

Понимаем структуру документа «Перенос данных»

Прежде чем приступать к написанию кода, проанализируем, как устроен этот объект. В отличие от стандартных документов, где данные хранятся в табличных частях (например, «Товары»), документ ПереносДанных хранит всю содержательную часть непосредственно в движениях по регистрам (сведений, накопления, расчета). Однако для того чтобы пользователь видел эти данные в интерфейсе, в документе существует служебная табличная часть — ТаблицаРегистров.

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

Шаг 1: Программная очистка движений регистров

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

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


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

// Записываем пустой набор, тем самым удаляя старые записи
Набор.Записать();

Если таких регистров в документе много, нам нужно проделать эту операцию для каждого. Однако после выполнения этого кода в самом документе все еще будут отображаться пустые закладки. Чтобы их убрать, переходим к следующему шагу.

Шаг 2: Удаление строк из коллекции «ТаблицаРегистров»

Теперь разберем, как программно зайти в объект документа и удалить упоминания о регистрах. Важно помнить, что для изменения структуры документа нам обязательно нужно получить ДокументОбъект. Метод Очистить() применим к табличной части, но если нам нужно удалить только одну конкретную таблицу (закладку), мы будем использовать метод Удалить().

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


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

// Определим имя регистра, который хотим убрать с формы
ИмяНужногоРегистра = "ЗарплатаПринятаяКУчету";

// Ищем строку в служебной таблице документа
СтрокаТЧ = ДокОбъект.ТаблицаРегистров.Найти(ИмяНужногоРегистра, "Имя");

Если СтрокаТЧ <> Неопределено Тогда
    ДокОбъект.ТаблицаРегистров.Удалить(СтрокаТЧ);
    ДокОбъект.Записать();
КонецЕсли;

В этом примере Имя — это реквизит табличной части ТаблицаРегистров, в котором хранится строковое представление метаданных регистра. После удаления строки и записи объекта, 1С при следующем открытии формы документа просто не нарисует соответствующую вкладку.

Комплексное решение: Полная очистка документа

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

Разберем по шагам, как это сделать наиболее эффективно:

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

Пример кода для полной очистки документа:


Процедура ПолностьюОчиститьПереносДанных(ДокСсылка)
    
    ДокОбъект = ДокСсылка.ПолучитьОбъект();
    
    // 1. Очищаем все движения по всем регистрам, связанным с документом
    Для Каждого НаборЗаписей Из ДокОбъект.Движения Цикл
        НаборЗаписей.Прочитать();
        Если НаборЗаписей.Количество() > 0 Тогда
            НаборЗаписей.Очистить();
            НаборЗаписей.Записать();
        КонецЕсли;
    КонецЦикла;
    
    // 2. Очищаем список регистров в самом документе (удаляем вкладки)
    ДокОбъект.ТаблицаРегистров.Очистить();
    
    // 3. Фиксируем изменения
    Попытка
        ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
        Сообщить("Документ " + ДокОбъект + " успешно очищен.");
    Исключение
        Сообщить("Ошибка при записи документа: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Важные нюансы и рекомендации

При работе с документом ПереносДанных в ЗУП КОРП следует учитывать несколько важных моментов, которые мы выяснили в ходе анализа:

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

← На главную