Своя операция в закрытии месяца? Легко!
Иногда приходится сталкиваться с задачей включения в пункты закрытия месяца своих операций. В данной статье будет показано – как с минимальными изменениями конфигурации, а также использованием расширений решить такую задачу.
- Описание
- Подробнее
Описание
Для решения задачи в качестве типовой конфигурации будем использовать «1С: ERP Управление предприятием 2».
Это могут быть как обязательные операции, от которых зависит финансовый результат, так и необязательные, которые не влияют на финансовый результат, но, возможно, несут некую функцию проверки учета, сигнализирования о неких проблемах при ведении учета.
Пример №1: Необходим пункт, который бы показывал ответственному бухгалтеру, который выполняет процедуру закрытия, общую картину по различиям между остатками товаров в оперативном и финансовом учете без учета складов и номенклатуры. Но, если бухгалтер захочет увидеть детально по складам и номенклатуре расхождения – чтобы у него была такая возможность из закрытия месяца вызвать какой-то отчет, который ему все покажет и все расскажет.
Как реализовать такую «хотелку»? Все достаточно просто. В конфигурации уже есть отчет «Контроль оформления документов товародвижения». Отчет показывает то что нам необходимо. Осталось только сделать пункт в операциях закрытия месяца и прикрутить туда данный отчет.
Обратимся к дереву метаданных конфигурации. Нам необходимо использовать следующие объекты:
- Отчет: «КонтрольОформленияДокументовТовародвижений»
- Общий модуль: «ЗакрытиеМесяцаСервер»
- Перечисление: «ОперацииЗакрытияМесяца»
Наиболее существенными в части доработок являются первые 2 объекта. Они не несут в себе структурных изменений метаданных – их можно легко разместить в расширении и производить модификацию именно там. Как создавать расширения конфигурации и как добавлять туда объекты – в интернете достаточно информации, можно без труда найти. В данной статье я опишу наиболее значимые моменты. Итак, поехали:
- Добавим в конфигурацию новое значение перечисления: «КонтрольОформленияДокументовПоОрдернымСкладам»
- Поместим процедуру ЗаполнитьОписаниеЭтаповЗакрытияМесяца(…) общего модуля в расширение. Наш код будет выполняться после основного кода процедуры. Его выделим в отдельную область.
- Добавим функцию, которая будет отвечать за открытия отчета с указанными параметрами (период, организация).
- Добавим процедуру, которая анализирует корректность оформления товарных документов. По сути, внутри ее производится вызов функции, в которой выполняется запрос из отчета. Именно из-за этого я не буду приводить листинг данной функции. По результатам выполнения такого запроса мы устанавливаем состояние у нашей операции.
- Поместим в расширение модуль объекта отчета «КонтрольОформленияДокументовТовародвижений». Мы сделаем этого для того, чтобы обработать входные параметры из операции закрытия месяца, и использовать их как значения отбора для компоновщика отчета.
Общий модуль «ЗакрытиеМесяцаСервер»
#Область ОписаниеЭтаповЗакрытияМесяца
&После("ЗаполнитьОписаниеЭтаповЗакрытияМесяца")
Процедура Расш_ЗаполнитьОписаниеЭтаповЗакрытияМесяца(ТаблицаЭтапов)
#Область КонтрольПоОрдернымСкладам
// наша операция будет располагаться внутри группы операций, которые находятся на
// "ручном контроле"
ТекущийРодитель = ИдентификаторГруппыРучныеОперации();
// добавляем непосредственно в таблицу, которая содержит перечень операций
НоваяСтрока = ДобавитьЭтапВТаблицу(ТаблицаЭтапов, ТекущийРодитель,
Перечисления.ОперацииЗакрытияМесяца.КонтрольОформленияДокументовПоОрдернымСкладам,
Истина, Ложь, Ложь);
// так как наша операция по факту показывает что есть какие то отклонения в товародвижении
// но не выполняет никаких действий по автоматическому исправлению ситуации, то
// основным действием - является интерактивный вызов отчета с нужными параметрами
НоваяСтрока.ВыполняетсяВручную = Истина;
НоваяСтрока.ТекстВыполнить = НСтр("ru='Показать'");
НоваяСтрока.ДействиеИспользование = ОписаниеДействия_СервернаяПроцедура(
"ЗакрытиеМесяцаСервер.Использование_КонтрольОформленияДокументовПоОрдернымСкладам");
// укажем что действием по нажатию гиперссылки будет являться открытие отчета с автоматическим формированием
НоваяСтрока.ДействиеВыполнить = ОписаниеДействия_ОткрытьФормуОтчета("Отчет.КонтрольОформленияДокументовТовародвижений.Форма", Новый Структура("СформироватьПриОткрытии", истина));
#КонецОбласти //КонтрольПоОрдернымСкладам
КонецПроцедуры
#КонецОбласти
#Область КонтрольОформленияДокументовПоОрдернымСкладам
// Обработчики этапа.
//
// Параметры:
// ПараметрыОбработчика - Структура, формируемая алгоритмом заполнения операций закрытия месяца, содержит основные параметры, такие как
// перечень организаций, период выполнения операции...
//
Процедура Использование_КонтрольОформленияДокументовПоОрдернымСкладам(ПараметрыОбработчика) Экспорт
ПараметрыРасчета = ПараметрыОбработчика.ПараметрыРасчета;
// формируем параметры, которые будут использоваться для установки параметров запроса,
// который показывает картину с корректностью отражения товародвижения
ПараметрыПроверки = Новый Структура;
ПараметрыПроверки.Вставить("КонецПериода", КонецМесяца(ПараметрыРасчета.ПериодРегистрации));
Если ПараметрыОбработчика.Свойство("ПараметрыРасчета") и ПараметрыОбработчика.ПараметрыРасчета.Свойство("МассивОрганизаций") Тогда
ПараметрыПроверки.Вставить("Организации", ПараметрыОбработчика.ПараметрыРасчета.МассивОрганизаций);
КонецЕсли;
// возвращает результат выполнения запроса, который идентичен запросу,
// который содержится в отчете КонтрольОформленияДокументовТовародвижений
Результат = ТоварноМатериальныеЦенностиСервер.ОперацииОрдерныеСкладыКВыполнению(ПараметрыПроверки);
// Неопределено - если данные получить не удается
// 1 строка - если все хорошо
// В остальных случаях - необходимо обратить внимание на корректность оформления документов!
Если Результат = Неопределено Тогда
УстановитьСостояниеНеТребуется(
ПараметрыОбработчика,
НСтр("ru='Отсутствует информация о неоформленных документах.'"));
ИначеЕсли Результат.Строки.Количество() = 1 Тогда
УстановитьСостояниеНеТребуется(
ПараметрыОбработчика,
НСтр("ru='Нет неоформленных документов.'"));
Иначе
ИтоговаяСтрока = Результат.Строки[Результат.Строки.Количество() - 1];
ТекстПояснения = НСтр("ru='Требуется оформление документов по ордерным складам'");
УстановитьСостояниеНеВыполнен(
ПараметрыОбработчика,
ТекстПояснения,
,
,
Перечисления.ВариантыВажностиПроблемыСостоянияСистемы.Предупреждение);
КонецЕсли;
КонецПроцедуры
// Описание действия "Открыть произвольную форму".
//
// Параметры:
// ИмяФормы - Строка - имя открываемой формы
// ПараметрыВСтруктуреОтбор - Булево - признак того, что параметры открываемой формы надо передать внутри параметра Отбор с типом Структура
//
// Возвращаемое значение:
// Структура - см. СтруктураОписанияДействия()
//
Функция ОписаниеДействия_ОткрытьФормуОтчета(ИмяФормы, ПараметрыОткрытия) Экспорт
Описание = СтруктураОписанияДействия();
Описание.ВидДействия = Перечисления.ВидыДействийРасшифровкиОперацийЗакрытияМесяца.ОткрытьФорму;
Описание.ИмяФормы = ИмяФормы;
Описание.НаКлиенте = Истина;
ПоляПараметровФормы = "Организация, МассивОрганизаций, ПериодРегистрации, Период, НачалоПериода, КонецПериода, ДатаОкончанияПериода";
Описание.Вставить("ПараметрыФормы", Новый Структура(ПоляПараметровФормы));
Описание.ПараметрыФормы.Вставить(ЗакрытиеМесяцаСервер.ИмяСлужебногоСвойстваОткрываемыхФорм(), Истина);
Для каждого Элемент из ПараметрыОткрытия Цикл
Описание.ПараметрыФормы.Вставить(Элемент.Ключ, Элемент.Значение);
КонецЦикла;
Возврат Описание;
КонецФункции
#КонецОбласти
Модуль объекта «КонтрольОформленияДокументовТовародвижений»
