Bom dia.
Segue uma solução utilizada por mim em uma situação parecida.
Dentro do ModelDef, crie uma validação para o campo:
oStruct:SetProperty('ZTC_CC', MODEL_FIELD_VALID, { || fVldCC() })
Na função utilizada no valid, faça a seguinte avaliação:
Static Function fVldCC
Local lRet := .T.
Local oView := FwViewActive()
Local oModel := FwModelActive()
If(!Empty(oModel:GetValue('ModelFicha','ZTC_CC')))
// Limpa os dados da grid
oModel:GetModel('ModelRateio'):ClearData(.F., .T.)
// Bloqueia a inserção, alteração e exclusão de linhas na grid
oModel:GetModel('ModelRateio'):SetNoInsertLine(.T.)
oModel:GetModel('ModelRateio'):SetNoUpdateLine(.T.)
oModel:GetModel('ModelRateio'):SetNoDeleteLine(.T.)
Else
// Limpa os dados da grid
oModel:GetModel('ModelRateio'):ClearData(.F., .T.)
// Habilita a inserção, alteração e exclusão de linhas na grid
oModel:GetModel('ModelRateio'):SetNoInsertLine(.F.)
oModel:GetModel('ModelRateio'):SetNoUpdateLine(.F.)
oModel:GetModel('ModelRateio'):SetNoDeleteLine(.F.)
EndIf
oView:Refresh()
Return(lRet)
Importante ressaltar que o método ClearData limpa os dados na grid apenas visualmente, e não no banco de dados. Sendo assim, seu uso só deve ser feito se a operação do modelo for inclusão. Caso contrário, você deve varrer sua grid e deletar linha por linha.
Os métodos da classe FWFormGridModel devem lhe auxiliar, existem métodos que permitem tornar o grid read only: https://tdn.totvs.com/display/framework/fwformgridmodel
— Daniel Mendes 23 de Nov de 2022