Имя: Пароль:
1C
1С v8
Выдавать ошибку при не заполенном реквизите
0 burrya
 
12.11.14
14:25
Как можно программно реализовать аналог "Выдавать ошибку" при незаполнном реквизите документа в УФ. Просто хочется сделать чтоб не просто сообщение выходило, а чтоб активизировался реквизит и была такая надпись. Ну Вы поняли в общем что я имею ввиду.:)
1 Wobland
 
12.11.14
14:25
зачем программно? обновлефобия?
2 SanGvin
 
12.11.14
14:27
Сделать СообщениеПользователю в процедуре проверки заполнения
3 burrya
 
12.11.14
14:30
(1) Нет :) просто при одних условиях обязательны одни реквизиты, при других - другие:)
4 burrya
 
12.11.14
14:30
(2) выглядеть будет также как, если бы выбрал в базе обязательный реквизит - "Выдавать ошибку"
5 SanGvin
 
12.11.14
14:31
(4) Да, если правильно сделаешь. СП смотри, эксперементируй
6 burrya
 
12.11.14
14:32
(5) спасибо
7 Timon1405
 
12.11.14
14:36
// Осуществляет проверку заполненности проверяемых реквизитов.
//
// Параметры:
//         Объект                      - ДокументОбъект, СправочникОбъект - Проверяемый объект.
//         МассивПроверяемыхРеквизитов - Массив - массив проверяемых реквизитов.
//
// Возвращаемое значение:
//         Булево - Истина, если значение хотя бы одного реквизита не заполнено, иначе Ложь
//
Функция ПроверитьЗаполнениеРеквизитовОбъекта(Объект, МассивПроверяемыхРеквизитов) Экспорт
    
    Перем ПроверяемыеРеквизитыТЧ;
    Отказ = Ложь;
    
    // Получение метаданных объекта
    МетаданныеОбъекта = Объект.Ссылка.Метаданные();
    
    // Создание структуры стандартных реквизитов
    СтандартныеРеквизиты = Новый Структура;
    Для Каждого Реквизит Из МетаданныеОбъекта.СтандартныеРеквизиты Цикл
        СтандартныеРеквизиты.Вставить(Реквизит.Имя, ?(ЗначениеЗаполнено(Реквизит.Синоним), Реквизит.Синоним, Реквизит.Имя));
    КонецЦикла;
    
    // Создание структуры для хранения имен табличных частей и проверяемых реквизитов в них.
    //         Ключ -  Имя табличной части
    //         Значение - Массив - Массив строк, реквизитов этой табличной части для проверки
    ТабличныеЧасти = Новый Структура;
    
    // Создание шаблонов сообщений об ошибках не заполненных реквизитов и реквизитов табличных частей
    ШаблонОшибкиРеквизита = НСтр("ru='Поле ""%ИмяРеквизита%"" не заполнено'");
    ШаблонОшибкиТЧ = НСтр("ru='Не введено ни одной строки в список ""%ИмяРеквизита%""'");
    ШаблонОшибкиРеквизитаТЧ = НСтр("ru='Не заполнена колонка ""%ИмяРеквизита%"" в строке %НомерСтроки% списка ""%ИмяТабличнойЧасти%""'");
    
    // Проверка реквизитов объекта и заполнение структуры по реквизитам табличных частей
    Для Каждого Реквизит Из МассивПроверяемыхРеквизитов Цикл
        
        ПозицияТочки = Найти(Реквизит,".");
        
        Если ПозицияТочки > 0 Тогда // В случае если указан реквизит табличной части
            
            ДлинаСтроки       = СтрДлина(Реквизит);
            ИмяТабличнойЧасти = Лев(Реквизит, ПозицияТочки-1);
            ИмяРеквизита      = Прав(Реквизит, ДлинаСтроки - ПозицияТочки);
            
            // Сохранение проверяемого реквизита табличной части в структуру
            Если НЕ ТабличныеЧасти.Свойство(ИмяТабличнойЧасти, ПроверяемыеРеквизитыТЧ) Тогда
                ПроверяемыеРеквизитыТЧ = Новый Массив;
                ТабличныеЧасти.Вставить(ИмяТабличнойЧасти, ПроверяемыеРеквизитыТЧ);
            КонецЕсли;
            ПроверяемыеРеквизитыТЧ.Добавить(ИмяРеквизита);
            
        Иначе // В случае если указан реквизит объекта
            
            Если Не ЗначениеЗаполнено(Объект[Реквизит]) Тогда
                
                Если МетаданныеОбъекта.Реквизиты.Найти(Реквизит) <> Неопределено Тогда // Если указано имя реквизита
                    ТекстОшибки = СтрЗаменить(ШаблонОшибкиРеквизита, "%ИмяРеквизита%",
                        МетаданныеОбъекта.Реквизиты[Реквизит].Синоним);
                ИначеЕсли СтандартныеРеквизиты.Свойство(Реквизит) Тогда // Если указано имя стандартного реквизита
                    ТекстОшибки = СтрЗаменить(ШаблонОшибкиРеквизита, "%ИмяРеквизита%",
                        СтандартныеРеквизиты[Реквизит]);
                Иначе // Если указано имя табличной части
                    ТекстОшибки = СтрЗаменить(ШаблонОшибкиТЧ, "%ИмяРеквизита%",
                        МетаданныеОбъекта.ТабличныеЧасти[Реквизит].Синоним);
                КонецЕсли;
                
                ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
                    ТекстОшибки,
                    Объект,
                    Реквизит,
                    ,
                    Отказ);
                
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЦикла;
    
    // Проверка реквизитов в табличных частях
    Для Каждого ТабличнаяЧасть Из ТабличныеЧасти Цикл
        
        ИмяТабличнойЧасти = ТабличнаяЧасть.Ключ;
        ТабличнаяЧастьОбъекта = Объект[ТабличнаяЧасть.Ключ];
        МассивРеквизитов = ТабличнаяЧасть.Значение;
        
        // Цикл по всем строкам табличной части.
        Для НомерСтроки=0 По ТабличнаяЧастьОбъекта.Количество()-1 Цикл
            
            // Цикл по всем проверяемым реквизитам для текущей табличной части.
            Для НомерРеквизита=0 По МассивРеквизитов.Количество()-1 Цикл
                
                ИмяРеквизита = МассивРеквизитов[НомерРеквизита];
                
                Если Не ЗначениеЗаполнено(ТабличнаяЧастьОбъекта[НомерСтроки][ИмяРеквизита]) Тогда
                    
                    ТекстОшибки = СтрЗаменить(ШаблонОшибкиРеквизитаТЧ, "%ИмяРеквизита%", МетаданныеОбъекта.ТабличныеЧасти[ИмяТабличнойЧасти].Реквизиты[ИмяРеквизита].Синоним);
                    ТекстОшибки = СтрЗаменить(ТекстОшибки, "%НомерСтроки%", Формат(НомерСтроки+1, "ЧГ=0"));
                    ТекстОшибки = СтрЗаменить(ТекстОшибки, "%ИмяТабличнойЧасти%", МетаданныеОбъекта.ТабличныеЧасти[ИмяТабличнойЧасти].Синоним);
                    
                    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
                        ТекстОшибки,
                        Объект,
                        ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти(ИмяТабличнойЧасти, НомерСтроки+1, ИмяРеквизита),
                        ,
                        Отказ);
                    
                КонецЕсли;
                
            КонецЦикла;
            
        КонецЦикла;
        
    КонецЦикла;
    
    МассивПроверяемыхРеквизитов.Очистить();
    
    Возврат Отказ;
    
КонецФункции // ПроверитьЗаполнениеРеквизитовОбъекта()
8 DrZombi
 
гуру
12.11.14
15:11
(0) Используй метод "СообщениеПользователю"

СообщениеПользователю (UserMessage)
СообщениеПользователю (UserMessage)
Свойства:

ИдентификаторНазначения (TargetID)
КлючДанных (DataKey)
Поле (Field)
ПутьКДанным (DataPath)
Текст (Text)

Методы:

Сообщить (Message)
УстановитьДанные (SetData)

Конструкторы:

По умолчанию

Описание:

Предназначен для хранения параметров сообщения, которые необходимо вывести пользователю.
Если сообщение еще не было показано пользователю (такое может быть при работе на стороне сервера, в фоновом задании, внешнем соединении или Web-сервисах), можно получить накопленные сообщения методом ПолучитьСообщенияПользователю.

В управляемых формах, в случае выполнения просмотра сообщения, выполняется следующий механизм обработки:
Если у сообщения свойство КлючДанных заполнено и не совпадает с ключевым значением основного реквизита текущей формы (ссылкой объекта или ключом записи регистра сведений), то:
открывается новая форма объекта, соответствующая значению свойства КлючДанных;
если у сообщения свойство ПутьКДанным не заполнено, то в него проставляется имя основного реквизита открытой формы объекта;
вызывается показ сообщения в только что открытой форме;
выполняется перенос всех соответствующих сообщений из окна первой формы в новую форму (с таким же значением свойств КлючДанных, как у выбранного сообщения). При этом перенесенным сообщениям аналогичным образом проставляется свойство ПутьКДанным, если оно не установлено.


Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Пример:

Процедура ДействиеСОбъектом(ОбъектДанных)
    ...
    Сообщение = Новый СообщениеПользователю();
    Текст = "ru = ""В строке 11 табличной части ""Номенклатура"" не хватает ";"
     + " en = ""In line 11 of tabular section ""Nomenclature"" is missing ";
    Сообщение.Текст = НСтр(Текст)+НедостающееКоличество+" "+ЕдиницаИзмеренияНоменклатуры;
    Сообщение.Поле = "Номенклатура[10].Количество";
    Сообщение.УстановитьДанные(ОбъектДанных);
    Сообщение.Сообщить();

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


См. также:

Глобальный контекст, метод УстановитьСоответствиеОбъектаИРеквизитаФормы
Глобальный контекст, метод ПолучитьСоответствиеОбъектаИРеквизитаФормы
Глобальный контекст, метод ПолучитьСообщенияПользователю
Закон Брукера: Даже маленькая практика стоит большой теории.