|
v7: проблема с программной записью периодического реквизита | ☑ | ||
---|---|---|---|---|
0
napagokc
31.01.12
✎
10:13
|
Уже полдня угрохал, не могу понять, что не так... Переношу доки прихода из 1С8.2 в 1С7.7 через ОЛЕ (да-да, из восьмерки в семерку, так надо). С с переносом документов проблем нет, все создается. Проблема возникает при программном создании товара в 7.7. Точнее, установки у него периодического реквизита - ставки НДС. И даже более того, эта проблема возникает лишь у некоторых товаров - у порядка 10% от всех создаваемых программным путем. То есть, 90% товаров создаются без проблем, периодический реквизит заносится, все ок. А у некоторых из конструкции Попытка-Исключение, вылетает в исключение. Что к чему - не могу понять. Лезу в справочник Номенклатуры в 7.7 - некоторые товары, несмотря на вылетевшее в исключение, создаются, а некоторые нет. Лезу в док прихода, в котором должен появиться этот товар - в доке прихода есть даже те товары, которых не видно в номенклатуре. И тут я вообще уже не понимаю что-кого. Я с семеркой плохо знаком... как так может быть, что в справочнике "Номенклатура" товара нет, но в док прихода этот товар есть и даже можно выбрать его? О_о
Код по программному созданию товара ниже (все лишнее удалил): Функция ПолучитьТовар(Товар, Дата) Ном = БазаПриемник.CreateObject("Справочник.Номенклатура"); Ном.Новый(); Ставка = ПолучитьСтавкуНДС(УстановкаРеквизитовТовараНДС(Дата, Товар).Ставка); Попытка Ном.Записать(); Сообщить("Добавлен товар: " + Товар, СтатусСообщения.Информация); Попытка //БазаПриемник.УстановитьРеквизитСправочника(Ном, "СтавкаНДС", Ставка, Дата); Ном.СтавкаНДС.Установить(Дата, Ставка); Исключение Сообщить("[Док от " + Дата + "] Не удалось записать ставку НДС для товара '" + Товар + "' по причине:" + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.ОченьВажное); КонецПопытки; Исключение Сообщить("[Док от " + Дата + "] Не удалось записать товар '" + Товар + "' по причине:" + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.ОченьВажное); КонецПопытки; Возврат Ном.ТекущийЭлемент(); КонецЕсли; КонецФункции //ПолучитьТовар |
|||
1
miki
31.01.12
✎
10:15
|
>>как так может быть, что в справочнике "Номенклатура" товара нет, но в док прихода этот товар есть и даже можно выбрать его
отборы, иерарархия... |
|||
2
napagokc
31.01.12
✎
10:16
|
(1) Убираю иерархию полностью - не видит товар и все тут ((
|
|||
3
miki
31.01.12
✎
10:17
|
(2)некоторые при сортировке по коду не могут найти нужный товар...
|
|||
4
napagokc
31.01.12
✎
10:17
|
в (0) на "КонецЕсли;" не обращайте внимание - забыл удалить. К делу не относится
|
|||
5
miki
31.01.12
✎
10:18
|
Ставка - это какой базы переменная? и в какую присваиваешь/пишешь?
|
|||
6
napagokc
31.01.12
✎
10:18
|
(3) Не, я вручную в справочнике Номенклатуры при просмотре без иерархии товар не вижу. А вручную же при просмотре документа прихода, вижу этот товар и могу его перевыбрать изнутри этого документа.
|
|||
7
miki
31.01.12
✎
10:19
|
(6)ставлю на отбор
|
|||
8
Rie
31.01.12
✎
10:19
|
(4) То есть, не работает у тебя один код, показываешь - другой?
Что такое ПолучитьСтавкуНДС и УстановкаРеквизитовТовараНДС? Какую именно ошибку выдаёт? |
|||
9
napagokc
31.01.12
✎
10:19
|
(5) Ставка находится верно. Это СОМ-объект базы 7.7
|
|||
10
Godofsin
31.01.12
✎
10:21
|
(0) Вроде же нельзя в клюшках использовать системные имена функций для переменных, не?
|
|||
11
efim16rus
31.01.12
✎
10:21
|
База 7.7 файловая?
|
|||
12
napagokc
31.01.12
✎
10:23
|
(8) Ставка находится верно, не в ней дело. УстановкаРеквизитовТовараНДС находит ставку НДС в базе 8.2. ПолучитьСтавкуНДС - находит ассоциацию полученного результата в базе 7.7.
(11) Да, файловая |
|||
13
efim16rus
31.01.12
✎
10:24
|
Была как-то проблема с 7.7. Тоже выводились не все элементы справочников. Помогло тестирование и исправление ИБ.
|
|||
14
Rie
31.01.12
✎
10:24
|
(12) А в чём? Например, родитель не тот указан. Или ИспользоватьДату кто-нибудь сказал. Или код не уникальный... В коде из (0) обо всём этом - ни слова.
|
|||
15
KRV
31.01.12
✎
10:25
|
Ном.СтавкаНДС.Установить(Дата, Ставка); вот тут у тебя грабли. Со словом Дата. Смеяться после слова Лопата. Ох уж эти восьмерочники..
|
|||
16
Godofsin
31.01.12
✎
10:26
|
(15) Еще в (10) об этом сказал, проигнорировал.
|
|||
17
KRV
31.01.12
✎
10:27
|
и вообще - везде, где натолкал Дата, замени ее на что-нибудь более соответствующее правилам.. например "МояНахФиздатаяДата"
|
|||
18
Rie
31.01.12
✎
10:27
|
(15) Это вряд ли. Код этот - написан в 8-ке, там Дата ничему не помешает.
|
|||
19
napagokc
31.01.12
✎
10:27
|
(15) щас попробую заменить название... хотя почему у большинства товаров проканало - не понял...
(14) Родителя указываю явно, там все верно. Просто не стал приводить код. В исключение попадает именно про ставку НДС. То есть, в исключение про Ном.Запись() не попадает ни разу вообще |
|||
20
napagokc
31.01.12
✎
10:28
|
(16) не проигнорировал, а не догнал о чем речь :)
|
|||
21
Rie
31.01.12
✎
10:28
|
(16) Это не клюшки, это - снеговик. Посмотри на Символы.ПС и СтатусСообщения.ОченьВажное.
|
|||
22
KRV
31.01.12
✎
10:28
|
(16) этим "мышепрограммистам" надо повторять несколько раз :)) а документацию "оне ваще ничитают - мышка есть для этого"
|
|||
23
Rie
31.01.12
✎
10:29
|
(19) А нет ли в удалённом коде ИспользоватьДату()? Особенно в каком-нибудь условном операторе?
|
|||
24
Rie
31.01.12
✎
10:29
|
+(23) Ну и раскрой секрет ПолучитьСтавкуНДС - что там написано?
|
|||
25
dk
31.01.12
✎
10:30
|
про отладчик уже говорили? )
|
|||
26
napagokc
31.01.12
✎
10:32
|
изменения "Дата" на "ДатаДок" ни к чему не привело. Результат тот же.
(23) привожу полнуй код функции: Функция ПолучитьТовар(Товар, ДатаДок) Ном = БазаПриемник.CreateObject("Справочник.Номенклатура"); Если Ном.НайтиПоРеквизиту("КодДляВыгрузки", СокрЛП(Товар.Код), 1) Тогда Возврат Ном.ТекущийЭлемент(); Иначе Родитель = БазаПриемник.CreateObject("Справочник.Номенклатура"); Ном.Новый(); Ном.КодДляВыгрузки = СокрЛП(Товар.Код); Ном.Наименование = Товар.Наименование; Ном.ПолнНаименование = Товар.Наименование; Ном.ЕдиницаИзмерения = ПолучитьЕдиницуИзмерения(Товар.БазоваяЕдиницаИзмерения); Ном.СтранаПроисхождения = ПолучитьСтрану(Товар.Страна); Ном.Изготовитель = ПолучитьИзготовителя(Товар.Производитель); Ном.ТипНоменклатуры = БазаПриемник.Перечисление.ТипыНоменклатуры.Товар; Ставка = ПолучитьСтавкуНДС(УстановкаРеквизитовТовараНДС(ДатаДок, Товар).Ставка); Если Родитель.НайтиПоНаименованию("Перенос") Тогда Ном.Родитель = Родитель.ТекущийЭлемент(); КонецЕсли; Попытка Ном.Записать(); Сообщить("Добавлен товар: " + Товар, СтатусСообщения.Информация); Попытка Ном.СтавкаНДС.Установить(ДатаДок, Ставка); Исключение Сообщить("[Док от " + ДатаДок + "] Не удалось записать ставку НДС для товара '" + Товар + "' по причине:" + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.ОченьВажное); КонецПопытки; Исключение Сообщить("[Док от " + ДатаДок + "] Не удалось записать товар '" + Товар + "' по причине:" + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.ОченьВажное); КонецПопытки; Возврат Ном.ТекущийЭлемент(); КонецЕсли; КонецФункции //ПолучитьТовар |
|||
27
napagokc
31.01.12
✎
10:33
|
(24)
Функция ПолучитьСтавкуНДС(СтНДС) СтавкаНДС = БазаПриемник.CreateObject("Справочник.СтавкиНДС"); Если СтНДС = 0 Тогда СтавкаНДС.НайтиПоКоду("3"); ИначеЕсли СтНДС = 10 Тогда СтавкаНДС.НайтиПоКоду("2"); ИначеЕсли СтНДС = 20 Тогда СтавкаНДС.НайтиПоКоду("1"); ИначеЕсли СтНДС = 18 Тогда СтавкаНДС.НайтиПоКоду("6"); КонецЕсли; Возврат СтавкаНДС.ТекущийЭлемент(); КонецФункции //ПолучитьСтавкуНДС |
|||
28
Rie
31.01.12
✎
10:35
|
(27) Во время переноса с ИБ 7.7 работают (другие) пользователи?
|
|||
29
napagokc
31.01.12
✎
10:35
|
замечу, что если забыть про установку ставки НДС, то код работает корректно
|
|||
30
napagokc
31.01.12
✎
10:36
|
(28) Нет, я отлаживаю в локальных базах, чтоб никто не мешал
|
|||
31
napagokc
31.01.12
✎
10:36
|
+(30) к 7.7 подключаюсь в монопольном режиме
|
|||
32
dk
31.01.12
✎
10:38
|
тык что там с отладчиком
|
|||
33
efim16rus
31.01.12
✎
10:38
|
(проблема с программной записью периодического реквизита Попробуй базу 7.7 переиндексировать.
|
|||
34
Godofsin
31.01.12
✎
10:38
|
тогда (25), останову на исключение, и смотреть на "ставка" и другие переменные.
|
|||
35
Rie
31.01.12
✎
10:40
|
(27) Если в функцию ПолучитьСтавкуНДС добавить в конец условного оператора
Иначе Сообщить("Да что за фигню мне подсунули подсунули: "+СтНДС); Возврат ""; ошибка не исчезнет? |
|||
36
napagokc
31.01.12
✎
10:42
|
(34) Разумеется, я это все сделал. Говорю же - ломается именно на строчке
Ном.СтавкаНДС.Установить(ДатаДок, Ставка); "Ставка" - СОМ-Объект, данные просмотреть нельзя. Но при заходе в функцию ПолучитьСтавкуНДС() видно, что данные туда попадают верные |
|||
37
napagokc
31.01.12
✎
10:43
|
(35) ))) Не исчезнет. Данные от "проблемных" товаров попадают: "0", "10" и "18"
|
|||
38
Godofsin
31.01.12
✎
10:45
|
(37) Коды точно соответствуют Справочник.СтавкиНДС?
|
|||
39
napagokc
31.01.12
✎
10:45
|
(38) Да.
Пока пробую переиндексацию. База большая, долго индексует |
|||
40
Rie
31.01.12
✎
10:46
|
(37) Какая длина кода? Какой тип кода?
|
|||
41
KRV
31.01.12
✎
10:48
|
в ДатаДок у тебя где значение присваивается? Что там?
Ставка = ПолучитьСтавкуНДС(УстановкаРеквизитовТовараНДС(ДатаДок, Товар).Ставка); тут тоже что-то визуабельно как-то.. |
|||
42
napagokc
31.01.12
✎
10:59
|
Переиндексация не помогла
(40) Тип Кода в 7.7: Число, 5 знаков. По факту, в базе 7.7 всего 6 значений с кодами от 1 до 6, соответственно |
|||
43
slowpoke1C
31.01.12
✎
11:00
|
(15), (0) Точно, Дата - встроенная функция языка 7.7. Как я не сообразил?
|
|||
44
napagokc
31.01.12
✎
11:00
|
(41) ДатаДок - значение, которое передается в функцию. Это дата документа из 8.2.
|
|||
45
slowpoke1C
31.01.12
✎
11:01
|
(42) Замените переменную 'Дата' на что-нить типа 'ДатаПроведения'
|
|||
46
napagokc
31.01.12
✎
11:01
|
(43) с этим уже разобрались, дело было не в названии переменной.
|
|||
47
napagokc
31.01.12
✎
11:01
|
(45) Заменил уже давно, см код ниже
|
|||
48
Rie
31.01.12
✎
11:08
|
(42) Попробуй ему число подсовывать, а не строку в НайтиПоКоду. Или несколько более другую строку - например, " 3". Что-нибудь изменится?
|
|||
49
slowpoke1C
31.01.12
✎
11:10
|
(47) Иногда помогает замена клюшечных русских операторов на англоязычные аналоги? т.е. ДатаДок = DocDate, ВыбратьСтроки() = SelectLines() и т.п.
Как вариант, написать в глобальном модуле клюшек процедуру с ключевым словом 'Экспорт', а в эту процедуру передавай параметры, причём __только строки, числа и даты__ |
|||
50
napagokc
31.01.12
✎
11:14
|
(49) Что ж вы к дате-то прикопались? Ее значение у меня фигурирует в "Сообщить", когда попадает в исключение - значение ДатаДок верное.
|
|||
51
Godofsin
31.01.12
✎
11:16
|
(50) Так тут только два варианта. Либо дата, либо ставка.
Пробуй (48), передавай число вместо строки. |
|||
52
napagokc
31.01.12
✎
11:20
|
(49), (51) Попробовал. Не помогло :(
|
|||
53
napagokc
31.01.12
✎
11:21
|
+(51) У меня стоят точки останова на "Сообщить" в исключениях. При этом, я могу по отладчику видеть значения ДатаДок и Ставка - они нормальные.
|
|||
54
napagokc
31.01.12
✎
11:29
|
Может у кого-то еще какие мысли появятся...
Когда запускаю обработку первый раз и попадаю в эту ошибку со ставкой, то товар все же записан, раз Ном.Записать() срабатывает без ошибок. Более того, когда запускаю обработку второй раз, программно ошибок на этом товаре не вылезает - то есть, он находится и подставляется в новый документ. Прерываю обработку, лезу смотреть в базу 7.7. Через записавшийся документ смотрю на товар, захожу в него - ставка НДС установлена верно (хотя вылетала в ошибку). Пытаюсь залезть в историю, но там все пусто... Кроме того, мне не понятно, почему же в ошибку попадает при программной установке ставки? На большинстве товаров не попадает, а на некоторых попадает... |
|||
55
napagokc
31.01.12
✎
11:30
|
можно было бы плюнуть и не обращать внимание, раз товар записывается. Но тут либо убрать сообщение (а вдруг что-то все же не запишется?), либо непонятно как объяснять заказчикам, что это за сообщение об ошибке и почему они не должны на него обращать внимание...
|
|||
56
Godofsin
31.01.12
✎
11:32
|
(55) А если убрать попытку на установить, какого рода ошибка тогда?
|
|||
57
napagokc
31.01.12
✎
11:33
|
(56) Та же самая, что и на Установить, например:
[Док от 13.12.2011 9:20:06] Не удалось записать ставку НДС для товара 'Глюкоза фл. 20% р-р 250 мл однопорт.' по причине: {Форма.Форма.Форма(126)}: Поле объекта недоступно для записи (Дата) |
|||
58
Ёпрст
31.01.12
✎
11:35
|
(0) это че за шляпа ?
>>>Если Ном.НайтиПоРеквизиту("КодДляВыгрузки", СокрЛП(Товар.Код), 1) Тогда >>>Если Родитель.НайтиПоНаименованию("Перенос") Тогда Это вообще не должно работать. Эти методы возвращают число, если что.. и их нужно с чем-то в условии сравнивать. Это тебе не снеговик |
|||
59
Тихий омут
31.01.12
✎
11:36
|
пара вопросов по коду, хотя может и не по теме:
Если Родитель.НайтиПоНаименованию("Перенос") Тогда нормально отрабатывает? Емнип, семерочный метод НайтиПоНаименованию возвращает 0/1, здесь оно автоматом преобразуется к восьмерочному типу булево? потом: Ном.СтавкаНДС.Установить(ДатаДок, Ставка); ДатаДок - как семерка переваривает дату в восьмерочном формате? или она здесь уже приведена к семерочному представлению? |
|||
60
Ёпрст
31.01.12
✎
11:37
|
+58 или ты этот код в снеговике выполняешь ?
Если да, то дату нужно передавать в формате клюшек - т.е без ввремени. |
|||
61
Тихий омут
31.01.12
✎
11:38
|
(60) наперегонки:)))
|
|||
62
Ёпрст
31.01.12
✎
11:38
|
(59) о ёпта, мысли сходятся
:) |
|||
63
napagokc
31.01.12
✎
11:38
|
(58) Это пишется в 1С8.2, поэтому они совершенно корректно работают
|
|||
64
Ёпрст
31.01.12
✎
11:39
|
(63) а вот с датой - явный косяк
|
|||
65
napagokc
31.01.12
✎
11:39
|
(59), (62) ооо! Попробую!
|
|||
66
napagokc
31.01.12
✎
11:41
|
(59), (62) !!!! НУ, ребята, вы реально мегамозги и живые дебаггеры!!! Спасибо огромное, заработало! Фухх!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |