Как получить сальдо взаиморасчетов из базы 1С с помощью внешнего скрипта?

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

При автоматизации бизнес-процессов юридических отделов, служб клиентской поддержки или внешних веб-сервисов часто возникает задача оперативного получения актуального сальдо по контрагентам. Рассмотрим, какими способами можно безопасно и корректно извлечь данные о задолженности из «1С:Бухгалтерии» средствами внешних языков программирования (например, PHP), а также разберем особенности структуры учета взаиморасчетов в платформе 1С:Предприятие.

Прежде чем приступать к интеграции, проанализируем важный нюанс: прямой доступ к таблицам СУБД (SQL) или файловой базе .1CD в обход платформы 1С не только нарушает условия лицензионного соглашения, но и технически неэффективен. В 1С актуальные остатки не хранятся в виде готовых плоских таблиц на каждый момент времени, а формируются платформой «на лету» с использованием механизма итогов и виртуальных таблиц. Попытка чтения сырых таблиц приведет к искажению данных.

Особенности расчета взаиморасчетов в типовых конфигурациях

Выясним причину, почему простого чтения записей регистров недостаточно для расчета глубины долга:

  1. Регистр бухгалтерии: В конфигурации «1С:Бухгалтерия» взаиморасчеты ведутся на счетах 62 («Расчеты с покупателями и заказчиками») и 76 в регистре РегистрБухгалтерии.Хозрасчетный. Субконто обычно настраиваются в разрезе контрагентов, договоров и документов расчетов.
  2. Использование виртуальных таблиц: Для получения правильного сальдо необходимо обращаться к виртуальной таблице РегистрБухгалтерии.Хозрасчетный.Остатки, которая выполняет корректный расчет итогов на уровне СУБД на заданную дату.
  3. Ограничение стандартного OData (REST API): Встроенный автоматический интерфейс OData платформы 1С предоставляет доступ только к реальным таблицам регистров, но не к виртуальным таблицам остатков. Поэтому агрегацию сальдо через стандартный OData выполнить затруднительно.

Вариант 1. Разработка собственного HTTP-сервиса в расширении (Рекомендуемый способ)

Разберем по шагам наиболее современный, быстрый и масштабируемый способ интеграции. Создание собственного 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);

Вариант 2. Подключение через COM-соединение (V83.COMConnector)

Рассмотрим подробнее альтернативный вариант, подходящий для серверов под управлением ОС 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-технологии:

  1. Работает исключительно в операционной системе Windows.
  2. Требует строгого совпадения разрядности PHP и установленного COMConnector (32-бит или 64-бит).
  3. Каждое подключение захватывает клиентскую лицензию платформы и создает значительную нагрузку на инициализацию сеанса.

Вариант 3. Асинхронный экспорт через регламентное задание

Если данные не требуются ежесекундно, проанализируем самый щадящий для базы вариант архитектуры. В конфигурации настраивается регламентное фоновое задание, которое по расписанию (например, каждый час):

  1. Формирует выборку остатков по взаиморасчетам.
  2. Сохраняет данные в формате JSON или CSV.
  3. Выкладывает файл по FTP/SFTP или записывает данные во внешнюю базу данных (MySQL/PostgreSQL), к которой уже обращается PHP-скрипт.

Такой подход полностью изолирует пользователей 1С от нагрузки со стороны внешних отчетов и исключает конфликты лицензий при одновременных запросах.

Вариант 4. Использование типового механизма «Рассылка отчетов»

Если нет возможности дорабатывать конфигурацию и писать внешние сервисы, воспользуемся штатным функционалом «1С:Бухгалтерии»:

  1. Открываем раздел Администрирование → Печатные формы, отчеты и обработки → Рассылки отчетов.
  2. Создаем рассылку стандартного отчета «Акт сверки расчетов» или «Задолженность покупателей по срокам долга».
  3. Настраиваем автоматическую отправку таблицы (в формате Excel или CSV) на выделенный почтовый ящик или сохранение в сетевую папку по расписанию.
  4. Скрипт на PHP парсит полученный файл и выполняет необходимые юридические расчеты.
← На главную