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

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

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

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

Вступайте в нашу телеграмм-группу Инфостарт

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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4978    Abysswalker    11    

47

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    9308    DeerCven    15    

63

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    58931    dimanich70    85    

175

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

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

1 стартмани

18.03.2024    8220    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

12.02.2024    73958    atdonya    31    

73

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    10223    ke.92@mail.ru    17    

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