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

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

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

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

    КонецЕсли;

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


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