Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Меняем время документа РН
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
Kutuzov
Здравствуйте...
Бух 7.7 доработанная 289

Дополняю обработку "Обработка документов" на возможность проведения документа на конец дня для этого пишу
    
Если Обработка = "ПоменятьВремя" Тогда
        //........ Здесь заполняю таблицу значений ссылками на документы РН
        
        Ном=0;
        
        ТабДок.ВыбратьСтроки();
        Пока ТабДок.ПолучитьСтроку()=1 Цикл  
            ТекДок=ТабДок.Док;
            Время=3600*23+60*59+59;
            
            ДокИзм=СоздатьОбъект("Документ");
            
            Провести=0;    
            ДокИзм.НайтиДокумент(ТекДок);
            Если ДокИзм.Проведен()=1 Тогда
                ДокИзм.СделатьНеПроведенным();                               // Вот тут возникает проблема которая влечет за собой ошибку дальше
                УстановитьВремяДокументаЧислом(ДокИзм,Время);    //процедура которая разбивает время на часы минуты секунды и устанавливает время текущему документу ДокИзм.УстановитьВремя(Ч,М,С);
                Если ДокИзм.Провести()=0 Тогда
                    Продолжить;
                КонецЕсли;
                
            Иначе
                УстановитьВремяДокументаЧислом(ДокИзм,Время);
                ДокИзм.Записать();
                Продолжить;
            КонецЕсли;
        КонецЦикла;        
        //ЗафиксироватьТранзакцию();  
    КонецЕсли;

Какая задача, необходимо взять проведенный документ, сделать его не проведенным при условии, что он проведен, установить время и уже с новым временем провести. Если он не проводится тогда продолжить и перейти к следующему. Но вот тут возникает проблема.
Проблема такова, документ ДокИзм который появляется после следующего прохода цикла при условии что предыдущий документ не провелся не может сделать документ не проведенным из за чего вылетает дальше ошибка
ДокИзм.СделатьНеПроведенным()=1 // первый проход
ДокИзм.Провести()=0 //первый проход истина
ДокИзм.СделатьНеПроведенным()=0 // Второй проход
nysysimara
нужна строка
ДокИзм.Записать();

перед
Если ДокИзм.Провести()=0 Тогда


и
ДокИзм=СоздатьОбъект("Документ");

я бы вынесла до начала цикла
Kutuzov
Цитата(nysysimara @ 15.12.11, 14:05) необходимо зарегистрироваться для просмотра ссылки
нужна строка
ДокИзм.Записать();

перед
Если ДокИзм.Провести()=0 Тогда


и
ДокИзм=СоздатьОбъект("Документ");

я бы вынесла до начала цикла


Не не сработало....
Zaval
Если проблема с отменой проведения - можно попробовать ставить/снимать пометку удаления. Потом уж менять время и проводить.
Домовик
не, ну создатьобъект из цикла вынести - проблему, конечно, не решит. но красивше и лучше ,и быстрее и....
то же самое Время =


А может два цикла ? Первый - мы делаем все доки непроведенными. Второй - устанавливаете время. Но Дольше, конечно, будет выполняться ваша обработка.

и как=то не пойму:
в одной ветке после установитьВремя записать есть, в другой - нет.

у меня подозрение, что тут дело в самом УстановитьВремяДОкумента.
Как-то оно в базе документ переписывает, переставляет, что положение следующего документа уже другое..
. и с ним работать программа не может..... Человеческим языком не объясню.
С выборкой он наверное не работает
Kutuzov
Цитата(Домовик @ 15.12.11, 16:52) необходимо зарегистрироваться для просмотра ссылки
не, ну создатьобъект из цикла вынести - проблему, конечно, не решит. но красивше и лучше ,и быстрее и....
то же самое Время =


А может два цикла ? Первый - мы делаем все доки непроведенными. Второй - устанавливаете время. Но Дольше, конечно, будет выполняться ваша обработка.

и как=то не пойму:
в одной ветке после установитьВремя записать есть, в другой - нет.

у меня подозрение, что тут дело в самом УстановитьВремяДОкумента.
Как-то оно в базе документ переписывает, переставляет, что положение следующего документа уже другое..
. и с ним работать программа не может..... Человеческим языком не объясню.
С выборкой он наверное не работает


Время сути не меняет я уже проставил, ну и присутствие или отсутствие процедуры установитьвремядокумента тоже....
 ДокИзм.УстановитьВремя(23,59,59);

Это ничего не изменило.
Делать все доки не проведенными не вариант так как те что были проведенными должны остаться проведенными, ну а не проведенные соответственно

Положение дока как по мне дело не имеет так как я из ТЗ ищу документ. и по этому не суть как стоят доки и как оно их переставляет
Pepe
Не вникал в суть, но я б подсмотрел в стандартной обработке "обработкадокументов".
Kutuzov
Цитата(Pepe @ 15.12.11, 17:08) необходимо зарегистрироваться для просмотра ссылки
Не вникал в суть, но я б подсмотрел в стандартной обработке "обработкадокументов".


Ну как бы там и смотрю. Собственно там и делаю.
                    ИначеЕсли Обработка = "ОтменаПроведения" Тогда
            Если Док.Проведен() = 1 Тогда
                глКомментарий("Отмена проведения "+Док,2);
                Док.СделатьНеПроведенным();
                глЗаписьЖурналаРегистрации(Комментарий, 2, 7, Док.ТекущийДокумент());
            КонецЕсли;


Это все что там написано...
У меня в РН есть условие при котором не проводится документ. Но если документу отменено проведение и потом записан тогда все нормально должно быть.
Домовик
вы устанавливаете всем докам один и тот же момент времени
mister-x
Цитата
вы устанавливаете всем докам один и тот же момент времени
ні, це один і той же час, що не є тотожним одному і тому ж моменту часу

Kutuzov попробуйте через
попытка
...
исключение
...
конецпопытки
і
начатьТранзакцию
...
ЗафиксироватьТранзакцию
Домовик
Транзакция - да, Мистер-х, можно попробовать. Тут она даже присутствовала, закоментирована.
Попытка - хорошо, но чего-то же вылетает.

Кутузов, а что с версией платформы? Еще можно формирование табл.зн. показать.
mister-x
Цитата
Транзакция - да, Мистер-х, можно попробовать. Тут она даже присутствовала, закоментирована.
Попытка - хорошо, но чего-то же вылетает.
тут можна таке використати і подивитись що скаже
Цитата
ОписаниеОшибки()
Синтаксис:
ОписаниеОшибки()
Назначение:
Применять данную функцию имеет смысл только в конструкции <Попытка - Исключение - КонецПопытки>, так как в иных случаях она возвращает пустую строку.
См. также:Попытка Исключение; ВызватьИсключение.
Возвращает описание ошибки времени выполнения модуля, такое же, как то, которое выдается в окне сообщений.
Параметры: нет
5_kopeek
Kutuzov, возможно, где-то в теле модуля присутствует процедура НачатьТранзакцию(), которая при возникновении ошибки проведения документа не дает дальше нормально работать. По идее, в Вашем случае даже у успешно проведенных до возникновения ошибки документов не должно было измениться время. Уберите все процедуры работы с транзакцией, и должно получиться.
shurik_shurik
Цитата(Домовик @ 15.12.11, 17:52) необходимо зарегистрироваться для просмотра ссылки
А может два цикла ? Первый - мы делаем все доки непроведенными. Второй - устанавливаете время. Но Дольше, конечно, будет выполняться ваша обработка.

Первый цикл в обратном порядке снимает проведение документов, одновременно занося в ТабЗнач пометку о том, что он был проведен, а во втором прямой порядок, уст. время и проводятся доки
Kutuzov
Всё, всем Спасибо!

Ув. 5-Копеек оказалась права, с ее помощью все удалось. Действительно выше по коду было
НачатьТранзакцию()
комментируя эту строку ну и соответственно закрытие транзакции все пошло.

Цитата
Первый цикл в обратном порядке снимает проведение документов, одновременно занося в ТабЗнач пометку о том, что он был проведен, а во втором прямой порядок, уст. время и проводятся доки


Вчера идя домой мне пришла подобная идея но как выяснилось сегодня уже нет в этом необходимости
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.