В практике ведения бизнеса часто встречается ситуация, когда одна группа компаний ведет учет в нескольких независимых информационных базах (например, разные ИП или юридические лица). Это создает определенные неудобства для клиентов и менеджеров: при печати накладной из одной базы клиент видит только часть своего долга, хотя фактически он может быть должен обоим предприятиям. В этой статье мы подробно разберем, как реализовать механизм получения данных о задолженности из «соседней» базы и вывести консолидированную сумму в печатную форму.
Рассмотрим ситуацию: у нас есть две идентичные конфигурации 1С:Управление торговлей. Базы полностью разделены, использование РИБ (распределенной информационной базы) или ведение нескольких организаций в одной базе не рассматривается по организационным причинам. Нам необходимо, чтобы при формировании печатной формы накладной в «Базе №1» система автоматически подключалась к «Базе №2», находила того же контрагента, получала его текущий остаток долга и прибавляла его к долгу из текущей базы.
Для решения этой задачи мы проанализируем три основных метода:
Проанализируем самый быстрый в реализации способ — использование 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;
Если Выборка.Следующий() Тогда
ДолгВоВторойБазе = Выборка.Долг;
КонецЕсли;
ОбщаяСуммаДолга = ДолгВЛокальнойБазе + ДолгВоВторойБазе;
Разберем, почему в современных реалиях (особенно для SQL-баз) стоит рассмотреть HTTP-сервисы. COM-соединение создает тяжелый процесс, который потребляет много памяти и времени на инициализацию при каждой печати документа. Если менеджеры печатают накладные часто, задержка в 3-5 секунд будет критичной.
Проанализируем схему работы через HTTP:
HTTP-сервис с шаблоном URL, принимающим ИНН.РасчетыСКлиентами и возвращает число — сумму долга.Это значительно безопаснее, так как нам не нужно хранить пароль администратора для COM-подключения, и работает на порядок быстрее. Кроме того, HTTP-запросы не зависят от разрядности сервера 1С (32/64 бит) и регистрации comcntr.dll.
Если прямое соединение между базами по каким-то причинам невозможно (например, базы находятся в разных сетях), можно использовать стандартный механизм Enterprise Data. Выясним, как это применить для нашей задачи:
Преимущество этого метода в том, что при печати накладной системе не нужно никуда подключаться — данные уже лежат в локальной базе, что обеспечивает мгновенную работу формы.
При реализации любого из методов мы должны учитывать проблему синхронизации справочников. Выясним, какие реквизиты лучше использовать для связи объектов:
Рекомендуем создать в конфигурации небольшой регистр сведений СоответствияКонтрагентов, где менеджер сможет один раз вручную указать, какому контрагенту из «Базы №2» соответствует клиент в текущей базе, если автоматический поиск по ИНН не сработал.
Проанализируем ситуацию с точки зрения налоговых рисков. Вывод долга чужого юридического лица в официальном документе (ТОРГ-12 или УПД) может вызвать вопросы у проверяющих органов. Чтобы избежать проблем, придерживайтесь следующих правил оформления в печатной форме:
Для реализации этого функционала лучше всего использовать внешнюю печатную форму. Это позволит не снимать конфигурацию с поддержки и легко вносить изменения в логику расчета долга без обновления всей системы.
Мы рассмотрели различные подходы к консолидации данных о долгах между двумя базами 1С:Управление торговлей. Самым простым для реализации «здесь и сейчас» является COM-соединение, однако для стабильной и быстрой работы в долгосрочной перспективе мы рекомендуем использовать HTTP-сервисы или фоновую синхронизацию остатков через Enterprise Data. Выбор конкретного метода зависит от объемов вашей базы данных и технических навыков специалиста, обслуживающего систему.