← Назад к вопросам

Как организовать обмен данными между 1С и другими системами?

2.0 Middle🔥 231 комментариев
#Интеграции и обмены

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Обмен данными между 1С и другими системами

Интеграция 1С с внешними системами — это критически важная задача для большинства предприятий. Существует несколько подходов и технологий.

1. Встроенные механизмы 1С

ОМеXmlОбъект

// Использование встроенного тип для работы с XML
Данные = Новый ОМеXmlОбъект();
Данные.ЭлементОбхват("Товары");
Данные.Элемент("Товар").Атрибут("ID", "123").Элемент("Имя").Текст("Товар 1");

// Преобразование в строку
ХMLСтрока = ОМеXmlОбъект.ВХМл();

Встроенные форматы

  • XML — для комплексных структур
  • JSON — современный формат для API
  • CSV — для простых таблиц
  • BASE64 — для бинарных данных

2. Web-сервисы (REST и SOAP)

REST API

Это наиболее популярный подход для интеграции.

// Отправка данных через HTTP
&НаСервере
Процедура ОтправитьДанныеВСистему(ДанныеДляОтправки)
    
    // Подготовка URL
    URLАдрес = "https://external-system.com/api/v1/orders";
    
    // Подготовка JSON
    JSONДанные = Новый ЗаписьJSON();
    JSONДанные.УстановитьСтроку();
    Записатель = Новый ЗаписьJSON();
    Записатель.ЗаписатьОбъект(ДанныеДляОтправки);
    JSONСтрока = Записатель.ПолучитьСтроку();
    
    // Отправка HTTP POST
    HTTPЗапрос = Новый HTTPЗапрос(URLАдрес, , "Content-Type: application/json");
    HTTPЗапрос.УстановитьТелоИзСтроки(JSONСтрока);
    
    HTTPСоединение = Новый HTTPСоединение("external-system.com", , , , , 30);
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    
    Если HTTPОтвет.КодСостояния = 200 Тогда
        ЗаписьЖурнала("Интеграция", ТипСобытияЖурналаРегистрации.Информация, , , 
                      "Данные успешно отправлены в систему");
    Иначе
        ВызватьИсключение("Ошибка при отправке данных: " + HTTPОтвет.КодСостояния);
    КонецЕсли;
    
КонецПроцедуры

// Получение данных из внешней системы
&НаСервере
Функция ПолучитьДанныеИзСистемы(ИД) Экспорт
    URLАдрес = "https://external-system.com/api/v1/orders/" + ИД;
    
    HTTPЗапрос = Новый HTTPЗапрос(URLАдрес);
    HTTPСоединение = Новый HTTPСоединение("external-system.com", , , , , 30);
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    
    Если HTTPОтвет.КодСостояния = 200 Тогда
        ЧтениеJSON = Новый ЧтениеJSON();
        ЧтениеJSON.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку());
        ДанныеОтвета = ЧтениеJSON.ПрочитатьОбъект();
        Возврат ДанныеОтвета;
    Иначе
        Возврат Неопределено;
    КонецЕсли;
КонецФункции

OAuth2 Аутентификация

&НаСервере
Процедура ПолучитьТокенАутентификации()
    URLТокен = "https://external-system.com/oauth/token";
    
    ТелоЗапроса = Новый ЗаписьJSON();
    ТелоЗапроса.УстановитьСтроку();
    Записатель = Новый ЗаписьJSON();
    
    СтруктураДанных = Новый Структура();
    СтруктураДанных.Вставить("client_id", "YOUR_CLIENT_ID");
    СтруктураДанных.Вставить("client_secret", "YOUR_CLIENT_SECRET");
    СтруктураДанных.Вставить("grant_type", "client_credentials");
    
    Записатель.ЗаписатьОбъект(СтруктураДанных);
    
    HTTPЗапрос = Новый HTTPЗапрос(URLТокен, , "Content-Type: application/json");
    HTTPЗапрос.УстановитьТелоИзСтроки(Записатель.ПолучитьСтроку());
    
    HTTPСоединение = Новый HTTPСоединение("external-system.com");
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    
    ЧтениеJSON = Новый ЧтениеJSON();
    ЧтениеJSON.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку());
    ДанныеОтвета = ЧтениеJSON.ПрочитатьОбъект();
    
    Токен = ДанныеОтвета["access_token"];
    Возврат Токен;
КонецПроцедуры

3. Файловые обмены

Импорт из Excel/CSV

&НаСервере
Процедура ИмпортДанныхИзЭксель(ПутьКФайлу)
    
    ТаблицаДанных = Новая ТаблицаЗначений();
    ТаблицаДанных.Колонки.Добавить("Артикул");
    ТаблицаДанных.Колонки.Добавить("Наименование");
    ТаблицаДанных.Колонки.Добавить("Цена");
    ТаблицаДанных.Колонки.Добавить("Остаток");
    
    ОбработкаЭкселя = Новый СчитыватьЭкселевыйДокумент();
    ОбработкаЭкселя.ПрочитатьФайл(ПутьКФайлу, 0);
    
    ДиапазонДанных = ОбработкаЭкселя.ПолучитьОбласть("A1:D");
    
    Для СтрокаДанных = 0 По ДиапазонДанных.Строк - 1 Цикл
        НоваяСтрока = ТаблицаДанных.Добавить();
        НоваяСтрока.Артикул = ДиапазонДанных[СтрокаДанных][0];
        НоваяСтрока.Наименование = ДиапазонДанных[СтрокаДанных][1];
        НоваяСтрока.Цена = ДиапазонДанных[СтрокаДанных][2];
        НоваяСтрока.Остаток = ДиапазонДанных[СтрокаДанных][3];
    КонецЦикла;
    
    // Обработка полученных данных
    ОбработатьИмпортированныеДанные(ТаблицаДанных);
    
КонецПроцедуры

&НаСервере
Процедура ЭкспортДанныхВФайл()
    ТаблицаДанных = Новая ТаблицаЗначений();
    
    // Получение данных из БД
    Запрос = Новый Запрос();
    Запрос.Текст = "ВЫБРАТЬ Наименование, Цена, Остаток ИЗ Справочник.Товары";
    ТаблицаДанных = Запрос.Выполнить().Выгрузить();
    
    // Запись в CSV
    ФайлCSV = Новый Файл();
    ФайлCSV.ПолучитьПредставлениеБезРасширения() = "Товары";
    
    Запись = Новый ЗаписьCSV();
    Запись.Открыть("/tmp/Товары.csv", КодировкаСтрок.UTF8);
    Запись.ЗаписатьИменаКолонок(ТаблицаДанных);
    
    Для каждого Строка Из ТаблицаДанных Цикл
        Запись.ЗаписатьНовуюСтроку();
        Запись.ЗаписатьПоле(Строка.Наименование);
        Запись.ЗаписатьПоле(Строка.Цена);
        Запись.ЗаписатьПоле(Строка.Остаток);
    КонецЦикла;
    
    Запись.Закрыть();
КонецПроцедуры

4. Базы данных

ODBCСоединение

&НаСервере
Процедура ПолучитьДанныеИзОДБЦ()
    СтрокаСоединения = "Driver={MySQL ODBC 8.0 ANSI Driver};Server=localhost;Database=external_db;";
    
    ОДБЦСоединение = Новый ОДБЦСоединение(СтрокаСоединения);
    
    Если ОДБЦСоединение.Подключено() Тогда
        Запрос = Новый ОДБЦЗапрос("SELECT * FROM Orders WHERE Status = Pending");
        Результат = ОДБЦСоединение.ВыполнитьЗапрос(Запрос);
        
        Пока Результат.Следующий() Цикл
            ИдЗаказа = Результат["OrderID"];
            СуммаЗаказа = Результат["Amount"];
            // Обработка данных
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

5. Очереди сообщений

RabbitMQ / Kafka интеграция

&НаСервере
Процедура ОтправитьСообщениеВОчередь(Сообщение)
    // Для RabbitMQ используется HTTP API
    URLАмк = "https://rabbitmq-server:15672/api/exchanges/vhost/my-exchange/publish";
    
    СтруктураСообщения = Новый Структура();
    СтруктураСообщения.Вставить("properties", Новый Структура());
    СтруктураСообщения.Вставить("routing_key", "orders");
    СтруктураСообщения.Вставить("payload", Сообщение);
    СтруктураСообщения.Вставить("payload_encoding", "string");
    
    JSONЗаписатель = Новый ЗаписьJSON();
    JSONЗаписатель.УстановитьСтроку();
    Записатель = Новый ЗаписьJSON();
    Записатель.ЗаписатьОбъект(СтруктураСообщения);
    
    HTTPЗапрос = Новый HTTPЗапрос(URLАмк, , "Content-Type: application/json");
    HTTPЗапрос.УстановитьТелоИзСтроки(Записатель.ПолучитьСтроку());
    HTTPЗапрос.УстановитьЗагловок("Authorization", "Basic " + КодировкаBase64("user:password"));
    
    HTTPСоединение = Новый HTTPСоединение("rabbitmq-server", 15672, , , , 30);
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
КонецПроцедуры

6. Лучшие практики интеграции

Обработка ошибок:

&НаСервере
Процедура ЗащитаОтОшибок()
    Попытка
        // Код интеграции
    Исключение
        // Логирование ошибки
        ЗаписьЖурнала("ОшибкаИнтеграции", ТипСобытияЖурналаРегистрации.Ошибка, , , 
                      ОписаниеОшибки());
        
        // Повторная попытка
        Для Попытка = 1 По 3 Цикл
            ОжиданиеВСекундах = Мощность(2, Попытка); // Экспоненциальная задержка
            Пауза(ОжиданиеВСекундах);
            Если ПовторитьОперацию() Тогда
                Прервать;
            КонецЕсли;
        КонецЦикла;
    КонецПопытки;
КонецПроцедуры

Асинхронная обработка:

&НаСервере
Процедура ОтправитьАсинхронно(Данные)
    // Используем фоновые работы для долгих операций
    ФоноваяРабота = Новая ФоноваяРабота();
    ФоноваяРабота.Описание = "Отправка данных в систему";
    ФоноваяРабота.ИмяМетода = "МодульОбработки.ОтправитьДанные";
    ФоноваяРабота.ПараметрыМетода = Новый Массив();
    ФоноваяРабота.ПараметрыМетода.Добавить(Данные);
    ФоноваяРабота.Выполнить();
КонецПроцедуры

Выбор подхода

ПодходКогда использоватьПлюсыМинусы
REST APIИнтеграция с облачными системамиПросто, современноСинхронно
ФайлыПериодические загрузкиНадежноМедленно
ODBCДоступ к другим БДПрямой доступБезопасность
ОчередиВысоконагруженные системыАсинхронноСложнее
SOAPКорпоративные интеграцииНадежноТяжело

Вывод

Выбор подхода зависит от сложности данных, частоты обмена, требований к надежности и наличия документированного API у партнёра.

Как организовать обмен данными между 1С и другими системами? | PrepBro