Имя: Пароль:
1C
1C 7.7
v7: Выкидывает из программы
0 maestro-72
 
19.02.18
21:19
Сделал обработку под видом подключаемой печатной формы в документе. Обработка формирует пко. После закрытия обработки программа тоже закрывается аварийно. Не могу понять почему. Сначала обработка была внутренняя, перенес во внешнюю, но ситуация не изменилась. Не могу понять что за ерунда. Документы ПКО формируются.
1 Casey1984
 
19.02.18
21:27
Ммм... а только из этой обработки выкидывает? А типовое ПКО? А ОС какая?
2 maestro-72
 
19.02.18
21:29
Ос win2008 пко создается и проводится нормально. Падает только когда создается этой обработкой из документа. Просто есть док маршрут, куда собираются документы для отгрузки, по некоторым создаются пко сразу. Вот когда ПКО созданы, закрывается обработка и валит сразу 1с ку...
3 MWWRuza
 
гуру
19.02.18
21:46
Какие нибудь внешние компоненты используются?
4 maestro-72
 
19.02.18
22:02
Нет
5 MWWRuza
 
гуру
19.02.18
22:21
В обработке процедура "ПриЗакрытии()" есть? Если есть, то, что в ней делается?
6 Herby
 
19.02.18
22:40
в отладчике найди место, до которого не доходит и закрывается. и будет понятнее.
7 maestro-72
 
19.02.18
22:43
(6) Завтра можно будет попробовать. Пока добавил в конце СтатусВозврата(0). Может поможет.
8 MWWRuza
 
гуру
20.02.18
07:48
(7)Пока добавил в конце СтатусВозврата(0).

В конце чего?
9 youalex
 
20.02.18
08:49
(8) В ПриОткрытии() вестимо, если я правильно понял. Если формирование ПКО идет оттуда.
Был похожий трабл, когда обработка, открывающаяся по расписанию нормально не закрывалась, и подвешивала процесс.
СтатусВозврата(0) - помогало. эту строчку в ПриОткрытии() - можно в самом начале разместить, код все равно отработает.
10 Сияющий в темноте
 
20.02.18
09:37
СтатусВохврата меняет значение,которое используется уже после исполнения процедуры,поэтому,в какой бы строке она не стояла,не важно.
а падать можнт,если в приоткрытии написать Форма.Закрыть
11 maestro-72
 
20.02.18
10:57
(9) Ну вот конец функции создания пко
        Сообщить("ПКО № "+СокрЛП(ПКО.НомерДок) + " для документа " + СокрЛП(Док.Заявка.ТекущийДокумент()));  
        Попытка
            ПКО.Записать();
        Исключение
            Сообщить("Неудачная попытка создания ПКО для документа " + СокрЛП(Док.Заявка.ТекущийДокумент()));
            Продолжить;
        КонецПопытки;    
        ПКО.Провести();
    КонецЦикла;    
    ПКО = 0;
        
КонецПроцедуры    

И соответственно функция при открытии вот так
Процедура ПриОткрытии()
    
    Если ПустоеЗначение(Форма.Параметр) = 0 Тогда
        
        Докум      = Форма.Параметр.Получить("Контекст");
    
        СоздатьПКО(Докум);
        Статусвозврата(0);
        Возврат;
    КонецЕсли;
    
    
КонецПроцедуры // ПриОткрытии()

Т.е. вроде все логично... Проходит цикл, создаются ПКО даже проводятся, но при завершении обработки 1с падает...
12 Ёпрст
 
20.02.18
11:31
(11) больше кода
13 Ёпрст
 
20.02.18
11:31
покажи весть текст поделки
14 maestro-72
 
20.02.18
13:05
(13) Вот (процедуру при открытии я не показываю она выше

Функция ПоказатьНаличныйРасчет(Док)  
    Если Док.Выбран() = 0 Тогда
        Возврат "";
    КонецЕсли;  
    
    Если СокрЛП(Док.Фирма.Код) <> "00031" Тогда
        Возврат "";
    КонецЕсли;
    
    Признак = "";
    ЕстьКонтрагент = глЕстьРеквизитШапки("Контрагент", Док.Вид());
    Если ЕстьКонтрагент = 1 Тогда                  
        НашлиДоговор = 0;
        СпрДоговоры = СоздатьОбъект("Справочник.Договоры");
        СпрДоговоры.ИспользоватьВладельца(Док.Контрагент);
        СпрДоговоры.ВыбратьЭлементы();
        Пока СпрДоговоры.ПолучитьЭлемент() = 1 Цикл
            Если Док.Фирма = СпрДоговоры.Фирма Тогда //Ищем договор с нужной фирмой!
                НашлиДоговор = 1;
                НайденныйДоговор = СпрДоговоры.ТекущийЭлемент();
                Прервать;
            КонецЕсли;    
        КонецЦикла;
        Если НашлиДоговор = 0 Тогда
            НайденныйДоговор = Док.Контрагент.ОсновнойДоговор;
        КонецЕсли;
        Если НайденныйДоговор.ГлубинаКредита = 0 Тогда
            Признак = "V";
        КонецЕсли;
    КонецЕсли;    
    Возврат Признак;
КонецФункции    

//ТК_бив124 Создает ПКО на основании заявок с расчетом налички.
Процедура СоздатьПКО(Докум)
    
    ПКО = СоздатьОбъект("Документ.ПКО");  
    
    Док = СоздатьОбъект("Документ.Маршрут");
    Если Док.НайтиДокумент(Докум) = 0 Тогда
        Возврат;
    КонецЕсли;
    
    Док.ВыбратьСтроки();
    Пока Док.ПолучитьСтроку() = 1 Цикл
        НашлиПКО = глНайтиСчетФактуру(Док.Заявка.ТекущийДокумент(), "ПКО");
        Если ПустаяСтрока(НашлиПКО)=0 тогда
            Сообщить("У документа "+СокрЛП(Док.Заявка.ТекущийДокумент())+" есть уже ПКО." + СокрЛП(НашлиПКО));
            Продолжить;
        КонецЕсли;
                  
        ПечНал = "";
        Если СокрЛП(Док.Заявка.Фирма.Код) = "00031" Тогда //Это ТамбовСоюзТорг
            ПечНал = ПоказатьНаличныйРасчет(Док.Заявка.ТекущийДокумент());
        КонецЕсли;
        
        Если СокрЛП(ПечНал) = "" Тогда
            Продолжить; // не нашла наличность
        КонецЕсли;    
        
        ПКО.Новый();
        ПКО.Фирма = Док.Заявка.Фирма;
        ПКО.ЮрЛицо = Док.Заявка.Фирма.ЮрЛицо;
        ПКО.ДатаДок= Док.Заявка.ДатаДок;
        ПКО.Проект = Док.Заявка.Проект;
        ПКО.Автор = Док.Заявка.Автор;
        //Найдем ДвижениеДенСредств
        //ПКО.ДвижениеДенежныхСредств = Константа.ДвижДенОплата;
        СпрДДС = СоздатьОбъект("Справочник.ДвиженияДенежныхСредств");  //ТК_бив124 Подставляем движение денежных средств
        Если СпрДДС.НайтиПоКоду("00003",0) = 1 Тогда
            ПКО.ДвижениеДенежныхСредств = СпрДДС.ТекущийЭлемент();
        КонецЕсли;                                                  
        СпрДДС = 0;
        //
        //Установим кассу
        ПКО.Касса = глЗначениеПоУмолчанию("ОсновнаяКасса");
        //ТК_бив124 12.05.2017 для того чтобы не зависило от кассы у пользователя
        Если ПКО.Касса.Выбран() = 0 Тогда
            СпрКассы = СоздатьОбъект("Справочник.Кассы");
            Если СпрКассы.НайтиПоКоду("00001", 0) = 1 Тогда
                ПКО.Касса = СпрКассы.ТекущийЭлемент();
            КонецЕсли;
        КонецЕсли;              
        //
        ПКО.ДокОснование = Док.Заявка.ТекущийДокумент();
        ПКО.Основание = глПредставлениеДокумента(Док.Заявка.ТекущийДокумент());
        ПКО.Валюта                 = Док.Заявка.Валюта;
        ПКО.Контрагент            = Док.Заявка.Контрагент;
        ПКО.Договор                = Док.Заявка.Договор;
        ПКО.СуммаВзаиморасчетов    = Док.Заявка.СуммаВзаиморасчетов;
        ПКО.КодОперации = глКО.ОплатаОтПокупателя;
        
        ПКО.Курс  = глКурсДляВалюты(ПКО.Валюта, ПКО.ДатаДок); // Курс мог измениться                              
        ПКО.Кратность = глКратностьДляВалюты(ПКО.Валюта, ПКО.ДатаДок);
        ПКО.Сумма = глПересчет(ПКО.СуммаВзаиморасчетов, ПКО.Договор.ВалютаВзаиморасчетов, ПКО.ДатаДок, ПКО.Валюта, ПКО.Курс,, ПКО.Кратность);  
        ПКО.ПринятоОт = ПКО.Контрагент.ЮрФизЛицо.ПолнНаименование;
        Сообщить("ПКО № "+СокрЛП(ПКО.НомерДок) + " для документа " + СокрЛП(Док.Заявка.ТекущийДокумент()));  
        Попытка
            ПКО.Записать();
        Исключение
            Сообщить("Неудачная попытка создания ПКО для документа " + СокрЛП(Док.Заявка.ТекущийДокумент()));
            Продолжить;
        КонецПопытки;    
        ПКО.Провести();
    КонецЦикла;    
    ПКО = 0;
        
КонецПроцедуры
15 maestro-72
 
20.02.18
13:07
Сегодня еще не пробовали, правда
16 aka AMIGO
 
20.02.18
13:22
У меня в понедельник рушилась 1с.7.7, сразу при запуске обработки.

Оказалось просто
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.ВыводитьПиктограммы(1,2);
ТЗ.НоваяКолонка("Пометка",,,,,8);
ТЗ.НоваяКолонка("Код1С",,,,,25);
ТЗ.НоваяКолонка("Наименование");

Желание ВыводитьПиктограммы оказалось быстрей создания колонок. Передвинуть вниз эту строку, после создания колонок, забыл.. Бывает..
Пару раз с удивлением смотрел, как исчезает 1С-Предприятие из поля зрения.
17 Ёпрст
 
20.02.18
14:12
(14) Док.Заявка - у тебя какого типа в табличной части ? Документ определенного вида, или <документ> без вида ?
18 aka AMIGO
 
20.02.18
14:19
Кстати, да. Еще в первый раз в глаза бросилось..
Процедура СоздатьПКО(Докум)
...  
    Док = СоздатьОбъект("Документ.Маршрут");
    Если Док.НайтиДокумент(Докум) = 0 Тогда

Вот вопрос : точно-ли в процедуру передается документ "Маршрут"?
И почему он может быть не найден? Что-то вместо него передается?
19 maestro-72
 
20.02.18
15:51
(17) Док.Заявка это документ реализация (ТиС)
20 maestro-72
 
20.02.18
15:52
(18) Страхуюсь... Но это делу не мешает. Только маршрут
21 aka AMIGO
 
20.02.18
15:55
(20) Если Док.Вид()="Маршрут" Тогда..
..найти..
22 maestro-72
 
20.02.18
15:59
(21) Можно и так, может и правильнее.
23 Ёпрст
 
20.02.18
17:08
Так, для начала

Функция ПоказатьНаличныйРасчет(Док)  
    Если СокрЛП(Док.Фирма.Код) <> "00031" Тогда
        Возврат "";
    КонецЕсли;
    НайденныйДоговор = "";
    СпрДоговоры = СоздатьОбъект("Справочник.Договоры");
    СпрДоговоры.ИспользоватьВладельца(Док.Контрагент);
    СпрДоговоры.ВыбратьЭлементы();
    Пока СпрДоговоры.ПолучитьЭлемент() = 1 Цикл
        Если Док.Фирма = СпрДоговоры.Фирма Тогда//Ищем договор с нужной фирмой!
            НайденныйДоговор = СпрДоговоры.ТекущийЭлемент();
            Прервать;
        КонецЕсли;    
    КонецЦикла;
    Если ПустоеЗначение(НайденныйДоговор) = 1 Тогда
        НайденныйДоговор = Док.Контрагент.ОсновнойДоговор;
    КонецЕсли;
    Если НайденныйДоговор.ГлубинаКредита = 0 Тогда
        Возврат  "V";
    КонецЕсли;
    Возврат "";
КонецФункции    

//ТК_бив124 Создает ПКО на основании заявок с расчетом налички.

Процедура СоздатьПКО(Док)
    
    ПКО = СоздатьОбъект("Документ.ПКО");  
    
    Док.ВыбратьСтроки();
    Пока Док.ПолучитьСтроку() = 1 Цикл
        Заявка = Док.Заявка;
        НашлиПКО = глНайтиСчетФактуру(Заявка, "ПКО");
        Если ПустоеЗначение(НашлиПКО)=0 тогда
            Сообщить("У документа "+Заявка+" есть уже ПКО." + НашлиПКО);
            Продолжить;
        КонецЕсли;
        
        ПечНал = "";
        Если СокрЛП(Заявка.Фирма.Код) = "00031" Тогда//Это ТамбовСоюзТорг
            ПечНал = ПоказатьНаличныйРасчет(Заявка);
        КонецЕсли;
        Если СокрЛП(ПечНал) = "" Тогда
            Продолжить;// не нашла наличность
        КонецЕсли;    
        
        ПКО.Новый();
        ПКО.Фирма = Заявка.Фирма;
        ПКО.ЮрЛицо = Заявка.Фирма.ЮрЛицо;
        ПКО.ДатаДок= Заявка.ДатаДок;
        ПКО.Проект = Заявка.Проект;
        ПКО.Автор = Заявка.Автор;
        //Найдем ДвижениеДенСредств
        //ПКО.ДвижениеДенежныхСредств = Константа.ДвижДенОплата;
        СпрДДС = СоздатьОбъект("Справочник.ДвиженияДенежныхСредств");  //ТК_бив124 Подставляем движение денежных средств
        Если СпрДДС.НайтиПоКоду("00003",0) = 1 Тогда
            ПКО.ДвижениеДенежныхСредств = СпрДДС.ТекущийЭлемент();
        КонецЕсли;                                                  
        
        //Установим кассу
        
        ПКО.Касса = глЗначениеПоУмолчанию("ОсновнаяКасса");
        //ТК_бив124 12.05.2017 для того чтобы не зависило от кассы у пользователя
        
        Если ПустоеЗначение(ПКО.Касса) = 1 Тогда
            СпрКассы = СоздатьОбъект("Справочник.Кассы");
            Если СпрКассы.НайтиПоКоду("00001", 0) = 1 Тогда
                ПКО.Касса = СпрКассы.ТекущийЭлемент();
            КонецЕсли;
        КонецЕсли;              
        //
        
        ПКО.ДокОснование = Заявка;
        ПКО.Основание = глПредставлениеДокумента(Заявка);
        ПКО.Валюта                 = Заявка.Валюта;
        ПКО.Контрагент            = Заявка.Контрагент;
        ПКО.Договор                = Заявка.Договор;
        ПКО.СуммаВзаиморасчетов    = Заявка.СуммаВзаиморасчетов;
        ПКО.КодОперации = глКО.ОплатаОтПокупателя;
        
        ПКО.Курс  = глКурсДляВалюты(ПКО.Валюта, ПКО.ДатаДок);// Курс мог измениться                              
        
        ПКО.Кратность = глКратностьДляВалюты(ПКО.Валюта, ПКО.ДатаДок);
        ПКО.Сумма = глПересчет(ПКО.СуммаВзаиморасчетов, ПКО.Договор.ВалютаВзаиморасчетов, ПКО.ДатаДок, ПКО.Валюта, ПКО.Курс,, ПКО.Кратность);  
        ПКО.ПринятоОт = ПКО.Контрагент.ЮрФизЛицо.ПолнНаименование;
        Сообщить("ПКО № "+ПКО.НомерДок + " для документа " + Заявка);  
        Попытка
            ПКО.Записать();
        Исключение
            Сообщить("Неудачная попытка создания ПКО для документа " + Заявка);
            Продолжить;
        КонецПопытки;    
        Если ПКО.Провести()=0 Тогда
            Сообщить("Неудачная попытка проведения ПКО для документа " + Заявка);
        КонецЕсли;
    КонецЦикла;    
КонецПроцедуры


но этот код не может свалить 1с-ину.

Это видать, не весь код ?
В операторах основной программы, нет ли обращений к форме дока ?
24 Mihail Shesternev
 
20.02.18
17:11
Единственное сомнение вызывает строка
ПКО = 0;

Попробуйте убрать
25 maestro-72
 
20.02.18
17:37
Ну вот дозвонился до операторов, сказали больше не выкидывает. Какой то косяк все же был. Единственно, что хочу заметить, после сообщений об сваливании я не только добавил СтатусВозврата(0) но и вот этот код
Док = СоздатьОбъект("Документ.Маршрут");
    Если Док.НайтиДокумент(Докум) = 0 Тогда
        Возврат;
    КонецЕсли;
До этого я использовал то что передавал - Докум. Скорее всего из за этого и выбрасывало.
Прошу сильно не пинать... Просто уже растерялся и не знал куда еще копать...
26 Ёпрст
 
20.02.18
18:37
(25)у тебя передается контекст открытой формы документа, а не ссылка.
А вот этим -
Док = СоздатьОбъект("Документ.Маршрут");
    Если Док.НайтиДокумент(Докум)

ты ищешь именно ссылку дока.
Но. можешь поиметь грабли - докмент был изменён и не записан и нажали на кнопку - тч дока будет не соответствовать сохраненному доку.
27 Ёпрст
 
20.02.18
18:37
ты слепишь свои пко, а потом запишут документ.
28 maestro-72
 
20.02.18
19:49
но нет... Оказалось что операторы просто не заметили что ПКО не создаются. Я вызвался сделать эти пко сам. В программе ошибка была синтаксическая. Исправил и обнаружил следующее. После обработки ПКО создаются и проводятся. она завершается. маршрут при этом открыт, его можно закрыть, но при дальнейших действиях, не важно каких, программа валится. Такое ощущение, что нарушаются индексы... В общем я думаю от этой затеи отказаться и сделать просто внешнюю обработку не из документа...
29 youalex
 
21.02.18
00:15
может при проведении ПКО еще какие-то формы открываются? Типа там информация о проведении?
30 Злопчинский
 
21.02.18
02:06
(16) есть, есть ещё удивительное в мире!
31 Злопчинский
 
21.02.18
02:08
Да какая-то хрень полная, надо просто сесть и аккуратно посмотреть, а не обрывки кода которые здесь
2 + 2 = 3.9999999999999999999999999999999...