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