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

06.12.13

Разработка - Универсальные функции

Навеяло от...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С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2665    0    John_d    8    

53

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4599    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3956    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8808    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16141    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7242    quazare    8    

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