Автоматизация рутинных операций является ключевым фактором повышения эффективности бизнеса. Создание заказов поставщикам – одна из таких задач, которая часто требует интеграции с внешними системами, будь то система планирования, электронная торговая площадка или другая информационная система. Рассмотрим, как мы можем эффективно автоматизировать этот процесс в 1С:Комплексная автоматизация 2.5, опираясь на доступные инструменты и практические рекомендации.
Мы сталкиваемся с задачей автоматической загрузки данных для создания документов "Заказ поставщику" в 1С:КА 2.5. Исходные данные о номенклатуре и товарах у нас уже есть, а основные параметры "шапки" документа могут быть предопределены. Главный вопрос, который мы себе задаем: какой "макар" (способ) реализации будет наиболее простым и эффективным?
Приступая к решению этой задачи, мы должны понимать, что варианты реализации могут быть различными, и выбор конкретного подхода будет зависеть от множества факторов, таких как архитектура внешних систем, уровень квалификации команды и требования к безопасности и производительности. Однако, мы сконцентрируемся на наиболее распространенных и проверенных методах.
Прежде всего, нам предстоит определить основное направление интеграции. Существует два глобальных варианта взаимодействия между 1С и внешней системой:
Выбор направления во многом определяется уже существующей инфраструктурой. Если на стороне 1С уже развернут веб-сервер (например, Apache или IIS) и опубликована информационная база, нам будет проще реализовать первый вариант. Если же веб-сервер или API доступны только во внешней системе, то целесообразнее выбрать второй вариант. При этом важно учитывать, что разработку придется вести на обеих сторонах, и "проще" будет тот вариант, где меньше сложностей для системного администратора и где удобнее проводить отладку.
Один из самых простых и гибких способов реализации интеграции, по мнению опытных разработчиков, – это использование комбинации HTTPСоединение, ЗаписьJSON и ЧтениеJSON. Этот подход позволяет передавать структурированные данные через стандартный HTTP-протокол, что обеспечивает хорошую совместимость и не требует глубоких познаний в специфических протоколах, таких как SOAP или OData (который иногда может показаться "муторным" на начальном этапе).
Объект HTTPСоединение позволяет устанавливать соединение с удаленным HTTP-сервером и выполнять HTTP-запросы (GET, POST, PUT, DELETE). Для создания заказа поставщику нам, скорее всего, потребуется метод POST для отправки новых данных.
Рассмотрим, как мы можем настроить соединение и отправить запрос:
// Пример на стороне 1С (если 1С выступает клиентом и отправляет данные внешней системе)
&НаКлиенте
Процедура ОтправитьЗаказПоставщику()
// Создаем структуру данных для заказа
ДанныеЗаказа = Новый Структура;
ДанныеЗаказа.Вставить("Номер", "АВТ-000001");
ДанныеЗаказа.Вставить("Дата", ТекущаяДата());
ДанныеЗаказа.Вставить("Поставщик", "РогаИКопыта"); // Здесь может быть УИД или код поставщика
ДанныеЗаказа.Вставить("Валюта", "РУБ");
ТабличнаяЧастьТовары = Новый Массив;
СтрокаТовара1 = Новый Структура;
СтрокаТовара1.Вставить("Номенклатура", "Монитор 27 дюймов");
СтрокаТовара1.Вставить("Количество", 10);
СтрокаТовара1.Вставить("Цена", 15000);
ТабличнаяЧастьТовары.Добавить(СтрокаТовара1);
СтрокаТовара2 = Новый Структура;
СтрокаТовара2.Вставить("Номенклатура", "Клавиатура");
СтрокаТовара2.Вставить("Количество", 50);
СтрокаТовара2.Вставить("Цена", 1500);
ТабличнаяЧастьТовары.Добавить(СтрокаТовара2);
ДанныеЗаказа.Вставить("Товары", ТабличнаяЧастьТовары);
// Сериализуем данные в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеЗаказа);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Настраиваем HTTP-соединение
Попытка
HTTPСоединение = Новый HTTPСоединение("api.vashasistema.ru", , , , , , ЗащищенноеСоединениеHTTP.Авто);
HTTPЗапрос = Новый HTTPЗапрос("/api/createOrder", СтрокаJSON);
HTTPЗапрос.УстановитьЗаголовки(Новый Соответствие);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
HTTPОтвет = HTTPСоединение.Отправить(HTTPЗапрос);
Если HTTPОтвет.Код = 200 Тогда
Сообщить("Заказ успешно отправлен во внешнюю систему!");
// Обработка ответа, например, получение ID заказа во внешней системе
ОтветВнешнейСистемы = HTTPОтвет.ПолучитьТелоКакСтроку();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ОтветВнешнейСистемы);
Результат = ПрочитатьJSON(ЧтениеJSON);
Сообщить("Ответ внешней системы: " + Результат.ID);
Иначе
Сообщить("Ошибка отправки заказа: " + HTTPОтвет.Код + " " + HTTPОтвет.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
Сообщить("Произошла ошибка при работе с HTTP-соединением: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
На стороне 1С (если она выступает сервером и принимает данные от внешней системы), нам потребуется создать HTTP-сервис или Веб-сервис в конфигурации, который будет принимать эти JSON-данные, десериализовать их с помощью ЧтениеJSON и создавать документ "Заказ поставщику".
Механизмы ЗаписьJSON и ЧтениеJSON предоставляют удобные средства для преобразования данных 1С (структуры, соответствия, массивы) в формат JSON и обратно. Это значительно упрощает процесс сериализации и десериализации данных, позволяя нам не задумываться о формировании строки JSON вручную.
Пример получения JSON и создания документа в 1С (на стороне HTTP-сервиса):
// Пример на стороне 1С (если 1С выступает сервером и принимает данные от внешней системы)
// Предполагаем, что этот код выполняется в обработчике HTTP-сервиса
&НаСервере
Функция ОбработатьЗапросЗаказаПоставщику(ЗапросHTTP)
Если ЗапросHTTP.Метод = "POST" Тогда
// Получаем тело запроса (JSON строка)
ПотокВвода = ЗапросHTTP.ПолучитьТело();
ЧтениеТекста = Новый ЧтениеТекста(ПотокВвода, КодировкаТекста.UTF8);
СтрокаJSON = ЧтениеТекста.ПрочитатьДоКонца();
// Десериализуем JSON в структуру 1С
Попытка
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
ДанныеЗаказа = ПрочитатьJSON(ЧтениеJSON);
Исключение
Возврат Новый HTTPСервисОтвет(500, "Ошибка парсинга JSON: " + ОписаниеОшибки());
КонецПопытки;
// Создаем документ "Заказ поставщику"
Попытка
НовыйЗаказ = Документы.ЗаказПоставщику.СоздатьДокумент();
НовыйЗаказ.Дата = ДанныеЗаказа.Дата;
НовыйЗаказ.Номер = ДанныеЗаказа.Номер; // Можно также использовать автонумерацию
// Находим поставщика по наименованию или УИД
Поставщик = Справочники.Контрагенты.НайтиПоНаименованию(ДанныеЗаказа.Поставщик);
Если Поставщик = Неопределено Тогда
Возврат Новый HTTPСервисОтвет(400, "Поставщик '" + ДанныеЗаказа.Поставщик + "' не найден.");
КонецЕсли;
НовыйЗаказ.Контрагент = Поставщик;
НовыйЗаказ.Валюта = Справочники.Валюты.НайтиПоКоду(ДанныеЗаказа.Валюта); // Предполагаем, что код валюты передается
Для Каждого СтрокаТовара Из ДанныеЗаказа.Товары Цикл
НоваяСтрока = НовыйЗаказ.Товары.Добавить();
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаТовара.Номенклатура);
Если Номенклатура = Неопределено Тогда
Возврат Новый HTTPСервисОтвет(400, "Номенклатура '" + СтрокаТовара.Номенклатура + "' не найдена.");
КонецЕсли;
НоваяСтрока.Номенклатура = Номенклатура;
НоваяСтрока.Количество = СтрокаТовара.Количество;
НоваяСтрока.Цена = СтрокаТовара.Цена;
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
КонецЦикла;
НовыйЗаказ.Записать(РежимЗаписиДокумента.Проведение); // Или РежимЗаписиДокумента.Запись
Ответ = Новый Структура;
Ответ.Вставить("Статус", "Успех");
Ответ.Вставить("Сообщение", "Заказ поставщику успешно создан.");
Ответ.Вставить("Ссылка", НовыйЗаказ.Ссылка.УникальныйИдентификатор());
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Ответ);
Возврат Новый HTTPСервисОтвет(200, ЗаписьJSON.Закрыть());
Исключение
Возврат Новый HTTPСервисОтвет(500, "Ошибка создания документа: " + ОписаниеОшибки());
КонецПопытки;
Иначе
Возврат Новый HTTPСервисОтвет(405, "Метод не поддерживается.");
КонецЕсли;
КонецФункции
Такой подход обеспечивает высокую гибкость, не требует значительных изменений в конфигурации 1С (достаточно создать внешнюю обработку или модуль для HTTP-сервиса) и является достаточно легковесным для большинства задач интеграции.
Помимо рекомендованного HTTP+JSON, существуют и другие мощные механизмы, которые мы можем рассмотреть для решения нашей задачи.
OData (Open Data Protocol) – это мощный и стандартизированный протокол для обмена данными, основанный на принципах REST. Он позволяет внешним приложениям получать, создавать, обновлять и удалять данные в 1С без изменения кода прикладного решения. Хотя на форуме этот вариант был назван "муторным", его сила заключается в стандартизации и возможностях работы с метаданными. Для использования OData нам необходимо опубликовать информационную базу 1С на веб-сервере (например, Apache или IIS) и настроить доступ. Запросы к данным осуществляются с использованием стандартных HTTP-методов (GET, POST, PATCH/PUT, DELETE), а ответы могут быть получены в форматах XML или JSON.
OData идеален для случаев, когда требуется унифицированный доступ к широкому спектру данных 1С, и внешняя система готова работать с этим протоколом. Он предоставляет встроенные механизмы фильтрации, сортировки и постраничного вывода данных, что упрощает разработку на стороне клиента.
Платформа 1С:Предприятие поддерживает публикацию собственных веб-сервисов и потребление внешних. Веб-сервисы, особенно основанные на REST (HTTP-сервисы в терминологии 1С), являются популярным выбором для интеграции благодаря своей простоте, высокой скорости обмена и независимости от релизов платформы. Они позволяют безопасно обмениваться данными через интернет без прямого доступа к базе.
Для организации обмена через веб-сервисы нам необходимо спроектировать API, а затем создать объект "Веб-сервис" (для SOAP) или "HTTP-сервис" (для REST) в конфигураторе 1С, описав необходимые методы и передаваемые данные. Это дает нам полный контроль над логикой обработки запросов и форматированием ответов.
Файловый обмен, используя форматы XML или JSON, является классическим и надежным способом интеграции, особенно для асинхронных операций или пакетной загрузки. Если данные могут быть предоставлены во внешней системе в виде файла, мы можем настроить в 1С регламентное задание, которое будет периодически проверять наличие таких файлов в определенной папке, читать их, парсить и создавать документы.
В 1С есть встроенные механизмы для работы с этими форматами: ЧтениеXML, ЗаписьXML, ЧтениеJSON, ЗаписьJSON. Это позволяет нам гибко настраивать выгрузку и загрузку данных, сопоставляя поля файла с реквизитами документов и справочников.
Пример чтения XML файла:
&НаСервере
Процедура ЗагрузитьЗаказыИзXML(ИмяФайла)
Попытка
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.Открыть(ИмяФайла);
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.Имя = "ЗаказПоставщику" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ДанныеЗаказа = ПрочитатьXML(ЧтениеXML); // Или парсить вручную
НовыйЗаказ = Документы.ЗаказПоставщику.СоздатьДокумент();
НовыйЗаказ.Дата = ДанныеЗаказа.Дата;
// ... заполнение полей из ДанныеЗаказа ...
НовыйЗаказ.Записать();
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
Сообщить("Заказы из XML файла успешно загружены.");
Исключение
Сообщить("Ошибка при загрузке XML: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Помимо методов интеграции с внешними системами, 1С:КА 2.5 также предлагает внутренние механизмы и возможности для программных доработок, которые могут упростить процесс создания заказов.
В 1С:Комплексная автоматизация 2.5 существует стандартная функциональность "Загрузка данных из таблицы", которую можно найти в разделе "НСИ и администрирование – Начальное заполнение – Загрузка данных из файла". Этот механизм предназначен для начального заполнения справочников и табличных частей документов. Он поддерживает распространенные форматы табличных документов (например, Excel, OpenDocument Spreadsheet) и позволяет сопоставлять поля внешней таблицы с реквизитами 1С.
Этот метод может быть полезен, если нам требуется разовая или периодическая загрузка данных из файлов, которые подготавливает пользователь. Однако для полностью автоматического режима, без участия человека, этот механизм не всегда подходит, так как требует ручного запуска и контроля сопоставления. Тем не менее, он может служить основой для создания собственных обработок загрузки, которые будут использовать его принципы, но выполняться автоматически.
1С:КА 2.5 включает в себя мощный функционал для автоматического расчета потребности в товарах и формирования заказов поставщикам. Этот механизм может учитывать множество параметров: сезонность, классы ABC/XYZ, сроки поставки, минимальные и максимальные запасы, наличие аналогов и так далее. Документ "Заказ поставщику" может быть создан на основании заказа клиента или на основании соглашения об условиях закупки. Стандартная обработка "Формирование заказов по потребностям" позволяет быстро создавать заказы, исходя из текущих нужд.
Мы должны понимать, что этот механизм ориентирован на внутренний расчет потребностей и планирование закупок внутри системы 1С. Если наша задача – переносить уже сформированные заказы из внешней системы, то напрямую этот механизм не используется для интеграции, но он может служить полезным инструментом для внутреннего управления закупками. Внешние обработки могут упростить его использование, сводя участие пользователя к минимуму и автоматизируя процесс создания документов по заданным правилам.
Для специфических требований, когда стандартные или полуавтоматические методы не подходят, по-прежнему актуальной остается разработка индивидуальных обработок или модулей на встроенном языке 1С. Как мы уже обсуждали, использование объектов HTTPСоединение, ЗаписьJSON, ЧтениеJSON позволяет создавать высококастомизированные интеграционные решения, полностью контролирующие процесс создания документов.
Преимущество этого подхода в том, что мы можем реализовать любую необходимую бизнес-логику: сложную проверку данных, поиск существующих элементов справочников по нескольким критериям, обработку ошибок, ведение логов интеграции и многое другое. При этом мы получаем максимальную гибкость и контроль над процессом.
Независимо от выбранного метода, при автоматизации создания заказов поставщику важно учитывать ряд общих моментов, которые обеспечат стабильность и безопасность разработанного решения.
Выбор оптимального способа автоматизации создания заказов поставщику в 1С:КА 2.5 зависит от конкретных условий проекта. Однако, как мы видим, использование HTTPСоединение в сочетании с форматом JSON часто является наиболее простым и эффективным решением для интеграции с внешними системами. Мы рассмотрели различные подходы, и теперь у нас есть понимание того, как мы можем приступить к реализации этой задачи, учитывая все необходимые аспекты.