Имя: Пароль:
1C
1С v8
КА 1.1. После выполнения обработки создания документов сами док-ты исчезают
0 Vigor06
 
20.05.15
11:02
Доброго дня!
В организации используется самописная обработка по созданию пакета док-в реализация + счет-фактура+счет на оплату
За март счета выставлялись нормально
Выставляю за апрель, проверяю в отладчике:
доки созданы, есть ссылка на них, делается запись в регистр сведений, на форме заполяняется ТЗ со списком созданных документов.

Завершаю отладку,выходя из процедуры - доков нет, в регистре тоже записей нет. в ТЗ пишет "объект не найден"

Открываю параллельно еще 1 сеанс,останавливаю на отладке после создания док-в, смотрю "ведомость по взаиморасчетам с контрагентами" - документ есть, правда открыть не дает.(после долгого думания пишет "Конфликт блокирововк при выполнении транзакции" Microsoft SQL Native Ckient 10/0: превышено время ожидания запроса на блокировку бла-бла-бла") Грешу на то,что отладка идет. Отладка заканчивается - в ведомости док-та нет..волшебство какое то
База sql-ная, единственное,на что могу грешить - так это на нее.
Хотя больше никто из бухгалтерии не звонил,значит просто так документы создаются и записыаются.
С обработкой ничего не делали уже несколько месяцев, спокойно все работало
1 Apokalipsec
 
20.05.15
11:14
RLS?
2 lxndr
 
20.05.15
11:14
транзакция откатывается
3 Vigor06
 
20.05.15
15:06
(1) неа
4 Vigor06
 
20.05.15
15:07
(2) а по изза чего так может бытЬ?ничего ж не менялось...
5 Lamer1C
 
20.05.15
15:08
(2) +1
(0) Код выкладывай
6 Vigor06
 
20.05.15
15:13
(5)да нечего выкладывать..перед "конец Процедуры" еще все существует..

Вот процедура нажатия кнопки

Процедура СоздатьДокументыНажатие(Кнопка)
    Если не ПроверитьКонстанты() тогда
        Если Вопрос("Не заполнены константы. Открыть форму констант?",РежимДиалогаВопрос.ДаНет,,КодВозвратаДиалога.Да)=КодВозвратаДиалога.Да тогда
            ОткрытьФорму("Обработка.Регион_Константы.Форма.Форма");
        КонецЕсли;
        Возврат;
    КонецЕсли;
    Если Организация.ОсновнойБанковскийСчет.Пустая() тогда
        Предупреждение("Для организации не указан основной банковский счет");
        Возврат;
    КонецЕсли;
    ОбновитьСписокДокументов();
    СоздатьДокументы();    
КонецПроцедуры


в процедуре "СоздатьДокументы"



Если не отказ тогда        
            //Сохраним информацию о сформированных документах
            запись=РегистрыСведений.АвтоСфрмированныеДокументы.СоздатьМенеджерЗаписи();
            запись.Договор=стр.ДоговорКонтрагента;
            запись.СчетНаОплату=счет.Ссылка;
            запись.Реализация=реализация.Ссылка;
            запись.СчетФактура=счетФакт.Ссылка;
            запись.Период=ДатаМесяц;
            запись.Записать();
            //Установим пометку в ТЧ        
            стр=ТекущаяТЧ.Найти(стр.ДоговорКонтрагента,"ДоговорКонтрагента");
            стр.ДокументыСозданы=Истина;
            стр.Пометка=Ложь;
        КонецЕсли;

Если отказ тогда
            ОтменитьТранзакцию();
            Прервать;
        иначе            
            ЗафиксироватьТранзакцию();
        КонецЕсли;
    КонецЦикла;
    ЗаполнитьСписокДокументов();
КонецПроцедуры



Транзакция выполняется и если точку останова ставить на "КонецПроцедуры", то в записи регистра сведений есть все ссылки на документы..
7 D_E_S_131
 
20.05.15
15:17
хм, а где создание документов? Может ты их тупо не записываешь?
8 ДенисЧ
 
20.05.15
15:18
Где счет = Документы.Счет.СоздатьДокумент();
...
счет.Записать?
и прочее?
9 Lamer1C
 
20.05.15
15:25
(6) отказ то наверняка равен истина
10 Vigor06
 
20.05.15
16:11
(9) отказ - Ложь) проверя 1000 раз)


Процедура СоздатьДокументы()Экспорт    
    //Подготовка
    этоАренда=ТипДоговора=Перечисления.дмВидыДоговоров.Аренда;
    этоСчетчики=ТипДоговора=Перечисления.дмВидыДоговоров.Счетчик;
    этоВода=ТипДоговора=Перечисления.дмВидыДоговоров.Вода;
    ЭтоПени = ТипДоговора=Перечисления.дмВидыДоговоров.Пени;
    ЭтоУслуга =ТипДоговора=Перечисления.дмВидыДоговоров.Услуги;
    ЭтоТелефон = ТипДоговора = Перечисления.дмВидыДоговоров.Телефон;
    СтруктураПоискаДокумента=новый Структура("ДоговорКонтрагента,Вид");    
    структураЗаполненияДокумента=
        новый Структура("КратностьВзаиморасчетов,КурсВзаиморасчетов,ТипЦен,СуммаВключаетНДС,УчитыватьНДС,
                        |Комментарий,Склад,ВидПередачи,ОтражатьВУправленческомУчете",
                        1,1,Константы.Регион_типЦенДокументовАренды.Получить(),Константы.Регион_типЦенДокументовАренды.Получить().ЦенаВключаетНДС,Ложь,
                        ТекстКомментария,Константы.Регион_СкладДокументовАренды.Получить(),Перечисления.ВидыПередачиТоваров.СоСклада,истина);
                        
    структураЗаполненияТЧ=новый Структура("СтавкаНДС,СуммаНДС",Перечисления.СтавкиНДС.БезНДС,0);
    
    ТекущаяТЧ=Неопределено;    
    Если этоАренда тогда
        структураЗаполненияТЧ.Вставить("Номенклатура",Константы.Регион_НоменклатураДокументовАренды.Получить());
        структураЗаполненияТЧ.Вставить("Количество",1);
        ТекущаяТЧ=ТЧАренда;
    ИначеЕсли ЭтоУслуга ТОгда
        структураЗаполненияТЧ.Вставить("Номенклатура",Номенклатура);
        структураЗаполненияТЧ.Вставить("Количество",1);
        ТекущаяТЧ = ТЧУслуги;
    ИначеЕсли ЭтоТелефон() ТОгда
        структураЗаполненияТЧ.Вставить("Номенклатура",Номенклатура);
        структураЗаполненияТЧ.Вставить("Количество",1);
        ТекущаяТЧ = ТЧТелефон;
    ИначеЕсли ЭтоПени Тогда    
        структураЗаполненияТЧ.Вставить("Номенклатура",Справочники.Номенклатура.НайтиПоКоду("00000000011")); //Пени
        структураЗаполненияТЧ.Вставить("Количество",1);
        ТекущаяТЧ = ТЧПени;
    Иначе
        ТекущаяТЧ = ТЧСчетчики;
    КонецЕсли;
                        
    Если этоАренда тогда
        ДатаРеализации=КонецМесяца(ДатаМесяц);
    иначе
        ДатаРеализации=ДатаСчетов;
    КонецЕсли;
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    АвтоСфрмированныеДокументы.СчетНаОплату,
    |    АвтоСфрмированныеДокументы.Реализация,
    |    АвтоСфрмированныеДокументы.СчетФактура
    |ИЗ
    |    РегистрСведений.АвтоСфрмированныеДокументы КАК АвтоСфрмированныеДокументы
    |ГДЕ
    |    АвтоСфрмированныеДокументы.Договор = &Договор
    |    И АвтоСфрмированныеДокументы.Период = &Период";
    запрос.УстановитьПараметр("Период",НачалоМесяца(ДатаМесяц));
    //Формирование документов
    инд=0;
    ТЧ=ПолучитьДанныеДляДокументов();
    всего=ТЧ.Количество();
    
    Если этоСчетчики или этоВода тогда
        ВыполнитьДвижениеПоСчетчикам(ТЧ);
        ТекущаяТЧ=ТЧСчетчики;
    КонецЕсли;
    
    содержание="за "+Формат(ДатаМесяц,"ДФ='ММММ yyyy'")+" г. ";
    для каждого стр из ТЧ цикл
        Состояние(""+инд+"/"+всего+" "+стр.ДоговорКонтрагента);
        инд=инд+1;
        счет=Неопределено; реализация=Неопределено;счетФакт=Неопределено;
        отказ=Ложь;
        
        НачатьТранзакцию();

        Если стр.ДокументыСозданы тогда
            запрос.УстановитьПараметр("Договор",стр.ДоговорКонтрагента);
            выборка=запрос.Выполнить().Выбрать();
            Если выборка.Следующий() тогда
                счет=выборка.СчетНаОплату;
                реализация=выборка.Реализация;
                счетФакт=выборка.СчетФактура;
                Продолжить;
            КонецЕсли;
        КонецЕсли;
        Если (не этоСчетчики) и (НЕ этоВода) Тогда
            Если (Стр.Сумма = 0) или (Стр.Сумма = "") Тогда
                Продолжить;    
            КонецЕсли;
        КонецЕсли;
        Если ЗначениеЗаполнено(счет) тогда
            счет=счет.ПолучитьОбъект();
        иначе
            счет=Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
        КонецЕсли;
        датаДок=стр.ДатаОплаты;
        //Счет на оплату
        ЗаполнитьЗначенияСвойств(счет,стр);
        ЗаполнитьЗначенияСвойств(счет,структураЗаполненияДокумента);
        Если ЭтоПени  Тогда
            Счет.Дата = ТекущаяДата();
            счет.ДатаОтгрузки=ТекущаяДата();
        Иначе
            счет.Дата=ДатаСчетов;
            счет.ДатаОтгрузки=ДатаСчетов;
        КонецЕсли;
        счет.СтруктурнаяЕдиница = стр.Организация.ОсновнойБанковскийСчет;
        счет.ВалютаДокумента = стр.ДоговорКонтрагента.ВалютаВзаиморасчетов;        
        счет.Услуги.Очистить();
        Если (Организация = Справочники.Организации.НайтиПоНаименованию("Энергосервис ООО").ссылка) или (Организация = Справочники.Организации.НайтиПоНаименованию("Регион ОПТ ООО").ссылка) ТОгда //Энергосервис или Регион-ОПТ
            счет.УчитыватьНДС = Истина;
        Иначе
            счет.УчитыватьНДС = Ложь;
        КонецЕсли;
            
        Если этоАренда или ЭтоУслуга или ЭтоТелефон или ЭтоПени тогда
            стрТЧДок=счет.Услуги.Добавить();
            ЗаполнитьЗначенияСвойств(стрТЧДок,стр);
            ЗаполнитьЗначенияСвойств(стрТЧДок,структураЗаполненияТЧ);
            Если ЭтоТелефон ТОгда
                стрТЧДок.Содержание =стрТЧДок.Номенклатура.Наименование + Содержание + стрЗаменить(СокрЛП(стр.ДоговорКонтрагента),Организация.Наименование,"");;
            ИначеЕсли этоАренда Тогда
                стрТЧДок.Содержание = содержание+СтрЗаменить(СокрЛП(стр.ДоговорКонтрагента),Стр.Организация,"");
            ИначеЕсли ЭтоПени Тогда
                стрТЧДок.Содержание = "Пени за несвоевременную уплату арендной платы с " + Лев(Строка(НачПериода),СтрДлина(Строка(НачПериода)) - 8) + " по "  + Лев(Строка(КонПериода),СтрДлина(Строка(КонПериода)) - 8);
            иначе
                стрТЧДок.Содержание = содержание+СокрЛП(стр.ДоговорКонтрагента);
            КонецЕсли;
            Если этоСчетчики тогда
                стрТЧДок.Сумма=стрТЧДок.Количество*стрТЧДок.Цена;
            иначе
                стрТЧДок.Цена                     = стр.Сумма;
            КонецЕсли;
            счет.СуммаДокумента=стрТЧДок.Сумма;
        ИначеЕсли этоСчетчики или этоВода тогда
            //+Самсонов
            Счет.СуммаВключаетНДС = Истина;
            //
            стрТЧДок=счет.Услуги.Добавить();
            ЗаполнитьЗначенияСвойств(стрТЧДок,структураЗаполненияТЧ);
            стрТЧДок.Количество=стр.Разница;
            Если этоВода тогда
                стрТЧДок.Цена=Цена1;
                стрТЧДок.Номенклатура=Номенклатура1;
            иначе
                стрТЧДок.Цена=Цена;
                стрТЧДок.Номенклатура=Номенклатура;
            КонецЕсли;
            стрТЧДок.Сумма=стрТЧДок.Количество*стрТЧДок.Цена;
            Сумма = стрТЧДок.Сумма;
            содержание= стрТЧДок.Номенклатура.Наименование + " (сч.№"+стр.Счетчик+", прош.пок.="+стр.ПрошлыеПоказания+", тек.пок.="+стр.ТекущиеПоказания+")" + " за " + Формат(ДатаМесяц,"ДФ='MMMM yyyy'");
            стрТЧДок.Содержание=содержание;
            //+Самсонов
                стрТЧДок.СтавкаНДС = стрТЧДок.Номенклатура.СтавкаНДС;
                стрТЧДок.СуммаНДС = стрТЧДок.Сумма * УчетНДС.ПолучитьСтавкуНДС(стрТЧДок.СтавкаНДС)/118;
            //
            Если этоВода тогда
                стрТЧДок=счет.Услуги.Добавить();
                ЗаполнитьЗначенияСвойств(стрТЧДок,структураЗаполненияТЧ);
                стрТЧДок.Количество=стр.Разница;
                стрТЧДок.Цена=Цена2;
                стрТЧДок.Номенклатура=Номенклатура2;
                стрТЧДок.Сумма=стрТЧДок.Количество*стрТЧДок.Цена;
                стрТЧДок.Содержание=стрТЧДок.Номенклатура.Наименование + " (сч.№"+стр.Счетчик+", прош.пок.="+стр.ПрошлыеПоказания+", тек.пок.="+стр.ТекущиеПоказания+")"  + " за " + Формат(ДатаМесяц,"ДФ='MMMM yyyy'");;
            Иначе
                стрТЧДок=счет.Услуги.Добавить();
                ЗаполнитьЗначенияСвойств(стрТЧДок,структураЗаполненияТЧ);
                СтрТЧДок.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00000000031").Ссылка;//Обслуживание Электрооборудования
                стрТЧДок.Содержание = стрТЧДок.Номенклатура.Наименование;
                стрТЧДок.Количество = 1;
                стрТЧДок.Цена = ПолучитьЦенуУслугиПоШкале(Сумма);
                стрТЧДок.Сумма = стрТЧДок.Цена;
                стрТЧДок.СтавкаНДС = стрТЧДок.Номенклатура.СтавкаНДС;
                стрТЧДок.СуммаНДС = стрТЧДок.Сумма * УчетНДС.ПолучитьСтавкуНДС(стрТЧДок.СтавкаНДС)/118;
            КонецЕсли;
            счет.СуммаДокумента=счет.Услуги.Итог("Сумма");
        КонецЕсли;
        Если не ЗаписатьДок(счет,стр,0) тогда отказ=Истина;КонецЕсли;
        
        Если не отказ тогда
            //Реализация
            Если ЗначениеЗаполнено(реализация) тогда
                реализация=реализация.ПолучитьОбъект();
            иначе
                реализация=Документы.РеализацияТоваровУслуг.СоздатьДокумент();
            КонецЕсли;
            строкаДок=Неопределено;
            реализация.Услуги.Очистить();
            реализация.Заполнить(счет.Ссылка);
            Если НЕ ЭтоУслуга И НЕ ЭтоТелефон и НЕ ЭтоПени ТОгда
            реализация.Проект=стр.Проект;
            КонецЕсли;
            реализация.ОтражатьВУправленческомУчете=истина;
            Если НЕ ЭтоПени Тогда
                реализация.Дата=ДатаРеализации;    
            Иначе
                реализация.Дата=ТекущаяДата();
            КонецЕсли;
            
            
            реализация.Комментарий=структураЗаполненияДокумента.Комментарий;
            реализация.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.АктВыполненныхРабот;
            Если не ЗаписатьДок(реализация,стр,1) тогда отказ=Истина;КонецЕсли;
        КонецЕсли;
        
        Если не отказ тогда
            //Счет фактура
            Если ЗначениеЗаполнено(счетФакт) тогда
                счетФакт=счетФакт.ПолучитьОбъект();
            иначе
                счетФакт=Документы.СчетФактураВыданный.СоздатьДокумент();
            КонецЕсли;
            счетФакт.ДокументыОснования.Очистить();
            счетФакт.Заполнить(реализация.Ссылка);
            счетФакт.СуммаДокумента=реализация.СуммаДокумента;
            счетФакт.Сумма=реализация.СуммаДокумента;
            счетФакт.Дата=ДатаРеализации;
            счетФакт.Комментарий=структураЗаполненияДокумента.Комментарий;
            Если не ЗаписатьДок(счетФакт,стр,2) тогда отказ=Истина;КонецЕсли;
        КонецЕсли;
        
        Если не отказ тогда        
            //Сохраним информацию о сформированных документах
            запись=РегистрыСведений.АвтоСфрмированныеДокументы.СоздатьМенеджерЗаписи();
            запись.Договор=стр.ДоговорКонтрагента;
            запись.СчетНаОплату=счет.Ссылка;
            запись.Реализация=реализация.Ссылка;
            запись.СчетФактура=счетФакт.Ссылка;
            запись.Период=ДатаМесяц;
            запись.Записать();
            //Установим пометку в ТЧ        
            стр=ТекущаяТЧ.Найти(стр.ДоговорКонтрагента,"ДоговорКонтрагента");
            стр.ДокументыСозданы=Истина;
            стр.Пометка=Ложь;
        КонецЕсли;
        Если отказ тогда
            ОтменитьТранзакцию();
            Прервать;
        иначе            
            ЗафиксироватьТранзакцию();
        КонецЕсли;
    КонецЦикла;
    ЗаполнитьСписокДокументов();
КонецПроцедуры
11 Vigor06
 
21.05.15
10:26
апну разок)
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.