Привет, Хабр! Меня зовут Донскова Елена, я работаю разработчиком на проектах внедрения 1C в IBS, занимаюсь разработкой нового функционала и модифицирую типовой функционал для удовлетворения потребностей бизнеса. Сегодня я расскажу о том, как создать новый вид контроля в системе «1С: Управление холдингом». Подобные задачи в моей практике встречаются не так часто, но когда я впервые столкнулась с необходимостью добавления такого функционала, поняла, что информации по нему практически нет.

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

Проанализировав имеющиеся типовые контроли, я реализовала новый вид и благополучно забыла. Примерно через полгода мне поступила аналогичная задача. И именно она натолкнула меня на написание данной статьи-инструкции для добавления собственного контроля.

Новый вид контроля я добавляла в конфигурации «1С:Управление холдингом», редакция 3.2 (3.2.4.19).

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

После того, как справочник был создан, мы приступаем к созданию регистра сведений аналитики контроля.

В модуле менеджера которого необходимо определить экспортные функции/процедуры, которые используются в типовом механизме контроля. Краткое описание каждой процедуры можно найти в комментариях, предшествующих ее объявлению.

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область СлужебныйПрограммныйИнтерфейс

Функция ИнформацияОКлюче() Экспорт
	
	//
	Результат = Новый Структура;
	Результат.Вставить("СправочникИмя", "ibs_КлючиКонтроляЛимитовПоБДДС");
	Результат.Вставить("СправочникМенеджер", Справочники.ibs_КлючиКонтроляЛимитовПоБДДС);
	Результат.Вставить("СправочникМетаданные", Метаданные.Справочники.ibs_КлючиКонтроляЛимитовПоБДДС);
	Результат.Вставить("РегистрИмя", "ibs_АналитикаКонтроляЛимитовПоБДДС");
	Результат.Вставить("РегистрМенеджер", РегистрыСведений.ibs_АналитикаКонтроляЛимитовПоБДДС);
	Результат.Вставить("РегистрМетаданные", Метаданные.РегистрыСведений.ibs_АналитикаКонтроляЛимитовПоБДДС);
	
	Результат.Вставить("ИмяПоляАналитика", "ibs_АналитикаКонтроляЛимитовПоБДДС");
	
	КонтрольУХКлючи.ДобавитьИзмеренияКлюча(Результат);
	
	Возврат Результат;
	
КонецФункции

Функция ПолучитьПолноеНаименованиеКлючаАналитики(МенеджерЗаписи) Экспорт

	Поля = Новый Массив;   
	Поля.Добавить(СокрЛП(МенеджерЗаписи.Организация));
	Поля.Добавить(СокрЛП(МенеджерЗаписи.СтатьяДвиженияДенежныхСредств));
	Возврат СтрСоединить(Поля, "; ");
	
КонецФункции

// Заполняет поле ibs_АналитикаКонтроляЛимитовПоБДДС в коллекции, содержащей колонки Организация и СтатьяДвиженияДенежныхСредств.
//
// Параметры:
//
//	Коллекция - ТабличнаяЧасть - Коллекция, в которой производится заполнение аналитики контроля годового лимита.
//
//	ИменаПолей - Структура - содержит реальные имена полей коллекции для получения и формирования аналитики.
//		содержит две секции, если значение ключа Неопределено, то имя поля берется из имени ключа.
//		секция идентификации {Организация, СтатьяДвиженияДенежныхСредств, ibs_АналитикаКонтроляЛимитовПоБДДС},
//	
//	ПараметрыЗаполнения - Структура - см. метод ПараметрыЗаполненияКлючейАналитики()
//
// Пример 1:
//	ИменаПолей = РегистрыСведений.ibs_АналитикаКонтроляЛимитовПоБДДС.ИменаПолейКоллекцииПоУмолчанию();
//	РегистрыСведений.ibs_АналитикаКонтроляЛимитовПоБДДС.ЗаполнитьВКоллекции(ДвиженияОперации, ИменаПолей);
//
// Пример 2:
//	РегистрыСведений.ibs_АналитикаКонтроляЛимитовПоБДДС.ЗаполнитьВКоллекции(ДвиженияОперации);
//
Процедура ЗаполнитьВКоллекции(Коллекция, 
								ИменаПолей = Неопределено, ДополнитьКлюч = Ложь, ПараметрыЗаполнения = Неопределено) Экспорт
	УстановитьПривилегированныйРежим(Истина);
	
	Если ПараметрыЗаполнения = Неопределено Тогда
		ПараметрыЗаполнения = ПараметрыЗаполненияКлючейАналитики();
	КонецЕсли;
	
	Если ИменаПолей = Неопределено Тогда
		ИменаПолей = ИменаПолейКоллекцииПоУмолчанию();
	КонецЕсли;
	Запрос = Новый Запрос(ТекстЗначенияКлючейАналитикиВКоллекции(ИменаПолей));
	Запрос.УстановитьПараметр("Коллекция", Коллекция);

	
	Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		Если Не ЗначениеЗаполнено(Выборка.ibs_АналитикаКонтроляЛимитовПоБДДС) Тогда
			Если ПараметрыЗаполнения.СоздаватьВКлючи Тогда
				КлючАналитики = ЗначениеКлючаАналитики(Выборка);
			Иначе
				ТекстИсключения = НСтр("ru = 'Ошибка при заполнении ключей в коллекции: есть аналитики, по которым ключи еще не созданы.'");
				ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(),
					УровеньЖурналаРегистрации.Ошибка,
					Метаданные.Справочники.КлючиКонтроляЗадолженностиПоКонтрагенту,
					,
					ТекстИсключения);
				ВызватьИсключение ТекстИсключения;
			КонецЕсли;
		Иначе
			КлючАналитики = Выборка.ibs_АналитикаКонтроляЛимитовПоБДДС;
		КонецЕсли;
		Коллекция[Выборка.Индекс][ИменаПолей.ibs_АналитикаКонтроляЛимитовПоБДДС] = КлючАналитики;

		ПараметрыЗаполнения.ИзмененаАналитика = Истина;
	КонецЦикла;
КонецПроцедуры

// Возвращает структуру полей выбора информации из коллекции для формирования аналитики контроля годового лимита.
//
// Возвращаемое значение:
//	Структура - содержит реальные имена полей коллекции для получения и формирования аналитики.
//		содержит две секции, если значение ключа Неопределено, то имя поля должно браться из имени ключа.
//		секция идентификации {Организация, СтатьяДвиженияДенежныхСредств},
//			все ключи заданы.
//
Функция ИменаПолейКоллекцииПоУмолчанию() Экспорт
	
	ИменаПолей = Новый Структура();  

	ИменаПолей.Вставить("Организация", "Организация");  
	ИменаПолей.Вставить("СтатьяДвиженияДенежныхСредств", "СтатьяДвиженияДенежныхСредств"); 
	ИменаПолей.Вставить("ibs_АналитикаКонтроляЛимитовПоБДДС", "КлючКонтроля");
	
	Возврат ИменаПолей;
КонецФункции 

Функция ПараметрыЗаполненияКлючейАналитики() Экспорт
	Возврат Новый Структура("ИзмененаАналитика,СоздаватьВКлючи", Ложь, Истина);
КонецФункции

Функция ТекстЗначенияКлючейАналитикиВКоллекции(ИменаПолей) 
	ТекстЗапроса = 
	"ВЫБРАТЬ
	|	АВТОНОМЕРЗАПИСИ() КАК Индекс,
	|	&ПолеАналитикаПланирования КАК ibs_АналитикаКонтроляЛимитовПоБДДС,
	|	&ПолеОрганизация КАК Организация,
	|	&ПолеСтатьяДвиженияДенежныхСредств КАК СтатьяДвиженияДенежныхСредств
	|ПОМЕСТИТЬ Коллекция
	|ИЗ
	|	&Коллекция КАК Коллекция
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Коллекция.Индекс - 1 КАК Индекс,
	|	Аналитика.КлючАналитики КАК ibs_АналитикаКонтроляЛимитовПоБДДС,
	|	Коллекция.Организация КАК Организация,
	|	Коллекция.СтатьяДвиженияДенежныхСредств КАК СтатьяДвиженияДенежныхСредств
	|ИЗ
	|	Коллекция КАК Коллекция
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ibs_АналитикаКонтроляЛимитовПоБДДС КАК Аналитика
	|		ПО (Аналитика.Организация = Коллекция.Организация)
	|			И (Аналитика.СтатьяДвиженияДенежныхСредств = Коллекция.СтатьяДвиженияДенежныхСредств)
	|ГДЕ
	|	(Аналитика.КлючАналитики ЕСТЬ NULL
	|			ИЛИ Аналитика.КлючАналитики <> Коллекция.ibs_АналитикаКонтроляЛимитовПоБДДС
	|			ИЛИ Аналитика.КлючАналитики = ЗНАЧЕНИЕ(Справочник.ibs_КлючиКонтроляЛимитовПоБДДС.ПустаяСсылка))";
	
	// заменим в тексте запроса подставляемые поля из структуры ИменаПолей
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеАналитикаПланирования", "Коллекция." + ИменаПолей.ibs_АналитикаКонтроляЛимитовПоБДДС);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеОрганизация", "Коллекция." + ИменаПолей.Организация);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеСтатьяДвиженияДенежныхСредств", "Коллекция." + ИменаПолей.СтатьяДвиженияДенежныхСредств);
	
	Возврат ТекстЗапроса;
КонецФункции

// Функция получает элемент справочника - ключ аналитики 
//
// Параметры:
//	ПараметрыАналитики - Выборка, Структура - Содержит полями "Организация, СтатьяДвиженияДенежныхСредств":
//		* Организация - СправочникСсылка.Организации.
//		* СтатьяДвиженияДенежныхСредств - СправочникСсылка.СтатьиДвиженияДенежныхСредств.
//
// Возвращаемое значение:
//	СправочникСсылка.ibs_КлючиКонтроляЛимитовПоБДДС - Созданный элемент справочника.
//
Функция ЗначениеКлючаАналитики(ПараметрыАналитики) Экспорт

	НаборЗаписей = ПолучитьНаборЗаписей(ПараметрыАналитики);
	
	Если НаборЗаписей <> Неопределено Тогда
		НаборЗаписей.Прочитать();
		
		Если НаборЗаписей.Количество() > 0
			И Не ЗначениеЗаполнено(НаборЗаписей[0].КлючАналитики) Тогда
			НаборЗаписей.Очистить();
			НаборЗаписей.Записать();
		КонецЕсли;

		Если НаборЗаписей.Количество() > 0
			И ЗначениеЗаполнено(НаборЗаписей[0].КлючАналитики) Тогда
			Результат = НаборЗаписей[0].КлючАналитики;
		Иначе
			Результат = СоздатьКлючАналитики(ПараметрыАналитики);
		КонецЕсли;

		Возврат Результат;
	КонецЕсли;

КонецФункции    

Функция ПолучитьНаборЗаписей(ПараметрыАналитики)
	// В параметрах аналитики могут быть не все свойства
	СтруктураАналитики = Новый Структура("Организация, СтатьяДвиженияДенежныхСредств");
	ЗаполнитьЗначенияСвойств(СтруктураАналитики, ПараметрыАналитики);
	Если НЕ ЗначениеЗаполнено(СтруктураАналитики.Организация)
	 И НЕ ЗначениеЗаполнено(СтруктураАналитики.СтатьяДвиженияДенежныхСредств) Тогда
		Возврат Неопределено
	Иначе
		НаборЗаписей = РегистрыСведений.ibs_АналитикаКонтроляЛимитовПоБДДС.СоздатьНаборЗаписей();
		
		Для Каждого КлючЗначение Из СтруктураАналитики Цикл
			НаборЗаписей.Отбор[КлючЗначение.Ключ].Установить(КлючЗначение.Значение);
		КонецЦикла;
		
		НоваяСтрока = НаборЗаписей.Добавить();
		
		ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураАналитики, "Организация, СтатьяДвиженияДенежныхСредств");
		Возврат НаборЗаписей;
	КонецЕсли;
	
КонецФункции

 // Функция получает элемент справочника - ключ аналитики контроля  .
//
// Параметры:
//	ПараметрыАналитики - Выборка или Структура  с полями "Организация, СтатьяДвиженияДенежныхСредств".
//
// Возвращаемое значение:
//	СправочникСсылка.ibs_КлючиКонтроляЛимитовПоБДДС - Созданный элемент справочника.
//
Функция СоздатьКлючАналитики(ПараметрыАналитики, ЗаписьПриОбновленииИБ = Ложь) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	Если ЗначениеЗаполнено(ПараметрыАналитики.Организация) 
			ИЛИ ЗначениеЗаполнено(ПараметрыАналитики.СтатьяДвиженияДенежныхСредств) Тогда
			
		НаборЗаписей = ПолучитьНаборЗаписей(ПараметрыАналитики);
		
		Если НаборЗаписей <> Неопределено Тогда
			
			НачатьТранзакцию(); // Создание нового ключа аналитики.
			Попытка
				СтрокаНабора = НаборЗаписей[0];
				
				СправочникОбъект = Справочники.ibs_КлючиКонтроляЛимитовПоБДДС.СоздатьЭлемент();
				СправочникОбъект.Наименование = ПолучитьПолноеНаименованиеКлючаАналитики(СтрокаНабора);
				ЗаполнитьЗначенияСвойств(СправочникОбъект, СтрокаНабора, "Организация, СтатьяДвиженияДенежныхСредств");
				Если ЗаписьПриОбновленииИБ Тогда
					ОбновлениеИнформационнойБазы.ЗаписатьОбъект(СправочникОбъект);
				Иначе
					СправочникОбъект.Записать();
				КонецЕсли;

				Результат = СправочникОбъект.Ссылка;

				СтрокаНабора.КлючАналитики = Результат;
				
				Если ЗаписьПриОбновленииИБ Тогда
					ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(НаборЗаписей, Ложь, Истина);
				Иначе
					НаборЗаписей.Записать(Ложь);
				КонецЕсли;
				ЗафиксироватьТранзакцию();
			Исключение
				// во время инициализации ключа, данный ключ уже был создан в ИБ другим сеансом.
				НаборЗаписей.Прочитать();
				Если НаборЗаписей.Количество() = 0 Тогда // запись не создана из-за ошибки заполнения полей.
					ОтменитьТранзакцию();
					ВызватьИсключение;
				Иначе
					ОтменитьТранзакцию();
					Результат = НаборЗаписей[0].КлючАналитики;
				КонецЕсли;
			КонецПопытки;

			Возврат Результат;
			
		КонецЕсли;
	КонецЕсли;
	
КонецФункции


#КонецОбласти 

#КонецЕсли

Далее нужно добавить новый предопределенный вид характеристики в «План видов характеристик. ВидыКонтроляДокументов». Тип – СправочникСсылка.ibs_КлючиКонтроляЛимитовПоБДДС (справочник созданный в п.1).

Также в «План видов характеристик. ВидыКонтроляДокументов» необходимо создать макет, который будет использован при расшифровке контроля в режиме «Предприятие».

Затем создаем общий модуль, в котором будут располагаться экспортные процедуры и функции, необходимые для встраивания нового контроля в типовой механизм. Краткое описание для каждой процедуры располагается в комментарии перед ее объявлением.

#Область ПрограммныйИнтерфейс

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

// Функция возвращает объект-проверку
Функция Создать() Экспорт
	
	Проверка = КонтрольУХ.Новый_Проверка();
	Проверка.Объект = ibs_КонтрольУХПроверкаЛимитовБДДС;
	Проверка.Источник = ИмяИсточника();
	Проверка.ВидКонтроля = ПланыВидовХарактеристик.ВидыКонтроляДокументов.ibs_КонтрольЛимитовПоБДДС;
	Проверка.ИмяРеквизита = "ibs_КонтрольБДДСНарушен";
	
	Возврат Проверка;
	
КонецФункции

// Функция возвращает Истина, если для этого документа проверка выполняется
Функция ТребуетсяДляДокумента(ИмяДокумента) Экспорт
	
	Возврат ИмяДокумента = "ЗаявкаНаРасходованиеДенежныхСредств";
	
КонецФункции

// Функция возвращает Истина, если требуется выполнение проверки исходя из данных источника
Функция ТребуетсяПроверка(ПараметрыКонтроля, Источник) Экспорт
	УстановитьПривилегированныйРежим(Истина);

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	УстановкаЛимитовПоДаннымБюджетированияПараметрыБюджетирования.Документ КАК Документ
		|ИЗ
		|	РегистрСведений.УстановкаЛимитовПоДаннымБюджетированияПараметрыБюджетирования КАК УстановкаЛимитовПоДаннымБюджетированияПараметрыБюджетирования
		|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.УправлениеПериодомСценария КАК УправлениеПериодомСценария
		|			ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Периоды КАК Периоды
		|			ПО УправлениеПериодомСценария.ПериодСценария = Периоды.Ссылка
		|		ПО УстановкаЛимитовПоДаннымБюджетированияПараметрыБюджетирования.УОП = УправлениеПериодомСценария.Ссылка
		|ГДЕ
		|	УстановкаЛимитовПоДаннымБюджетированияПараметрыБюджетирования.ВидБюджета = &ВидБюджета
		|	И УстановкаЛимитовПоДаннымБюджетированияПараметрыБюджетирования.ЦФО = &ЦФО
		|	И УстановкаЛимитовПоДаннымБюджетированияПараметрыБюджетирования.СостояниеСогласования = &СостояниеСогласования
		|	И Периоды.ДатаНачала = &НачалоПериода";
	
	Запрос.УстановитьПараметр("ВидБюджета", ПланыВидовХарактеристик.ВидыБюджетов.БюджетДвиженияДенежныхСредств);
	Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Источник.ДатаПлатежа));
	Запрос.УстановитьПараметр("СостояниеСогласования", Перечисления.СостоянияОтчетов.Утвержден);
	Запрос.УстановитьПараметр("ЦФО", Источник.Организация);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Возврат РезультатЗапроса.Пустой();
КонецФункции

// Функция выполняет обработку данных источника
Функция ОбработатьДанныеИсточника(ИнформацияДляКонтроля, Источник) Экспорт
	УстановитьПривилегированныйРежим(Истина);
	
	Запрос = Новый Запрос;
	
	Для Каждого КлючЗначение Из Источник Цикл
		Запрос.УстановитьПараметр(КлючЗначение.Ключ, КлючЗначение.Значение);
	КонецЦикла;
	
	Запрос.Текст =  ibs_ОбщийМодульСервер.ПолучитьТекстЗапросаКонтрольГодовогоЛимита();
	
	РезультатЗапроса = Запрос.Выполнить();
	Данные = РезультатЗапроса.Выгрузить();  
	
	Возврат Данные;
	
КонецФункции

// Процедура выполняет контроль обработанных данных
Функция ВыполнитьКонтроль(ИнформацияДляКонтроля, ДанныеДляКонтроля) Экспорт
	
	КонтрольНарушен = Ложь;

	Если  ТипЗнч(ДанныеДляКонтроля) = Тип("ТаблицаЗначений") Тогда   
		Строки = ДанныеДляКонтроля.НайтиСтроки(Новый Структура("КонтрольНарушен", Истина));
		КонтрольНарушен = Строки.Количество() > 0;
	КонецЕсли;	

	Возврат КонтрольНарушен;
КонецФункции

// Функция возвращает Истина, если нарушение контроля должно приводить к блокированию проведения
Функция БлокироватьПроведение(КлючКонтроля) Экспорт
	
	РежимКонтроля = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПланыВидовХарактеристик.ВидыКонтроляДокументов.ibs_КонтрольЛимитовПоБДДС, "РежимКонтроля");
	Возврат РежимКонтроля = Перечисления.РежимыКонтроляДокументов.Блокировать
	
КонецФункции

// Возвращает имя источника для проверки
//
Функция ИмяИсточника() Экспорт
	
	Возврат "ibs_ЛимитыПоБДДС";
	
КонецФункции

// Процедура возвращает табличный документ с расшифровкой контроля документа
//
Функция СформироватьРасшифровкуКонтроля(Проверка, СтрокаКонтроль) Экспорт
	
	РезультатКонтроля = ПолучитьИзВременногоХранилища(СтрокаКонтроль.АдресРезультата);
	ДанныеКонтроля = РезультатКонтроля.Скопировать();	
	Возврат СформироватьОтчетКонтрольГодовогоЛимита(СтрокаКонтроль, ДанныеКонтроля);
	
КонецФункции

// Процедура сохраняет данные для контроля в табличной части документа
//
// Параметры:
//  ДанныеДляКонтроля	- Таблица значений	- Результат контроля
//  РезультатыКонтроля	- ТабличнаяЧасть	- табличная часть РезультатыКонтроля проверяемого документа
//
Процедура СохранитьДанныеДляКонтроляВДокументе(ДанныеДляКонтроля, РезультатыКонтроля) Экспорт
	
	Инфо = РегистрыСведений.ibs_АналитикаКонтроляЛимитовПоБДДС.ИнформацияОКлюче();
	
	РегистрыСведений.ibs_АналитикаКонтроляЛимитовПоБДДС.ЗаполнитьВКоллекции(ДанныеДляКонтроля);
	
	// Загрузить результат контроля в тч.РезультатыКонтроля
	Для Каждого Строка Из ДанныеДляКонтроля Цикл
		ЗаполнитьЗначенияСвойств(РезультатыКонтроля.Добавить(), Строка);
	КонецЦикла;
	
КонецПроцедуры // СохранитьДанныеДляКонтроляВДокументе()

// Функция возвращает соответствие с описанием колонок таблицы данных контроля, которые получаются из ключа контроля
//
// Возвращаемое значение:
//   Соответствие   - {ИмяКолонки, Структура("ИмяКолонки, ОписаниеТипа, ПутьКДанным")}
//
Функция КолонкиДанныхКонтроля() Экспорт
	
	Колонки = Новый Соответствие;
	КонтрольУХ.ДобавитьКолонкуКонтроля(Колонки, 
	"Организация",
	Новый ОписаниеТипов("СправочникСсылка.Организации"));
	КонтрольУХ.ДобавитьКолонкуКонтроля(Колонки, 
	"СтатьяДвиженияДенежныхСредств",
	Новый ОписаниеТипов("СправочникСсылка.СтатьиДвиженияДенежныхСредств"));  
	
	Результат = Новый Структура;
	Результат.Вставить("Источник", "Справочник.ibs_КлючиКонтроляЛимитовПоБДДС");
	Результат.Вставить("Колонки", Колонки);
	
	Возврат Результат;
	
КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция СформироватьОтчетКонтрольГодовогоЛимита(СтрокаКонтроль, ДанныеКонтроля) экспорт
	
	ТабДок = Новый ТабличныйДокумент;
	
	Макет = ПланыВидовХарактеристик.ВидыКонтроляДокументов.ПолучитьМакет("ibs_КонтрольЛимитовПоБДДС");
	
	ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
	ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
	ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали"); 
	
	ТабДок.Очистить();
	ОбластьЗаголовок.Параметры.Документ = СтрокаКонтроль.Документ;
	
	ОбластьЗаголовок.Параметры.ДатаВремяКонтроля = СтрокаКонтроль.ВремяПроверки;
	ОбластьЗаголовок.Параметры.ТекущееВремя = ТекущаяДатаСеанса();
	ОбластьЗаголовок.Параметры.ТекущийПользователь = Пользователи.ТекущийПользователь(); 
	
	ТабДок.Вывести(ОбластьЗаголовок);
	ТабДок.Вывести(ОбластьШапкаТаблицы);
	
	//
	ТабДок.НачатьАвтогруппировкуСтрок();
	Для каждого Данные Из ДанныеКонтроля Цикл
		ОбластьДетальныхЗаписей.Параметры.Заполнить(Данные);
		ТабДок.Вывести(ОбластьДетальныхЗаписей);
	КонецЦикла; 
	ТабДок.ЗакончитьАвтогруппировкуСтрок();
	
	Возврат ТабДок;
	
КонецФункции

#КонецОбласти

В общем модуле «КонтрольУХВстраивание» в процедуре «ВсеПроверки» определяем новый вид контроля.

&ИзменениеИКонтроль("ВсеПроверки")
Процедура ИБС_ВсеПроверки(ОбщиеМодулиКонтроля)

	//ОбщиеМодулиКонтроля.Вставить(<ПланыВидовХарактеристик.ВидыКонтроляДокументов.НовыйВидКонтроля>, <ИмяМодуляОтвечающегоЗаПроверку>); 
	ОбщиеМодулиКонтроля.Вставить(ПланыВидовХарактеристик.ВидыКонтроляДокументов.КонтрольОбъемаЗакупок, КонтрольУХОбъемыЗакупок);
	#Вставка 
	// ibs Донскова Е.В. 13.02.2024 {
	ОбщиеМодулиКонтроля.Вставить(ПланыВидовХарактеристик.ВидыКонтроляДокументов.ibs_КонтрольЛимитовПоБДДС, ibs_КонтрольУХПроверкаЛимитовБДДС);
	// } ibs Донскова Е.В. 13.02.2024 
	#КонецВставки
	
КонецПроцедуры

В документ «Заявка на оплату» добавляем новый реквизит «ibs_КонтрольБДДСНарушен» с типом «Булево». Данный реквизит будет указывать нарушен ли новый контроль в документе.

В модуле менеджера документа «Заявка на оплату» в функции «ИсточникиДокумента» добавляем новый контроль.

&ИзменениеИКонтроль("ИсточникиДокумента")
Функция ibs_ИсточникиДокумента(Объект, ДопПараметры)
	
	Источники = Новый Соответствие;
	
	// 1. Источник для контроля бюджетных лимитов и резервов
	КонтрольУХ.ДобавитьИсточник(
	Источники, 
	КонтрольУХБюджетныеЛимиты, 
	//Источник_БюджетныеЛимитыРезервы(Объект, ДопПараметры));
	Источник_БюджетныеЛимитыРезервы(Объект));
	
	// 2. Планы по взаиморасчетам с контрагентом
	КонтрольУХ.ДобавитьИсточник(
	Источники, 
	КонтрольУХВзаиморасчетыПоКонтрагенту, 
	Источник_ВзаиморасчетыПоКонтрагенту(Объект));
	
	// 3. Планы по взаиморасчетам по контрагентам
	КонтрольУХ.ДобавитьИсточник(
	Источники, 
	КонтрольУХВзаиморасчетыПоДоговору,
	Источник_ВзаиморасчетыПоДоговору(Объект));
	
	// 4. Контроль суммы расходов по договору
	КонтрольУХ.ДобавитьИсточник(
	Источники, 
	КонтрольУХРасходыПоДоговору,
	Источник_РасходыПоДоговору(Объект));
	#Вставка   
	// ibs Донскова Е.В. 13.02.2024 { 
	КонтрольУХ.ДобавитьИсточник(
	Источники, 
	ibs_КонтрольУХПроверкаЛимитовБДДС,
	ibs_Источник_ЛимитыПоБДДС(Объект));
	// } ibs Донскова Е.В. 13.02.2024
	#КонецВставки
	
	Возврат Источники;
	
КонецФункции


// ibs Донскова Е.В. 13.02.2024 {
Функция ibs_Источник_ЛимитыПоБДДС(Объект) 
	
	Результат = Новый Структура;
	Результат.Вставить("Заявка", 				 Объект.Ссылка); 
	Результат.Вставить("Организация", 			 Объект.Организация)	
	Результат.Вставить("ДвиженияОперации", 		 Объект.ДвиженияОперации.Выгрузить());  
	Результат.Вставить("НачалоПериода", 		 НачалоГода(Объект.Дата));   
	Результат.Вставить("ДатаПлатежа", 			?(Объект.ЖелательнаяДатаПлатежа = Дата(1,1,1), Объект.Дата, Объект.ЖелательнаяДатаПлатежа));
	Результат.Вставить("КонецПериода", 		 	 КонецГода(Объект.Дата));
	Результат.Вставить("ВидОтчета", 			 РегистрыСведений.ibs_ДополнительныеКонстанты.ПолучитьЗначениеКонстанты(ПланыВидовХарактеристик.ibs_ВидыКонстант.ВидОтчетаБДДС));
	Результат.Вставить("СценарийБДДС", 			 РегистрыСведений.ibs_ДополнительныеКонстанты.ПолучитьЗначениеКонстанты(ПланыВидовХарактеристик.ibs_ВидыКонстант.СценарийОтчетаБДДС));	 
	Возврат Результат;
	
КонецФункции
// } ibs Донскова Е.В. 13.02.2024 

После обновления конфигурации необходимо настроить новый контроль в режиме «Предприятие».

Пример работы контроля:

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

Благодарю вас за уделенное время и надеюсь, что мой материал будет вам полезен!

Комментарии (2)


  1. Grey_54
    04.04.2024 07:56
    +2

    Спасибо автор, правда полезная информация !


  1. max-zhilin
    04.04.2024 07:56
    +1

    Познавательно