Имя: Пароль:
1C
1С v8
Вопрос по обработчикам событий при записи объектов
0 bfss-732
 
17.06.22
15:39
Всем привет!
https://its.1c.ru/db/v8std/browse/13/-1/1/5 <--тут изучал, и в других источников. Но остался вопрос.
Есть 1С ЕРП 2.5, есть документ акт выполненных работ. Есть табличная часть, в ней есть реквизит "НазначениеЗаказ", который надо контролировать расширением.
Есть старые, "неправильные", документы, в которых придется менять "НазначениеЗаказ" при проведении, но тут засада.
ВАЖНО: Нужно дать записать документ, если ВыборкаДетальныеЗаписи.ЗаказКлиента <> ВыборкаДетальныеЗаписи.НазначениеЗаказ = ИСТИНА, но нельзя провести документ при неравенстве.  


Процедура Расш2_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    АктВыполненныхРабот.Ссылка КАК Ссылка,
        |    АктВыполненныхРабот.АктПоЗаказам КАК АктПоЗаказам,
        |    АктВыполненныхРабот.ЗаказКлиента КАК ЗаказКлиента,
        |    АктВыполненныхРаботУслуги.Назначение.Заказ КАК НазначениеЗаказ
        |ИЗ
        |    Документ.АктВыполненныхРабот.Услуги КАК АктВыполненныхРаботУслуги
        |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.АктВыполненныхРабот КАК АктВыполненныхРабот
        |        ПО АктВыполненныхРаботУслуги.Ссылка = АктВыполненныхРабот.Ссылка
        |ГДЕ
        |    АктВыполненныхРабот.Ссылка = &Ссылка";
        
        Запрос.УстановитьПараметр("Ссылка", ЭтотОбъект.Ссылка);
        
        РезультатЗапроса = Запрос.Выполнить();
        
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            Если ВыборкаДетальныеЗаписи.ЗаказКлиента <> ВыборкаДетальныеЗаписи.НазначениеЗаказ Тогда
                Отказ = Истина;    
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "ВНИМАНИЕ!!! В поле ""Акт по заказу"" в обязательном порядке должен быть указан один документ, что и в поле ""Назначение""";
                Сообщение.Поле = "ЭтотОбъект.ЗаказКлиента";
                Сообщение.Сообщить();
                
            КонецЕсли;
        КонецЦикла;

КонецПроцедуры

Если документ записать(но не проводить) то он запишется, а потом можно провести. Но если сразу нажать проведение, он выдаст ошибку(См. выше) по моему условию.
Получается, заходит пользователь с старый, "неправильный" документ, что-то меняет, а ему мое условие не дает провести. Они меняют реквизит "НазначениеЗаказ" на правильный, нажимают провести, а ошибка таже (СМ.выше). Если сначала записывают, а потом проводят, все нормально.

ВОПРОС: Как сделать чтоб документ "неправильный" мог только записаться, а если меняется реквизит "НазначениеЗаказ" на правильный, то через провести сразу проводился?
1 Лирик
 
17.06.22
15:52
Событие ПЕРЕД записью, а данные получаешь из таблицы, то есть записанные в прошлый раз. Потому и не можешь. Контролируй ТЧ ОБЪЕКТА.
2 bfss-732
 
17.06.22
15:56
(1) так это я понимаю)) ОбработкаПроверкиЗаполнения не прокатит, надо записать "неправильный докумет"
3 Kassern
 
17.06.22
16:00
(0) это что за конструкции такие?) ВыборкаДетальныеЗаписи.ЗаказКлиента <> ВыборкаДетальныеЗаписи.НазначениеЗаказ = ИСТИНА
4 lodger
 
17.06.22
16:02
(2) анализируй варианты параметров РежимЗаписи, РежимПроведения
5 Мультук
 
гуру
17.06.22
16:03
(4)

Зачем анализировать РежимПроведения ? Что это даст?
6 bfss-732
 
17.06.22
16:05
Спасибо! Вопрос ЗАКРЫТ!
&Перед("ОбработкаПроведения")
Процедура Расш2_ОбработкаПроведения(Отказ, РежимПроведения)
    Если РежимПроведения = РежимПроведенияДокумента.Неоперативный ИЛИ РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда  

        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    АктВыполненныхРабот.Ссылка КАК Ссылка,
        |    АктВыполненныхРабот.АктПоЗаказам КАК АктПоЗаказам,
        |    АктВыполненныхРабот.ЗаказКлиента КАК ЗаказКлиента,
        |    АктВыполненныхРаботУслуги.Назначение.Заказ КАК НазначениеЗаказ
        |ИЗ
        |    Документ.АктВыполненныхРабот.Услуги КАК АктВыполненныхРаботУслуги
        |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.АктВыполненныхРабот КАК АктВыполненныхРабот
        |        ПО АктВыполненныхРаботУслуги.Ссылка = АктВыполненныхРабот.Ссылка
        |ГДЕ
        |    АктВыполненныхРабот.Ссылка = &Ссылка";
        
        Запрос.УстановитьПараметр("Ссылка", ЭтотОбъект.Ссылка);
        
        РезультатЗапроса = Запрос.Выполнить();
        
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            Если ВыборкаДетальныеЗаписи.ЗаказКлиента <> ВыборкаДетальныеЗаписи.НазначениеЗаказ Тогда
                Отказ = Истина;    
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "ВНИМАНИЕ!!! В поле ""Акт по заказу"" в обязательном порядке должен быть указан один документ, что и в поле ""Назначение""";
                Сообщение.Поле = "ЭтотОбъект.ЗаказКлиента";
                Сообщение.Сообщить();
                
            КонецЕсли;
        КонецЦикла;
        
    КонецЕсли;    
КонецПроцедуры
7 bfss-732
 
17.06.22
16:06
Пока не пожалуешься, прозрение не придет)))
8 Мультук
 
гуру
17.06.22
16:08
(7)

Это очень важное условие.
А в нем может быть "иначе" ?

Если РежимПроведения = РежимПроведенияДокумента.Неоперативный ИЛИ РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
9 Kigo_Kigo
 
17.06.22
16:08
(7) Я называю это  - "Эффект свободные уши" Бгггг, часто так бывает когда бух звонит, что то не получается, выговорится, а потом хоба, да блин, вот этож надо сделать, и трубку кладет :)