Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

1С OLE запись - в полях значения "<>"


pogi ©   (2008-08-08 12:48:00) 

Помогите разобраться плиз!

При записи документа в 1С через OLE все успешно записываем, но потом в интерфейсе 1С в форме документа некоторые поля-справочники заполняются значением "<>". Не "<Объект не найден>", а просто "<>".
В эти поля значение вообще не передается.

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

Откуда берутся эти "<>" и как от них избавиться?

1С v.7.7 + MS SQL 2000 sp4


pogi   (2008-08-11 15:01:00) [1]

Разобрался с помощью добрых людей.

В некоторых справочниках были значения пустые строки. Соответственно, там где проверки на пустоту не было, 1С находил в справочнике пустую строку и успешно ссылался на нее. А символами "<>" в форме показываются вот такие поля - где значение выбрано, но 1С не может показать его.


pogi   (2008-08-11 14:28:00) [2]

Объект 1С создается так:
  try
   if VarIsNull(Handle1C) or VarIsEmpty(Handle1C) then
     Handle1C := ConnectTo1C_Application('V77S.Application', //имя сервера автоматизации
                                       // строка инициализации
                                       '/D"' + GetPath1C + '"',//директория, где Б.Д., с которой соединяемся
                                       //' /N' + ResStrE('LOGIN') +        //пользователь (имя)
                                       //' /P' + ResStr(OwnClsId,'PWD'),           //пароль
                                       '');                              //не грузится заставка
   if VarIsEmpty(Handle1C)  then
   begin
     MessageDlg(ResStrE('MES.1CNOSTART', 'LOSS'), mtInformation, [mbOk], 0);
     Exit;
   end else
   try
     Handle1CObj := ConnectTo1C_Object(Handle1C, 'Документ.<ИмяДокумента>');
     if VarIsEmpty(handle1CObj) then
     begin
       MessageDlg(ResStrE('MES.NODOC', 'LOSS'), mtInformation, [mbOk], 0);
       Exit;
     end
     else
     begin
       LogMessage('TfrmLossInit.SaveOle1C Создали документ', 6);
       try
         prNeedCreateNew := true;
         NumDoc := Loss.NUM;
         DtDoc := Loss.DT;
         if Trim(Loss.ID_LOSS_1C) <> '' then
           if (Handle1CObj.FindByNum(NumDoc, DtDoc)=1) then
           begin
             prNeedCreateNew := false;
           end;
         if prNeedCreateNew then
         begin
           Handle1CObj.New;
         end;


В базу 1С в эти поля пишутся значения вида "   0     " - и у меня и у заказчика одинаково.


Сергей М.   (2008-08-08 13:58:00) [3]

И если [6] соответствует действительности, то это означает, что среды не полностью идентичны - конфигурации (метаданные) одинаковые, а данные отличаются.


Сергей М.   (2008-08-08 13:54:00) [4]


> просто "<>"


Если не ошибаюсь, это означает , что ссылка на объект валидна, и этот объект имеет в атрибуте "Название" (или как его там ?) пустую строку.


Сергей М.   (2008-08-08 13:47:00) [5]


> и в объект 1С в соответствующем поле ничего не заполняю


А запись в объекте-документе кто и как создает, перед тем как начинает работать твоя ф-ция AddValFromSpr ?

И еще:


>  hSprObj := Unassigned; // <- это что, контрольный в голову что ли ? Зачем ?!
>  hSprObj := ConnectTo1C_Object(Handle1C, 'Справочник.'+nmSpr);
>


pogi   (2008-08-08 13:34:00) [6]

Просто эти поля не заполнялись в форме. Там код записи примерно такой:
if Loss.fNM_REASON <> '' then
 AddValFromSpr(Handle1CObj, 'ПричинаОтказа', Loss.fNM_REASON, 'ПричинаОтказа');
           
function AddValFromSpr(Handle1CObj: OleVariant; nmSpr, nmFind, nmField: string): Boolean;
var hSprObj:  OleVariant;
   str: string;
begin
 Result := False;
 LogMessage('Begin TfrmLossInit.AddValFromSpr', 6);
 hSprObj := Unassigned;
 hSprObj := ConnectTo1C_Object(Handle1C, 'Справочник.'+nmSpr);
 LogMessage('Справочник.'+nmSpr, 6);
 if not VarIsEmpty(hSprObj) then
 begin
   if (hSprObj.FindByDescr(Trim(nmFind), 0, 0)=1) then
   begin
     LogMessage('Справочник.'+nmSpr + ' - Нашли значение', 6);
     Handle1CObj.SetAttrib(nmField, hSprObj.CurrentItem);
     Result := True
   end;
 end;
 DisconnectFrom1C_Object(hSprObj);
 LogMessage('End TfrmLossInit.AddValFromSpr', 6);
end;


Соответственно если пол не заполнили, то и в объект 1С в соответствующем поле ничего не заполняю.

Конфигурации 1-в-1.


Сергей М.   (2008-08-08 13:23:00) [7]


> в объекте для данных полей значение ВООБЩЕ не выставляется


Это ради проверки сделано ? Или ты сознательно игнорируешь ссылочную целостность ?

А конфигурации в тестовой среде и у заказчика совпадают один-в-один ?


pogi   (2008-08-08 13:01:00) [8]

То что отличается - это понятно.
а при чем здесь локали? ведь это поля-справочники. а потом в объекте для данных полей значение ВООБЩЕ не выставляется.
Причем это относиться не ко всем подобным полям, а только к определенным.


Сергей М.   (2008-08-08 12:53:00) [9]

Значит тестовая среда чем-о отличается от рабочей среды у Заказчика.
Например, локали разные..


Наверх

Титульная страница Поиск, карта сайта Написать письмо