Имя: Пароль:
1C
1С v8
Проверка уникальности номера в расширении
0 bfss-732
 
28.10.21
21:20
Всем привет!
Пишу такой код проверки уникальности номера. Но все равно не прерывается код и документ в итоге создается. Что не так делаю?
&НаКлиенте
Процедура Расш1_НомерПриИзмененииПосле(Элемент)    
    
    ИзменитьНомер()
    
КонецПроцедуры

Процедура ИзменитьНомер();
    
    
    
    //Запрос всех номеров в день создания СФ
    ЗапросПоследнегоНомера = Новый Запрос;
    ЗапросПоследнегоНомера.Текст =
    "ВЫБРАТЬ
    |    СчетФактураВыданный.Ссылка КАК Ссылка,
    |    СчетФактураВыданный.ВерсияДанных КАК ВерсияДанных,
    |    СчетФактураВыданный.ПометкаУдаления КАК ПометкаУдаления,
    |    СчетФактураВыданный.Номер КАК Номер,
    |    СчетФактураВыданный.Дата КАК Дата,
    |    СчетФактураВыданный.Проведен КАК Проведен
    |ИЗ
    |    Документ.СчетФактураВыданный КАК СчетФактураВыданный
    |ГДЕ
    |    НЕ СчетФактураВыданный.ПометкаУдаления
    |    И СчетФактураВыданный.Проведен
    |    И СчетФактураВыданный.Дата <= &ДатаКон
    |    И СчетФактураВыданный.Дата >= &ДатаНач
    |
    |УПОРЯДОЧИТЬ ПО
    |    Номер";
    
    ЗапросПоследнегоНомера.УстановитьПараметр("ДатаКон", КонецДня(Объект.Дата));
    ЗапросПоследнегоНомера.УстановитьПараметр("ДатаНач", НачалоДня(Объект.Дата));
    
    
    РезультатЗапроса = ЗапросПоследнегоНомера.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выгрузить();
    
    Для Каждого ЗначениеЭлементаМассива Из ВыборкаДетальныеЗаписи Цикл
        Если ЗначениеЭлементаМассива.Номер = Объект.Номер Тогда
            Сообщить("Номер не уникален!");
            Отказ = Истина;
               Возврат;
        КонецЕсли;
    КонецЦикла;
    
    
КонецПроцедуры
1 bfss-732
 
28.10.21
21:21
Почему полностью не прерывается код?
Отказ = Истина;
Возврат;
2 bfss-732
 
28.10.21
21:24
В итоге если ЗначениеЭлементаМассива.Номер = Объект.Номер будет ИСТИНА, полностью прервать операцию с сообщением "Номер не уникален!"
3 Homer
 
28.10.21
23:23
Отказ работаем там где он прописан. Какое отношение имеет номер к отказу в штатной конфигурации
4 серый КТУЛХУ
 
29.10.21
01:11
//а.хре.неть!
Если ДокПоНомеру <> Неопределено Тогда Если НачДата <= ДокПоНомеру.Дата И ДокПоНомеру.Дата <= КонДата Тогда Отказ = Истина КонецЕсли КонецЕсли;
5 серый КТУЛХУ
 
29.10.21
01:12
а. и. перед. вотето:
ДокПоНомеру = Документы.СчетФактураВыданный.НайтиПоНомеру(Объект.Номер,Объект.Дата);
6 bfss-732
 
29.10.21
10:15
(4) Тут проверка на уникальность номера?
7 Dmitrii
 
гуру
29.10.21
10:24
Сам код - полное *авно. Но ключевая проблема не в этом.
С какого перепугу ты решил, что Отказ = Истина должно привести к отмене записи?
Как какая-то там переменная "Отказ" в какой-то твоей процедуре связана с событием записи документа? Что такое "Отказ" у тебя?

Если ты обрабатываешь событие изменения значения в поле ввода, то должно выводиться сообщение или предупреждение пользователю и поле ввода должно очищаться или возвращаться предыдущее значение.
Если ты обрабатываешь событие записи (например, ПередЗаписью), то и пиши код там. Там есть флаг "Отказ".
8 Ёпрст
 
гуру
29.10.21
10:25
(0)
>>>После
9 Dmitrii
 
гуру
29.10.21
10:27
(6) Сначала (5) потом (4).
А весь запрос в (0) - полный бред.
Если конечно только у тебя не отключен контроль уникальности номеров. Тогда может запрос в (0) и имеет смысл. Дать возможность пользователю насоздавать кучу непроведенных или помеченных на удаление документов с одинаковым номером.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.