garbagecollect

This commit is contained in:
Татьяна Фарбер 2026-04-03 18:37:20 +04:00
commit dae8491c9f
8 changed files with 3035 additions and 0 deletions

1335
README.md Normal file

File diff suppressed because it is too large Load Diff

1434
bitrix/crm.lua Normal file

File diff suppressed because it is too large Load Diff

5
config/bitrix.lua Executable file
View File

@ -0,0 +1,5 @@
local config = require('config.config')
local _M = config
_M.file = 'bitrix.conf' -- файл конфигурации
_M.read()
return _M.data

52
config/config.lua Executable file
View File

@ -0,0 +1,52 @@
local json = require('cjson.safe')
local _M = {}
_M.data = {}
_M.comments = {}
_M.file = '' -- файл конфигурации
local key
function _M.read()
for line in io.lines(_M.file) do
key = string.match(line, '([%w_]+)::')
if (key) then
_M.data[key] = string.match(line, '::(.*) #')
_M.comments[key] = string.match(line, '#(.*)')
if string.find(_M.data[key],'%{%"') or string.find(_M.data[key],'%[%"') then
_M.data[key] = json.decode(_M.data[key])
end
end
end
end
function reprint(k,v)
if type(v) == 'table' then
for i,j in pairs(v) do
reprint(i,j)
end
else
print(k..': '..v)
end
end
function _M.data:write()
local config_file = io.open(_M.file, 'w')
for k,v in pairs(self) do
if type(v) ~= 'function' then
if type(v) == 'table' then v = json.encode(v) end
config_file:write(k..'::'..v..' #'.._M.comments[key]..'\n')
end
end
config_file:close()
end
function _M.data:print()
for k,v in pairs(self) do
if type(v) ~= 'function' then
if _M.comments[k] then print('\n'.._M.comments[k]:gsub("^%s*(.-)%s*$", "%1")..': \n') end
reprint(k,v)
end
end
end
return _M

46
test.lua Normal file
View File

@ -0,0 +1,46 @@
local json = require('cjson')
local crm = require('bitrix.crm')
local log = require('utils.log')
log.outfile = 'logs/tests_'..os.date('%Y-%m-%d')..'.log'
log.level = 'trace'
local deal_id = 158811
local test_date = '2025-01-05'
local function get_statuses()
log.info('Поля статусов CRM: '..json.encode(crm.status.fields()))
log.info('Статусы сделок : '..json.encode(crm.status.list(nil,{['ENTITY_ID']='DEAL_TYPE'})))
end
local function test_deal_get(id)
local result = crm.deal.get(id)
if result.BEGINDATE then log.info('Тест получения сделок: успешно')
else log.error('Тест получения сделок: провален '..json.encode(result)) end
result = crm.deal.productrows.get(id)
if result[1].PRODUCT_ID then log.info('Тест получения продукта сделки: успешно')
else log.error('Тест получения продукта сделки: провален '..json.encode(result)) end
end
local function test_deal_add_update_delete()
local result = crm.deal.add(id)
if result.BEGINDATE then log.info('Тест получения сделок: успешно')
else log.error('Тест получения сделок: провален '..json.encode(result)) end
result = crm.deal.productrows.get(id)
if result[1].PRODUCT_ID then log.info('Тест получения продукта сделки: успешно')
else log.error('Тест получения продукта сделки: провален '..json.encode(result)) end
end
local function test_deal_list()
local result = crm.deal.list({'*'},{['STAGE_ID']='NEW',['>DATE_CREATE']=test_date})
if #result ~= tonumber(crm.res.total) then
log.error('Ошибка обработки листинга сделок '..json.encode(crm.res))
else
log.info('Тест листинга сделок: успешно')
end
end
get_statuses()
test_deal_get(deal_id)
test_deal_list()

43
utils/array.lua Executable file
View File

@ -0,0 +1,43 @@
local _M = {}
function _M.keys(t)
local keys = {}
for key,_ in pairs(t) do
table.insert(keys, key)
end
return keys
end
function _M.merge(t1,t2)
for k,v in pairs(t2) do
table.insert(t1,v)
end
return t1
end
function _M.count(t)
local count = 0
for key,_ in pairs(t) do
count = count + 1
end
return count
end
function _M.minkey(t)
local a = {}
for n in pairs(t) do table.insert(a, n) end
table.sort(a)
return a[1]
end
function _M.implode(t,before,after,sep)
local result = ''
local count = _M.count(t)
for key,val in pairs(t) do
result = result..before..val..after
if key < count then result = result..sep end
end
return result
end
return _M

90
utils/log.lua Normal file
View File

@ -0,0 +1,90 @@
--
-- log.lua
--
-- Copyright (c) 2016 rxi
--
-- This library is free software; you can redistribute it and/or modify it
-- under the terms of the MIT license. See LICENSE for details.
--
local log = { _version = "0.1.0" }
log.usecolor = true
log.outfile = nil
log.level = "trace"
local modes = {
{ name = "trace", color = "\27[34m", },
{ name = "debug", color = "\27[36m", },
{ name = "info", color = "\27[32m", },
{ name = "warn", color = "\27[33m", },
{ name = "error", color = "\27[31m", },
{ name = "fatal", color = "\27[35m", },
}
local levels = {}
for i, v in ipairs(modes) do
levels[v.name] = i
end
local round = function(x, increment)
increment = increment or 1
x = x / increment
return (x > 0 and math.floor(x + .5) or math.ceil(x - .5)) * increment
end
local _tostring = tostring
local tostring = function(...)
local t = {}
for i = 1, select('#', ...) do
local x = select(i, ...)
if type(x) == "number" then
x = round(x, .01)
end
t[#t + 1] = _tostring(x)
end
return table.concat(t, " ")
end
for i, x in ipairs(modes) do
local nameupper = x.name:upper()
log[x.name] = function(...)
-- Return early if we're below the log level
if i < levels[log.level] then
return
end
local msg = tostring(...)
local info = debug.getinfo(2, "Sl")
local lineinfo = info.short_src .. ":" .. info.currentline
-- Output to console
print(string.format("%s[%-6s%s]%s %s: %s",
log.usecolor and x.color or "",
nameupper,
os.date("%H:%M:%S"),
log.usecolor and "\27[0m" or "",
lineinfo,
msg))
-- Output to log file
if log.outfile then
local fp = io.open(log.outfile, "a")
local str = string.format("[%-6s%s] %s: %s\n",
nameupper, os.date(), lineinfo, msg)
fp:write(str)
fp:close()
end
end
end
return log

30
utils/url.lua Normal file
View File

@ -0,0 +1,30 @@
local _M = {}
local char_to_hex = function(c)
return string.format("%%%02X", string.byte(c))
end
local hex_to_char = function(x)
return string.char(tonumber(x, 16))
end
function _M.encode(url)
if url == nil then
return
end
url = url:gsub("\n", "\r\n")
url = url:gsub("([^%w ])", char_to_hex)
url = url:gsub(" ", "+")
return url
end
_M.decode = function(url)
if url == nil then
return
end
url = url:gsub("+", " ")
url = url:gsub("%%(%x%x)", hex_to_char)
return url
end
return _M