|   |   | 
| 
 | 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) !!!! НУ, ребята, вы реально мегамозги и живые дебаггеры!!! Спасибо огромное, заработало! Фухх!     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |