Имя: Пароль:
1C
1C 7.7
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
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) !!!! НУ, ребята, вы реально мегамозги и живые дебаггеры!!! Спасибо огромное, заработало! Фухх!