Имя: Пароль:
1C
 
v8.2 Флажок
0 ms_ananas
 
08.09.14
11:07
В справочнике в табличной части есть реквизит "Актуальность". У меня есть процедура, которая следит чтобы актуальной была только одна строка. Когда стоит актуальность на двух строках, появляется ошибка, я соглашаюсь с ней, а потом закрываю справочник и при этом нажимаю что не надо сохранять изменения. Но потом когда опять заходишь в справочник значение актуальности осталось на двух строках. Как сделать чтобы не сохранял изменения?
1 Steini
 
08.09.14
11:17
Мисс Ананас, как первый вариант могу предложить сделать в модуле справочника в обработчике ПередЗаписью эту вашу проверку, и, в случае не успеха, не позволять записывать элемент справочника.
2 _fvadim
 
08.09.14
11:18
или ловить установку флажка и сбрасывать его на всех строчках кроме текущей.
3 ms_ananas
 
08.09.14
11:29
(1) перед записью у меня и идет проверка. он проверяет. но если закрыть справочник то данные все равно остались( я не могу понять почему
4 Timon1405
 
08.09.14
11:35
Если кинете код в студию(какие формы, какой модуль, какое событие), публике станет понятнее что у вас там происходит.
5 Steini
 
08.09.14
11:43
(3) да ну не бывает такого)
могу назадавать наводящие вопросы:
1) формы обычные или управляемые?
2) действительно ли в обработчике модуля объекта (а не формы) ПередЗаписью находится примерно такой код:

Если Не МояПроверка() Тогда
    Сообщить("Слишком много галочек");
    Отказ = Истина;
    Возврат;
КонецЕсли;

3) действительно ли на форме помещена табличная часть, а не какое-нибудь табличное поле, которое живет независимой жизнью?
4) действительно ли изначально в этом объекте стояло не больше одной галочки?
6 ms_ananas
 
08.09.14
11:51
(5) Ааам. форма обычная.
Изменяю конфигурацию ЗИК.
Да код находится именно в модуле объекта.
Я сама создала эту колонку ссылаясь на реквизит. Никакой независимой жизни быть не может.
Галочек не было. Потом например я добавила три галочки на все три строки. Нажимаю записать, появляется ошибка, окей я соглашаюсь. Потом ничего не изменяю, закрываю справочник и не сохраняю изменения. а потом захожу и они правда там остаются.

Вот код:
Процедура ПередЗаписью(Отказ)
    
    ФизическиеЛицаПереопределяемый.ПередЗаписью(ЭтотОбъект, Отказ);
    
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    #Если ТолстыйКлиентОбычноеПриложение Тогда
        ОбработкаКомментариев = глЗначениеПеременной("глОбработкаСообщений");
        ОбработкаКомментариев.УдалитьСообщения();
    #КонецЕсли
     //изменено админ
    // проверим дубли строк в таблице Стажи
    СписокДублейСтажа = Новый СписокЗначений;
    СписокСтажа = Новый СписокЗначений;
    Для каждого СтрокаСтажа Из Стажи Цикл
        Проверка = СтрокаСтажа.Актуальность;              // админ
        Если Проверка = Истина Тогда                       // админ
            Если СписокСтажа.НайтиПоЗначению(СтрокаСтажа.ВидСтажа) = Неопределено Тогда
                СписокСтажа.Добавить(СтрокаСтажа.ВидСтажа);            
            Иначе
                СписокДублейСтажа.Добавить(СтрокаСтажа.ВидСтажа);
            КонецЕсли;
            
        КонецЕсли;
    КонецЦикла;
    
    Если СписокДублейСтажа.Количество() <> 0 Тогда
        
        Отказ = Истина;
        СрокаСообщенияОбОшибке = "В списке ""Стажи общего характера"" обнаружены записи с повторяющимся видом стажа: " + СписокДублейСтажа;
        
        #Если ТолстыйКлиентОбычноеПриложение Тогда
            ОбработкаКомментариев.ДобавитьСообщение(СрокаСообщенияОбОшибке, Перечисления.ВидыСообщений.Ошибка);
            ОбработкаКомментариев.ДобавитьСообщение("Актульным может быть только один стаж!", Перечисления.ВидыСообщений.Ошибка);
            ОбработкаКомментариев.ДобавитьСообщение("Элемент не записан!", Перечисления.ВидыСообщений.Ошибка);
            ОбработкаКомментариев.ПоказатьСообщения();
        #Иначе
            Сообщить(СрокаСообщенияОбОшибке, СтатусСообщения.Важное);
        #КонецЕсли
        
    КонецЕсли;
    
КонецПроцедуры
7 ms_ananas
 
08.09.14
11:55
8 Steini
 
08.09.14
11:55
Первое: а в ФизическиеЛицаПереопределяемый.ПередЗаписью(ЭтотОбъект, Отказ); объект, случайно, не записывается? точно? =)
9 ms_ananas
 
08.09.14
11:56
(7) это я не трогала, так было изначально в конфе)
10 Steini
 
08.09.14
11:58
(9) да, но все же, попробуй свою проверку переместить в самое начало процедуры. Перед ФизическиеЛицаПереопределяемый.ПередЗаписью(ЭтотОбъект, Отказ);
11 Timon1405
 
08.09.14
12:01
(10) Лучше прямо в подписку. переопределяемые модули для этого и сделаны, чтобы не править модуль исходного объекта
12 ms_ananas
 
08.09.14
12:06
(10) не вышло. ошибку опять выдал. Но после отмены сохранения данные все равно остались.
13 break
 
08.09.14
12:14
кеш почистите
14 Steini
 
08.09.14
12:15
Что-то мистическое. В таких случаях отладчик в помощь! Мое предложение:
1) ставим точку останова на первую строку в процедуре ПередЗаписью
2) добавляем в табло две переменные:
ЭтотОбъект.ТвояТЧ и Ссылка.ТвояТЧ.
3) сравниваем, в Ссылка не должно быть галочек, в ЭтотОбъект - должно быть.
4) далее скрупулезно ищем момент, когда они становятся одинаковыми.
15 break
 
08.09.14
12:17
(14) или просто Модифицированность()
16 ms_ananas
 
08.09.14
12:18
(15) и что даст этот метод? первый раз о нем слышу
17 Steini
 
08.09.14
12:19
(15) да это неинформативно, я вон выше немножко тоже ступил))) Ведь все дороги перед записью ведут в обработчик "ПередЗаписью" =)
18 ms_ananas
 
08.09.14
12:20
(14) выходит из-за того, что становятся одинаковыми этотобъект и ссылка, данные сохраняются даже при отмене сохранения?
19 ms_ananas
 
08.09.14
12:21
(17) у меня даже если я прост сейчас много строк создам и не сохраню их. они все равно сохранятся. Даже если они без галочки
20 Один С
 
08.09.14
12:21
(7) типа без палева выложила скрин?
это Мальков Александр Яковлевич..
21 Steini
 
08.09.14
12:22
(18) не, я бы так не стал говорить. Вообще, что-то странное, как будто данные записываются где-то еще, не попадая в обработчик ПередЗаписью. Сравнивая в отладчике ЭтотОбъект.Стажи с Ссылка.Стажи можно воочию увидеть, что в текущий момент изменено на форме, а что уже записано в базу данных.
22 ms_ananas
 
08.09.14
12:22
(20) ага не заметила. заработалась
23 ms_ananas
 
08.09.14
12:26
сейчас даже ради забавы протестировала. добавила 10 новых строк без галочки и две строки с галочкой. Выходит ошибка что должна быть только одна актуальная строка, я соглашаюсь, потом закрываю, не сохраняю, захожу опять, а он все оставил как есть. 12 строк. Почему он так хранит данные? Вдруг пользователь не заметит что копировал строки и сохранит.
24 ms_ananas
 
08.09.14
12:31
(21) ладно спасибо большое, буду разбираться)
25 break
 
08.09.14
12:41
комментируете весь код в ПередЗаписью(), в связанных подписках, оставляете только Отказ = истина, пробуете что происходит при (23). рекомендую еще кеш почикать
AdBlock убивает бесплатный контент. 1Сергей