|
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
|
Большое спасибо всем за замечания и подсказки.
Тема закрыта. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |