gifts2017

Проверка заполненности реквизитов через подписку на событие

Опубликовал Sergey Boltach (ser6702) в раздел Программирование - Практика программирования

Навеяло от...http://infostart.ru/public/203664/ но с другого бока. Пришли пингвины, заявили... (а база перекурочена предшественниками как черепаха богом) хотим чтоб если есть в документе такой то реквизит, чтоб он всегда был заполнен... или же никогда там не выбирались группы и перечислили наименования справочников при ссылке на которые не должно быть пустот. И что? Я рыжий сидеть дня два прсматривать каждый из почти двух сотен доков? Потому и уродились три подписки на события. Описание в тексте

Выбор групп проверяется на событие ПередЗаписью а проверка реквизитов на событии ОбработкаПроверкиЗаполнения

//{СИБ проверяется чтобы не были выбраны группы в реквизитах документа
//или в реквизитах таб частей документа для перечисленных в массиве справочников
Процедура кс_ПередЗаписьюДокументаПроверитьВыборГруппВРеквизитах(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
//{ПроверитьВыборГруппВРеквизитах
Реквизиты = Источник.ЭтотОбъект.Метаданные().Реквизиты;
ТабличныеЧасти = Источник.ЭтотОбъект.Метаданные().ТабличныеЧасти;

Массив = Новый Массив;
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.СтатьиЗатрат"));
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.ПрочиеДоходыИРасходы"));
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.НоменклатурныеГруппы"));
Для каждого Реквизит Из Реквизиты Цикл

Для й=0 По Массив.Количество()-1 Цикл

Если Реквизит.Тип = Массив[й] Тогда
Если Источник[Реквизит.Имя].ЭтоГруппа Тогда
Сообщить("Реквизит документа """+Источник.ЭтотОбъект.Метаданные()+"."+Реквизит+"""
| Содержит группу, а не элемент справочника """+Массив[й]+""".", СтатусСообщения.Важное);
Отказ = Истина;
КонецЕсли;
КонецЕсли;


КонецЦикла;


КонецЦикла;

Для Каждого ТабличнаяЧасть Из ТабличныеЧасти Цикл

Для Каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл
Для й=0 По Массив.Количество()-1 Цикл

Если Реквизит.Тип = Массив[й] Тогда
Для Каждого Стр Из Источник[ТабличнаяЧасть.Имя] Цикл
Если Стр[Реквизит.Имя].ЭтоГруппа Тогда
Сообщить("Реквизит табличной части """+ТабличнаяЧасть+""" документа """+Источник.ЭтотОбъект.Метаданные()+"."+Реквизит+"""
| в строке """+Стр.НомерСтроки+"""
| содержит группу, а не элемент справочника """+Массив[й]+".""", СтатусСообщения.Важное);
Отказ = Истина;
КонецЕсли;


КонецЦикла;


КонецЕсли;
КонецЦикла;

КонецЦикла;

КонецЦикла;
//Проверка групп}

КонецПроцедуры //СИБ}

//{СИБ - проверяется чтобы не были пустые реквизиты в шапке для перечисленных в массиве справочников
//
Процедура кс_ПроверитьНаЗаполненностьВыбранныеРеквизиты(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
//Процедура на тестировании заявителя
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;

Реквизиты = Источник.ЭтотОбъект.Метаданные().Реквизиты;

//{СИБ проверить ЗаполненностьРеквизитов
//1. Статьи ДДС
//2. Типы договоров
//3. Статьи затрат
//4. Номенклатурные группы
//5. Виды расчетов с сотрудниками

Массив = Новый Массив;
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.СтатьиДвиженияДенежныхСредств"));
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.КС_ТипыДоговоров"));
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.СтатьиЗатрат"));
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.НоменклатурныеГруппы"));
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.КС_ВидыРасчетовССотрудниками"));

Для каждого Реквизит Из Реквизиты Цикл

Для й=0 По Массив.Количество()-1 Цикл

Если Реквизит.Тип = Массив[й] Тогда
//Если Источник[Реквизит.Имя].Ссылка = Неопределено ИЛИ Источник[Реквизит.Имя].Ссылка = Источник[Реквизит.Имя].ПустаяСсылка Тогда
Если НЕ ЗначениеЗаполнено(Источник[Реквизит.Имя].Ссылка) Тогда
Сообщить("Реквизит документа """+Источник.ЭтотОбъект.Метаданные()+"."+Реквизит+"""
| НЕ ЗАПОЛНЕН! """+Массив[й]+".""", СтатусСообщения.Важное);
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;


КонецЦикла;

//СИБ}

КонецПроцедуры //СИБ}

//{СИБ - проверяется чтобы не были пустые реквизиты таб. частей документа для перечисленных в массиве справочников
//
Процедура кс_ПроверитьНаЗаполненностьВыбранныеРеквизитыВТабЧастях(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;

ТабличныеЧасти = Источник.ЭтотОбъект.Метаданные().ТабличныеЧасти;

//{СИБ проверить ЗаполненностьРеквизитов
//1. Статьи ДДС
//2. Типы договоров
//3. Статьи затрат
//4. Номенклатурные группы
//5. Виды расчетов с сотрудниками

Массив = Новый Массив;
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.СтатьиДвиженияДенежныхСредств"));
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.КС_ТипыДоговоров"));
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.СтатьиЗатрат"));
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.НоменклатурныеГруппы"));
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.КС_ВидыРасчетовССотрудниками"));

Для Каждого ТабличнаяЧасть Из ТабличныеЧасти Цикл
Для Каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл
Для й=0 По Массив.Количество()-1 Цикл

Если Реквизит.Тип = Массив[й] Тогда
Для Каждого Стр Из Источник[ТабличнаяЧасть.Имя] Цикл
Если НЕ ЗначениеЗаполнено(Стр[Реквизит.Имя].Ссылка) Тогда
Сообщить("Реквизит табличной части"""+ТабличнаяЧасть+""" документа """+Источник.ЭтотОбъект.Метаданные()+"."+Реквизит+"""
| в строке """+Стр.НомерСтроки+"""
| НЕ ЗАПОЛНЕН """+Массив[й]+".""", СтатусСообщения.Важное);
Отказ = Истина;
КонецЕсли;
КонецЦикла;


КонецЕсли;
КонецЦикла;

КонецЦикла;

КонецЦикла;
//СИБ}

КонецПроцедуры
//СИБ}

 

//А МОЖНО УПРОСТИТЬ И УЛУЧШИТЬ ПРОВЕРКУ НА ЗАПОЛНЕННОСТЬ, ЕСЛИ ДЕЛАТЬ ЕЕ В ПРОВОДКАХ - коллеги посоветовали

//При проведении документа проверяем на заполненность обязательные реквизиты
//если в проводках не заполнено, то Отказ=Истина и запускаем проверку заполненности по шапке и по ТЧ (для вывода сообщению пользователю)
Процедура кс_ПроверитьНаЗаполненностьВыбранныеРеквизитыПриПроведении(Источник, Отказ, РежимПроведения) Экспорт
//Процедура на тестировании заявителя
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;

ПроводкиДок = Источник.ЭтотОбъект.Движения.Хозрасчетный;

//1. Статьи ДДС
//2. Типы договоров
//3. Статьи затрат
//4. Номенклатурные группы
//5. Виды расчетов с сотрудниками

Массив = Новый Массив;
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.СтатьиДвиженияДенежныхСредств"));
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.КС_ТипыДоговоров"));
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.СтатьиЗатрат"));
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.НоменклатурныеГруппы"));
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.КС_ВидыРасчетовССотрудниками"));

Для Каждого Проводка Из ПроводкиДок Цикл
Для й=0 По Массив.Количество()-1 Цикл
Для Каждого Субк Из Проводка.СубконтоДт Цикл
Если Субк.Ключ.ТипЗначения = Массив[й] Тогда
Если НЕ ЗначениеЗаполнено(Субк.Значение) Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Для Каждого Субк Из Проводка.СубконтоКт Цикл
Если Субк.Ключ.ТипЗначения = Массив[й] Тогда
Если НЕ ЗначениеЗаполнено(Субк.Значение) Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;

//Теперь, если мы обнаружили не заполненные реквизиты, проверяем документ
//единственное - эта проверка может быть избыточной
//(пр: документ "Поступление на р/с" реквизит "СтатьяДДС" есть и в шапке, и в ТЧ, но по факту заполняется только в одном месте)
Если Отказ = Истина Тогда

Реквизиты = Источник.ЭтотОбъект.Метаданные().Реквизиты;
ТабличныеЧасти = Источник.ЭтотОбъект.Метаданные().ТабличныеЧасти;

Для каждого Реквизит Из Реквизиты Цикл
Для й=0 По Массив.Количество()-1 Цикл
Если Реквизит.Тип = Массив[й] Тогда
//Если Источник[Реквизит.Имя].Ссылка = Неопределено ИЛИ Источник[Реквизит.Имя].Ссылка = Источник[Реквизит.Имя].ПустаяСсылка Тогда
Если НЕ ЗначениеЗаполнено(Источник[Реквизит.Имя].Ссылка) Тогда
Сообщить("Реквизит документа """+Источник.ЭтотОбъект.Метаданные()+"."+Реквизит+"""
| НЕ ЗАПОЛНЕН! """+Массив[й]+".""", СтатусСообщения.Важное);
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;

Для Каждого ТабличнаяЧасть Из ТабличныеЧасти Цикл
Для Каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл
Для й=0 По Массив.Количество()-1 Цикл
Если Реквизит.Тип = Массив[й] Тогда
Для Каждого Стр Из Источник[ТабличнаяЧасть.Имя] Цикл
Если НЕ ЗначениеЗаполнено(Стр[Реквизит.Имя].Ссылка) Тогда
Сообщить("Реквизит табличной части"""+ТабличнаяЧасть+""" документа """+Источник.ЭтотОбъект.Метаданные()+"."+Реквизит+"""
| в строке """+Стр.НомерСтроки+"""
| НЕ ЗАПОЛНЕН """+Массив[й]+".""", СтатусСообщения.Важное);
Отказ = Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;

КонецЕсли; //Если Отказ = Истина

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

 

 

=========================================================================================

//Текст процедуры для подписки при проведении Так будет более правильно делать методологически

Процедура кс_ПроверитьНаЗаполненностьВыбранныеРеквизитыПриПроведении(Источник, Отказ, РежимПроведения) Экспорт

 

 

Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;

ПроводкиДок = Источник.ЭтотОбъект.Движения.Хозрасчетный;

// В целях контроля аналитического учета сделать обязательной к заполнению (во всех документах, где это применимо), следующую аналитику:
//1. Статьи ДДС
//2. Типы договоров
//3. Статьи затрат
//4. Номенклатурные группы
//5. Виды расчетов с сотрудниками

Массив = Новый Массив;
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.СтатьиДвиженияДенежныхСредств"));
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.ТипыДоговоров"));
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.СтатьиЗатрат"));
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.НоменклатурныеГруппы"));
Массив.Добавить(Новый ОписаниеТипов("СправочникСсылка.ВидыРасчетовССотрудниками"));

Для Каждого Проводка Из ПроводкиДок Цикл
Для й=0 По Массив.Количество()-1 Цикл
Для Каждого Субк Из Проводка.СчетДт.Ссылка.ВидыСубконто Цикл
Если Субк.ВидСубконто.ТипЗначения = Массив[й] Тогда
Если НЕ ЗначениеЗаполнено(Проводка.СубконтоДт[Субк.ВидСубконто]) Тогда
Сообщить("НЕ ЗАПОЛНЕНА аналитика по Дт """+Субк.ВидСубконто.ТипЗначения+""".", СтатусСообщения.Важное);
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Для Каждого Субк Из Проводка.СчетКт.Ссылка.ВидыСубконто Цикл
Если Субк.ВидСубконто.ТипЗначения = Массив[й] Тогда
Если НЕ ЗначениеЗаполнено(Проводка.СубконтоКт[Субк.ВидСубконто]) Тогда
Сообщить("НЕ ЗАПОЛНЕНО аналитика по Кт """+Субк.ВидСубконто.ТипЗначения+""".", СтатусСообщения.Важное);
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;

//Теперь, если мы обнаружили не заполненные реквизиты, проверяем документ
//единственное - эта проверка может быть избыточной
//(пр: документ "Поступление на р/с" реквизит "СтатьяДДС" есть и в шапке, и в ТЧ, но по факту заполняется только в одном месте)
Если Отказ = Истина Тогда

Реквизиты = Источник.ЭтотОбъект.Метаданные().Реквизиты;
ТабличныеЧасти = Источник.ЭтотОбъект.Метаданные().ТабличныеЧасти;

Для каждого Реквизит Из Реквизиты Цикл
Для й=0 По Массив.Количество()-1 Цикл
Если Реквизит.Тип = Массив[й] Тогда
//Если Источник[Реквизит.Имя].Ссылка = Неопределено ИЛИ Источник[Реквизит.Имя].Ссылка = Источник[Реквизит.Имя].ПустаяСсылка Тогда
Если НЕ ЗначениеЗаполнено(Источник[Реквизит.Имя].Ссылка) Тогда
Сообщить("Реквизит документа """+Источник.ЭтотОбъект.Метаданные()+"."+Реквизит+"""
| НЕ ЗАПОЛНЕН! """+Массив[й]+".""", СтатусСообщения.Важное);
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;

Для Каждого ТабличнаяЧасть Из ТабличныеЧасти Цикл
Для Каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл
Для й=0 По Массив.Количество()-1 Цикл
Если Реквизит.Тип = Массив[й] Тогда
Для Каждого Стр Из Источник[ТабличнаяЧасть.Имя] Цикл
Если НЕ ЗначениеЗаполнено(Стр[Реквизит.Имя].Ссылка) Тогда
Сообщить("Реквизит табличной части"""+ТабличнаяЧасть+""" документа """+Источник.ЭтотОбъект.Метаданные()+"."+Реквизит+"""
| в строке """+Стр.НомерСтроки+"""
| НЕ ЗАПОЛНЕН """+Массив[й]+".""", СтатусСообщения.Важное);
Отказ = Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;

КонецЕсли; //Если Отказ = Истина

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

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Sergey Boltach (ser6702) 23.10.13 07:01
Это дело можно улучшить и избежать некоторых проблем, если данную проверку засунуть в проверку движений - может вечером выложу новую подписку. И тогда вместо двух точно удобней обойтись одной подпиской при проверке реквизитов на заполненность
2. Саша Безымяный (help1Ckr) 23.10.13 11:09
такой вариант не прокатит, если нужен реквизит, в зависимости от заполненности которого работает какой нибудь алгоритм. То есть пользователь создал документ, не записывая нажимает заполнить, а реквизит то не заполнен.
3. Sergey Boltach (ser6702) 25.10.13 09:15
Такая задача и не ставилась - задача ставилась только с точки зрения заполненности важных субконто в проверках
4. mikhailovaew (mikhailovaew) 05.12.13 16:38
Текст кода в публикации неплохо бы раскрасить, будет читабельнее.
Gendalf_beliy; +1 Ответить
5. Елена Ситникова (lesenoklenok) 14.02.14 10:41
Спасибо за информацию, но не читабельно вообще.
6. shoy Андрей ais (shoy) 22.08.14 12:16
Да уж! Трудно прочесть, и к тому же если хоть один раз Отказ = Истина, то стоит ли дальше проверять?