При автоматизации бизнес-процессов юридических отделов, служб клиентской поддержки или внешних веб-сервисов часто возникает задача оперативного получения актуального сальдо по контрагентам. Рассмотрим, какими способами можно безопасно и корректно извлечь данные о задолженности из «1С:Бухгалтерии» средствами внешних языков программирования (например, PHP), а также разберем особенности структуры учета взаиморасчетов в платформе 1С:Предприятие.
Прежде чем приступать к интеграции, проанализируем важный нюанс: прямой доступ к таблицам СУБД (SQL) или файловой базе .1CD в обход платформы 1С не только нарушает условия лицензионного соглашения, но и технически неэффективен. В 1С актуальные остатки не хранятся в виде готовых плоских таблиц на каждый момент времени, а формируются платформой «на лету» с использованием механизма итогов и виртуальных таблиц. Попытка чтения сырых таблиц приведет к искажению данных.
Выясним причину, почему простого чтения записей регистров недостаточно для расчета глубины долга:
62 («Расчеты с покупателями и заказчиками») и 76 в регистре РегистрБухгалтерии.Хозрасчетный. Субконто обычно настраиваются в разрезе контрагентов, договоров и документов расчетов.РегистрБухгалтерии.Хозрасчетный.Остатки, которая выполняет корректный расчет итогов на уровне СУБД на заданную дату.Разберем по шагам наиболее современный, быстрый и масштабируемый способ интеграции. Создание собственного HTTP-сервиса позволяет получить готовые данные в формате JSON через обычный HTTP-запрос (GET или POST).
Для сохранения типовой конфигурации на поддержке создадим расширение конфигурации (файл .cfe), в котором добавим объект HTTP-сервис.
Рассмотрим пример программного кода метода сервиса на стороне 1С, который выполняет запрос к виртуальной таблице остатков и возвращает структурированный JSON:
Функция ПолучитьСальдоКонтрагентов(ЗапросHTTP)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ХозрасчетныйОстатки.Субконто1 КАК Контрагент,
| ХозрасчетныйОстатки.Субконто2 КАК Договор,
| ХозрасчетныйОстатки.СуммаОстатокДт КАК ДолгПокупателя,
| ХозрасчетныйОстатки.СуммаОстатокКт КАК АвансПокупателя
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет В ИЕРАРХИИ (&Счет62), , ) КАК ХозрасчетныйОстатки";
Запрос.УстановитьПараметр("Период", ТекущаяДата());
Запрос.УстановитьПараметр("Счет62", ПланыСчетов.Хозрасчетный.РасчетыСПокупателямиИЗаказчиками);
Результат = Запрос.Выполнить().Выгрузить();
МассивДанных = Новый Массив;
Для Каждого Стр Из Результат Цикл
СтруктураСтроки = Новый Структура;
СтруктураСтроки.Вставить("Контрагент", Строка(Стр.Контрагент));
СтруктураСтроки.Вставить("Договор", Строка(Стр.Договор));
СтруктураСтроки.Вставить("Долг", Стр.ДолгПокупателя);
СтруктураСтроки.Вставить("Аванс", Стр.АвансПокупателя);
МассивДанных.Добавить(СтруктураСтроки);
КонецЦикла;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, МассивДанных);
СтрокаJSON = ЗаписьJSON.Закрыть();
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Возврат Ответ;
КонецФункции
После написания сервиса базу необходимо опубликовать на внутреннем веб-сервере (Apache или IIS). Со стороны PHP-скрипта получение данных сводится к стандартному вызову через cURL:
$ch = curl_init('http://1c-server/base/hs/debt/get_balance');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, 'ws_user:password');
$response = curl_exec($ch);
curl_close($ch);
$debts = json_decode($response, true);
Рассмотрим подробнее альтернативный вариант, подходящий для серверов под управлением ОС Windows. В этом случае PHP взаимодействует с базой 1С напрямую через COM-объект без необходимости предварительной публикации на веб-сервере.
Посмотрим на пример инициализации COM-соединения и выполнения запроса через PHP:
$v83 = new COM("V83.COMConnector");
$connectionString = "Srvr='1c-server';Ref='buh_base';Usr='admin';Pwd='pass';";
$base1c = $v83->Connect($connectionString);
$query = $base1c->NewObject("Запрос");
$query->Text = "ВЫБРАТЬ Субконто1 КАК Контрагент, СуммаОстатокДт КАК Долг ИЗ РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет В ИЕРАРХИИ (&Счет62))";
$query->SetParameter("Период", $base1c->ТекущаяДата());
$query->SetParameter("Счет62", $base1c->ПланыСчетов->Хозрасчетный->РасчетыСПокупателямиИЗаказчиками);
$result = $query->Execute()->Unload();
Ограничения COM-технологии:
COMConnector (32-бит или 64-бит).Если данные не требуются ежесекундно, проанализируем самый щадящий для базы вариант архитектуры. В конфигурации настраивается регламентное фоновое задание, которое по расписанию (например, каждый час):
Такой подход полностью изолирует пользователей 1С от нагрузки со стороны внешних отчетов и исключает конфликты лицензий при одновременных запросах.
Если нет возможности дорабатывать конфигурацию и писать внешние сервисы, воспользуемся штатным функционалом «1С:Бухгалтерии»: