Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Разрешить записать документ, но запретить провести по кнопке Οκ?

Разрешить записать документ, но запретить провести по кнопке Οκ?
Я
   pvase
 
22.04.19 - 12:14
Здравствуйте.
Возникла необходимость при проведении документа делать некую проверку и запрещать проводить, но при этом надо чтобы документ сохранялся в базу. Т.е. когда пользователь создает новый документ и жмет кнопку "Οκ", то чтобы при проведении выдавалось сообщение об ошибке, и документ не проводился, но записывался в базу. Сейчас же, ввиду реализации транзакции в 1С: ПередЗаписью - ПриЗаписи - ОбработкаПроведения, если в любом из этих модулей Отказ = Истина - тогда откатывается вся транзакция и документ не сохраняется в базу, даже новый. Подскажите пожалуйста, как можно разрешить записывать, но запретить проводить нового документа по кнопке Οκ?
 
 
   Nikoss
 
1 - 22.04.19 - 12:15
режим записи поменять
   Ахмадинежад
 
2 - 22.04.19 - 12:17
А если открыть проведённый, изменить и попытаться перепровести ? Пусть сам меняется, а его движения нет ?
   pvase
 
3 - 22.04.19 - 12:19
(1) Как это сделать, на кнопке Οκ висит стандартная команда "Записать и закрыть"?
   Eiffil123
 
4 - 22.04.19 - 12:20
(1) хитро. Раньше не предполагал, что режим записи можно менять программно в процедуре "Перед записью"
   Eiffil123
 
5 - 22.04.19 - 12:20
(3) свою кнопку "Ок" нарисовать, в ее коде вызывать запись в нужном режиме.
   pvase
 
6 - 22.04.19 - 12:21
(2) С проведенными все гуд, надо с новыми. Дело в том, что при записи создается документ на основании, а потом обработка проведения откатывает транзакцию и соответственно откатывается и созданный на основании документ. Получается что Отмена в проведении отменять и запись созданных документов в процедуре "ПередЗаписью".
   Cyberhawk
 
7 - 22.04.19 - 12:25
Создавай связанный документ вне транзакции записи основания
   Eiffil123
 
8 - 22.04.19 - 12:30
(0) вообще варианта 2:
1. Нарисовать свою кнопку "Ок", в ней 2 строки кода (Записать, потом провести)
2. Сказать пользователям, что так работает 1С и если нужно обязательно записать документ, то пусть сначала жмут Записать, потом уже провести.
   1Сергей
 
9 - 22.04.19 - 12:40
Семёрка, отпусти автора
   Eiffil123
 
10 - 22.04.19 - 12:47
(9) в семёрке было ПередЗаписью?
   Nikoss
 
11 - 22.04.19 - 13:03
(6) да не надо делать отмену в проведении. В процедуре передзаписью (на форме) просто вставить строку
"ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Запись;" И никакого проведения не будет.
   Cyberhawk
 
12 - 22.04.19 - 13:03
(11) Так ему все-таки за одно нажатие надо чтоб и провелось, если все хорошо
   pvase
 
13 - 22.04.19 - 13:06
(11) Таки ДА.
Переделываю на свою процедуру кнопку ОК.
   pvase
 
14 - 22.04.19 - 14:16
Что-то не могу понять, написал свою функцию проведения:
Процедура ОсновныеДействияФормыОК(Кнопка)
    ДополнительныеСвойства.ПрограммноеИзменение = Ложь;
    Если ЭтоНовый() Тогда
        Записать(РежимЗаписиДокумента.Запись,РежимПроведенияДокумента.Оперативный);
    КонецЕсли; 
    
    ЕстьНарушения = ПроверитьНарушения();
    
    Если ЕстьНарушения Тогда 
        Сообщение = Новый СообщениеПользователю();
        Сообщение.Текст = "Обнаружены нарушения при проведении";
        Сообщение.КлючДанных = Ссылка;
        Сообщение.ПутьКДанным = "Объект";
        Сообщение.Сообщить();
        //Отказ    = Истина;

    КонецЕсли;

    Если НЕ ЕстьНарушения Тогда
        Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Оперативный);
    КонецЕсли; 
КонецПроцедуры

Но в результате документ в отладчике пишет что создан (Новый() = Ложь) но при этом в журнале его нет. Подскажите, что может быть не так?
   pvase
 
15 - 22.04.19 - 14:20
Ситуация еще хуже. Если в открытой форме, подправить реквизит и попытаться закрыть, то выдает сообщение о модифицированности и необходимости записать. Если нажать на кнопку "Да" то документ как будто записывается и форма закрывается, но в форме списка нет.
   1Сергей
 
16 - 22.04.19 - 14:21
(10) семерка по умолчанию сохраняет док даже в случае ошибки
   pvase
 
17 - 22.04.19 - 14:28
На всякий случай: Форма - обычная, клиент - толстый.
   pvase
 
18 - 22.04.19 - 14:31
При этом в заголовке формы пишет "Новый", а значение Модифицированность() = Ложь; Ссылка не пустая, но документа физически нет.
   pvase
 
19 - 22.04.19 - 14:38
В общем, что-то непонятное. Документ создается, записывается, а потом как будто все отменяется, документ снова становиться новым и не записанным, при этом и не модифицированным.
   Nikoss
 
20 - 22.04.19 - 14:44
как минимум 2 раза слово "запись" из процедуры убрать нужно
   Nikoss
 
21 - 22.04.19 - 14:47
+(20) ну т.е. делать сначала запись, а потом еще раз запись с проведением - не правильно
   Nikoss
 
22 - 22.04.19 - 14:50
что-то типо того

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


    КонецЕсли;

    Если ЕстьНарушения Тогда
    Если ЭтоНовый() Тогда
        Записать(РежимЗаписиДокумента.Запись);
    КонецЕсли;
    Иначе
        Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Оперативный);
    КонецЕсли; 
КонецПроцедуры
   Nikoss
 
23 - 22.04.19 - 14:51
Но судя по логике твоего кода, не новые с нарушением записаны не будут.
   Cyberhawk
 
24 - 22.04.19 - 16:21
(22) С таким кодом документ никогда с первого раза проведен не будет
   Nikoss
 
25 - 23.04.19 - 06:26
(24) если нарушений нет, будет с первого раза проведен
   Cyberhawk
 
26 - 23.04.19 - 07:34
(25) Это только если успешно проведется. А если неуспешно, что изначально и наблюдается у автора, то будет отлуп без сохранения "черновика", т.е. твой способ ничем от ситуации в сабже отличается, т.к. нарушение (отлуп) у него только в транзакции проведения вываливается и заранее он не хочет проверять )
   los_hooliganos
 
27 - 23.04.19 - 08:01
ПередЗаписью - ПриЗаписи - ОбработкаПроведения
Заводишь реквизит флЗаписатьНеПроводить;
Если в ПередЗаписью - ПриЗаписи Отказа = Истина, то ставишь Отказа = Ложь в расширениях После[ПередЗаписью - ПриЗаписи] при этом реквизит флЗаписатьНеПроводить = Истина;
Если в ОбработкаПроведения флЗаписатьНеПроводить = Истина Тогда Отказа = Истина; можно в расширение Перед[ОбработкаПроведения]
   los_hooliganos
 
28 - 23.04.19 - 08:02
(27) Если это нетиповая то можно это в саму конфу засунуть
   Nikoss
 
29 - 23.04.19 - 08:58
(26) это я написал еще в (23). Никто не мешает убрать прверку на Новый() и сделать по умолчанию запись.


"и заранее он не хочет проверять"
почему не хочет? у него же в коде (14) есть обращение к функции "ЕстьНарушения = ПроверитьНарушения();"
   Cyberhawk
 
30 - 23.04.19 - 13:33
(29) А, ясно, не читал просто всю ветку ) Оказывается это сам автор там проверку уже реализовал, Я-то думал это ты ему предлагаешь так делать )
 
 Рекламное место пустует


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.