ПроверяемыеРеквизиты.Удалить

1. M_A_D 184 30.07.20 09:30 Сейчас в теме
Необходимо на стороне УТ 11.3 дописать код, при исполнении которого не будет проверяться реквизитТЧ.

На текущий момент написал:
&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
	
	Сумм = ПроверяемыеРеквизиты.Найти("Товары.Сумма");
	Тов = Объект.Товары;
	Для каждого Строка из Тов цикл
	Если Строка.ПроцентАвтоматическойСкидки = 100 тогда
		Сообщить("Поймали строку");
		ПроверяемыеРеквизиты.Удалить(Сумм);
	КонецЕсли;
	Сообщить(Сумм)
	КонецЦикла;
	
	
	// СтандартныеПодсистемы.Свойства
	УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтаФорма, Отказ, ПроверяемыеРеквизиты);
	// Конец СтандартныеПодсистемы.Свойства
	
	
	
КонецПроцедуры
Показать


Но при исполнении получаю ошибку "Не соответствие типов параметра 1"....
Как мне исключить реквизит ТЧ из проверяемых Перед записью?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
15. Sashares 34 30.07.20 12:53 Сейчас в теме +1 $m
(14)Для этого надо в процедуре проверки заполнения реализовать собственную проверку в цикле.
Если проверка по условию должна быть для каждой строки тч.
17. M_A_D 184 30.07.20 14:18 Сейчас в теме
(15)Вообщем, да, все верно на счет собственной построчной проверки ТЧ документа, именно так реализовал в процедуре "ПередЗаписьюНаСервере" и все заработало!
Только есть побочка, придется переписывать все проверки)))
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 72 30.07.20 09:38 Сейчас в теме
(1)ПроверяемыеРеквизиты - массив, работать с ним нужно как с массивом.
5. M_A_D 184 30.07.20 09:47 Сейчас в теме
(2)
а можно попросить вас подробнее?
6. nomad_irk 72 30.07.20 10:09 Сейчас в теме
(5) В случае ошибки несоответствия типов, мне видится только один вариант: ПроверяемыеРеквизиты.Найти("Товары.Сумма") возвращает Неопределено, т.к. искомого значения нет в массиве.

Если поиск вернул бы любой индекс, то повторное удаление элемента по этому индексу, даже если количество элементов массива уменьшилось сильнее значения индекса найденного элемента, не вызывало бы ошибки.

В типовой ЗУП З.1 спокойно работает код в документе ПриемНаРаботу:

ПроверяемыйРеквизитЕжегодныеОтпуска = ПроверяемыеРеквизиты.Найти("ЕжегодныеОтпуска");
Если ПроверяемыйРеквизитЕжегодныеОтпуска <> Неопределено Тогда
	ПроверяемыеРеквизиты.Удалить(ПроверяемыйРеквизитЕжегодныеОтпуска);
КонецЕсли;
7. M_A_D 184 30.07.20 10:21 Сейчас в теме
(6)
Дело в том, что я пытаюсь отменить проверку реквизита табличной части по условию заполненности другого реквизита ТЧ документа...

Если конкретнее, то речь о документе РеализацияТоваров и ЗаказыКлиентов.
Нужно что бы реквизит ТЧ не проверялся если скидка =100%...

Если я вас правильно понимаю, поиск выполняемый здесь:
Сумм = ПроверяемыеРеквизиты.Найти("Товары.Сумма");

Возращает, ровным счетом ничего, потому то и удаление не происходит....

Но как тогда этот реквизит ТЧ проверяется в момент прведения документа?
8. nomad_irk 72 30.07.20 10:28 Сейчас в теме
(7)ПроверяемыеРеквизиты спокойно могут изменяться программно.
Судя по коду, что вы привели, проверка может выполнятся где-то внутри
УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтаФорма, Отказ, ПроверяемыеРеквизиты);

в зависимости от каких-то других условий.
3. user705522_constantin_h 35 30.07.20 09:39 Сейчас в теме
(1)
Но при исполнении получаю ошибку "Не соответствие типов параметра 1"....

В какой момент вы получаете эту ошибку? У вас этот код в цикле:
    Если Строка.ПроцентАвтоматическойСкидки = 100 тогда
        Сообщить("Поймали строку");
        ПроверяемыеРеквизиты.Удалить(Сумм);
    КонецЕсли;

Вы удалили строку Сумм из ПроверяемыеРеквизиты, а на следуюущей строке пытаетесь это сделать снова, но строки уже нет. Нужно так:
    Если Строка.ПроцентАвтоматическойСкидки = 100 тогда
        Сообщить("Поймали строку");
        ПроверяемыеРеквизиты.Удалить(Сумм);
        Прервать;
    КонецЕсли;
4. M_A_D 184 30.07.20 09:43 Сейчас в теме
(3)

Несоответствие типов (параметр номер '1')
{Документ.ЗаказКлиента.Форма.ФормаДокумента.Форма(136)}:		ПроверяемыеРеквизиты.Удалить(Сумм);
{ОбщийМодуль.ОбщегоНазначенияУТКлиент.Модуль(1643)}:	Результат = Форма.Записать(ПараметрыЗаписи);
{Документ.ЗаказКлиента.Форма.ФормаДокумента.Форма(260)}:	ОбщегоНазначенияУТКлиент.ОбработатьЗаписьОбъектаВФорме(ЭтаФорма, ДополнительныеПараметры.ПараметрыЗаписи, Отказ);
{ОбщийМодуль.МногооборотнаяТараКлиент.Модуль(167)}:		ВыполнитьОбработкуОповещения(ОписаниеОповещения, Ложь);
{Документ.ЗаказКлиента.Форма.ФормаДокумента.Форма(166)}:		МногооборотнаяТараКлиент.ПредложитьПодобратьМногооборотнуюТару(

по причине:
Несоответствие типов (параметр номер '1')
Показать


Боюсь, что (2) абсолютно прав, про работу с массивом, но пока я не понял как это реализовать)))
11. Sashares 34 30.07.20 10:57 Сейчас в теме
(1)Вы уверены, что в принципе правильно идете?
Проверка заполнения реквизитов проверяет заполнение каждой строки ТЧ.
Если вы удаляете проверяемый реквизит табличной части, то оно в принципе теперь не будет проверяться.

Если проверять нужно не всегда, а в зависимости от условия, то правильно сделать свою проверку заполнения - и в цикле проверять, вместо платформенной.
12. M_A_D 184 30.07.20 11:13 Сейчас в теме
(11)
Это пожалуй самый интересный вариант...
Но я не понимаю как реквизиты ТЧ валятся в массив, я попробовал вывести массив в сообщение и в нем хранится только одно значение "Объект"...

Причем даже если я полностью закоментировал тело процедуры "ОбработкаПроверкиЗаполнения", проверка заполнения один фиг исполняется, такое ощущение что проверка выполняется где-то еще....
13. Sashares 34 30.07.20 11:24 Сейчас в теме
(12)Модуль объекта процедура ОбработкаПроверкиЗаполнения
Модуль формы, событие ОбработкаПроверкиЗаполненияНаСервере.
Еще проверка может быть перед записью - как в форме, так и в модуле.

В массиве проверяемых реквизитов реквизит будет только если у него задано свойство Проверки заполнения.
Прикрепленные файлы:
14. M_A_D 184 30.07.20 11:48 Сейчас в теме
(13)
Да, здесь вы абсолютно правы!
Нашел что у Формы стояла проверка заполнения, отключил и дает провести документ при незаполненном реквизите, только теперь проблема изменилась, нужно Вернуть реквизит в списко проверяемых, по условию, и что бы проверка выполнялась только в той строке где условия не выполнились..
15. Sashares 34 30.07.20 12:53 Сейчас в теме +1 $m
(14)Для этого надо в процедуре проверки заполнения реализовать собственную проверку в цикле.
Если проверка по условию должна быть для каждой строки тч.
16. M_A_D 184 30.07.20 13:59 Сейчас в теме
(15)
А если отключить проверку заполнения в форме и сделать проверку в цикле в ПередЗаписью?

Для каждого Стр из Объект.Товары цикл
Если Стр.ПроцентАвтоматическойСкидки <> 100 и НЕ ЗначениеЗаполнено(Стр.Сумма) тогда
Отказ = Истина;
КонецЕсли;
КонецЦикла;

Я сейчас пробую так, но по какой-то причине не работает отказ.... Условия все выполнились, даже дописывал "Сообщить("Условия выполнились")", сообщение получаю, но документ проводится....
Нельзя делать отказ в цикле?
18. Sashares 34 30.07.20 14:29 Сейчас в теме
(16)Для документов процедура ОбработкаПроверкиЗаполненияНаСервере выполняется только при проведении.
Если документ просто записывается без проведения - не вызывается.
Отказ в цикле делать можно.
17. M_A_D 184 30.07.20 14:18 Сейчас в теме
(15)Вообщем, да, все верно на счет собственной построчной проверки ТЧ документа, именно так реализовал в процедуре "ПередЗаписьюНаСервере" и все заработало!
Только есть побочка, придется переписывать все проверки)))
9. UstinovVA 287 30.07.20 10:32 Сейчас в теме
в модуле объекта документа:
в процедуре
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

// в массив добавляете
МассивНепроверяемыхРеквизитов = Новый Массив;
МассивНепроверяемыхРеквизитов.Добавить("Товары.Сумма");
....

// затем включаем предопределенную процедуру

ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, МассивНепроверяемыхРеквизитов);

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

// и радуемся результату
user1050439; Albert_2008; user705522_constantin_h; +3 Ответить
10. Albert_2008 30.07.20 10:42 Сейчас в теме
по идее можно сделать в модуле объекта ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
https://its.1c.ru/db/v8std/content/463/hdoc
19. NO_FEAR 2 04.04.21 23:55 Сейчас в теме
(10) спасибо, сделал как описано, все получилось!!!

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	Если РольДоступна("Бухгалтер") тогда
		НепроверяемыеРеквизиты = Новый Массив();
		НепроверяемыеРеквизиты.Добавить("Артикул"); 
		НепроверяемыеРеквизиты.Добавить("Поставщик"); 
		НепроверяемыеРеквизиты.Добавить("Вес");
		УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, НепроверяемыеРеквизиты);
	КонецЕсли;
	
КонецПроцедуры

Процедура УдалитьНепроверяемыеРеквизитыИзМассива(МассивРеквизитов, МассивНепроверяемыхРеквизитов) Экспорт

  Для Каждого ЭлементМассива Из МассивНепроверяемыхРеквизитов Цикл
 
    // перед удалением реквизита из массива необходимо проверить, что он там есть
    // (не был удален ранее платформой или в коде).
    ПорядковыйНомер = МассивРеквизитов.Найти(ЭлементМассива);
    Если ПорядковыйНомер <> Неопределено Тогда
      МассивРеквизитов.Удалить(ПорядковыйНомер);
    КонецЕсли;
 
  КонецЦикла;
 
КонецПроцедуры
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот