S41C (Socket for 1C)

TCP-socket-сервер и клиент для платформы "1С:Предприятие"

Системные требования

  • Microsoft Windows семейства NT (только для сервера)
  • 1С:Предприятие v7 (только для сервера)
  • Ruby 1.9.3

Установка

gem install s41c

Пример использования

Сервер

Запустить сервер для 1C:Предприятия 7.7 (сетевая версия) на localhost:1421 и использовать базу "C:\Base\"

require 's41c'

server = S41C::Server.new
server.db('C:\Base\\')
server.start

Или чуть сложнее: запустить сервер для 1С:Предприятия (локальная версия) на 127.0.0.1:2000, разрешать подключения только с адреса 123.45.67.8, использовать базу "C:\Base\", при подключении требовать логин "username" и пароль "password", писать лог в c:\server.log и записать время остановки сервера в файл

require 's41c'

server = S41C::Server.new('127.0.0.1', 2000, 'c:\server.log')
server.white_list('123.45.67.8')
server.ole_name = 'V77L.Application'
server.db('C:\Base\\')

server.('username', 'password')

server.at_exit do
  File.open('c:\server_stoped_at.txt', 'w') { |f| f.puts Time.now }
end

server.start

Клиент

При подключении можно указать хост и порт сервера (если не указаны, будут использоваться localhost:1421), а также данные для авторизации. После подключения на сервер передаётся руби-код, который и выполняет все, что нам нужно. Внимание! В передаваемом коде нельзя использовать комментарии и условия вида "do_somthing if some_condition", вместо это следует писать "if some_condition do_somthing;end", аналогично для unless

require 's41c'

client = S41C::Client.new('127.0.0.1', 2000)
client.('username', 'password')

vars = {:spr_name => 'Товары', :tov_name => 'Название товара'}
response = client.request(vars) do

  spr = @ole.CreateObject("Справочник.#{@vars[:spr_name]}")

  if spr.invoke('НайтиПоНаименованию', @tov_name) == 1.0
    item = spr.invoke('ТекущийЭлемент')
    item_id = get_1c_id(item)
    expr = 'КакаяНибудьФункция(ЗначениеИзСтрокиВнутр(' + item_id + '))'
    result = @ole.EvalExpr(expr)
  end

  to_utf8(result)

end

puts response
client.disconnect

Данные, переданные методу request, внутри кода доступны либо через хеш @vars, либо непосредственно через одноименные переменные. Также доступен объект @ole, который является инстансом 1С и у него есть 3 метода

  • CreateObject - создает объект агрегатного типа данных 1С:Предприятия и возвращает ссылку на него.

  • EvalExpr - вычислияет выражение системы 1С:Предприятие и возвращает результат вычисления

  • ExecuteBatch - выполняет последовательность операторов системы 1С:Предприятие и возвращает статус выполнения (true/false)

Вызов функций и процедур созданных объектов осуществляется с помощью метода 'invoke', которому в качестве первого аргумента передаётся название функции/процедуры, а последующих - параметры.

Также достпен ряд вспомогательных функций

  • to_bin - переводит utf-строку в бинарный формат
  • to_utf8 - переводит бинарную или строку из 1С в utf-8
  • get_1c_id - обертка над 1С-функцией 'ЗначениеВСтрокуВнутр', возращает строковый идентификатор объекта.