В глобальном модуле комплексной конфигурации , а также некоторых конфигураций 7.7 , основанных на комплексной, есть функция : глВсеРеквизитыДокументаЗаполнены().
Она не проверяет реквизиты табличной части, хотя в ее исходном тексте есть такое "намерение". Мне понадобился данный функционал , и я решил подработать эту функцию ( в ней есть продублированный текст, но это так нужно, по "движку" 1с когда несколько строк в документе ). Здесь представлен подработанный мной вариант данной функции :
Функция глВсеРеквизитыДокументаЗаполнены(Конт,СписокРеквизитов) Экспорт Если Константа.РазрешитьПроводитьБудущейДатой = 0 Тогда Если Конт.ДатаДок>РабочаяДата() Тогда
глНеПроводить(Конт,"Нельзя проводить документ будущей датой!"); Возврат (0); КонецЕсли; КонецЕсли; Пока СтрДлина(СписокРеквизитов)>0 Цикл
ПозЗапятой = Найти (СписокРеквизитов,","); Если ПозЗапятой = 0 Тогда
ИдентРеквизита = СписокРеквизитов;
СписокРеквизитов = ""; Иначе
ИдентРеквизита = Сред(СписокРеквизитов,1,ПозЗапятой-1);
СписокРеквизитов = Сред(СписокРеквизитов,ПозЗапятой+1); КонецЕсли;
пустой_атрибут_табличной_части=0;
это_атрибут_табличной_части=0;// и поэтому у него доп проверка - перебор строк в которой может быть не выбрано значение
ВидДок = Конт.Вид(); Если Метаданные.Документ(ВидДок).РеквизитТабличнойЧасти(ИдентРеквизита).Выбран()=1 Тогда
это_атрибут_табличной_части=1;// конецесли; Если ПустоеЗначение(Конт.ПолучитьАтрибут(ИдентРеквизита))=1 Тогда Если Метаданные.Документ(ВидДок).РеквизитШапки(ИдентРеквизита).Выбран()=1 Тогда
Объект = Метаданные.Документ(ВидДок).РеквизитШапки(ИдентРеквизита); ИначеЕсли Метаданные.ОбщийРеквизитДокумента(ИдентРеквизита).Выбран()=1 Тогда
Объект = Метаданные.ОбщийРеквизитДокумента(ИдентРеквизита); ИначеЕсли Метаданные.Документ(ВидДок).РеквизитТабличнойЧасти(ИдентРеквизита).Выбран()=1 Тогда
это_атрибут_табличной_части=1;
Объект = Метаданные.Документ(ВидДок).РеквизитТабличнойЧасти(ИдентРеквизита);
пустой_атрибут_табличной_части=0;
конт.выбратьстроки(); пока конт.получитьстроку()=1 цикл Если ПустоеЗначение(Конт.ПолучитьАтрибут(ИдентРеквизита))=1 Тогда
Объект = Метаданные.Документ(ВидДок).РеквизитТабличнойЧасти(ИдентРеквизита);
пустой_атрибут_табличной_части=1; прервать; конецесли; конеццикла; Иначе
глНеПроводить(Конт,"ВсеРеквизитыДокументаЗаполнены(): Неверный реквизит:"+ИдентРеквизита); Возврат (0); КонецЕсли; если это_атрибут_табличной_части=0 тогда
ПредставлениеРеквизита = ?(ПустоеЗначение(Объект.Синоним)=0,Объект.Синоним,Объект.Идентификатор);
глНеПроводить(Конт,"Не заполнен реквизит """+ПредставлениеРеквизита+""""); Возврат (0); иначеесли это_атрибут_табличной_части=1 тогда если пустой_атрибут_табличной_части=1 тогда
ПредставлениеРеквизита = ?(ПустоеЗначение(Объект.Синоним)=0,Объект.Синоним,Объект.Идентификатор);
глНеПроводить(Конт,"Не заполнен реквизит """+ПредставлениеРеквизита+""""); Возврат (0); конецесли; конецесли; КонецЕсли; если это_атрибут_табличной_части=1 тогда // может понадобиться доп проверка
Объект = Метаданные.Документ(ВидДок).РеквизитТабличнойЧасти(ИдентРеквизита);
пустой_атрибут_табличной_части=0;
конт.выбратьстроки(); пока конт.получитьстроку()=1 цикл Если ПустоеЗначение(Конт.ПолучитьАтрибут(ИдентРеквизита))=1 Тогда
Объект = Метаданные.Документ(ВидДок).РеквизитТабличнойЧасти(ИдентРеквизита);
пустой_атрибут_табличной_части=1; прервать; конецесли; конеццикла; если пустой_атрибут_табличной_части=1 тогда
ПредставлениеРеквизита = ?(ПустоеЗначение(Объект.Синоним)=0,Объект.Синоним,Объект.Идентификатор);
глНеПроводить(Конт,"Не заполнен реквизит """+ПредставлениеРеквизита+""""); Возврат (0); конецесли; конецесли; КонецЦикла; Возврат (1); КонецФункции
В типовых конфигурациях глобальная функция глВсеРеквизитыДокументаЗаполнены() не работает с реквизитами табличной части. Данная статья содержит текст исправленной функции, корректно проверяющей табличную часть.
С удивлением увидел , что данная функция кочует из релиза в релиз .