Каталог решений - Своя операция в закрытии месяца? Легко!

Своя операция в закрытии месяца? Легко!

Своя операция в закрытии месяца? Легко!

В наличии

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

Категория:

Описание

Для решения задачи в качестве типовой конфигурации будем использовать «1С: ERP Управление предприятием 2». 

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

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

Как реализовать такую «хотелку»? Все достаточно просто. В конфигурации уже есть отчет «Контроль оформления документов товародвижения». Отчет показывает то что нам необходимо. Осталось только сделать пункт в операциях закрытия месяца и прикрутить туда данный отчет.

Обратимся к дереву метаданных конфигурации. Нам необходимо использовать следующие объекты:

  1. Отчет: «КонтрольОформленияДокументовТовародвижений»
  2. Общий модуль: «ЗакрытиеМесяцаСервер»
  3. Перечисление: «ОперацииЗакрытияМесяца»

Наиболее существенными в части доработок являются первые 2 объекта. Они не несут в себе структурных изменений метаданных – их можно легко разместить в расширении и производить модификацию именно там. Как создавать расширения конфигурации и как добавлять туда объекты – в интернете достаточно информации, можно без труда найти. В данной статье я опишу наиболее значимые моменты. Итак, поехали:

  1. Добавим в конфигурацию новое значение перечисления: «КонтрольОформленияДокументовПоОрдернымСкладам»
  2. Поместим процедуру ЗаполнитьОписаниеЭтаповЗакрытияМесяца(…) общего модуля в расширение. Наш код будет выполняться после основного кода процедуры. Его выделим в отдельную область.
  3. Добавим функцию, которая будет отвечать за открытия отчета с указанными параметрами (период, организация).
  4. Добавим процедуру, которая анализирует корректность оформления товарных документов. По сути, внутри ее производится вызов функции, в которой выполняется запрос из отчета. Именно из-за этого я не буду приводить листинг данной функции. По результатам выполнения такого запроса мы устанавливаем состояние у нашей операции.
  5. Поместим в расширение модуль объекта отчета «КонтрольОформленияДокументовТовародвижений». Мы сделаем этого для того, чтобы обработать входные параметры из операции закрытия месяца, и использовать их как значения отбора для компоновщика отчета.

 

 Общий модуль «ЗакрытиеМесяцаСервер»

#Область ОписаниеЭтаповЗакрытияМесяца

&После("ЗаполнитьОписаниеЭтаповЗакрытияМесяца")
Процедура Расш_ЗаполнитьОписаниеЭтаповЗакрытияМесяца(ТаблицаЭтапов)
	#Область КонтрольПоОрдернымСкладам	
	// наша операция будет располагаться внутри группы операций, которые находятся на 
	// "ручном контроле"
	ТекущийРодитель = ИдентификаторГруппыРучныеОперации();

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

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

#Область КонтрольОформленияДокументовПоОрдернымСкладам

// Обработчики этапа.
//
// Параметры:
//  ПараметрыОбработчика - Структура, формируемая алгоритмом заполнения операций закрытия месяца, содержит основные параметры, такие как
// 							перечень организаций, период выполнения операции...
//
Процедура Использование_КонтрольОформленияДокументовПоОрдернымСкладам(ПараметрыОбработчика) Экспорт
	
	ПараметрыРасчета = ПараметрыОбработчика.ПараметрыРасчета;
	
	// формируем параметры, которые будут использоваться для установки параметров запроса,
	// который показывает картину с корректностью отражения товародвижения
	ПараметрыПроверки = Новый Структура;
	ПараметрыПроверки.Вставить("КонецПериода", КонецМесяца(ПараметрыРасчета.ПериодРегистрации));
	Если ПараметрыОбработчика.Свойство("ПараметрыРасчета") и ПараметрыОбработчика.ПараметрыРасчета.Свойство("МассивОрганизаций") Тогда
		ПараметрыПроверки.Вставить("Организации", ПараметрыОбработчика.ПараметрыРасчета.МассивОрганизаций);
	КонецЕсли;
	
	// возвращает результат выполнения запроса, который идентичен запросу, 
	// который содержится в отчете КонтрольОформленияДокументовТовародвижений
	Результат = ТоварноМатериальныеЦенностиСервер.ОперацииОрдерныеСкладыКВыполнению(ПараметрыПроверки);
	
	// Неопределено - если данные получить не удается
	// 1 строка - если все хорошо
	// В остальных случаях - необходимо обратить внимание на корректность оформления документов!
	Если Результат = Неопределено Тогда
		
		УстановитьСостояниеНеТребуется(
			ПараметрыОбработчика,
			НСтр("ru='Отсутствует информация о неоформленных документах.'"));

	ИначеЕсли Результат.Строки.Количество() = 1 Тогда
		
		УстановитьСостояниеНеТребуется(
			ПараметрыОбработчика,
			НСтр("ru='Нет неоформленных документов.'"));
		
	Иначе
				
		ИтоговаяСтрока = Результат.Строки[Результат.Строки.Количество() - 1];		
		ТекстПояснения = НСтр("ru='Требуется оформление документов по ордерным складам'");
		
		УстановитьСостояниеНеВыполнен(
			ПараметрыОбработчика,
			ТекстПояснения,
			,
			,
			Перечисления.ВариантыВажностиПроблемыСостоянияСистемы.Предупреждение);
		
	КонецЕсли;
	
КонецПроцедуры

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

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

Модуль объекта «КонтрольОформленияДокументовТовародвижений»

has been added to your cart:
Оформление заказа