Необходимо на стороне УТ 11.3 дописать код, при исполнении которого не будет проверяться реквизитТЧ.
На текущий момент написал:
&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
Сумм = ПроверяемыеРеквизиты.Найти("Товары.Сумма");
Тов = Объект.Товары;
Для каждого Строка из Тов цикл
Если Строка.ПроцентАвтоматическойСкидки = 100 тогда
Сообщить("Поймали строку");
ПроверяемыеРеквизиты.Удалить(Сумм);
КонецЕсли;
Сообщить(Сумм)
КонецЦикла;
// СтандартныеПодсистемы.Свойства
УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтаФорма, Отказ, ПроверяемыеРеквизиты);
// Конец СтандартныеПодсистемы.Свойства
КонецПроцедуры
Показать
Но при исполнении получаю ошибку "Не соответствие типов параметра 1"....
Как мне исключить реквизит ТЧ из проверяемых Перед записью?
(14)Для этого надо в процедуре проверки заполнения реализовать собственную проверку в цикле.
Если проверка по условию должна быть для каждой строки тч.
(15)Вообщем, да, все верно на счет собственной построчной проверки ТЧ документа, именно так реализовал в процедуре "ПередЗаписьюНаСервере" и все заработало!
Только есть побочка, придется переписывать все проверки)))
(5) В случае ошибки несоответствия типов, мне видится только один вариант: ПроверяемыеРеквизиты.Найти("Товары.Сумма") возвращает Неопределено, т.к. искомого значения нет в массиве.
Если поиск вернул бы любой индекс, то повторное удаление элемента по этому индексу, даже если количество элементов массива уменьшилось сильнее значения индекса найденного элемента, не вызывало бы ошибки.
В типовой ЗУП З.1 спокойно работает код в документе ПриемНаРаботу:
ПроверяемыйРеквизитЕжегодныеОтпуска = ПроверяемыеРеквизиты.Найти("ЕжегодныеОтпуска");
Если ПроверяемыйРеквизитЕжегодныеОтпуска <> Неопределено Тогда
ПроверяемыеРеквизиты.Удалить(ПроверяемыйРеквизитЕжегодныеОтпуска);
КонецЕсли;
Несоответствие типов (параметр номер '1')
{Документ.ЗаказКлиента.Форма.ФормаДокумента.Форма(136)}: ПроверяемыеРеквизиты.Удалить(Сумм);
{ОбщийМодуль.ОбщегоНазначенияУТКлиент.Модуль(1643)}: Результат = Форма.Записать(ПараметрыЗаписи);
{Документ.ЗаказКлиента.Форма.ФормаДокумента.Форма(260)}: ОбщегоНазначенияУТКлиент.ОбработатьЗаписьОбъектаВФорме(ЭтаФорма, ДополнительныеПараметры.ПараметрыЗаписи, Отказ);
{ОбщийМодуль.МногооборотнаяТараКлиент.Модуль(167)}: ВыполнитьОбработкуОповещения(ОписаниеОповещения, Ложь);
{Документ.ЗаказКлиента.Форма.ФормаДокумента.Форма(166)}: МногооборотнаяТараКлиент.ПредложитьПодобратьМногооборотнуюТару(
по причине:
Несоответствие типов (параметр номер '1')
Показать
Боюсь, что (2) абсолютно прав, про работу с массивом, но пока я не понял как это реализовать)))
(1)Вы уверены, что в принципе правильно идете?
Проверка заполнения реквизитов проверяет заполнение каждой строки ТЧ.
Если вы удаляете проверяемый реквизит табличной части, то оно в принципе теперь не будет проверяться.
Если проверять нужно не всегда, а в зависимости от условия, то правильно сделать свою проверку заполнения - и в цикле проверять, вместо платформенной.
(11)
Это пожалуй самый интересный вариант...
Но я не понимаю как реквизиты ТЧ валятся в массив, я попробовал вывести массив в сообщение и в нем хранится только одно значение "Объект"...
Причем даже если я полностью закоментировал тело процедуры "ОбработкаПроверкиЗаполнения", проверка заполнения один фиг исполняется, такое ощущение что проверка выполняется где-то еще....
(12)Модуль объекта процедура ОбработкаПроверкиЗаполнения
Модуль формы, событие ОбработкаПроверкиЗаполненияНаСервере.
Еще проверка может быть перед записью - как в форме, так и в модуле.
В массиве проверяемых реквизитов реквизит будет только если у него задано свойство Проверки заполнения.
(13)
Да, здесь вы абсолютно правы!
Нашел что у Формы стояла проверка заполнения, отключил и дает провести документ при незаполненном реквизите, только теперь проблема изменилась, нужно Вернуть реквизит в списко проверяемых, по условию, и что бы проверка выполнялась только в той строке где условия не выполнились..
(14)Для этого надо в процедуре проверки заполнения реализовать собственную проверку в цикле.
Если проверка по условию должна быть для каждой строки тч.
(15)
А если отключить проверку заполнения в форме и сделать проверку в цикле в ПередЗаписью?
Для каждого Стр из Объект.Товары цикл
Если Стр.ПроцентАвтоматическойСкидки <> 100 и НЕ ЗначениеЗаполнено(Стр.Сумма) тогда
Отказ = Истина;
КонецЕсли;
КонецЦикла;
Я сейчас пробую так, но по какой-то причине не работает отказ.... Условия все выполнились, даже дописывал "Сообщить("Условия выполнились")", сообщение получаю, но документ проводится....
Нельзя делать отказ в цикле?
(16)Для документов процедура ОбработкаПроверкиЗаполненияНаСервере выполняется только при проведении.
Если документ просто записывается без проведения - не вызывается.
Отказ в цикле делать можно.
(15)Вообщем, да, все верно на счет собственной построчной проверки ТЧ документа, именно так реализовал в процедуре "ПередЗаписьюНаСервере" и все заработало!
Только есть побочка, придется переписывать все проверки)))
(10) спасибо, сделал как описано, все получилось!!!
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если РольДоступна("Бухгалтер") тогда
НепроверяемыеРеквизиты = Новый Массив();
НепроверяемыеРеквизиты.Добавить("Артикул");
НепроверяемыеРеквизиты.Добавить("Поставщик");
НепроверяемыеРеквизиты.Добавить("Вес");
УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, НепроверяемыеРеквизиты);
КонецЕсли;
КонецПроцедуры
Процедура УдалитьНепроверяемыеРеквизитыИзМассива(МассивРеквизитов, МассивНепроверяемыхРеквизитов) Экспорт
Для Каждого ЭлементМассива Из МассивНепроверяемыхРеквизитов Цикл
// перед удалением реквизита из массива необходимо проверить, что он там есть
// (не был удален ранее платформой или в коде).
ПорядковыйНомер = МассивРеквизитов.Найти(ЭлементМассива);
Если ПорядковыйНомер <> Неопределено Тогда
МассивРеквизитов.Удалить(ПорядковыйНомер);
КонецЕсли;
КонецЦикла;
КонецПроцедуры