Code Monkey home page Code Monkey logo

php-odata-1c's Introduction

Библиотека для доступу из PHP к 1С по протоколу OData

За основу взята и доработана saintsystems/odata-client-php

Базовая документация по ней: https://github.com/saintsystems/odata-client-php/wiki/Example-calls

Настройка 1С

По-умолчанию в 1С отключена публикация всех данных дажи при активированном OData протоколе в публикации. Для решения данной проблемы ренобходимо от администратора запустить РедактированиеСоставаСтандартногоИнтерфейсаOData.epf

Применение

Инициализация

$odataServiceUrl = 'путь к опубликованной базе данных';
$username = 'пользователь 1С';
$password = 'пароль 1С';

$oDataClient = new OData1CClient($odataServiceUrl, $username, $password);

Получение массива данных

$measures = $oDataClient->from('Catalog_КлассификаторЕдиницИзмерения')
            ->where('DeletionMark', '=', false) // условие отбора может быть также \DateTime, строкой guid. Главное, что должно соответствовать типу данных в отбираемом поле
            ->get();
foreach ($measures as $rec) {
    print ($rec->НаименованиеПолное) . "\n";
}

// получаем первую запись из списка
$measures = $oDataClient->from('Catalog_КлассификаторЕдиницИзмерения')
            ->where('DeletionMark', '=', false)
            ->first();

Получение количества записей для данного запроса:

$total = $oDataClient->from('Catalog_КлассификаторЕдиницИзмерения')
            ->where('DeletionMark', '=', false)
            ->count();

Массив со связями на другой объект:

$barcodes = $oDataClient->from('InformationRegister_ШтрихкодыНоменклатуры')
            ->select([
                'Штрихкод',
                'Номенклатура_Key',
                'Номенклатура/Артикул',
                'Номенклатура/Description'
            ])->expand('Номенклатура')
            ->get();

foreach ($barcodes as $bc) {
    print $bc['Штрихкод'] . ' ' . $bc['Номенклатура']['Description'] . "\n";
}

Пажинация

$result = $oDataClient->from('Catalog_КлассификаторЕдиницИзмерения')
            ->where('DeletionMark', '=', false)
            ->skip(3) // пропустить первые 3
            ->take(2) // взять 2
            ->get();

Сортировка

Следует иметь ввиду, что последующий вызов order перезаписывает предыдущий, в отличие от where.

// сортировка по возрастанию
$result = $oDataClient->from('Catalog_КлассификаторЕдиницИзмерения')
            ->order('Description')
            ->get();

// сортировка по убыванию
$result = $oDataClient->from('Catalog_КлассификаторЕдиницИзмерения')
            ->order('Description', 'desc')
            ->get();

// сортировка по нескольким полям
$result = $oDataClient->from('Catalog_КлассификаторЕдиницИзмерения')
            ->order([['Description', 'desc'], ['Code', 'asc']])
            ->get();

Получение записи по ID

$entity = $oDataClient->from('Catalog_КлассификаторЕдиницИзмерения')
            ->find('96289644-7af3-11e9-92fa-000c2979dd34');
var_export($entity->НаименованиеПолное);

Отбор по регистрам (виртуальным таблицам)

Доступные методы:

  • balance(null|array $conditions)
  • turnovers(null|array $conditions)
  • balanceAndTurnovers(null|array $conditions)

Например, получаем остатки и обороты по складу:

$storeRemains = $oDataClient->from('AccountingRegister_Хозрасчетный')
    ->balanceAndTurnovers([
            'AccountCondition' => "Account/Code eq '43' or Account/Code eq '41.01'", // пока что красивая группировка не реализована, 
                                                                                     // соответственно операторы должны соответствовать стандартку ODate, 
                                                                                     // кавычки всегда одинарные!
            'EndPeriod' => new \DateTime('2019-05-01'), // Автоматически приводит к дате
            'StartPeriod' => new \DateTime('2019-04-01'),
        ])
    ->select([
        'Account/Code',
        'Account/Description',
        'Валюта/Code',
        'Валюта/Description',
        'Организация/Description',
        'Организация/ИНН',
        'ExtDimension1',
        'ExtDimension3',
        'СуммаBalance',
        'КоличествоBalance'
    ])->expand(['Account', 'Валюта', 'Организация', 'ExtDimension1', 'ExtDimension3'])
    ->take(5)
    ->get();
var_export($storeRemains);

Отбор по нескольким условиям

$measures = $oDataClient->from('Catalog_КлассификаторЕдиницИзмерения')
    ->where([
        ['Code', '=', '736'],
        ['Description', '=', 'рул']
    ])
    ->orWhere([
        ['Code', '=', '778'],
        ['Description', '=', 'упак']
    ])
    ->get();
foreach ($measures as $rec) {
    print ($rec->НаименованиеПолное) . "\n";
}

Пометка на удаление

Объект удаляется не полностью, а помечается на удаление:

$oDataClient->from('Catalog_КлассификаторЕдиницИзмерения')
            ->delete('ac886490-9a42-11e8-9429-a8a795c008e0');

Массовое удаление в 1С недоступно.

Создание объекта

$result = $oDataClient->from('Catalog_КлассификаторЕдиницИзмерения')
            ->create([
                'Code' => 777,
                'Description' => '777 ед',
                'НаименованиеПолное' => 'Единица 777',
            ]); 
print_r($result); // содержит полную информацию об объекте

Изменение объекта

$result = $oDataClient->from('Catalog_КлассификаторЕдиницИзмерения')
            ->update('ac886490-9a42-11e8-9429-a8a795c008e0', [
                'Code' => 778,
            ]); 
print_r($result); // содержит полную информацию об объекте

Массовое изменение в 1С недоступно.

Проведение и отмена проведения

// проведение
$oDataClient->from('Document_ОприходованиеТоваров')
            ->postDocument('f8c00f9e-7887-11e9-80c8-00155d58132c');
            
// отмена проведения
$oDataClient->from('Document_ОприходованиеТоваров')
            ->unPostDocument('f8c00f9e-7887-11e9-80c8-00155d58132c');

Базовая информация по 1С

Стоит иметь ввиду, что реализация со стороны 1С отличается от стандарта.

Настройка Apache для публикации 1С

https://infostart.ru/public/646384/

Описание формата

php-odata-1c's People

Contributors

vovantune avatar

Stargazers

 avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.