При работе с документом Перенос данных многие разработчики сталкиваются с концептуальной трудностью: попытка найти табличную часть для записи движений регистра внутри самого документа оказывается безрезультатной. Давайте разберем, как устроена эта архитектура и каким образом правильно вносить данные в регистры накопления или сведения через данный механизм.
Важно уяснить, что Перенос данных — это не классический документ с табличными частями для хранения учетных данных. Его табличная часть ТаблицаРегистров является лишь реестром, своего рода «списком прав доступа». Когда мы добавляем в нее запись с именем регистра, мы лишь говорим системе: «Данный документ является регистратором для этого регистра». Сами же данные хранятся непосредственно в таблицах самого регистра.
Следовательно, обращение к «вложенной табличной части» в самом объекте ДокументОбъект.ПереносДанных невозможно, так как ее не существует в структуре метаданных. Вместо этого мы должны работать с объектом НаборЗаписей соответствующего регистра.
Рассмотрим, как программно реализовать наполнение регистра данными через уже созданный документ ПереносДанных. Для этого нам потребуется выполнить три ключевых этапа: найти регистратор, создать набор записей и выполнить их запись в базу данных.
СоздатьНаборЗаписей() у нужного регистра накопления или сведений.Регистратор, чтобы 1С понимала, какие именно записи в регистре принадлежат нашему документу.Представим, что нам нужно добавить данные в регистр СведенияОДоходахСтраховыеВзносы. Выполним это следующим образом:
// Сначала найдем документ по номеру (или по другой ссылке)
Регистратор = Документы.ПереносДанных.НайтиПоНомеру("0000001");
// Создаем набор записей регистра
НаборЗаписей = РегистрыНакопления.СведенияОДоходахСтраховыеВзносы.СоздатьНаборЗаписей();
// Устанавливаем отбор по нашему документу
НаборЗаписей.Отбор.Регистратор.Установить(Регистратор);
// Прочитываем существующие записи, чтобы не затереть их, если они есть
НаборЗаписей.Прочитать();
// Добавляем новую запись
Запись = НаборЗаписей.Добавить();
Запись.Период = ТекущаяДатаСеанса();
Запись.ГоловнаяОрганизация = Справочники.Организации.НайтиПоНаименованию("ООО Ромашка");
Запись.ФизическоеЛицо = Справочники.ФизическиеЛица.НайтиПоНаименованию("Иванов Иван Иванович");
// ... заполняем остальные измерения и ресурсы
// Записываем набор в базу данных
НаборЗаписей.Записать();
При работе с наборами записей через ПереносДанных, обратите внимание на следующие моменты:
Прочитать(): Если вы пропустите этот этап, вы рискуете затереть данные, которые уже были внесены в документ ранее. Всегда сначала считывайте состояние регистра для данного регистратора.НаборЗаписей.Записать() платформа автоматически удаляет старые записи, соответствующие отбору (то есть привязанные к этому же документу), и записывает новые. Это штатное поведение для наборов записей.ТаблицуРегистров: Если вы создаете документ с нуля, убедитесь, что вы программно добавили нужный регистр в табличную часть ТаблицаРегистров самого документа, иначе регистр не будет «видеть» связь с документом.Анализируя данную задачу, мы рекомендуем всегда проверять, не предусмотрен ли для вашей цели (например, смены регистрационного налогового органа) типовой документ системы. В ЗКГУ смена параметров учета часто требует корректного закрытия периодов, и простое внесение записей через ПереносДанных может привести к расхождениям в отчетности, если не учесть влияние на другие регистры накопления.