Обмен данными — одна из самых частых и ответственных задач, с которыми сталкивается программист 1С. Существует множество технологий для передачи информации между базами, и выбор конкретного метода зависит от архитектуры систем, объема данных и требований к скорости обмена. В этой статье мы подробно разберем пять основных способов реализации обмена, которые часто встречаются в тестовых заданиях и реальной практике.
Этот метод считается одним из самых простых и «древних», но он до сих пор актуален благодаря своей универсальности и высокой скорости обработки. Разберем ситуацию, когда нам нужно выгрузить данные из одной базы и загрузить в другую, используя текстовый файл с разделителями (CSV).
Для работы с текстом в платформе 1С предусмотрены объекты ЗаписьТекста и ЧтениеТекста. Рассмотрим пример выгрузки списка товаров в файл, где в качестве разделителя будем использовать точку с запятой.
// Пример выгрузки данных в текстовый файл
ПутьКФайлу = "C:\Exchange\ExportData.csv";
Текст = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
// Формируем строку: Наименование;Артикул;Цена
СтрокаДанных = Выборка.Наименование + ";" + Выборка.Артикул + ";" + Строка(Выборка.Цена);
Текст.ЗаписатьСтроку(СтрокаДанных);
КонецЦикла;
Текст.Закрыть();
Проанализируем процесс загрузки. При чтении нам необходимо разбить строку на части, используя функцию СтрРазделить. Это позволит получить массив значений и записать их в соответствующие реквизиты объектов новой базы.
Важные нюансы: при использовании текстовых файлов всегда следите за кодировкой. Если одна база записывает в UTF8, а вторая пытается прочитать в Windows-1251, вместо данных вы получите «кракозябры». Также помните, что текстовый формат не поддерживает сложную структуру, поэтому он лучше всего подходит для плоских таблиц.
Формат DBF (Data Base File) пришел к нам из эпохи настольных баз данных. В 1С для работы с ним используется объект XBase. Этот способ часто применяется для интеграции с устаревшим ПО или государственными информационными системами.
Разберем по шагам, как создать DBF-файл и наполнить его данными. Основная сложность здесь заключается в предварительном описании структуры колонок.
// Создание и заполнение файла DBF
ФайлDBF = Новый XBase;
ФайлDBF.Поля.Добавить("ID", "N", 10); // Числовое поле длиной 10
ФайлDBF.Поля.Добавить("NAME", "S", 100); // Строковое поле длиной 100
ФайлDBF.СоздатьФайл("C:\Exchange\data.dbf");
// Добавление записей
Выборка = Справочники.Контрагенты.Выбрать();
Пока Выборка.Следующий() Цикл
ФайлDBF.Добавить();
ФайлDBF.ID = Выборка.Код;
ФайлDBF.NAME = Выборка.Наименование;
ФайлDBF.Записать();
КонецЦикла;
ФайлDBF.ЗакрытьФайл();
Выясним причину, почему этот метод считается «капризным»: в DBF существуют жесткие ограничения на длину имен полей (не более 10 символов) и типы данных. Если ваше поле в 1С называется «НаименованиеПолное», в DBF его придется сократить до «NAME_FULL». Тем не менее, XBase работает очень быстро и позволяет работать с файлом как с таблицей БД, включая использование индексов для поиска.
Это современные стандарты обмена. XML долгое время был основным форматом в 1С (на нем построены правила обмена «Конвертации данных»), а JSON стал популярным благодаря интеграции с веб-сервисами.
Рассмотрим использование JSON, так как он более лаконичен и удобен для передачи через интернет. Для этого мы будем использовать объекты ЗаписьJSON и СериализаторXDTO.
// Выгрузка документа в формат JSON
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
// Можно записывать вручную
Запись.ЗаписатьНачалоОбъекта();
Запись.ЗаписатьИмяСвойства("НомерДокумента");
Запись.ЗаписатьЗначение(Объект.Номер);
Запись.ЗаписатьИмяСвойства("Дата");
Запись.ЗаписатьЗначение(Объект.Дата);
Запись.ЗаписатьКонецОбъекта();
Результат = Запись.Закрыть();
Проанализируем ситуацию с XML. В 1С реализован мощный механизм XDTO (XML Data Transfer Objects). С его помощью можно описать сложную структуру данных (схему) и автоматически преобразовывать объекты 1С в XML-пакеты. Это гарантирует, что принимающая сторона получит данные именно в том виде, в котором ожидает.
Это самый «продвинутый» способ, который позволяет базам общаться в режиме реального времени без создания промежуточных файлов на диске. Одна база выступает как HTTP-сервис (сервер), а другая как клиент.
Разберем логику работы клиента. Нам нужно создать HTTPСоединение, сформировать HTTPЗапрос и отправить его на сервер.
// Отправка данных на внешний HTTP-сервис
Соединение = Новый HTTPСоединение("myserver.ru", 443, "Логин", "Пароль", , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/api/v1/data");
Запрос.УстановитьТелоИзСтроки("{ 'info': 'Тестовые данные' }", КодировкаТекста.UTF8);
Попытка
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
Сообщить("Данные успешно отправлены!");
КонецЕсли;
Исключение
Сообщить("Ошибка связи: " + ОписаниеОшибки());
КонецПопытки;
Преимущество этого метода в том, что данные передаются мгновенно. Это критично для систем, где, например, остатки товаров на складе должны обновляться сразу после продажи в розничном магазине. Для реализации полноценного обмена вам потребуется создать в дереве конфигурации объект «HTTP-сервис» и прописать в нем шаблоны URL и методы (GET, POST).
Метод COM (Component Object Model) позволяет одной базе 1С буквально «подключиться» к другой и работать с её объектами напрямую. Это выглядит так, будто вы открыли вторую базу внутри кода первой.
Посмотрим на пример создания такого соединения. Для этого используется системный объект V83.COMConnector.
// Подключение к другой базе 1С через COM
Соединитель = Новый COMОбъект("V83.COMConnector");
СтрокаПодключения = "Srvr='ServerName';Ref='BaseName';Usr='Admin';Pwd='123'";
Попытка
БазаПриемник = Соединитель.Connect(СтрокаПодключения);
// Теперь мы можем создавать объекты в той базе!
НовыйКонтрагент = БазаПриемник.Справочники.Контрагенты.СоздатьЭлемент();
НовыйКонтрагент.Наименование = "Новый из другой базы";
НовыйКонтрагент.Записать();
Сообщить("Контрагент успешно создан через COM");
Исключение
Сообщить("Не удалось подключиться: " + ОписаниеОшибки());
КонецПопытки;
Важные ограничения: COM-соединение работает только под управлением ОС Windows. Оно требует, чтобы на компьютере (или сервере), где выполняется код, была установлена платформа 1С. Кроме того, этот метод считается ресурсоемким и медленным по сравнению с HTTP-сервисами, поэтому его рекомендуют использовать только в локальных сетях для разовых или регламентных задач переноса данных.
Мы рассмотрели пять принципиально разных подходов. Выделим основные правила выбора:
Помните, что в типовых конфигурациях 1С чаще всего используется механизм «Синхронизация данных», который базируется на планах обмена и формате EnterpriseData (на основе XML). Однако понимание всех перечисленных методов сделает вас универсальным специалистом, способным решить любую задачу по интеграции.