Разработка и Конфигурация · 13 мин
Как создать документ в другой базе 1С
Как создать документ в другой базе 1С: COM-соединение, веб-сервисы, HTTP и обмен EnterpriseData. Примеры кода, проверка результата, типичные ошибки.
Задача создать документ в другой базе 1С возникает при интеграции учётных систем: например, заказ из базы «Управление торговлей» должен автоматически появляться в «Бухгалтерии», или центральная база собирает накладные из филиалов. Универсального встроенного механизма «создать документ в чужой базе» в платформе нет — для этого используют один из программных способов обращения к внешней информационной базе.
Основные варианты: COM-соединение (только Windows), веб-сервисы и HTTP-сервисы, опубликованные на стороне базы-приёмника, стандартный обмен через формат EnterpriseData, а также план обмена с выгрузкой XML. Выбор зависит от того, работают ли базы в одной сети, какая у вас версия платформы, нужна ли гарантированная доставка и кто отвечает за сопровождение.
Ниже разобраны практические способы с примерами кода, условиями выбора, проверкой результата и типичными ошибками. Материал ориентирован на разработчиков и администраторов 1С, имеющих доступ к конфигуратору хотя бы одной из баз.
Выбор способа: что учесть до начала разработки
Прежде чем писать код, ответьте на четыре вопроса. Первый — топология: базы в одной локальной сети или разделены интернетом. COM-соединение работает только внутри одной сети и требует установленной платформы на компьютере, откуда выполняется подключение. Второй — режим работы: если база-приёмник работает в клиент-серверном варианте на Linux или обслуживается франчайзи без вашего доступа к серверу, COM не подойдёт.
Третий вопрос — требования к надёжности. Если документ обязан быть доставлен даже при недоступности второй базы, нужны очереди и повторные попытки: это умеют планы обмена и механизмы на основе регистрации изменений. Прямое обращение (COM, HTTP) при недоступности приёмника просто вернёт ошибку, и логику повторов придётся писать самостоятельно.
Четвёртый вопрос — кто сопровождает приёмник. Веб-сервис или HTTP-сервис нужно создать и опубликовать в базе-приёмнике, а значит, потребуется доступ к её конфигуратору и веб-серверу (IIS или Apache). Если влиять на приёмник нельзя, остаются варианты через файлы обмена или универсальные механизмы вроде формата EnterpriseData, если он поддерживается конфигурацией.
Как выбрать способ
Способ 1. COM-соединение: прямое создание документа
COM-соединение — самый «прямой» способ: из кода одной базы вы открываете сеанс с другой базой и работаете с её объектами почти как с локальными. Подключение выполняется через объект V83.COMConnector, после чего вызывается метод Connect со строкой соединения, аналогичной строке запуска базы.
Для файловой базы строка подключения выглядит как File="C:\Bases\Trade";Usr="Администратор";Pwd="123", для серверной — Srvr="Server1";Ref="Trade";Usr="...";Pwd="...". После подключения доступен привычный объектный интерфейс: менеджеры документов, справочников, запросы.
Пример создания документа «Реализация товаров и услуг» в другой базе:
Коннектор = Новый COMОбъект("V83.COMConnector");
Соединение = Коннектор.Connect("File=""D:\Bases\UT"";Usr=""Обмен"";Pwd=""pass""");
Док = Соединение.Документы.РеализацияТоваровУслуг.СоздатьДокумент();
Док.Дата = ТекущаяДата();
Док.Организация = Соединение.Справочники.Организации.НайтиПоНаименованию("ООО Ромашка");
Док.Комментарий = "Создан из внешней базы";
Док.Записать(Соединение.РежимЗаписиДокумента.Проведение);
Ключевое ограничение: через COM нельзя передавать объекты между базами напрямую — ссылка на справочник одной базы бессмысленна в другой. Поэтому сопутствующие данные (контрагентов, номенклатуру) ищут по наименованию, коду или GUID, либо создают заранее. Также учитывайте, что COM-соединение создаёт полноценный сеанс и потребляет лицензию.
Способ 2. HTTP-сервис или веб-сервис в базе-приёмнике
Более надёжная и переносимая архитектура — опубликовать в базе-приёмнике HTTP-сервис (или классический SOAP веб-сервис), который принимает данные документа и создаёт его внутри своей базы. Источник обращается к сервису обычным HTTP-запросом, что работает из любой ОС и через интернет.
В конфигураторе приёмника добавьте объект «HTTP-сервис», создайте шаблон URL, например /documents, и метод POST. В обработчике разберите тело запроса (обычно JSON), найдите или создайте связанные объекты и запишите документ:
Функция СоздатьДокументPOST(Запрос)
Данные = ПрочитатьJSON(Запрос.ПолучитьТелоКакПоток());
Док = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
Док.Дата = Данные.Дата;
Док.НомерВходящегоДокумента = Данные.Номер;
// поиск контрагента по ИНН, номенклатуры по коду...
Док.Записать(РежимЗаписиДокумента.Проведение);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки("OK:" + Строка(Док.Ссылка.УникальныйИдентификатор()));
Возврат Ответ;
КонецФункции
После этого сервис нужно опубликовать на веб-сервере (Apache или IIS) через диалог «Публикация на веб-сервере» в конфигураторе. Источник вызывает сервис через HTTPСоединение и HTTPЗапрос. Обязательно включите аутентификацию: как минимум базовую по пользователю базы, а лучше — отдельный токен в заголовке и HTTPS.
Способ 3. Обмен через EnterpriseData и планы обмена
Если обе базы — типовые конфигурации фирмы «1С» (Бухгалтерия, Управление торговлей, ERP, ЗУП), в большинстве из них встроена поддержка универсального формата EnterpriseData. Обмен настраивается без программирования: в разделе «Синхронизация данных» создаётся настройка, указывается способ подключения (через каталог, FTP, веб-сервис или прямое подключение), и документы выбранных видов начинают переноситься автоматически.
Преимущество подхода — готовые правила сопоставления справочников, механизмы разрешения коллизий, регистрация изменений и повторная отправка при сбоях. Недостаток — переносятся только те виды документов и в тех сочетаниях конфигураций, которые предусмотрены форматом, а тонкая настройка требует изучения правил конвертации.
Для нестандартных конфигураций остаётся классический план обмена: вы создаёте план обмена, включаете в состав нужные документы, настраиваете правила регистрации и пишете обработчик выгрузки/загрузки (обычно через «Конвертацию данных»). Это самый трудоёмкий, но и самый управляемый вариант для сложных распределённых систем.
Сравнение способов
Быстро реализовать, но только Windows и одна сеть; потребляет лицензию; нет повторных попыток
Кроссплатформенно, работает через интернет; требует публикации и разработки на стороне приёмника
Без программирования для типовых конфигураций; ограничен предусмотренными сценариями обмена
Гарантированная доставка и очереди; самая высокая трудоёмкость настройки
Сопоставление данных: ключевая проблема интеграции
Создать сам документ несложно — сложно заполнить его корректными ссылками на справочники другой базы. Контрагент «ООО Ромашка» в источнике и приёмнике — это разные объекты с разными ссылками. Есть три рабочих подхода к сопоставлению.
Первый — поиск по ключевым реквизитам: контрагентов по ИНН и КПП, номенклатуру по коду или артикулу, организации по наименованию. Просто, но чувствительно к качеству данных: дубли и ошибки в ИНН ломают сопоставление. Второй — хранение соответствия в регистре сведений: при первой выгрузке объекта вы сохраняете пару «ссылка источника — ссылка приёмника» и дальше используете её. Это самый надёжный вариант для постоянной интеграции.
Третий — синхронизация по GUID: при переносе объекта в приёмник вы принудительно устанавливаете ему тот же уникальный идентификатор, что в источнике. Тогда ссылки совпадают, и поиск не нужен. Минус — при коллизии GUID (объект с таким идентификатором уже существует) запись завершится ошибкой, поэтому способ годится, когда приёмник изначально заполняется из источника.
Проверка результата и отладка
После создания документа проверьте три вещи. Во-первых, документ реально записался: метод Записать() в попытке-исключении вернёт текст ошибки, если что-то пошло не так (незаполненные обязательные реквизиты, нарушение прав). Во-вторых, документ проведён, если это требуется: проверка Док.Проведен после записи. В-третьих, связанные объекты найдены правильно — откройте документ в приёмнике и убедитесь, что контрагент и номенклатура соответствуют ожиданиям.
Для отладки HTTP-сервиса временно добавьте в ответ расширенную информацию: номер созданного документа, список незаполненных полей, предупреждения. Ведите в источнике журнал интеграции — регистр сведений или текстовый лог с датой, документом, результатом и текстом ошибки. Это окупается при первом же инциденте «документ не доехал».
Полезная практика — режим тестового прогона: сервис проверяет данные и возвращает результат валидации, не записывая документ. Так можно безопасно отладить сопоставление справочников на реальных данных, не засоряя учётную базу.
Как проверить результат
Записать() выполнен без исключения, ссылка присвоена
Исключение с текстом про обязательные реквизиты или права
Свойство Проведен = Истина
Документ записан, но не проведён — ошибки в движениях или остатках
Контрагент и номенклатура в документе совпадают с источником по смыслу
Подставлены пустые ссылки или не те элементы
Повторная отправка не создаёт второй документ
Каждая выгрузка плодит копии
Ограничения и когда обратиться к специалисту
Самостоятельная интеграция оправдана, когда сценарий простой: один-два вида документов, стабильные конфигурации, есть доступ к обеим базам. Границы разумного — это интеграция с самописной конфигурацией без документации, обмен с высокой нагрузкой (тысячи документов в час), требования к транзакционности «всё или ничего» между базами и сценарии с распределёнными филиалами.
В таких случаях ошибки проектирования обходятся дороже разработки: рассинхронизация остатков, дубли первички, потерянные документы. Здесь имеет смысл привлечь специалиста по интеграциям 1С или использовать готовые шины и брокеры сообщений (например, RabbitMQ с обработчиками на стороне 1С), где вопросы гарантированной доставки решены на уровне инфраструктуры.
Что важно запомнить
Документ в другой базе создают через COM, HTTP/веб-сервис или обмен данными. Главная сложность — не сама запись, а сопоставление справочников и контроль дублей. Выбирайте способ по топологии сети и требованиям к надёжности, используйте отдельного пользователя с ограниченными правами и обязательно логируйте результат каждой отправки.
Частые вопросы
Можно ли создать документ в другой базе без программирования?
Да, если обе базы — типовые конфигурации с поддержкой синхронизации данных (EnterpriseData). Настройка выполняется через мастер в разделе «Синхронизация данных» и не требует написания кода, но переносятся только предусмотренные форматом виды документов.
Почему COM-соединение выдаёт ошибку «Класс не зарегистрирован»?
Объект V83.COMConnector существует только на компьютере с установленной платформой 1С, причём разрядность COM-объекта должна совпадать с разрядностью процесса, который его вызывает. Если код выполняется на сервере 1С под Linux, COM недоступен в принципе — используйте HTTP-сервисы.
Как избежать дублей при повторной отправке документа?
Передайте в приёмник уникальный идентификатор документа источника (GUID или номер с префиксом базы) и перед созданием проверяйте, нет ли уже документа с таким признаком. Альтернатива — хранить таблицу соответствия «документ источника — документ приёмника» в регистре сведений.
Что надёжнее: веб-сервис или HTTP-сервис?
Функционально они равнозначны для этой задачи. HTTP-сервисы проще в отладке и естественно работают с JSON, SOAP веб-сервисы дают формальное описание интерфейса (WSDL), что удобно при интеграции с внешними системами на других платформах. Для связки «1С — 1С» чаще выбирают HTTP-сервис.
Документ создаётся, но не проводится — в чём причина?
Проведение может не выполняться из-за нехватки остатков на складе, закрытого периода, незаполненных реквизитов, влияющих на движения, или прав пользователя. Записывайте документ в попытке-исключении, читайте текст ошибки и проверяйте сообщения пользователю — они содержат конкретную причину отказа.
Можно ли передавать табличную часть документа через HTTP-сервис?
Да. Сериализуйте табличную часть в массив структур JSON (товар, количество, цена, сумма), передайте в теле POST-запроса, а в обработчике сервиса заполните табличную часть документа циклом. Идентификаторы номенклатуры передавайте как код или GUID для поиска в приёмнике.