Имя: Пароль:
1C
1C 7.7
v7: Программная запись элемента подчиненного справочника
,
0 ch53
 
17.11.11
10:11
ОС - Windows XP SP2;  
1Cv7.7 - 7.70.027 Бухгалтерия - 7.70.530

Много раз говорили на тему о программной записи элемента подчиненного справочника. Но может кто сталкивался с подобным.
Пишу загрузчик данных из сторонней программы.
Есть справ."Контрагенты" и подчиненный справ."Договоры".
Необходимо создать новый договор у данного контрагента.
...
СпрДог = СоздатьОбъект("Справочник.Договоры");
СпрДог.ИспользоватьВладельца(Контр);
СпрДог.ИспользоватьДату(РабочаяДата());
СпрДог.НайтиПоНаименованию(ИмяДоговора,1,1);
Если СпрДог.Выбран()=0 Тогда
   СпрДог.Новый();
   СпрДог.Наименование = Строка(ИмяДоговора);
   СпрДог.ДатаВозникновенияОбязательства = Строка(РабочаяДата());
   СпрДог.ДатаПогашенияОбязательства = Строка(РабочаяДата());
   СпрДог.Записать();
КонецЕсли;
Дог = СпрДог.ТекущийЭлемент();
...
Задача не сложная. Но после отработки модуля, в справочнике договоров
нового договора не появляется. Ошибок не выдает. В отладчике смотрел - всё формируется и заполняется.
Подскажите. В чем дело?
1 Рэйв
 
17.11.11
10:18
(0)Контр как получаешь?
2 1Сергей
 
17.11.11
10:19
СпрДог.Новый();
СпрДог.Владелец = Контр;
3 chief accountant
 
17.11.11
10:21
Искать по наименованию дубль, эээ как бэ...
4 Patrio_
O_Muerte
 
17.11.11
10:21
Контр.Вид()
Контр.ТекущийЭлемент()
ТипЗначенияСтр(Контр)

Чему равны в отладчике?
5 Chum
 
17.11.11
10:22
СпрДог.ИспользоватьДату(РабочаяДата()); - убрать нафиг

Если СпрДог.НайтиПоНаименованию(ИмяДоговора,1,1) = 0 Тогда
СпрДог.Новый();
...
СпрДог.Записать();

СпрДог.КакойтоПериодическийРеквизит.Установить( Значение, Рабочадата() );

// записать здесь уже не применяется, т.к. периодика лежит в другом объекте.

Постоянно создаю подчиненные элементы. бывает и с трехэтажным подчинением. все работает нормально.
6 Chum
 
17.11.11
10:24
кстати, а зачем Строка(ИмяДоговора); ?

ИмяДоговора не есть строка, а что-то другое? Зачем преобразование? имхо СокрЛП тут более уместно, если загрузка из excel-я идет
7 Chum
 
17.11.11
10:27
(4) ругнулось бы "не задан владелец"
8 ch53
 
17.11.11
10:38
(6) Загрузка производится из текстового файла. Наименование контрагента и наименование договора формируются в другой программе, в виде ID-кода. Затем поиск с контролем реквизита, и получаем "Контр" в виде объекта.  "ИмяДоговора" - текст. Согласен, что для него лучше "СокрЛП", а не "Строка".
9 Patrio_
O_Muerte
 
17.11.11
10:39
(0)Кстати есть вариант, что ты просто неправильно смотришь.
Попробуй сделать запрос к справочнику и отсотируй по коду или по какому нибудь признаку, который поможет определить что количество договоров не изменилось
10 Patrio_
O_Muerte
 
17.11.11
10:40
+(9)И кстати ответь у тебя в отладчике в условие входит то или нет?
11 1Сергей
 
17.11.11
10:40
>>Согласен, что для него лучше "СокрЛП", а не "Строка".

Давай зачётку
13 Rie
 
17.11.11
10:42
(8) Контр - это у тебя созданный СоздатьОбъект("Справочник.Контрагенты")?
Используй Контр.ТекущийЭлемент().
14 ch53
 
17.11.11
10:44
(13)Контр - это уже найденный элемент справочника Контрагенты.
15 Рэйв
 
17.11.11
10:47
(14)Это не делает Контр текущим элементом
16 1Сергей
 
17.11.11
10:47
(15)+1
17 Rie
 
17.11.11
10:47
(14) Покажи оператор присваивания Контр.
18 Рэйв
 
17.11.11
10:50
(17) да он судя по всему сделал просто Контр.НайтиПо....
19 Rie
 
17.11.11
10:52
(18) На это и пытаюсь намекнуть.
Возможен также вариант, что у него
Контр = спрКонтрагенты.НайтиПо...
20 Рэйв
 
17.11.11
10:53
(19)Это еще хуже. Будет число тогда
21 Rie
 
17.11.11
10:54
(20) Вот и интересен ответ ТС.
22 ch53
 
17.11.11
10:55
(17)
...
Процедура НайтиКонтрагента(Код, КвоЗн)
   Контр = "";
   Код = СокрЛП(Строка(Код));
   КолЗн = СтрДлина(Код);
   Если КолЗн>КвоЗн Тогда
        Сообщить("Кол-во знаков в IDКоде контрагента больше, чем определено конфигурацией 1С.","!");
        Возврат;
   ИначеЕсли КолЗн<КвоЗн Тогда
       СпрК.ВыбратьЭлементы();
       Пока СпрК.ПолучитьЭлемент(1)=1 Цикл
            Контр = СпрК.ТекущийЭлемент();
            Если СокрЛП(Контр.IDCools)=Код Тогда
             Прервать;
            Иначе
             Контр = "";
            КонецЕсли;
       КонецЦикла;
       Если ПустоеЗначение(Контр)=1 Тогда
            ОшибкаЗагрузки(Код+" - Контрагент с таким кодом IP-Cools в справочнике ""Контрагенты"" не найден.");
            Возврат;
       КонецЕсли;
   КонецЕсли;
   
КонецПроцедуры    //НайтиКонтрагента()
...
Вот сама процедура, которая формирует переменную Контр.
23 1Сергей
 
17.11.11
10:56
(22) ты (2) попробовал?
25 Rie
 
17.11.11
10:58
(22) Извращение, конечно... Но пусть...
Контр - глобальная переменная? Или просто никак не описана?
26 Рэйв
 
17.11.11
10:59
(22)Жосткий поиск однако...:-)
27 Rie
 
17.11.11
10:59
+(25) И ответь на (4).
28 Rie
 
17.11.11
11:00
(22) Кстати, а что происходит, когда КолЗн=КвоЗн?
Не в этом ли прикол?
29 KishMish
 
17.11.11
11:00
возмоджно при посике по наименванию сбивается настройки пвладельца
я бы посоветовал при создании нового заново указывать владельца
30 KishMish
 
17.11.11
11:04
+(29)
СпрДог.ИспользоватьВладельца(Контр);
СпрДог.Новый();
   СпрДог.Наименование = Строка(ИмяДоговора);
   СпрДог.ДатаВозникновенияОбязательства = Строка(РабочаяДата());
   СпрДог.ДатаПогашенияОбязательства = Строка(РабочаяДата());
   СпрДог.Записать();
31 ch53
 
17.11.11
11:15
(4)(27) Контр в отладчике показывает элемент справочника.
(28)Нет. Прикол не в этом. КвоЗн - кол-во зн. зарезервированное для кода. КолЗн - кол-во зн. которые имеются в коде на данный момент.
(29) Я так тоже сначала подумал. Но в отладчике Контр позволяет спокойно увидеть ему принадлежащие реквизиты.
32 ch53
 
17.11.11
11:17
(30) Вашу конструкцию без поиска использовать нельзя, т.к. возможно на данный момент такой договор существует.
34 Rie
 
17.11.11
11:18
(31) И если КвоЗн=КолЗн, то контрагент НЕ ищется - так написано в (22)
35 ch53
 
17.11.11
11:20
(33) А вот за это отдельное спасибо!
Не заметил вовремя...
36 1Сергей
 
17.11.11
11:22
- Доктор, почему меня все игнорируют?
- Следующий!
©
37 gp42
 
17.11.11
11:24
Попробуй перебором

...
СпрДог = СоздатьОбъект("Справочник.Договоры");
СпрДог.ИспользоватьВладельца(Контр);
СпрДог.ИспользоватьДату(РабочаяДата());
СпрДог.ВыбратьЭлементы(1);
ДоговорНайден = 0;
Пока СпрДог.ПолучитьЭлемент()=1 Цикл

Если СокрЛП(СпрДог.Наименование)=СокрЛП(ИмяДоговора) Тогда
ДоговорНайден = 1;
Прервать;
КонецЕсли;
КонецЦикла;
Если ДоговорНайден = 0 Тогда
   СпрДог.Новый();
   СпрДог.Наименование = СокрЛП(ИмяДоговора);
   СпрДог.ДатаВозникновенияОбязательства = Строка(РабочаяДата());
   СпрДог.ДатаПогашенияОбязательства = Строка(РабочаяДата());
   СпрДог.Записать();
КонецЕсли;
Дог = СпрДог.ТекущийЭлемент();
...
38 ch53
 
17.11.11
11:26
(36) Варианта (2) не проверял. Жестковатый режим.
39 1Сергей
 
17.11.11
11:32
(38) жестковатый? о_О
ну, делай помягче...
40 Rie
 
17.11.11
11:34
(38) После того, как контрагенты с кодом правильной длины начали находиться - проблема исчезла?
Ну и на всякий случай - есть у справочников замечательный метод НайтиПоРеквизиту. С его помощью можно избавиться от цикла в (22).
41 ch53
 
17.11.11
11:37
(37) Спасибо за совет. Я уже думал над этим. Проверю - отпишусь.
(40) Метод НайтиПоРеквизиту действительно хороший, но вот использовать его можно не всегда. Существует ограничение, которое я перешагнуть не могу.
42 ch53
 
17.11.11
11:42
Всем кто был со мной на связи большое спасибо. Я сейчас вас покину. Начальство напрягает. Надеюсь сегодня попробовать некоторые варианты, а завтра снова буду здесь. До свидания.
43 gp42
 
17.11.11
11:46
(0) Защита информации на уровне - Двойной Контур?
БД во внутреннем контуре, где нет инета ?
44 ch53
 
18.11.11
12:44
Здравствуйте все кто откликнулся на моё обращение.
Вопрос я решил. Все дело было в спешке. Как всегда - "Надо еще вчера!...".
Действия, производимые со справочниками "Контрагенты" и "Договоры" находятся в теле транзакции. А транзакцию необходимо фиксировать. Вот эту-то команду я и забыл, а отсюда результат - есть выполнение всех команд, но нет отражения результата в справочнике "Договоры" и нет индикации ошибки. Кстати, понял одну вещь - при подобных действиях с подчиненными справочниками, наиболее стабильная и быстрая отработка алгоритма происходит в том случае, когда передача параметра Контр в команду СпрДог.ИспользоватьВладельца(Контр) производится в теле одной процедуры, т.е. уменьшается вероятность потери значения Контр.
45 ch53
 
18.11.11
12:46
Большое спасибо всем за замечания и подсказки.
Тема закрыта.