При разработке или обновлении конфигураций 1С часто возникает задача по миграции данных. Например, когда необходимо перенести значения из отдельных реквизитов справочника в его табличную часть. Начинающие разработчики часто сталкиваются с ошибками при попытке напрямую записать табличную часть, не учитывая архитектуру платформы 1С:Предприятие. Давайте разберем, как выполнить эту задачу правильно и безопасно.
Основная ошибка при работе с табличными частями (ТЧ) заключается в попытке манипулировать ими как независимыми структурами. Важно помнить, что в 1С табличная часть является неотъемлемой частью объекта справочника или документа. Вы не можете записать «только табличную часть» — вы всегда записываете объект целиком.
Для выполнения изменений необходимо пройти следующий путь:
ПолучитьОбъект().Рассмотрим пример процедуры, которая корректно переносит данные из старых реквизитов в табличную часть КонтактнаяИнформация. Этот код рекомендуется размещать в модуле менеджера или в процедуре обработки обновления данных.
Процедура ЗаполнитьТабличнуюЧастьКонтактнаяИнформация() Экспорт
Выборка = Справочники.Контрагенты.Выбрать();
Пока Выборка.Следующий() Цикл
КонтрагентОбъект = Выборка.ПолучитьОбъект();
КонтактнаяИнформация = КонтрагентОбъект.КонтактнаяИнформация;
// Очистка ТЧ может быть опасна, если там уже есть данные!
КонтактнаяИнформация.Очистить();
Строка1 = КонтактнаяИнформация.Добавить();
Строка1.Вид = Справочники.ВидыКонтактнойИнформации.EMailКонтрагента;
Строка1.Значение = Выборка.УдалитьEMail;
Строка2 = КонтактнаяИнформация.Добавить();
Строка2.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
Строка2.Значение = Выборка.УдалитьТелефон;
КонтрагентОбъект.Записать();
КонецЦикла;
КонецПроцедуры
Хотя приведенный выше код решает поставленную задачу, профессиональная разработка требует соблюдения дополнительных мер предосторожности:
1. Риск потери данных. Использование метода Очистить() без проверки удаляет всю информацию, которая могла быть внесена пользователями ранее. Перед очисткой обязательно убедитесь, что вы не затираете актуальные данные, либо разработайте логику дополнения строк, а не полной перезаписи.
2. Оптимизация производительности. Перебор всего справочника через Выбрать() крайне неэффективен на больших объемах данных (десятки и сотни тысяч контрагентов). Вместо этого используйте запросы с условием ГДЕ, чтобы выбирать только те элементы, которые действительно требуют обработки (например, где реквизит УдалитьEMail не пуст).
3. Порционная обработка. При выполнении масштабных миграций данных рекомендуется обрабатывать объекты «пачками» (по 500–1000 элементов за итерацию). Это позволяет избежать блокировок всей таблицы базы данных на долгое время и снижает нагрузку на сервер.
4. Использование транзакций. Чтобы обеспечить целостность данных, оберните цикл в явную транзакцию. В случае ошибки на середине процесса, транзакция позволит откатить выполненные изменения, предотвращая частичное «засорение» справочника некорректными данными.
5. Расположение кода. Если задача является разовой, лучше создать внешнюю обработку. Это позволит протестировать код в безопасной среде, не меняя структуру конфигурации без лишней необходимости. Модуль менеджера стоит использовать только в том случае, если вы пишете официальный обработчик обновления для БСП.
Следуя этим правилам, вы обеспечите стабильную и безопасную работу вашего программного решения, минимизируя риск потери информации и снижая нагрузку на систему при выполнении регламентных операций.