Справочники и Данные · 12 мин
Как перезаписать всех контрагентов в 1С
Как массово перезаписать контрагентов в 1С через групповую обработку, встроенные механизмы и обработку на встроенном языке. Порядок действий, риски и проверка результата.
Перезапись всех контрагентов — типовая задача при обновлении данных справочника: после доработки конфигурации, добавления новых реквизитов, изменения алгоритмов заполнения или исправления ошибок обмена. Перезапись заставляет объект заново пройти все обработчики записи (проверку заполнения, подписки на события, механизмы синхронизации), что невозможно сделать простым изменением реквизита через запрос.
В зависимости от конфигурации и режима работы (файловая или клиент-серверная база, управляемые или обычные формы) доступно несколько способов: типовая групповая обработка «Групповое изменение реквизитов», обработка «Универсальный подбор и обработка объектов», консоль кода или собственная обработка на встроенном языке. Каждый вариант имеет ограничения по скорости, правам доступа и безопасности.
Главный риск массовой перезаписи — срабатывание бизнес-логики, которую администратор не учёл: регистрация изменений в планах обмена, запуск регламентных проверок, пересчёт связанных данных. Поэтому перед запуском обязательно делается резервная копия, а сама операция сначала тестируется на копии базы или на ограниченной выборке.
Когда действительно нужна перезапись, а не изменение реквизита
Перезапись отличается от изменения данных тем, что объект проходит полный цикл записи: вызываются обработчики «ПередЗаписью» и «ПриЗаписи», срабатывают подписки на события, проверки заполнения, механизмы версионирования и регистрации в планах обмена. Именно это и нужно, когда требуется «провести» справочник через новую логику после доработки конфигурации.
Типовые сценарии, где нужна именно перезапись: добавлен новый реквизит, который заполняется в обработчике «ПриЗаписи»; изменилась методика формирования наименования или полного наименования; требуется зарегистрировать всех контрагентов к выгрузке в план обмена; после восстановления базы часть элементов имеет некорректные служебные признаки, которые сбрасываются при записи.
Если же задача — просто поменять значение одного реквизита (например, проставить страну или группу доступа), перезапись не обязательна: достаточно группового изменения реквизита без вызова обработчиков. Это быстрее и безопаснее, особенно на больших справочниках.
Подготовка: копия базы, права и тестовая выборка
Перед массовой операцией сделайте резервную копию. Для файловой базы достаточно скопировать файл 1Cv8.1CD при остановленной работе пользователей или выгрузить базу через конфигуратор («Администрирование» → «Выгрузить информационную базу»). Для клиент-серверной базы используйте штатные средства СУБД.
Проверьте права: для перезаписи нужны права на изменение справочника «Контрагенты» и, как правило, право запуска внешних обработок или доступ к разделу «Администрирование». В типовых конфигурациях групповое изменение доступно пользователям с правами администратора или с ролью «Добавление и изменение базовой нормативно-справочной информации» в сочетании с настройкой прав.
Обязательно проведите тест на ограниченной выборке: отберите 5–10 контрагентов, выполните перезапись и проверьте результат — не изменились ли реквизиты, которые меняться не должны, не появились ли ошибки проверки заполнения, не заблокировались ли элементы. Только после успешного теста запускайте обработку всего справочника.
Способ 1. Групповое изменение реквизитов в типовой конфигурации
В конфигурациях на Библиотеке стандартных подсистем (УТ 11, КА 2, ERP 2, БП 3.0 и другие) есть встроенный инструмент «Групповое изменение реквизитов». Путь: «Администрирование» → «Обслуживание» → «Корректировка данных» → «Групповое изменение реквизитов». В некоторых конфигурациях обработка доступна через «Все функции» или раздел «НСИ и администрирование».
Порядок работы: выберите в списке типов объектов «Контрагенты», при необходимости настройте отбор (по группе, по признаку пометки удаления, по дате изменения). Чтобы выполнить именно перезапись без изменения данных, в списке реквизитов выберите любой безопасный реквизит и укажите для него то же самое значение — либо используйте режим перезаписи, если ваша версия обработки его предлагает. Затем нажмите «Изменить реквизиты».
Обработка выполняется в фоновом задании, прогресс отображается в процентах. По завершении формируется отчёт: сколько элементов обработано, сколько пропущено с ошибками и по какой причине. Это самый безопасный способ для пользователя без навыков программирования.
- 1Сделайте резервную копию базы
- 2Откройте Администрирование → Обслуживание → Групповое изменение реквизитов
- 3Выберите тип объектов «Контрагенты» и настройте отбор при необходимости
- 4Укажите безопасный реквизит с неизменным значением или режим перезаписи
- 5Запустите обработку и дождитесь завершения фонового задания
- 6Изучите отчёт: количество обработанных и пропущенных элементов
Способ 2. Перезапись через консоль кода или внешнюю обработку
Если типовой обработки нет (самописная конфигурация, старая версия платформы) или нужен полный контроль над процессом, используется встроенный язык. Код выполняется в консоли кода (внешняя обработка) или в фоновом задании. Базовый вариант выглядит так:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты ГДЕ НЕ ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.Записать();
КонецЦикла;
Для больших справочников добавьте обработку ошибок и транзакции порциями: оборачивайте запись каждого элемента в попытку/исключение, чтобы один проблемный контрагент не прервал весь цикл, и фиксируйте транзакцию каждые 500–1000 элементов. Это снижает время удержания блокировок и позволяет продолжить с места сбоя.
Если перезапись нужна только для регистрации в плане обмена, вместо записи объекта используйте ПланыОбмена.ЗарегистрироватьИзменения() — это быстрее и не вызывает обработчики записи. Уточните, какая именно цель стоит: «прогнать» объекты через логику записи или просто отправить их в обмен.
Попытка
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.Записать();
Исключение
ЗаписьЖурналаРегистрации("Перезапись контрагентов", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;Способ 3. Универсальные подбор и обработка объектов
Для обычных форм (УТ 10.3, УПП 1.3) классический инструмент — внешняя обработка «Универсальный подбор и обработка объектов». Она позволяет отобрать элементы справочника по произвольным условиям и применить к ним действие, включая «Перезаписать объекты». Обработка открывается через «Файл» → «Открыть» и требует прав на запуск внешних обработок.
В управляемых формах аналогичные задачи решают консоль кода, обработка «Инструменты разработчика» (ИР) или собственные обработки с отбором СКД. Принцип везде одинаков: отбор → цикл ПолучитьОбъект() → Записать(). Разница только в удобстве настройки отбора и протоколирования результата.
Сравнение способов перезаписи
Типовой безопасный способ без программирования; ограничение — не во всех конфигурациях есть и не всегда доступен режим чистой перезаписи
Полный контроль, обработка ошибок, порционные транзакции; требует навыков встроенного языка и аккуратности
Гибкий отбор без кода для обычных форм; ограничение — внешняя обработка, нужны права и контроль версии
Проверка результата и журнал регистрации
После завершения обработки сверьте количество: сколько элементов должно было быть перезаписано и сколько фактически обработано. Расхождение обычно означает ошибки проверки заполнения у части элементов — например, незаполненный обязательный реквизит блокирует запись.
Откройте журнал регистрации («Администрирование» → «Обслуживание» → «Журнал регистрации») с отбором по событию ошибок данных за период обработки. Там видно, какие элементы не записались и по какой причине. Эти элементы обработайте отдельно: заполните недостающие реквизиты вручную или скорректируйте код.
Дополнительно проверьте несколько контрагентов визуально: откройте карточки из разных групп, убедитесь, что реквизиты не «поехали», история изменений (если включено версионирование) зафиксировала запись, а связанные объекты (договоры, контактные лица) на месте.
Как проверить результат
Совпадает с числом отобранных
Часть элементов пропущена — смотрите журнал регистрации
Реквизиты на месте, запись зафиксирована
Очищены поля или ошибки открытия формы
Изменения зарегистрированы ожидаемо
Огромная очередь выгрузки, о которой не планировали
Типичные ошибки и ограничения
Самая частая ошибка — запуск перезаписи без отбора помеченных на удаление, когда задача касается только «живых» элементов. Помеченные объекты тоже перезаписываются и регистрируются в обменах, что увеличивает объём обработки в разы на старых базах.
Вторая ошибка — игнорирование обработчиков записи. Если в конфигурации при записи контрагента пересчитываются связанные данные или отправляются уведомления, массовая перезапись запустит всё это тысячи раз. Изучите код обработчиков «ПриЗаписи» перед запуском или временно отключите подписки на события при согласовании с разработчиком.
Третья группа проблем — блокировки в клиент-серверном режиме. Длинная транзакция на десятки тысяч записей блокирует таблицы и мешает пользователям. Решение: порционные транзакции, запуск в нерабочее время, при необходимости — паузы между порциями.
Частые вопросы
Чем перезапись отличается от группового изменения реквизита?
Изменение реквизита меняет конкретное поле и может выполняться в режиме без вызова бизнес-логики. Перезапись проводит объект через все обработчики записи, проверки заполнения и подписки на события. Перезапись нужна, когда требуется, чтобы сработала логика конфигурации, а не просто поменялось значение.
Почему часть контрагентов не перезаписалась?
Чаще всего срабатывает проверка заполнения: у элемента не заполнен обязательный реквизит, который стал обязательным после обновления конфигурации. Причины видны в журнале регистрации. Такие элементы дозаполняют вручную или обрабатывают отдельным проходом с отключённой проверкой (Объект.ОбменДанными.Загрузка = Истина — только если понимаете последствия).
Можно ли перезаписать контрагентов без срабатывания обработчиков?
Да: установите Объект.ОбменДанными.Загрузка = Истина перед Записать(). Объект запишется в режиме загрузки данных — без подписок на события и большинства проверок. Это быстрее, но опаснее: логика контроля целостности не выполнится, поэтому применяйте режим осознанно и только для служебных операций.
Сколько времени занимает перезапись большого справочника?
Зависит от количества элементов, обработчиков записи и режима работы базы. Десятки тысяч элементов без тяжёлой логики обычно обрабатываются за минуты, но при активных подписках на события и синхронизациях время может вырасти многократно. Точную оценку даёт тестовый прогон на небольшой выборке с замером времени.
Отразится ли перезапись на обмене с сайтом или другой базой?
Да. Каждая запись регистрирует изменение в планах обмена, и при следующей синхронизации все перезаписанные контрагенты будут выгружены. Если цель — именно выгрузка, это желаемый эффект; если нет — снимайте регистрацию изменений или используйте режим загрузки с отключённой регистрацией.
Нужен ли монопольный режим для перезаписи?
Строго обязателен он только для операций вроде удаления помеченных объектов. Перезапись возможна и при работающих пользователях, но это создаёт блокировки и риск конфликтов с одновременным редактированием тех же карточек. Практическая рекомендация — выполнять массовую перезапись в нерабочее время или в монопольном режиме.
Что важно запомнить
Перезапись контрагентов выполняется типовой обработкой «Групповое изменение реквизитов» или циклом ПолучитьОбъект() + Записать(). Обязательны резервная копия, тест на малой выборке и проверка журнала регистрации после завершения. Учитывайте влияние на планы обмена и блокировки — запускайте операцию вне рабочего времени.