Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Перепроведение документа.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
alex040269
Добрый день. При закрытии документа появляется вопрос: " Сохранить документ? (Документ будет перепроведен) ".

Можно как-то запретить сохранение документа, кроме нажатия на кнопку ОК?

Спасибо.

Платформа 7.70.027.
MATEVI
Повесить на кнопку закрыть свою процедуру
//=============================================
Процедура ПриЗакрытииДокумента()
    Форма.Закрыть(0); // где 0 без вопросов
КонецПроцедуры
nysysimara
MATEVI, а как быть с нажатием крестика в правом верхнем углу?
5_kopeek
В правах пользователя убрать разрешение записи без перепроведения. Тогда даже при выборе утвердительного ответа документ не будет сохранен без нажатия ОК.
nysysimara
нужна глобальная переменная
например - НажалиОк
при нажатии кнопки "Ок" присвоить НажалиОк=1;
а в процедуре ПриЗаписи прописать
Процедура ПриЗаписи()
    Если  НажалиОк=0 Тогда
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;  
КонецПроцедуры
MATEVI
Цитата(nysysimara @ 21.02.12, 14:29) необходимо зарегистрироваться для просмотра ссылки
MATEVI, а как быть с нажатием крестика в правом верхнем углу?

Да поспешил.
alex040269
Спасибо всем откликнувшимся!!!

К сожалению ничего не помогает.

У меня есть дописанная Бух 7.70.259. В ней есть документ, Расчет ЗП не типовый. Этот документ использует "всповогательные документы". РасчетНачисления,РасчетУдержания и РасчетФонды. Так вот, если Документ рассчтиать и нажаить ОК, то все хорошо, но если документ закрыть как нибудь иначе, даже если реалльно документ в базу не записывается:
Процедура ПриЗаписи()
      СтатусВзврата(0);
      Возврат;
КонецПроцедуры.


Каким то образом документы РасчетУдержания помечаются на удаление и при следуещем перепроведении документ проводится не правильно.
Нужно снова рассчитать весь документ и провести sad.gif
MATEVI
Как так? При закрытии помечается на удаление? Поподробней желательно с кодом
Читатель
Надо смотреть код где и как Ваш документ "Расчет ЗП" <использует "всповогательные документы">. Где-то же он помечает на удаление.
5_kopeek
Цитата(alex040269 @ 21.02.12, 16:30) необходимо зарегистрироваться для просмотра ссылки
Каким то образом документы РасчетУдержания помечаются на удаление и при следуещем перепроведении документ проводится не правильно.
Нужно снова рассчитать весь документ и провести sad.gif

Так это совсем другой вопрос. Как говорили, нужен код.
alex040269
В какие обработчики смотреть?
nysysimara
Цитата(alex040269 @ 21.02.12, 16:30) необходимо зарегистрироваться для просмотра ссылки
но если документ закрыть как нибудь иначе, даже если реалльно документ в базу не записывается

а что у вас в процедуре ПриЗакрытии()?
Может там прописано удаление
alex040269
ПриЗакрытии процедура не определена
ПриЗаписи вполне стандартно было:

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


+ Я добавил код для проверки соответсвия основного документа вспомогательным, после чего и выявил такой баг...


Р.S. НажалиОК - тоже я добавил по совету nysysimara
nysysimara
Если Итоговый = 1 Тогда
        ИзмИтоговый();
    КонецЕсли;

- это вами добавленная проверка?
а непосредственно код процедуры ИзмИтоговый() можно
alex040269
нет там ничего!
Процедура ИзмИтоговый()
    Если Итоговый = 1 Тогда
        НачалоПериода = НачМесяца(ДатаДок);
        КонецПериода  = КонМесяца(ДатаДок);
        
        ДатаДок = КонецПериода;
    КонецЕсли;
КонецПроцедуры
nysysimara
Цитата(alex040269 @ 22.02.12, 8:52) необходимо зарегистрироваться для просмотра ссылки
+ Я добавил код для проверки соответсвия основного документа вспомогательным, после чего и выявил такой баг...

так может в этом коде собака и зарыта
и закрытие или запись документа ни причем
alex040269
баг был и раньше, суммы в доке есть а проводок - нет.
вот полный код:
Процедура ПроверитьВспомогательныеДокументы(ДокументыНачисления,ТабличнаяЧасть,спНачислено,ДокНач)
    НСДокументаНачисления = 0;
    Пока ДокументыНачисления.НайтиЗначение(ТабличнаяЧасть.Сотрудник,НСДокументаНачисления,"Сотр") = 1 Цикл
        ДокументыНачисления.ПолучитьСтрокуПоНомеру(НСДокументаНачисления);
        Если ДокНач.НайтиДокумент(ДокументыНачисления.Док) = 1 Тогда
            ТабЧасть = 0;
            ДокНач.ВыгрузитьТабличнуюЧасть(ТабЧасть,);
            //ТабЧасть.ВыбратьСтроку();
            РазмерСписка = спНачислено.РазмерСписка();
            Для ш = 1 По РазмерСписка Цикл
                Реквизит = спНачислено.ПолучитьЗначение(ш);
                Значение = ТабличнаяЧасть.ПолучитьЗначение(ТабличнаяЧасть.НомерСтроки,Реквизит);
                Если Значение <> 0 Тогда
                    СтрокаНУ = 0;
                    Если СоответсвиеНУ.НайтиЗначение(Реквизит,СтрокаНУ,"Реквизит") = 0 Тогда
                        Сообщить("Не найден вид расчета для " + Реквизит);
                        Продолжить;
                    КонецЕсли;
                    СоответсвиеНУ.ПолучитьСтрокуПоНомеру(СтрокаНУ);
                    //ТабЧасть.ВыбратьСтроку();
                    спВидыРасчетов.ВыбратьЭлементыПоРеквизиту("ВидРасчетов",СоответсвиеНУ.ВидРасчета,0,0);
                    Пока спВидыРасчетов.ПолучитьЭлемент() = 1 Цикл
                        СтрокаНУ = 0;
                        Пока ТабЧасть.НайтиЗначение(спВидыРасчетов.ТекущийЭлемент(),СтрокаНУ,"НачислениеУдержание") = 1 Цикл
                            ТабЧасть.ПолучитьСтрокуПоНомеру(СтрокаНУ);
                            Значение = Значение - ТабЧасть.Результат;
                            ТабЧасть.УдалитьСтроку(СтрокаНУ);
                            СтрокаНУ = 0;
                        КонецЦикла;
                    КонецЦикла;
                    ТабличнаяЧасть.УстановитьЗначение(ТабличнаяЧасть.НомерСтроки,Реквизит,Значение)
                КонецЕсли;
            КонецЦикла;    
        Иначе
            Сообщить(ДокументыНачисления.Док + " не найден");
        КонецЕсли;
        ДокументыНачисления.УдалитьСтроку(НСДокументаНачисления);
        НСДокументаНачисления = 0;
    КонецЦикла;
КонецПроцедуры



Процедура ПриЗаписи()

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

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

    Если Запрос.Выполнить(запрУдержСотр) = 0 Тогда
        Сообщить("Не выполнен запрос по начислениям сотрудников ");
        Возврат;
        //Продолжить;
    КонецЕсли;
    
    ДокументыУдержания = 0;
    Запрос.Выгрузить(ДокументыУдержания,,0);
    
    ДокНач = СоздатьОбъект("Документ.авбЗарплатаСотрудникаНачисления");
    ДокУд = СоздатьОбъект("Документ.авбЗарплатаСотрудникаУдержания");

    СоздатьСоответсвие();    
    спВидыРасчетов = СоздатьОбъект("Справочник.авбНачисленияУдержания");

    
        ТабличнаяЧасть = 0;
    ВыгрузитьТабличнуюЧасть(ТабличнаяЧасть);
    
    ТабличнаяЧасть.ВыбратьСтроки();
    Пока ТабличнаяЧасть.ПолучитьСтроку() = 1 Цикл
        Если (ТабличнаяЧасть.Начислено <> 0) Тогда
            ПроверитьВспомогательныеДокументы(ДокументыНачисления,ТабличнаяЧасть,спНачислено,ДокНач)
        КонецЕсли;
        Если (ТабличнаяЧасть.Удержано <> 0) Тогда
            ПроверитьВспомогательныеДокументы(ДокументыУдержания,ТабличнаяЧасть,спУдержано,ДокУд)
        КонецЕсли;
    КонецЦикла;
    
    
    РазмСписка = спУдержано.РазмерСписка();
    Для ш = 1 по РазмСписка Цикл
        спНачислено.ДобавитьЗначение(спУдержано.ПолучитьЗначение(ш))
    КонецЦикла;
        
    РазмСписка = спНачислено.РазмерСписка();
    ТабличнаяЧасть.ВыбратьСтроки();
    Пока ТабличнаяЧасть.ПолучитьСтроку() = 1 Цикл
        Для ш = 1 По РазмСписка Цикл
            ИмяРевизита = спНачислено.ПолучитьЗначение(ш);
            Значение = ТабличнаяЧасть.ПолучитьЗначение(ТабличнаяЧасть.НомерСтроки,ИмяРевизита);
            Если Значение <> 0 Тогда
                Сообщить("Сотрудник " + ТабличнаяЧасть.Сотрудник + " расхождение сумм в колонке " + ИмяРевизита + " = " + Значение,"!!!");
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры



Большое спасибо за внимание.


Нужно еще исследовать процедуру ПриУдаленииДокумента. Отладчик не остананавливался, Сообщить не устанавливал, а надо бы ... в общем сделаю - отпишусь...
5_kopeek
Проверьте, действительно ли вспомогательный документ помечается на удаление именно при закрытии документат Расчет ЗП. Заодно гляньте, что происходит в ПриОтменеПроведения(). А для анализа формирования/не формирования проводок нужен модуль документа.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.