Re: Ошибка: Недостаточно памяти для выполнения опереации

Во время выполнения скрипта произошла вот такая ошибка:

System Error. Code: 14.
Недостаточно памяти для выполнения операции
CSDN.Tsc_Inventory

Это ошибка от недостатка физической памяти?

Re: Ошибка: Недостаточно памяти для выполнения опереации

AlexB писал(а):
Это ошибка от недостатка физической памяти?

Нет.
Вероятно решение тут -> https://forum.technologics.ru/viewtopic.php?id=986

Re: Ошибка: Недостаточно памяти для выполнения опереации

Из ниже сказанного следует, что надо руками освобождать объекты, так что ли?

Re: Ошибка: Недостаточно памяти для выполнения опереации

выходит что так)

Re: Ошибка: Недостаточно памяти для выполнения опереации

Есть у нас модуль, который проходя по вложенным спецификациям, вычисляет массу изделия. В нем все глобальные объекты освобождаются как надо (TCSApp.DeleteModuleByUserModuleName( "Имя" ) ), но проглотить ему состав изделия в 1500 позиций, так и не удается - обрабатывает ~1050 поз. и говорит "Out of memory мой друг - пользуйся мол калькулятором, excel-ем...". Во время отладки останавливается обычно не на глобальном объекте, а на X=ptModule.Properties['Parameters'].AsIDispatch, который по инструкции удаляется X := Nil; И глубина вложенности вреде бы не большая ~4 (на рекурсию особо и не погрешишь), просто подсборки объемные.
В ApiExplorer-e на глобальных объектах установлен флаг IModule.SingleInstance, это правильное предположение?
Я уже думаю все объекты что ли проверять на глобальность?
Кстати метод DeleteModuleByUserModuleName выполняется без сообщений и для объектов созданных, через Properties['...'].AsIDispatch, но легче от этого все равно не становится.
Если можно, перечислите модули TCS, для которых обновилось API в 463 по сравнению с 403, а то размеры файлов TCSApi.ocx немного различаются, но новых возможностей не видно, хотя ожидал.

И еще замечание: в справке есть куча примеров, в которых создаются объекты от TCSApp, но только наверное в одном можно встретить пример использования DeleteModuleByUserModuleName, это мне кажется и есть одна из основных причин множества одних и тех же вопросов по этой теме.

RAM = 512МБ и задействуется не вся.

Re: Ошибка: Недостаточно памяти для выполнения опереации

Олег Зырянов писал(а):
Корневые объекты получаемые от Application (TCS_Application, OCS_Application) создаются в системе один раз и удалятся только при выгрузке программы.


Олег Зырянов писал(а):
Все остальные объекты (полученные через Properties, ChildModules ) удалются системой автоматически при отсутcтвии ссылок на них, либо при удалении родительского ообъекта.

т.е. нет смысла "проверять объекты на глобальность" и использовать DeleteModuleByUserModuleName для "объектов созданных, через Properties['...'].AsIDispatch"
Быть может Вы неправильно удаляете объекты(?) - без кода не понять

Re: Ошибка: Недостаточно памяти для выполнения опереации

...на первый взгляд вроде нормально...в какой версии ошибка вылазит?...

Re: Ошибка: Недостаточно памяти для выполнения опереации

v 4.3.4.0 (7875) под MS SQL 2000 sp4

Re: Ошибка: Недостаточно памяти для выполнения опереации

Sh писал(а):
v 4.3.4.0 (7875) под MS SQL 2000 sp4

попробуйте в 4.6.3

Re: Ошибка: Недостаточно памяти для выполнения опереации

Можно ли для начала просто подменить TCSApi.ocx

Re: Ошибка: Недостаточно памяти для выполнения опереации

Sh писал(а):
Можно ли для начала просто подменить TCSApi.ocx

попробуйте )

Re: Ошибка: Недостаточно памяти для выполнения опереации

Здраствуйте, уважаемые!

Я написал скрипт для выгрузки id позиций из фактической сдачи + ведение логов для дальней шей загрузки записей в 1С. У клиента на машине вылазит ошибка о нехватке памяти. Вот письмо, которое он мне написал по этому поводу:

"Нет возможности выгружать больше 10 а иногда и 7-ми дней сразу. Первоначально предполагалось, что компьютеру не хватает оперативной памяти для работы(512Мб). После экспериментов на сервере с объемом памяти 2Гб выяснилось, что проблема не в объёме памяти. В ходе дальнейших экспериментов выяснилось, что не хватает дескрипторов windows. Это проявляется в том, что после прекращения выполнения скрипта по ошибке в системе не возможно открыть никакого окна(Alt+Ctr+Del, или вообще закрыть TCS - окошко "Хотите выйти Да/Нет?"). Если же в системе закрыть любое окно(например если был открыт проводник и его закрыть), то сразу появляется возможность продолжить работу. Видимо проблема в высвобождении дескрипторов системы."

Я не знаю что на это ответить, может Вы знаете в чём проблемма и как это можно поправить?

Если нужно скрипт могу выложить.

Re: Ошибка: Недостаточно памяти для выполнения опереации

выложи

Re: Ошибка: Недостаточно памяти для выполнения опереации

Sub FormMacro_GetOperationToFile(TCSActiveModule)
On Error Resume Next   
LogObject.ScriptTimeOut = 0

Dim Sostav
Dim Tp

Set fso = CreateObject("Scripting.FileSystemObject")
     
Set File = fso.OpenTextFile("C:\MI2.txt", 2, True) 
Set Log_File = fso.OpenTextFile("C:\MI2.log", 2, True)

Log_File.Write CStr(Now)

ProductionBOM_ID = ""
ID = ""
IDPSp = ""
IStr = ""                           
IdsLast = ""   
FBr = "" 
pbStr = CSDN_VIS_Library.constProgressBarStr
TCSActiveModule.First
While Not TCSActiveModule.EOF
    pbStr = CSDN_VIS_Library.ShowProgressBar(pbStr)           
    ProductionBOM_ID = ProductionBOM_ID + TCSActiveModule.Properties("PRODUCTIONBOM_ID").AsString  + " "
    ID = ID + TCSActiveModule.Properties("ID").AsString + " "

Set Sostav = TCSApp.Manufacturing.ProductionBOMStructure( TCSActiveModule.Properties("PRODUCTIONBOM_ID").AsInteger, -1, TCSActiveModule.Properties("PRODBOM_STRUCTUREITEM_ID").AsInteger )'Взять ПСп
    Set Tp = Sostav.Properties("ProductionBOMProcess").AsIDispatch ' Взять ТП позиции состава ПСп
II = Tp.Locate( "ID", TCSActiveModule.Properties("PRODBOM_MNFPROCESSITEM_ID").AsInteger,0 )' Перейти к соответствующей операции
    OperationNumber = Tp.Properties("OPERATION_NUMBER").AsSafeString
    IStr = IStr + Tp.Properties("OPERATION_NUMBER").AsSafeString + " "
    IDPSp = IDPSp + Tp.Properties("OPERATION_ID").AsSafeString + " "
    Tp.First
    While Not Tp.EOF
        IdLast = Tp.Properties("OPERATION_NUMBER").AsSafeString
        Tp.Next
    Wend
       
    IdsLast = IdsLast + IdLast + " "
    Set Sostav = Nothing 'Освободить объект
    Set Tp = Nothing 'Освободить объект     
     
    'Взять признак брака
    Set OrderFact = TCSActiveModule.ChildModules.ModuleByName("OrderFact").AsIDispatch
    If  Not OrderFact Is Nothing Then 
           FBr = FBr + OrderFact.Properties("N_ORDFACT_DISCARD").DisplayText + " "
    End If
     
    Set OrderInfo = TCSActiveModule.ChildModules.ModuleByName("OrderInfo").AsIDispatch
    If  Not OrderInfo Is Nothing Then 
      SPsNote = OrderInfo.Properties("N_ORD_NOTE").AsString
    End If     

If TCSActiveModule.Properties("BATCH_NUMBER").DisplayText = "" And TCSActiveModule.Properties("SERIALNUMBER").DisplayText = "" Then
Log_File.Write Chr(10) + Chr(13) + "№ ПСп " + SPsNote + " № Операции " + OperationNumber + " - Отсутствует серийный номер партии или номер партии"
    End If
     
    If TCSActiveModule.Properties("FINISHEDPRODUCTS_DEPATMENT_SECTOR").DisplayText = "" Then               
        Log_File.Write Chr(10) + Chr(13) + "№ ПСп " + SPsNote + " № Операции " + OperationNumber + " - Отсутствует номер линии"
    End If
     
    Set WorkMans = TCSActiveModule.Properties("WorkMans").AsIDispatch
    If  Not WorkMans Is Nothing Then 
        WorkMan_ID = WorkMans.Properties("WORKMAN_ID").DisplayText
    End If
     
    If WorkMan_ID = "" Then     
        Log_File.Write Chr(10) + Chr(13) + "№ ПСп " + SPsNote + " № Операции " + OperationNumber + " - Отсутствует работник"
    End If                                                                   
     
    If TCSActiveModule.Properties("DeliveryDate").DisplayText = "" Then     
        Log_File.Write Chr(10) + Chr(13) + "№ ПСп " + SPsNote + " № Операции " + OperationNumber + " - Отсутствует дата сдачи"
    End If   
     
    Set WorkMans = TCSActiveModule.Properties("WorkMans").AsIDispatch
    If  Not WorkMans Is Nothing Then 
        WorkMans.First
        While Not WorkMans.EOF
            StandardHours = WorkMans.Properties("StandardHours").AsInteger
            If StandardHours = 0 Then
                LastName = WorkMans.Properties("WORKMAN_LASTNAME").DisplayText
Log_File.Write Chr(10) + Chr(13) + "№ ПСп " + SPsNote + " № Операции " + OperationNumber + " Работник: " + LastName + " - Отсутствует время"
            End If
            WorkMans.Next
        Wend
    End If
    Set WorkMans = Nothing
     
    TCSActiveModule.Next
Wend       
IDs = ProductionBOM_ID + ID + IDPSp + IStr + IdsLast + FBr
File.Write IDs
File.Close   
Log_File.Close 
Call TCSApp.HideProgressMessage
End Sub

Re: Ошибка: Недостаточно памяти для выполнения опереации

попробуйте заменить = Nothing на DeleteModuleByUserModuleName