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