Как вывести общую задолженность клиента из двух разных баз 1С:Управление торговлей в одной печатной форме?

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

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

Постановка задачи и выбор стратегии

Рассмотрим ситуацию: у нас есть две идентичные конфигурации 1С:Управление торговлей. Базы полностью разделены, использование РИБ (распределенной информационной базы) или ведение нескольких организаций в одной базе не рассматривается по организационным причинам. Нам необходимо, чтобы при формировании печатной формы накладной в «Базе №1» система автоматически подключалась к «Базе №2», находила того же контрагента, получала его текущий остаток долга и прибавляла его к долгу из текущей базы.

Для решения этой задачи мы проанализируем три основных метода:

  1. COM-соединение — классический метод прямого обращения к данным другой базы.
  2. HTTP-сервисы — современный и быстрый способ обмена данными.
  3. Синхронизация через Enterprise Data — использование типовых механизмов обмена.

Реализация через COM-соединение

Проанализируем самый быстрый в реализации способ — использование COMConnector. Этот метод позволяет из кода одной базы программно «войти» в другую базу под определенным пользователем и выполнить там запрос или обратиться к методам менеджеров объектов.

Для начала разберем логику формирования строки соединения. Важно учитывать тип вашей базы данных (файловая или клиент-серверная на SQL). Проанализируем пример кода для инициализации соединения:


// Для файловой базы:
ПутьКБазе = "C:\1C_Bases\SecondBase";
СтрокаСоединения = "File=""" + ПутьКБазе + """;Usr=""" + Логин + """;Pwd=""" + Пароль + """;";

// Для серверной (SQL) базы:
ИмяСервера = "localhost";
ИмяБазы = "trade_base_2";
СтрокаСоединения = "Srvr=""" + ИмяСервера + """;Ref=""" + ИмяБазы + """;Usr=""" + Логин + """;Pwd=""" + Пароль + """;";

Попытка
    V83COMConnector = Новый COMОбъект("V83.COMConnector");
    Соединение = V83COMConnector.Connect(СтрокаСоединения);
Исключение
    Сообщить("Не удалось подключиться к базе: " + ОписаниеОшибки());
КонецПопытки;

После того как соединение установлено, нам нужно найти контрагента во второй базе. Самый надежный способ идентификации — по ИНН и КПП. Рассмотрим алгоритм поиска и получения суммы долга:


// В базе-источнике (где печатаем)
ТекИНН = ОбъектКонтрагент.ИНН;

// Выполняем поиск во второй базе через COM
ЗапросВторойБазы = Соединение.NewObject("Запрос");
ЗапросВторойБазы.Текст = 
"ВЫБРАТЬ
|	СУММА(РасчетыСКлиентамиОстатки.СуммаОстаток) КАК Долг
|ИЗ
|	РегистрНакопления.РасчетыСКлиентами.Остатки( , АналитикаУчетаПоПартнерам.Партнер.ИНН = &ИНН) КАК РасчетыСКлиентамиОстатки";

ЗапросВторойБазы.УстановитьПараметр("ИНН", ТекИНН);
Выборка = ЗапросВторойБазы.Выполнить().Выбрать();

ДолгВоВторойБазе = 0;
Если Выборка.Следующий() Тогда
    ДолгВоВторойБазе = Выборка.Долг;
КонецЕсли;

ОбщаяСуммаДолга = ДолгВЛокальнойБазе + ДолгВоВторойБазе;

Использование HTTP-сервисов как альтернатива

Разберем, почему в современных реалиях (особенно для SQL-баз) стоит рассмотреть HTTP-сервисы. COM-соединение создает тяжелый процесс, который потребляет много памяти и времени на инициализацию при каждой печати документа. Если менеджеры печатают накладные часто, задержка в 3-5 секунд будет критичной.

Проанализируем схему работы через HTTP:

  1. В «Базе №2» создается HTTP-сервис с шаблоном URL, принимающим ИНН.
  2. Сервис выполняет запрос к регистру РасчетыСКлиентами и возвращает число — сумму долга.
  3. «База №1» отправляет простой GET-запрос и мгновенно получает результат в формате JSON.

Это значительно безопаснее, так как нам не нужно хранить пароль администратора для COM-подключения, и работает на порядок быстрее. Кроме того, HTTP-запросы не зависят от разрядности сервера 1С (32/64 бит) и регистрации comcntr.dll.

Синхронизация через Enterprise Data (ED)

Если прямое соединение между базами по каким-то причинам невозможно (например, базы находятся в разных сетях), можно использовать стандартный механизм Enterprise Data. Выясним, как это применить для нашей задачи:

  1. Настраивается типовой обмен между «другими программами».
  2. В правилах регистрации объектов указывается только регистр остатков или конкретные документы расчетов.
  3. Данные о долгах синхронизируются в фоновом режиме (например, раз в 15 минут).
  4. В основной базе создается служебный регистр сведений, где хранятся актуальные остатки по контрагентам из второй базы.

Преимущество этого метода в том, что при печати накладной системе не нужно никуда подключаться — данные уже лежат в локальной базе, что обеспечивает мгновенную работу формы.

Важные нюансы идентификации и учета

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

Рекомендуем создать в конфигурации небольшой регистр сведений СоответствияКонтрагентов, где менеджер сможет один раз вручную указать, какому контрагенту из «Базы №2» соответствует клиент в текущей базе, если автоматический поиск по ИНН не сработал.

Юридические аспекты и оформление

Проанализируем ситуацию с точки зрения налоговых рисков. Вывод долга чужого юридического лица в официальном документе (ТОРГ-12 или УПД) может вызвать вопросы у проверяющих органов. Чтобы избежать проблем, придерживайтесь следующих правил оформления в печатной форме:

Для реализации этого функционала лучше всего использовать внешнюю печатную форму. Это позволит не снимать конфигурацию с поддержки и легко вносить изменения в логику расчета долга без обновления всей системы.

Заключение

Мы рассмотрели различные подходы к консолидации данных о долгах между двумя базами 1С:Управление торговлей. Самым простым для реализации «здесь и сейчас» является COM-соединение, однако для стабильной и быстрой работы в долгосрочной перспективе мы рекомендуем использовать HTTP-сервисы или фоновую синхронизацию остатков через Enterprise Data. Выбор конкретного метода зависит от объемов вашей базы данных и технических навыков специалиста, обслуживающего систему.

← На главную