Имя: Пароль:
1C
1С v8
Проведение документа программно и "руками"
0 Soulseller76
 
09.10.18
17:57
Всем привет.
У меня есть обработка, которая загружает данные в документ ПКО.
Так вот, наткнулась на странную особенность.
1. Если в момент создания документа создать к нему Контрагента, то документ не проведется программно. Но записать себя даст.
2. Руками проводится без каких-либо ошибок.
3. При повторной загрузки данного документа (контрагент уже в системе есть, он не создается), документ проводится без вопросов.

Блин, что я не так делаю?!
Сравнивала реквизиты документа ДО и ПОСЛЕ проведения - ничего не меняется.
Нашла что ошибка возникает при попытке сделать запись в РегистрНакопления.РасчетыСКлиентами (где именно в коде - пока не нашла, тьма окон открывается). Но опять же, тут же руками проводишь - все отлично.
1 AlvlSpb
 
09.10.18
17:59
(0) А Контрагент создаваемый программно Записывается? Если ДА, то раньше чем проведение ПКО?
2 Soulseller76
 
09.10.18
18:00
(1) Обижаешь. Конечно. )
3 Timon1405
 
09.10.18
18:00
а точно в документ подставляется ссылка а не объект контрагента?
4 Soulseller76
 
09.10.18
18:01
Это КА 2.2
Создаю сначала Партнера, потом Контрагента, у него устанавливаю реквизит Партнер.
5 Soulseller76
 
09.10.18
18:02
(3) Точно. Иначе бы не встала. Реквизит же имеет Тип Справочник.Ссылка
А в документе Реквизит Контрагент - заполнен. И Партнер тоже заполнен.
6 Soulseller76
 
09.10.18
18:04
Причем, перезапись контрагента в справочнике Контрагенты - никак не влияет на последующую загрузку документа. То есть, если перезаписать контрагента, а потом заново сделать документ - не запишется. А вот если предыдущий руками провести... Тогда запишется.
У меня есть ОЧЕНЬ большой подозрение, что при проведении ПКО делается какая-то запись в какой-то регистр... Но вот куда?!
И как это попытаться найти.
7 AlvlSpb
 
09.10.18
18:05
(2) Какую дату указываешь при создании ПКО? Если никакой, то может по умолчанию подтягивается текущая с временем 00.00, а при создании полностью текущая? Посмотри отладчиком
8 AlvlSpb
 
09.10.18
18:06
блииин читать "а при создании справочника Контрагента - полностью текущая"
9 Soulseller76
 
09.10.18
18:08
(7) Дата 100% прописывается по алгоритму. Всегда при проблемах при записи документа - именно дату проверяю.
10 Soulseller76
 
09.10.18
18:09
(8) Тогда не понятно, почему не проводится при втором прогоне (если не провести предыдущий).
Нет, не в дате тут дело. ((((((
11 Soulseller76
 
09.10.18
18:11
Капец!
Ради эксперимента сделала сначала записать (ну, раз уж записывается), а потом тут же! Провести.
И все провелось...
Что это было?!!!!!!!!!!!!!!!!!!!!!
12 AlvlSpb
 
09.10.18
18:15
(11) Не понял, а код можно как проводила. Потому что Док.Записать(РежимЗаписиДокумента.Проведение) - это и есть запись и проведение
13 AlvlSpb
 
09.10.18
18:15
При это естественно Док - это документ объект
14 lodger
 
09.10.18
18:17
(11) ну так загляни в код проведения в подписки там всякие.
еще прикольно включить в отладке "остановка по ошибке".
и смотреть откуда ноги растут.
15 lodger
 
09.10.18
18:18
(11) вангую - дело в наличии валидной ссылки на документ.
в самом документе это как-то обыграно, а у вас нет.
16 Soulseller76
 
09.10.18
18:21
(15) Но почему тогда все реквизиты до и после проведения документа одинаковые. Это первый вопрос.
Второй. Я же каждый раз УДАЛЯЮ предыдущий документ и создаю новый.
17 Soulseller76
 
09.10.18
18:21
НачатьТранзакцию();
            Попытка
                НовыйПКО.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
                ЗафиксироватьТранзакцию();
                //Возврат Истина;
            Исключение
                ОтменитьТранзакцию();
                НеПровелось = Истина;            
            КонецПопытки;
18 Soulseller76
 
09.10.18
18:23
(14) Остановка по ошибке срабатывает только когда вываливается в процедуру мной созданную, а именно:

НовыйПКО.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);

Говорит - не могу провести!
19 AlvlSpb
 
09.10.18
18:27
(17) Это НЕ рабочий код? Попробуй убрать НачатьТранзакцию и ЗафиксироватьТранзакцию. Может проблема как раз в блокировках?
20 AlvlSpb
 
09.10.18
18:30
И почему режим проведения Неоперативный? Как раз в данном случае нужен Оперативный (текущее время)
21 Soulseller76
 
09.10.18
18:30
(19) ок. Сейчас попробую.
22 AlvlSpb
 
09.10.18
18:31
Я бы упростил код.
Попытка
             НовыйПКО.Записать(РежимЗаписиДокумента.Проведение);

            Исключение
               Сообщить("Не проведено");            
            КонецПопытки;
23 Cyberhawk
 
09.10.18
18:35
(22) Не надо "Сообщить". Надо "СообщениеПользователю" :)
24 Soulseller76
 
09.10.18
18:44
(22) Исправила.
Но все равно, результат тот же ((((((((((
25 rphosts
 
09.10.18
18:46
(2) когда ручками делаешь у тебя куча кода дорм элемента справочника, документа отрабатывает - туда и копай
26 rphosts
 
09.10.18
18:47
*дорм = форм
27 Soulseller76
 
09.10.18
18:49
(26) Блин, видимо, это остался единственный вариант...

А сроки пожимают (((((((((((((
28 rphosts
 
09.10.18
18:51
(27) если поджимают - начни с формы элемента справочника Контрагенты
29 Soulseller76
 
09.10.18
18:55
(28) Не понимаю, почему там копать?
Ведь при перезаписи контрагента проблема не решается. Только проведение созданного документа.
30 rphosts
 
09.10.18
18:56
(29) я-бы начал с той стороны
31 rphosts
 
09.10.18
18:57
ну или промежуточный вариант: создаю ручками контрагента, а документ программно... если проводится - дело в справочнике, если нет - в документе
32 Soulseller76
 
09.10.18
18:59
(31) Сейчас так и попробую.
Спасибо за идею.
33 Soulseller76
 
09.10.18
19:04
(31) Руками завела контрагента. Программно документ. Контрагент в списке нашелся, но документ не провелся.
Но Записался. А Потом провелся.
34 AlvlSpb
 
09.10.18
19:16
(33) РежимПроведенияДокумента.Неоперативный остался?
35 AlvlSpb
 
09.10.18
19:22
Неоперативный режим проведения предусматривает, проведение задним числом, т.е. док должен быть минимум записан, чтобы появилась дата которой и надо неоперативно проводить. У вас создается док, не записан, дата не установлена. Может поэтому и не проводит?
36 breezee
 
09.10.18
20:11
(17) Прочитайе, пожалуйста, зачм нужна явная транзакция в 1с
37 Soulseller76
 
10.10.18
09:17
(34) нет, удалила.
38 Soulseller76
 
10.10.18
09:17
(35) Дата устанавливается принудительно при создании документа. Второй строкой идет после СоздатьДокумент()
39 Soulseller76
 
10.10.18
09:21
(36) Да, спасибо. Я вижу теперь свою ошибку с транзакциями.
Удалила.
40 Cyberhawk
 
10.10.18
09:32
(39) Так нет никакой ошибки
41 unregistered
 
10.10.18
09:36
(0) Попробуйте разделить транзакции.
Сначала - создавайте и записывайте все новые объекты, которые понадобятся для вашего документа (в т.ч. контрагентов и партнёров). Завершаете эту транзакцию.
Потом - создаёте документ и заполняете его ссылками на ранее созданные элементы. Завершаете вторую транзакцию.

Или вообще откажитесь от явного использования транзакций.
42 unregistered
 
10.10.18
09:38
(0) > ошибка возникает при попытке сделать запись в РегистрНакопления.РасчетыСКлиентами

Возможно, что при записи контрагента вы забываете установить какие-либо критичные реквизиты. Вы там случайно не делаете запись контрагента в режиме ОбменДанными.Загрузка = Истина ?
43 unregistered
 
10.10.18
09:39
У вас два вариант:
1. Показать тут весь код.
2. Научиться пользоваться отладчиком.
44 Soulseller76
 
10.10.18
09:47
(43) Я умею им пользоваться. Проблема в том, что КА + БитФинанс ужасно сложная конфигурация, которая своей запутанностью ставит меня просто в ступор. )))))
45 Soulseller76
 
10.10.18
09:49
(40) Я про другое.
Я не завершала Транзакцию, когда документ не проводился, а продолжала попытки его записать. И у меня появлялись записи "В этой транзакции уже происходили ошибки". )
Это слегка озадачивало.
46 dmpl
 
10.10.18
09:54
(0) Скорее всего не все регистры заполняются при программном создании контрагента.
47 Soulseller76
 
10.10.18
09:55
Как-то так:

НовыйПКО = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();
НовыйПКО.Дата  = ДатаЧека;
НовыйПКО.Касса = КассаДокумента;
Организация = Справочники.Организации.НайтиПоНаименованию("ООО ""ЧЧЧЧ""", Истина);
НовыйПКО.Организация  = Организация;
НовыйПКО.ХозяйственнаяОперация  = Перечисления.ХозяйственныеОперации.ПоступлениеОплатыОтКлиента;
НовыйПКО.СуммаДокумента         = СуммаДокумента;
НовыйПКО.Валюта = ВалютаРегламентированногоУчета;                
НовыйПКО.Подразделение = НовыйПКО.Касса.Подразделение;
                
КонтрагентСуществует = НайтиКонтрагентаПоИННКПП(ИННКонтрагента, КППКонтрагента);

Если КонтрагентСуществует <> Неопределено Тогда
    ПартнерСуществует = КонтрагентСуществует.Партнер;    
Иначе
    ПартнерСуществует = НайтиПартнераПоКодуИзКис(КодКонтрагентаИзКис);
    
    Если ПартнерСуществует <> Неопределено Тогда
        КонтрагентСуществует    = НайтиКонтрагентаПоПартнеру(ПартнерСуществует);
    КонецЕсли;
КонецЕсли;
                
Если КонтрагентСуществует = Неопределено и ПартнерСуществует = Неопределено Тогда
    ОбъектБылСоздан = СоздатьПартнераНаСервере(ТаблицаДанныхДляДокумента[0], ПризнакЗагружаемыхДанных, Организация);
    Если ОбъектБылСоздан <> Неопределено Тогда
        КонтрагентСуществует    =  ОбъектБылСоздан;
        ПартнерСуществует       =  КонтрагентСуществует.Партнер;
    Иначе
        КонтрагентСуществует    =  Справочники.Контрагенты.ПустаяСсылка();
        ПартнерСуществует       =  Справочники.Партнеры.ПустаяСсылка();
    КонецЕсли;
КонецЕсли;

НовыйПКО.Контрагент     = КонтрагентСуществует;                    
//НовыйПКО.Комментарий            = "Выручка за "+Формат(ДатаНовогоДокумента, "ДЛФ=Д");

НовыйПКО.ПринятоОт              = Строка(НовыйПКО.Контрагент);
НовыйПКО.Основание              = "Доставка корреспонденции от юридических лиц";
НовыйПКО.Приложение             = "Суточный отчет с гашением от "+Формат(ДатаЧека, "ДЛФ=Д");

РасшифровкаПлатежа                                  = НовыйПКО.РасшифровкаПлатежа.Добавить();
РасшифровкаПлатежа.Партнер                          = ПартнерСуществует;
РасшифровкаПлатежа.СтатьяДвиженияДенежныхСредств    = Справочники.СтатьиДвиженияДенежныхСредств.ПоступлениеОплатыОтКлиента;
РасшифровкаПлатежа.Подразделение                    = НовыйПКО.Касса.Подразделение;
РасшифровкаПлатежа.СтавкаНДС                        = Перечисления.СтавкиНДС.НДС18;

СуммаНДС                                            = СуммаДокумента*18/118;
РасшифровкаПлатежа.СуммаНДС                         = Окр(СуммаНДС, 2);
РасшифровкаПлатежа.Сумма                            = СуммаДокумента;
КонецЕсли;

НеПровелось = Ложь;

Попытка
    НовыйПКО.Записать(РежимЗаписиДокумента.Проведение);
Возврат Истина;
Исключение
    НеПровелось = Истина;            
КонецПопытки;    

Если НеПровелось Тогда
    Попытка
        НовыйПКО.Записать(РежимЗаписиДокумента.Запись);
    Исключение
        ЕмайлОтветственного = ПолучитьЕМайлОтветственногоПоКассе(НовыйПКО.Касса);
        ПисьмоОтправлено = ОтправитьПисьмоРугательное(НовыйПКО, ЕмайлОтветственного);                
        Возврат Ложь;
    КонецПопытки;
КонецЕсли;
48 Cyberhawk
 
10.10.18
09:56
(45) "когда документ не проводился, а продолжала попытки его записать" // Так в том коде нет этого. В том коде если документ не проводится, то код уходит в исключение с отменой транзакции. Где там повторение попытки записи?
49 Cyberhawk
 
10.10.18
09:57
А, у тебя видимо начао транзакции было до первой попытки записи, а фиксация/отмена - после второй
50 Soulseller76
 
10.10.18
09:57
Это код создания Партнера/Контрагента

Функция СоздатьПартнераНаСервере(МассивСДанными, ПризнакЗагружаемыхДанных, ТекОрганизация)
    
    Ошибка = Ложь;
    
    НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
    
    НовыйПартнер                    = Справочники.Партнеры.СоздатьЭлемент();
    НовыйПартнер.Клиент             = Истина;
    НовыйПартнер.Наименование       = МассивСДанными.Customers;
    НовыйПартнер.НаименованиеПолное = МассивСДанными.Customers;
    
    ДопРеквизиты = НовыйПартнер.ДополнительныеРеквизиты.Добавить();
    ДопРеквизиты.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Код из КИС");
    ДопРеквизиты.Значение =    МассивСДанными.CustomerNumber;
    
    НовыйПартнер.ЮрФизЛицо      = Перечисления.КомпанияЧастноеЛицо.Компания;
    
    НовыйПартнер.Комментарий        = "Создан выгрузкой из КИС";
    
    Попытка
        НовыйПартнер.Записать();    
        ТекущийПартнер = НовыйПартнер.Ссылка;
    Исключение
        Ошибка = Истина;
    КонецПопытки;
    
    НовыйКонтрагент         = Справочники.Контрагенты.СоздатьЭлемент();    
    
    НовыйКонтрагент.ЮрФизЛицо           = Перечисления.ЮрФизЛицо.ЮрЛицо;
    НовыйКонтрагент.Наименование        = МассивСДанными.Customers;
    НовыйКонтрагент.НаименованиеПолное  = МассивСДанными.Customers;
    НовыйКонтрагент.ИНН                 = МассивСДанными.CustomerINN;
    НовыйКонтрагент.Кпп                 = МассивСДанными.CustomerKPP;
    НовыйКонтрагент.Партнер             = ТекущийПартнер;        
    
    Попытка
        НовыйКонтрагент.Записать();
        ТекущийКонтрагент = НовыйКонтрагент.Ссылка;
    Исключение
        Ошибка = Истина;
    КонецПопытки;  
    
    НовыеКлючиАналитики = Справочники.КлючиАналитикиУчетаПоПартнерам.СоздатьЭлемент();
    НовыеКлючиАналитики.Наименование = Строка(ТекущийКонтрагент)+"; "+Строка(ТекОрганизация)+";"+Строка(ТекущийПартнер);
    НовыеКлючиАналитики.Партнер      = ТекущийПартнер;
    НовыеКлючиАналитики.Организация  = ТекОрганизация;
    НовыеКлючиАналитики.Контрагент   = ТекущийКонтрагент;
    
    Попытка
        НовыеКлючиАналитики.Записать();
        ТекущийКлючАналитки = НовыеКлючиАналитики.Ссылка;
    Исключение
        Ошибка = Истина;
    КонецПопытки;
    
    МенеджерЗаписи = РегистрыСведений.АналитикаУчетаПоПартнерам.СоздатьМенеджерЗаписи();
    
    МенеджерЗаписи.Партнер      = ТекущийПартнер;
    МенеджерЗаписи.Организация  = ТекОрганизация;
    МенеджерЗаписи.Контрагент   = ТекущийКонтрагент;
    МенеджерЗаписи.КлючАналитики= ТекущийКлючАналитки;
    
    Попытка
        МенеджерЗаписи.Записать();
    Исключение
        Ошибка = Истина;
    КонецПопытки;
    
    ЗафиксироватьТранзакцию();
    
    Если НЕ Ошибка Тогда
        Возврат ТекущийКонтрагент;
    Иначе
        Возврат Неопределено;
    КонецЕсли;
    
КонецФункции
51 Soulseller76
 
10.10.18
09:58
(49) Да ) Не учла особенности )
52 Михаил Козлов
 
10.10.18
10:24
Может быть из-за какая-то "бяки" с созданием ключей аналитики по партнерам и записью в РС Аналитика учета по партнерам.
53 Soulseller76
 
10.10.18
13:00
(52) Да вроде нет. Хотя, надо вот что посмотреть - при проведении документа - не появляется ли новая запись в РС Аналитика учета.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший