В современной практике разработки на платформе 1С:Предприятие 8.3 все чаще встречаются ситуации, когда классическое COM-соединение (или OLE) становится недоступным. Основная причина — переход серверов на операционную систему Linux, где технология COM не поддерживается на уровне ядра. Разберем ситуацию, когда нам необходимо сопоставить данные между старой конфигурацией (например, Управление торговлей 10.3) и актуальной Бухгалтерией предприятия 3.0, работающей на СУБД PostgreSQL под управлением Linux.
Рассмотрим несколько эффективных стратегий решения этой задачи, начиная от стандартных механизмов платформы и заканчивая низкоуровневым доступом к данным.
Проанализируем самый быстрый способ получения данных, который не требует внесения изменений в конфигурацию источника (в нашем случае — БП 3.0). Платформа 1С имеет встроенный механизм OData, который позволяет обращаться к объектам базы данных через обычные HTTP-запросы.
Для активации этого механизма выполним следующие шаги:
УдаленныйДоступЧерезStandardOData).Теперь мы можем получать данные из 1С:Бухгалтерии, отправляя GET-запросы из кода УТ 10.3. Например, для получения списка платежных поручений адрес будет выглядеть так: http://server/base/odata/standard.odata/Document_ПлатежноеПоручение.
Выясним преимущества использования фильтрации в запросе. Чтобы не выгружать лишние данные, используем параметр $filter. В коде 1С это реализуется через объект HTTPСоединение:
Сервер = "192.168.1.10";
Ресурс = "/bp_base/odata/standard.odata/Document_ПлатежноеПоручение?$filter=Date ge datetime'2023-01-01T00:00:00'&$format=json";
Соединение = Новый HTTPСоединение(Сервер, , "Логин", "Пароль");
Запрос = Новый HTTPЗапрос(Ресурс);
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Обработка JSON ответа
КонецЕсли;
Если стандартный интерфейс OData кажется избыточным или сложным в настройке фильтрации по сложным критериям, разберем способ создания своего HTTP-сервиса. Это наиболее гибкий метод, позволяющий реализовать любую логику на стороне базы-источника.
В конфигурации Бухгалтерия предприятия 3.0 создадим расширение и добавим в него новый объект HTTP-сервис. Укажем корневой URL (например, api/v1) и создадим шаблон URL для получения данных.
Посмотрим на пример кода метода GET, который возвращает таблицу значений, сериализованную в JSON:
Функция GetData(Запрос)
ЗапросКБД = Новый Запрос;
ЗапросКБД.Текст =
"ВЫБРАТЬ
| ПлатежноеПоручение.Номер КАК Номер,
| ПлатежноеПоручение.Дата КАК Дата,
| ПлатежноеПоручение.СуммаДокумента КАК Сумма,
| ПлатежноеПоручение.Контрагент.Наименование КАК Контрагент
|ИЗ
| Документ.ПлатежноеПоручение КАК ПлатежноеПоручение
|ГДЕ
| ПлатежноеПоручение.Дата МЕЖДУ &ДатаНач И &ДатаКон";
// Установка параметров из параметров запроса URL
ДатаНачала = Запрос.ПараметрыЗапроса.Получить("start");
ЗапросКБД.УстановитьПараметр("ДатаНач", ДатаНачала);
// ... установка остальных параметров
Результат = ЗапросКБД.Выполнить().Выгрузить();
// Сериализация в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Результат);
СтрокаJSON = ЗаписьJSON.Закрыть();
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
Возврат Ответ;
КонецФункции
Важный нюанс: поскольку вызывающая сторона (УТ 10.3) работает на старой платформе, убедитесь, что она поддерживает парсинг JSON. Если встроенных функций ПрочитатьJSON нет, можно использовать объект ЧтениеJSON или сторонние библиотеки на языке 1С.
Рассмотрим метод, который обеспечивает максимальную производительность при чтении больших объемов данных. Платформа 1С позволяет подключать таблицы сторонних баз SQL как Внешние источники данных.
В конфигурации Управление торговлей 10.3 выполним следующие действия:
ВнешнийИсточникДанных.Проанализируем сложность этого метода. Основная проблема заключается в именовании таблиц в SQL. Например, документ "Платежное поручение" может называться _Document150. Чтобы выяснить соответствие имен, необходимо на стороне Бухгалтерии выполнить метод ПолучитьСтруктуруХраненияБазыДанных().
Преимущество этого подхода в том, что вы можете использовать стандартные Запросы 1С прямо в коде УТ 10.3, обращаясь к внешнему источнику как к обычным таблицам, что позволяет соединять данные двух баз в одном запросе.
Если задача не требует мгновенного получения данных "в режиме реального времени", разберем самый надежный "олдскульный" метод — выгрузку данных в файл через регламентное задание.
На стороне БП 3.0 настроим регламентное задание, которое раз в час выгружает результат запроса в общую сетевую папку:
ТЗ = Запрос.Выполнить().Выгрузить();
ПутьКФайлу = "/shared/exchange/bank_data.dat";
ЗначениеВФайл(ПутьКФайлу, ТЗ);
На стороне УТ 10.3 по нажатию кнопки пользователь считывает этот файл:
ПутьКФайлу = "\\server\shared\exchange\bank_data.dat"; // Путь для Windows-клиента
ТЗ_ИзБухгалтерии = ЗначениеИзФайла(ПутьКФайлу);
Если ТЗ_ИзБухгалтерии <> Неопределено Тогда
// Алгоритм сравнения данных
КонецЕсли;
Важно помнить: при работе в среде Linux пути к файлам должны быть настроены с учетом прав доступа пользователя usr1cv8. Метод ЗначениеВФайл очень удобен тем, что он автоматически сохраняет типы данных 1С (строки, числа, даты) без необходимости ручной десериализации.
Подводя итог, проанализируем, какой метод лучше выбрать в зависимости от условий:
ЗначениеВФайл.Использование данных методов позволит вам полностью отказаться от COM-технологий и обеспечить стабильную работу интеграции в гетерогенных сетях (Windows + Linux).