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