Страница 1 из 1

Проблема с докомпиляцией интерфейса в 9.1

Добавлено: 04 фев 2014, 17:45
KATZ
Имеется докомпилированный интерфейс, добавляющий в список документов колонку с внешним атрибутом. В 8.1 всё работает "на ура". Пробую перенести его в 9.1: компилируется нормально, но при запуске вылетает по рантайму. Проблемная функция cfsCreateObject, падает на ней. Причем когда вызываю ее в режиме проверки (4-ый параметр == TRUE), то всё хорошо, возвращает 0. Тут же следом вызываю в режиме создания (с параметром FALSE) - и конец.

Версия 9.1 свежая, патчи почти последние. Кто-нибудь сталкивался с подобным? Проблема в программе или в моих неумелых руках?

Re: Проблема с докомпиляцией интерфейса в 9.1

Добавлено: 04 фев 2014, 18:39
Den
а других alter со вставкой посредством cfsCreateObject работают ?
Можно попробовать встроенным конфигуратором сделать такое поле внешнего атрибута и посмотреть в designer-е массив свойств у созданного объекта и сравнить с тем что в коде alter присваивается .

Re: Проблема с докомпиляцией интерфейса в 9.1

Добавлено: 05 фев 2014, 07:22
Алексей
мы на 9-ку НЕ переходили, но я собирал альтеры, проверял, готовился к переходу. вроде ничего не падало.
может действительно со свойствами перемудрили?

Re: Проблема с докомпиляцией интерфейса в 9.1

Добавлено: 05 фев 2014, 10:03
KATZ
Den писал(а):а других alter со вставкой посредством cfsCreateObject работают ?
Можно попробовать встроенным конфигуратором сделать такое поле внешнего атрибута и посмотреть в designer-е массив свойств у созданного объекта и сравнить с тем что в коде alter присваивается .
У меня только в одном интерфейсе колонка добавляется, в остальных докомпилируются обработчики событий, там cfsCreateObject не требуется. До модификации свойств дело не доходит, т. к. объект не получается создать.

Сделать через конфигуратор попробовал сразу же, как докомпиляция обломилась. Колонка нормально создается, имена и типы остались те же, что в 8.1.

На днях атлантис обновился до 5.5.17, может, с ним получится.

Re: Проблема с докомпиляцией интерфейса в 9.1

Добавлено: 06 фев 2014, 23:10
LaaLaa
KATZ писал(а):...докомпилированный интерфейс, добавляющий в список документов колонку с внешним атрибутом...при запуске вылетает по рантайму...проблемная функция cfsCreateObject...
Что конкретно передаете в cfsCreateObject в качестве пераметра. По идее там должен быть NREC атрибута. И в БД такой NREC тоже должен быть иначе не произойдет добавление колонки.

Re: Проблема с докомпиляцией интерфейса в 9.1

Добавлено: 07 фев 2014, 12:49
KATZ
LaaLaa писал(а):Что конкретно передаете в cfsCreateObject в качестве пераметра. По идее там должен быть NREC атрибута. И в БД такой NREC тоже должен быть иначе не произойдет добавление колонки.
Передается NREC, как и положено. В конфигураторе вручную добавил колонку, выгрузил скрипт, проверил - всё совпадает. Атрибут в БД, естественно, есть. В 8.1 код работает. Свежий атлантис ничего не изменил.

Вот, собственно, исходник. Оставил минимум + добавил пояснения и отладочные сообщения. Суть - вставить колонку со строковым атрибутом в список договоров. Если кто-нибудь найдет время у себя попробовать и указать мне на ошибки, то достаточно будет только NREC атрибута сменить на реальный.

Код: Выделить всё

#component "L_DOGOVOR"

alter interface DOGOVOR;
HandleEvent
cmInit:
{
  Inherited::HandleEvent(cmInit);
  var lStatus, lMyObject: longint;
  lStatus:=cfsSetCurrentContainer('L_DOGOVOR::DOGOVOR');
  if (lStatus<>0)
  {
    Message('Ошибка '+String(lStatus)+' функции cfsSetCurrentContainer.', Error+OKButton);
    exit;
  }
  lStatus:=cfsCreateObject('TreeColumn', 'BRDOGOVORSELECTMAIN', 'ExtAttr: DOGOVOR1,4612070754798193775', TRUE, lMyObject);
  if (lStatus<>0)
  {
    Message('Ошибка '+String(lStatus)+' пробной функции cfsCreateObject.', Error+OKButton);
    exit;
  }
  Message('Перед созданием.', 0); // это сообщение еще есть
  lStatus:=cfsCreateObject('TreeColumn', 'BRDOGOVORSELECTMAIN', 'ExtAttr: DOGOVOR1,4612070754798193775', FALSE, lMyObject);
  Message('После создания.', 0);  // этого сообщения уже нет
  if (lStatus<>0)
  {
    Message('Ошибка '+String(lStatus)+' функции cfsCreateObject.', Error+OKButton);
    exit;
  }
  /*
  Настройка свойств нового объекта, до которой дело не доходит
  */
}
end;
end.

Re: Проблема с докомпиляцией интерфейса в 9.1

Добавлено: 07 фев 2014, 13:58
edward_K
1.
Вместо
lStatus:=cfsSetCurrentContainer('L_DOGOVOR::DOGOVOR');
лучше использовать
lStatus:=cfsSetCurrentContainer(cfsGetCurrentContainerSelf)
2.
Я предпочитаю для атрибутов вставлять вычисляемые поля - их можно по наименованию юзать.
Да и то - вставку для них длеать через cnf скрипт.

Код: Выделить всё

//===========================
(local_propis)
as select 
  piExtAttr.doGetAttr(coPersons,Persons.Nrec,'Нечто') //
....
TableEvent Table ??????;
  cmExprFieldChanged :
  { inherited :: handleEvent (cmExprFieldChanged); 
    case curfield of
    #local_propis:
    { piExtAttr.doSetAttr(coPersons,Persons.Nrec,'Нечто',double(ExprFieldValue))
    }
    end;
 }
end;

Есть объект для отображения и выбора списочного атрибута.
С датой чуть сложнее - чтобы не зависеть от региональных настроек делаю так StrToDate(TRIM(REPLACE(ExprFieldValue,'/','.')),'DD.MM.YYYY')

Re: Проблема с докомпиляцией интерфейса в 9.1

Добавлено: 10 фев 2014, 12:47
KATZ
edward_K
Замечания полезные, но хотелось бы в имеющемся коде ошибку найти. Либо получить подтверждение от независимого эксперта, что это ошибка не моя, а "Галактики".

Может, кто-нибудь потратит 10-15 минут и попробует скомпилировать и запустить у себя на 9.1?

Re: Проблема с докомпиляцией интерфейса в 9.1

Добавлено: 22 апр 2014, 21:27
Den
KATZ победил проблему или удалось выяснить ее причины ?
пробую аналогичный вариант на 5.5.17.0 - точь в точь такая же ситуация как у тебя...на 5,4,44 все ок без рантайма

Re: Проблема с докомпиляцией интерфейса в 9.1

Добавлено: 23 апр 2014, 10:27
KATZ
Den писал(а):KATZ победил проблему или удалось выяснить ее причины ?
пробую аналогичный вариант на 5.5.17.0 - точь в точь такая же ситуация как у тебя...на 5,4,44 все ок без рантайма
Нет, не победил. При каждом обновлении L_Dogovor докомпилирую обработчик событий, а потом к результату добавляю колонку вручную через конфигуратор. Свежий атлантис 5.5.18 ничего не изменил.

И причины выяснить не удалось. Источник рантайма, понятное дело, - не код на VIPе, а EXE/DLL, причины в них только разработчики могут найти. А разработчик один раз отметился в теме банальным советом и более интереса не проявлял.

Re: Проблема с докомпиляцией интерфейса в 9.1

Добавлено: 23 апр 2014, 10:55
edward_K
Ну зачем же вручную - можно же раз добавить и выгрузить в скрипт. Собирать нужно в один рес - сначала докомпиляцию, потом cnf.
Глупый вопрос - а собираете точно на рабочей базе и том же exe? Просто если нет, то и раньше были проблемы при сборке без внешнего атрибута. А вообще поскольку у меня клиентов много, то я за добавление путем, как писал выше - так я не привязываюсь к базе, и более того - не нужно следить за наличием атрибута - он сам создается, ну разве что он будет ссылочный - тогда надо его все таки проверить и создать.
Падать еще может пр сборке с vih не соответствующим ресурсам - мне приходится держать vih отдельно под каждый тип exe клиента. Попробуйте собрать только вашу докомпиляцию.

Re: Проблема с докомпиляцией интерфейса в 9.1

Добавлено: 23 апр 2014, 11:16
Den
Ясно :)
Прокатывает кажись еще через ExtendFormats. По крайней мере у меня не упало.

Re: Проблема с докомпиляцией интерфейса в 9.1

Добавлено: 23 апр 2014, 12:46
LaaLaa
Сегодня потратил 50 минут. Скомпилировал пример KATZ. Подтверждаю пример KATZ корректный, функция cfsCreateObject действительно падает.

Жаль что кроме форума в техподдержку не написали.
По ночам мне спасть хочется, а не компилировать.
А на работе у меня сейчас другой проект не могу все отслеживать.

Re: Проблема с докомпиляцией интерфейса в 9.1

Добавлено: 24 апр 2014, 12:59
Den
102.132431

Кстати, если добавляешь по аналогии не в бравсе а в скрин - то все работает