Задача переноса данных из одной информационной базы 1С в другую — одна из самых частых практики разработки. Разберем подробнее, как правильно подойти к решению этой задачи, если требуется перенести элементы справочника из базы-источника в базу-приемник с проверкой на существование дублей.
Рассмотрим структуру обработки обмена. Для выполнения задачи перегрузки данных логика обмена обычно выносится в отдельную внешнюю или встроенную обработку. Это позволяет использовать один и тот же инструмент как в базе-источнике, так и в базе-приемнике.
Проанализируем основные вопросы, возникающие при проектировании обработки:
РегламентноеЗадание без применения форм.ОткрытьФорму:
ОткрытьФорму("Обработка.ИмяОбработки.Форма.ФормаВыгрузки");
Устаревший синтаксис ПолучитьФорму().Открыть() в управляемом режиме не применяется.Выясним, какие варианты связи между базами 1С существуют и как выбрать подходящий:
СериализаторXDTO или записи в JSON/XML). В базе-приемнике этот файл считывается и обрабатывается. Это универсальный и надежный способ.V83.ComConnector и записывает данные напрямую. Помним о технических ограничениях: COM-соединение работает только под управлением ОС Windows и требует совпадения разрядности платформ. На серверах под управлением Linux данное решение недоступно.HTTPСоединение. Это современный стандарт обмена между распределенными системами.Рассмотрим пошагово, как должна работать логика переноса записей, чтобы избежать дублирования информации:
Шаг 1. Выгрузка из источника
В базе-источнике с помощью запроса выбираем элементы справочника и сохраняем их реквизиты (например, Фамилия, Имя, Отчество, Дата рождения) в файл или структурированный массив.
Шаг 2. Поиск и создание записей в приемнике
На стороне приемника для каждой выгруженной записи сначала выполняется поиск через Запрос по ключевым реквизитам. Сканировать справочник простым перебором не рекомендуется, так как это снижает производительность.
Посмотрим на пример кода поиска и сохранения данных на сервере:
&НаСервере
Процедура ЗагрузитьЗаписьВБазу(Фамилия, Имя, Отчество, ДатаРождения)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ФИО.Ссылка КАК Ссылка
|ИЗ
| Справочник.ФИО КАК ФИО
|ГДЕ
| ФИО.Фамилия = &Фамилия
| И ФИО.Имя = &Имя
| И ФИО.Отчество = &Отчество
| И ФИО.ДатаРождения = &ДатаРождения";
Запрос.УстановитьПараметр("Фамилия", Фамилия);
Запрос.УстановитьПараметр("Имя", Имя);
Запрос.УстановитьПараметр("Отчество", Отчество);
Запрос.УстановитьПараметр("ДатаРождения", ДатаРождения);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
НачатьТранзакцию();
Попытка
Если Выборка.Следующий() Тогда
// Элемент найден — обновляем существующих данные при необходимости
ОбъектСправочника = Выборка.Ссылка.ПолучитьОбъект();
Иначе
// Элемент не найден — создаем новый
ОбъектСправочника = Справочники.ФИО.СоздатьЭлемент();
ОбъектСправочника.Фамилия = Фамилия;
ОбъектСправочника.Имя = Имя;
ОбъектСправочника.Отчество = Отчество;
ОбъектСправочника.ДатаРождения = ДатаРождения;
КонецЕсли;
ОбъектСправочника.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Если вы только начинаете осваивать разработку на платформе 1С:Предприятие 8.3, рекомендуется проходить обучение поэтапно. Для формирования базового понимания архитектуры клиент-серверного взаимодействия и работы с объектами базы данных стоит обратиться к фундаментальным материалам: