Как загрузить данные из MySQL через внешний источник данных и программно создать документ в 1С?

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

При интеграции сайта или внешней информационной системы с 1С часто возникает задача: прочитать заявки из внешней таблицы (например, MySQL через ODBC-драйвер или механизм Внешние источники данных) и автоматически сформировать документы в информационной базе. Разберем типичные ошибки, возникающие при реализации такой загрузки, и посмотрим, как правильно написать программный код создания и заполнения документов.

В чем заключается основная проблема?

Проанализируем типовую ситуацию: разработчик получает данные из внешнего источника запросом к таблице ВнешнийИсточникДанных, обходит результат в цикле и пытается присвоить полученные поля напрямую реквизитам нового документа. В результате документы создаются либо пустыми, либо часть реквизитов (например, Контрагент или Ответственный) не заполняется.

Выясним главные причины такого поведения:

  1. Несоответствие типов данных: в таблице MySQL имя клиента хранится в виде обычной строки (тип Строка), а в документе 1С реквизит Контрагент имеет ссылочный тип (СправочникСсылка.Контрагенты). Платформа 1С не может автоматически преобразовать строку в ссылку на элемент базы данных, поэтому значение реквизита сбрасывается в пустую ссылку.
  2. Пустой блок обработки исключений: конструкция Попытка ... Исключение КонецПопытки без вывода текста ошибки полностью скрывает системные сбои (ошибки записи из-за незаполненных обязательных реквизитов, проверки прав доступа, сбои при проведении).
  3. Отсутствие обработки событий формы: при вызове метода СоздатьДокумент() не срабатывают интерактивные события формы (например, ПриИзменении у контрагента, где обычно автоматически заполняются договор, организация или счета учета). Все связанные реквизиты необходимо заполнять в коде явно либо вызывать процедуру автозаполнения объекта.

Пошаговое решение: правильное сопоставление полей и создание документа

Рассмотрим по шагам, как исправить алгоритм загрузки, чтобы строковые значения из внешней СУБД превращались в корректные ссылки справочников 1С.

  1. Поиск элементов справочника по наименованию или уникальным идентификаторам. Перед записью реквизита документа необходимо найти соответствующий элемент в справочнике 1С с помощью функции НайтиПоНаименованию() или НайтиПоРеквизиту(). Если элементы могут дублироваться по имени, надежнее искать контрагента по ИНН или коду.
  2. Оптимизация выборки данных. Вместо метода Выгрузить(), загружающего всю таблицу в оперативную память, используем потоковую выборку через Выбрать() и обход с помощью Следующий().
  3. Логирование ошибок. В блоке Исключение обязательно получаем подробное описание проблемы через ОписаниеОшибки() или КраткоеПредставлениеОшибки() и записываем ее в журнал регистрации с помощью метода ЗаписьЖурналаРегистрации().

Посмотрим на пример правильного кода серверной процедуры загрузки заявок:


&НаСервере
Процедура ЗагрузитьЗаявкиИзВнешнегоИсточника()
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Заявки.username КАК ИмяКонтрагента,
        |	Заявки.emailzakaz КАК Email,
        |	Заявки.tipotdeleniya КАК ТипОтделенияНаименование,
        |	Заявки.adress КАК АдресДоставки
        |ИЗ
        |	ВнешнийИсточникДанных.Таблица.ldo56_zayavki_upakovka КАК Заявки";
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        Попытка
            // Создаем новый объект документа
            НовыйДокумент = Документы.ЗаявкиНаУпаковочныйМатериал.СоздатьДокумент();
            
            // Заполняем системные реквизиты
            НовыйДокумент.Дата = ТекущаяДатаСеанса();
            
            // Ищем контрагента по строковому наименованию из MySQL
            НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию(Выборка.ИмяКонтрагента, Истина);
            Если ЗначениеЗаполнено(НайденныйКонтрагент) Тогда
                НовыйДокумент.Контрагент = НайденныйКонтрагент;
            Иначе
                // Если контрагент не найден, можно создать нового или зафиксировать ошибку
                ВызватьИсключение "Не найден контрагент с наименованием: " + Выборка.ИмяКонтрагента;
            КонецЕсли;
            
            // Ищем ссылочные данные для типа отделения
            НайденныйТип = Справочники.ТипыОтделений.НайтиПоНаименованию(Выборка.ТипОтделенияНаименование, Истина);
            НовыйДокумент.ТипОтделения = НайденныйТип;
            
            // Заполняем строковые реквизиты
            НовыйДокумент.EMail = Выборка.Email;
            НовыйДокумент.АдресДоставки = Выборка.АдресДоставки;
            
            // Записываем документ в информационную базу
            НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
            
        Исключение
            // Фиксируем ошибку в журнале регистрации для анализа
            ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
            ЗаписьЖурналаРегистрации(
                "ЗагрузкаЗаявок",
                УровеньЖурналаРегистрации.Ошибка,,,
                "Ошибка при создании заявки: " + ТекстОшибки
            );
        КонецПопытки;
        
    КонецЦикла;
    
КонецПроцедуры

Особенности настройки подключения к MySQL и ODBC

Разберем важные нюансы взаимодействия платформы 1С и внешних баз данных через ODBC-драйверы:

  1. Разрядность драйвера: разрядность установленного ODBC-драйвера MySQL на сервере должна строго совпадать с разрядностью службы 1С:Предприятие (если кластер 1С 64-битный, требуется 64-битный MySQL ODBC Driver).
  2. Кодировка соединения: чтобы строковые данные на кириллице не превращались в знаки вопроса, в параметрах подключения ODBC необходимо явно указывать кодировку (параметр CharSet=utf8 или utf8mb4).
  3. Защита от повторной загрузки: при каждом запуске запроса без фильтрации будут считываться все строки из таблицы. Чтобы избежать дублирования документов, рекомендуется добавлять в MySQL признак загрузки (флаг обработки) либо хранить первичный ключ заявки в дополнительном реквизите документа 1С и выполнять проверку перед созданием.

Автоматизация загрузки и альтернативные варианты

Для полной автоматизации процесса создания документов рассмотрим два подхода:

  1. Регламентные задания 1С: код загрузки помещается в серверный общий модуль и вызывается по расписанию через объект метаданных РегламентныеЗадания без участия пользователя.
  2. Использование HTTP-сервисов 1С: вместо прямого опроса базы MySQL через ODBC более надежным архитектурным решением является разработка собственного REST API на стороне 1С (объект HTTP-сервисы). В таком сценарии сайт сам отправляет JSON-пакет с данными заявки сразу в момент ее заполнения клиентом, а 1С мгновенно регистрирует документ и возвращает сайту статус выполнения.
← На главную