Как программно работать с Диадок в 1С на стороне сервера без использования форм

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При автоматизации электронного документооборота (ЭДО) часто возникает задача выполнять действия в фоновом режиме: проверять статусы контрагентов, загружать документы или отправлять уведомления через регламентные задания — для этого есть модуль автоматического получения документов из Диадок и СБИС. Основная сложность заключается в том, что стандартная обработка от Диадока («Контур.ЭДО») сильно завязана на клиентский интерфейс, формы и контекст выполнения. Разберем, как обойти эти ограничения и организовать стабильную работу на сервере.

Вариант 1. Работа через объект обработки и инициализацию «Ядра»

Наиболее эффективный способ использования уже имеющегося функционала обработки без открытия форм — это программное создание объекта обработки и вызов методов инициализации контекста. Внутренняя архитектура обработки Диадока (особенно версии «Универсальный модуль») построена на разделении логики. Основные функции сосредоточены в модуле, который разработчики называют «Ядром».

Рассмотрим пример кода, который позволяет инициализировать сессию и получить доступ к функциям API Диадока непосредственно на сервере (например, в модуле регламентного задания):


// Создаем объект обработки
ПутьКОбработке = "Путь_к_файлу_или_имя_в_конфигурации";
ОбработкаДиадок = Обработки.КонтурЭДО.Создать(); 

// Инициализируем контекст без открытия формы
// Этот метод подготавливает внутренние структуры данных
ОбработкаДиадок.ИнициализироватьОбщийКонтекст();

// Получаем доступ к программному интерфейсу (Ядру)
Ядро = ОбработкаДиадок.Модуль_Ядро();

// Считываем настройки служебной учетной записи
Логин = Ядро.ОбщиеНастройки_Прочитать("СлужебнаяУчетнаяЗаписьЛогин");
Пароль = Ядро.ОбщиеНастройки_Прочитать("СлужебнаяУчетнаяЗаписьПароль");

Если НЕ ЗначениеЗаполнено(Логин) Тогда
    ВызватьИсключение "Не указана служебная учетная запись ЭДО";
КонецЕсли;

// Проходим авторизацию и получаем токен доступа
Токен = Ядро.Авторизация_ПоПаролю(Логин, Пароль);

// Устанавливаем контекст для текущего сеанса
Ядро.КонтекстСеанса_ДляСлужебнойУчетнойЗаписи();

// Пример: получение статуса контрагента по ИНН
СтатусКонтрагента = Ядро.Контрагенты_СтатусКонтрагента(ИНН_Контрагента);

Проанализируем этот подход. Метод ИнициализироватьОбщийКонтекст крайне важен, так как он заполняет кэши и внутренние переменные объекта. Без него вызовы функций из модуля Ядро будут возвращать ошибки из-за отсутствия необходимых структур данных.

Вариант 2. Использование возможностей «Подключаемых модулей» (ПМ)

Если вам требуется не просто вызывать стандартные функции, а расширить логику (например, добавить специфическую проверку перед отправкой документа), рекомендуется использовать механизм «Подключаемых модулей». Это внешние обработки, которые «подцепляются» к основной обработке Диадока.

Преимущества использования ПМ:

  1. Безопасность при обновлениях: Ваш код находится в отдельном файле, и при замене основной обработки Диадока (которая обновляется довольно часто) ваши доработки не затрутся.
  2. Доступ к событиям: В ПМ предусмотрены предопределенные процедуры, такие как ПередОтправкой или ПослеЗагрузки, в которые можно встроиться.

Для реализации серверной логики через ПМ мы можем прописать нужные действия в теле внешней обработки и вызывать её методы, передавая туда инициализированный объект Ядро основной обработки.

Вариант 3. Прямая работа с REST API Диадока

В ситуациях, когда стандартная обработка кажется избыточной или слишком «тяжелой» для сервера, можно рассмотреть вариант прямого взаимодействия с серверами Контура через HTTP-запросы — в этом поможет инструмент логирования и анализа HTTP-запросов API в 1С. Этот путь требует большего объема написания кода, но обеспечивает максимальную производительность и независимость от обновлений интерфейсной обработки.

Для работы напрямую через API нам понадобятся:

Пример структуры HTTP-запроса для получения информации об организации:


// Подготовка соединения
Соединение = Новый HTTPСоединение("host.diadoc.ru", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/GetOrganization?inn=" + ИНН);
Запрос.Заголовки.Вставить("Authorization", "DiadocAuth ddauth_api_client_id=" + КлючРазработчика + ",ddauth_token=" + ТокенСессии);

Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
    // Обработка полученного JSON или ProtoBuf
КонецЕсли;

Выясним причину, по которой многие выбирают именно этот путь: отсутствие необходимости загружать тяжелые модули 1С в память сервера. Однако помните, что при работе напрямую вам придется самостоятельно обрабатывать форматы передачи данных (часто это Protocol Buffers).

Вариант 4. Работа через COM-компоненту (DiadocApi.dll)

Для тех, кто хочет использовать высокоуровневые методы, но не готов разбираться в тонкостях HTTP-запросов, Диадок предоставляет библиотеку DiadocApi.dll. Её можно зарегистрировать на сервере и использовать как объект COMОбъект.

Рассмотрим особенности этого метода:

Рекомендации по выбору метода

Проанализировав ситуацию, можно дать следующие советы по выбору архитектурного решения:

  1. Если задача разовая или не требует высокой производительности (например, ночная проверка 100 контрагентов), используйте Вариант 1. Это самый быстрый способ «взлететь», так как используется готовый код из официальной обработки.
  2. Если вы планируете глубокую интеграцию с изменением бизнес-логики (автозаполнение полей, сложные проверки), используйте Подключаемые модули (Вариант 2).
  3. Для высоконагруженных систем с тысячами документов в час оптимальным будет прямое взаимодействие с REST API (Вариант 3), так как это исключает накладные расходы на инициализацию объектов 1С внутри обработки.

Важный нюанс: при работе на сервере всегда проверяйте, чтобы в коде инициализации не было вызовов Предупреждение(), Вопрос() или обращений к ЭтаФорма. В официальной обработке «Контур.ЭДО» такие места обычно экранированы проверками на НаКлиенте, но при написании собственных оберток об этом стоит помнить. Используйте конструкцию Попытка...Исключение при авторизации, так как серверы Диадока могут быть временно недоступны или токен может истечь в самый неподходящий момент.

← На главную