7.7 Документ.Провести()

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем Jivchic, 19 май 2010.

  1. TopicStarter Overlay
    Jivchic
    Offline

    Jivchic Опытный в 1С

    Регистрация:
    4 фев 2008
    Сообщения:
    54
    Симпатии:
    0
    Баллы:
    26
    Конфигурация не типовая...

    При перепроведении документа приходная, надо перепровести все проведенные расходные в интервале от этого дока до текущей даты... из модуля проведения приходной вызывается обработка вот с таким кодом:


    Код:
    Процедура Выполнить(ДатаПерепр)
    
    
    дРК = СоздатьОбъект("Документ.РасходнаяКредит");
    
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = 
    "//{{ЗАПРОС(Сформировать)
    |Период с ДатаПерепр по (ТекущаяДата());
    |Обрабатывать НеПомеченныеНаУдаление;	
    |ОбрабатыватьДокументы Проведенные;
    |РасходнаяКредит = Документ.РасходнаяКредит.ТекущийДокумент;
    |Функция Счётчик = Счётчик();
    |Группировка РасходнаяКредит упорядочить по РасходнаяКредит.ДатаДок;
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;
    
    Пока Запрос.Группировка(1) = 1 Цикл
    Если Запрос.РасходнаяКредит.Проведен()=0 Тогда //на всякий случай
    Продолжить;
    КонецЕсли;
    
    Попытка
    дРК.НайтиДокумент(Запрос.РасходнаяКредит);
    Если дРК.Провести(0,)=1 Тогда
    Сообщить(":1 "+"Документ "+Запрос.РасходнаяКредит+" перепроведен");
    КонецЕсли;
    Исключение
    Сообщить(":0 "+ОписаниеОшибки());
    КонецПопытки;
    
    
    КонецЦикла;
    
    КонецПроцедуры
    
    некоторые документы перепроводятся, а при "Расчете" в отладчике, вылазит
    "дРК.Провести(0,) = Ошибка в выражении!"

    в чем проблема? мож я не правильно делаю?
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    В модуле Документа НЕ ЖЕЛАТЕЛЬНО проводить.
    Лучше делайте вот так
    Код:
    Процедура ОбработкаПроведения()
    
    ОткрытьФормуМодально(дКР.ТекущийДокумент(),"ПровестиИЗакрыть",0);
    КонецПроцедуры
    
    Модуль формы расходной: 
    
    Процедура ПриОткрытии()
    Если Форма.Параметр="ПровестиИЗакрыть" Тогда
    Провести();
    СтатусВозврата(0);
    Форма.Закрыть();        
    КонецЕсли;
    КонецПроцедуры
    
    
    
  3. TopicStarter Overlay
    Jivchic
    Offline

    Jivchic Опытный в 1С

    Регистрация:
    4 фев 2008
    Сообщения:
    54
    Симпатии:
    0
    Баллы:
    26
    т.е. запрос на выборку расходных сделать в Обработке Проведения документа? и от туда модально открывать формы расходных?


    Вот что я сделал:

    Модуль документа Приходная:
    Код:
    Процедура ОбработкаПроведения();
    
    Если ТекущийДокумент().Проведен()=1 Тогда
    Перепроводим = 1;
    КонецЕсли;
    
    //----------------------------
    // Прочий код модуля
    //----------------------------
    
    Если Перепроводим=1 Тогда
    Если Дата(ДатаСохр) < Дата(ДатаДок) Тогда
    ДатаПерепр = ДатаСохр;
    Иначе
    ДатаПерепр = ДатаДок;
    КонецЕсли;
    
    ОткрытьФорму("Обработка.ПерепроведениеРК",ДатаПерепр);
    
    КонецЕсли;
    
    КонецПроцедуры
    

    И в первом посте я выкладывал текст модуля обработки "Обработка.ПерепроведениеРК"

    Открывание формы каждого дока не будет ли оч долго?
  4. TopicStarter Overlay
    Jivchic
    Offline

    Jivchic Опытный в 1С

    Регистрация:
    4 фев 2008
    Сообщения:
    54
    Симпатии:
    0
    Баллы:
    26
    а здесь СтатусВозврата(0); Что даст?
  5. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Статус возврата - чтобы не пошло на выполнение. если код вне процедур. Внизу

    Мой пример для проведения непосредственно в модуле проведения. Если через вызов обработки ПерепроведениеРК - ее вызывать ТОЛЬКО МОДАЛЬНО. Это связано с тем что по умолчанию в 1с проведение связано с ТРАНЗАКЦИЕЙ
  6. TopicStarter Overlay
    Jivchic
    Offline

    Jivchic Опытный в 1С

    Регистрация:
    4 фев 2008
    Сообщения:
    54
    Симпатии:
    0
    Баллы:
    26
    попробую
  7. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Еще забыл... Если в процедуре есть еще текст нужно так:

    Код:
    Если Форма.Параметр="ПровестиИЗакрыть" Тогда
    Провести();
    СтатусВозврата(0);
    Форма.Закрыть(); 
    ВОЗВРАТ;
    КонецЕсли;
    
    
  8. TopicStarter Overlay
    Jivchic
    Offline

    Jivchic Опытный в 1С

    Регистрация:
    4 фев 2008
    Сообщения:
    54
    Симпатии:
    0
    Баллы:
    26
    ага, как раз таки с возвратом сделал, теперь бывает что при пере проведении вылазит окно типо

    "Нужного товара нету" "Документ непроведен"


    в таком случае легче же сделать по таймауту шоб сообщение закрывалось... ?
  9. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    ...или добавить переменную при определении Форма.Параметр и смотрель ее при проведении и не выдавать ну скажем СООБЩЕНИЕ а не предупреждение... Тогда тормоза не будет... А вообще-то странно что такое при проведении выскакивает. Значит ошибка в учете....
  10. TopicStarter Overlay
    Jivchic
    Offline

    Jivchic Опытный в 1С

    Регистрация:
    4 фев 2008
    Сообщения:
    54
    Симпатии:
    0
    Баллы:
    26
    ну поидее на то оно и расчитано, что при перепроведении приходной, нада все расходные после перепровести...
  11. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Тогда перепроведение расхода должно быть после движения регистров в приходной... Иначе безсмыслица.
  12. TopicStarter Overlay
    Jivchic
    Offline

    Jivchic Опытный в 1С

    Регистрация:
    4 фев 2008
    Сообщения:
    54
    Симпатии:
    0
    Баллы:
    26
    Вот я и думаю, что может как перепровели приходную, запускаем обработку, и с помощью нее перепроводим документы...

    Таким образом можно реализовать? Если поверить Проведена ли приходная и потом выбирать расходные.
  13. TopicStarter Overlay
    Jivchic
    Offline

    Jivchic Опытный в 1С

    Регистрация:
    4 фев 2008
    Сообщения:
    54
    Симпатии:
    0
    Баллы:
    26

    это надо в модуле документа вызывать ОткрытьФормуМодально("Обработка.ПерепроведениеРК",ДатаП)

    и в обработке ПерепроведениеРК делать ОткрытьФормуМодально("Документ.Расходная","ПровестиИЗакрыть")


    так?
  14. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Все проще - делаем перемещение прихода в начало дня (играем со временем документа), потом перепроводим

    Нет - достаточно первого вызова модально... Нам надо "стопронуть" код в модуле проведения
  15. TopicStarter Overlay
    Jivchic
    Offline

    Jivchic Опытный в 1С

    Регистрация:
    4 фев 2008
    Сообщения:
    54
    Симпатии:
    0
    Баллы:
    26
    нада попробовать...

    АвтоВремяНачалоДня() неподойдет? это как я понял для ВВодНового...


    а для моего случая делать Установить Время() ?

    Пардон конечно, а если вызывать модально обработку из модуля документа , при ее вызове в конце процедуры проведения, документ Приходная мож следует закрыть? или неважно?
  16. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    АвтоВремя - да, только для нового.
    Вым нужно просто взять первый документ из выборки на дату. Получить его время и отнимать от него по 1 секунде для каждого поступления. Пользуемся Получить/УстановитьВремя.

    Про модальность - форма может быть закрыта.
  17. 1Счик
    Offline

    1Счик

    Регистрация:
    16 дек 2008
    Сообщения:
    46
    Симпатии:
    0
    Баллы:
    1
    Всем привет!

    В дополнение темы.

    В моей ситуации к приходной накладной может быть привязано несколько документов "Услуги сторонних организаций". В свою очередь каждый документ "Услуги сторонних организаций" может быть привязан к нескольким приходным накладным. С этим проблем нет. Все привязывается как надо.

    Задача:
    При проведении/перепроведении/снятии с проведения документа "Приходная накладная" (интерактивно и обработкой) нужно перепроводить все "привязанные" к ней документы "Услуги сторонних организаций".

    Для этого я воспользовался описанным выше методом.

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

    Как же узнать, в момент проведения документа "Услуги сторонних организаций" состояние приходной накладной (проведен/не проведен)?
  18. 1Счик
    Offline

    1Счик

    Регистрация:
    16 дек 2008
    Сообщения:
    46
    Симпатии:
    0
    Баллы:
    1
    Есть, конечно, идея создать глобальную переменную и в нее писать, что я делаю (провожу или снимаю с проведения приходную накладную), но, ИМХО, это не совсем хорошо.
  19. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Не совсем понятна суть вопроса.
    Есть процедуры ОбработкаПроведения и ОбработкаУдаленияПроведения. Из них передавай параметр в ПерепроведениеДокументовУслугиСтороннихОрганизаций.

    А по поводу
    То задача поставлена не совсем верно.
    При проведении одного документа, не должны перепроводиться другие.... Обычно используются обработки для группового проведения документов.

Поделиться этой страницей