Есть триггер перед модификацией записи в KatMc.
Его задача проставлять в поле ссылку на группу МЦ, которая получается
по правилу, определённому в функции oi_Trigger_MC_cGroup.GetGroupMc_Kod_By_nRec.
Логика следующая: получаем МЦ из буфера, вносим изменения в нужное поле, затем модифицированную запись вставляем в буфер.
Проблема возникает при вставки изменённой переменной buf в буфер с помощью функции SetTableBuffer();
var oi_Trigger_MC_cGroup : Trigger_MC_cGroup new;
handler with replace Trigger_KatMc_ret1 on trigger KatMc before update [10]
action
{
var buf : record as table KatMc;
GetTableBuffer(buf);
//Извлекаем nRec записи из таблицы GroupMC
buf.ret1 := oi_Trigger_MC_cGroup.GetGroupMc_Kod_By_nRec(buf.cGroupMC);
if ( SetTableBuffer(buf) != tsOk )
Message('Ошибка вставки в буфер'); //Возникает ошибка при вставке в буфер
result := true;
}
handler with replace titledoc_Before_upd on trigger titledoc before update [201]
action
{
//переменная буфера с позицией
var buf : record as table titledoc with x$position;
GetTableBufferP(buf); // Считываем буфер
if buf.DocMemo=0
{ //buf.DocMemo := coGetTune('UP.STAFF.NAME_FILIAL'); // Изменяем значение поля
set buf.DocMemo :=coGetTune('UP.MY.FILIAL_STAFF')
//message(string(buf.DocMemo))
SetTableBuffer(buf); // Сохраняем буфер
}
result := true;
}
Переделал по аналогии с Вашим примером. Решил оставить только чтение из буфера и вставку в буфер.
Всё равно выскакивает ошибка 311.
Есть подозрение, что проблема не в коде, а в настойках.
handler with replace Trigger_KatMc_ret1 on trigger KatMc before update [200]
action
{
var buf : record as table KatMc with x$position;
var wErr: word;
wErr := GetTableBufferP(buf);
if(wErr != tsOK)
Message( wErr + ' Ошибка считывания из буфера');
wErr := SetTableBuffer(buf);
if ( wErr != tsOk )
Message( wErr + ' Ошибка вставки в буфер' + chr(13) + buf.ret1 ); //Возникает ошибка при вставке в буфер
result := true;
}
Решил попробовать вынести процедуру обновления поля в интерфейс.
В результате выполнения триггера появилось сообщение "Конфликт с другим пользователем. Запись будет пересчитана. Таблица N1411."
1411 - это номер таблицы KatMc.
Есть подозрение, что что-то не то с доступом к таблице KatMc.
Если вы будете менять таблу вне тригера, то так и будет - тогда в родительском нужно вызвать Rereadrecoord(#katmc) - а это затратно, если речь идет о нескольких возможностях. Проще уж сразу их докомпилить. Ну у меня работало - бейтесь. В ТП отпишите - что они скажут. Попробуйте с другой таблой.
К сожалению, проблема не ушла.
Попробовал реализовать триггер на другой таблице - тоже самое.
Жду любых рекомендаций по поводу того, в чём может быть проблема.
handler MnPlan_Test_Trig on trigger MnPlan before update [99]
action
{
var buf :record as table MnPlan;
var wErr : word;
Message('Обработка триггера на изменение записи в MnPlan');
GetTableBuffer(buf);
wErr := SetTableBuffer(buf);
if (wErr != tsOK)
Message(wErr + ' Ошибка вставки в буфер');
}
Если у переменной, которой присваивается значение из буфера,
изменить значение какого либо поля, пример кода приведён ниже,
то появится сообщение об ошибке в буфер, но изменения будут производиться в соответствии с кодом.
#include GetCurMc.vih
var oi_GetCurMc : GetCurMc new;
handler with replace MC_trigger_Cancel_Groups on trigger KatMc before update [99]
action
{
var buf : record as table KatMc;
var CurMc : record as table KatMc;
var sTmp : string;
var wErr : word;
GetTableBuffer(buf);
buf.Name := buf.name + 'Test';
wErr := SetTableBuffer(buf);
if(wErr != tsOK)
Message('Ошибка вставки в буфер');
result := true;
}
rollback
{}
Похоже на баг какой то.... быстрее всего что и GetTableBuffer чуть Выше в Вашем коде тоже кидает не tsok значение контанты в качестве результата выполнения метода.
Den писал(а):Похоже на баг какой то.... быстрее всего что и GetTableBuffer чуть Выше в Вашем коде тоже кидает не tsok значение контанты в качестве результата выполнения метода.
Вы правы, GetTableBuffer тоже возвращает не tsOK, а тоже 311.