Актуально для большой группы обособленных подразделений

В конфигурации ЗУП КОРП 3.1 автоматизирован кадровый учет и расчет зарплаты крупного торгово-промышленного холдинга, имеющего широкую сеть фирменных магазинов по всей России. Организационно холдинг состоит из группы юридических лиц, магазины являются обособленными подразделениями. Согласно бизнес-процессам компании, при начислении зарплаты требовалось вводить отдельный документ по каждому подразделению. В связи с существенным количеством подразделений (порядка 100) это было трудоемко.

ЗУП: создание документов-черновиков начисления

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

Пример кода — функция, выполняющая выбор подразделений с еще не созданными документами начисления и создающая документы. Поддерживаются НачислениеЗарплаты и НачислениеЗаПервуюПоловинуМесяца:

Функция СоздатьДокументыНаСервере(Знач Период, Знач Организация, Знач ВидОперацииРасчетаЗП, Знач Подразделения)
	
	Если ВидОперацииРасчетаЗП = "НачислениеЗаПервуюПоловинуМесяца" Тогда
		ТипДокумента = "НачислениеЗаПервуюПоловинуМесяца";
	Иначе
		ТипДокумента = "НачислениеЗарплаты";
	КонецЕсли; 
	
	Запрос = Новый Запрос;
	Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	Запрос.УстановитьПараметр("Организация", Организация);
	Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Период));
	Запрос.УстановитьПараметр("ОкончаниеПериода", КонецМесяца(Период));
	Запрос.УстановитьПараметр("ВидДокумента", ВидОперацииРасчетаЗП);
	Запрос.УстановитьПараметр("Подразделения", Подразделения);
	
	Запрос.Текст = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
	|	ПодразделенияОрганизаций.Ссылка КАК Подразделение,
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(ДополнительныеРеквизитыТипПодразделения.Значение.Наименование, """") = ""Офис""
	|				ИЛИ ЕСТЬNULL(ДополнительныеРеквизитыТипПодразделения.Значение.Наименование, """") = ""Склад""
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК ИскатьПодразделениеВерхнегоУровня
	|ИЗ
	|	Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПодразделенияОрганизаций.ДополнительныеРеквизиты КАК ДополнительныеРеквизитыТипПодразделения
	|		ПО ПодразделенияОрганизаций.Ссылка = ДополнительныеРеквизитыТипПодразделения.Ссылка
	|			И (ДополнительныеРеквизитыТипПодразделения.Свойство.Имя = ""КодМагазина"")
	|ГДЕ
	|	&УсловиеОтбораПодразделения
	|	И (ПодразделенияОрганизаций.ДатаРасформирования = ДАТАВРЕМЯ(1, 1, 1)
	|			ИЛИ ПодразделенияОрганизаций.ДатаРасформирования >= &НачалоПериода)
	|	И ПодразделенияОрганизаций.ДатаСоздания <= &ОкончаниеПериода";
	Если Подразделения.Количество() > 0 Тогда	
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеОтбораПодразделения", 
			"ПодразделенияОрганизаций.Ссылка В (&Подразделения)");
	Иначе
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеОтбораПодразделения", 
			"ПодразделенияОрганизаций.Владелец = &Организация");
	КонецЕсли;
	
	КэшДанныхИерархии = Новый Соответствие;
	ДанныеПодразделений = Запрос.Выполнить().Выгрузить();
	Для Каждого СтрокаДанныхПодразделения Из ДанныеПодразделений Цикл
		Если СтрокаДанныхПодразделения.ИскатьПодразделениеВерхнегоУровня Тогда
			СтрокаДанныхПодразделения.Подразделение = ПолучитьРодителяВерхнегоУровня(СтрокаДанныхПодразделения.Подразделение, КэшДанныхИерархии);
		КонецЕсли; 
	КонецЦикла; 
	
	Запрос.Текст = 
	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ДанныеПодразделений.Подразделение КАК Подразделение
	|ПОМЕСТИТЬ ВТПодразделения
	|ИЗ
	|	&ДанныеПодразделений КАК ДанныеПодразделений
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	НачислениеЗарплаты.Ссылка КАК Документ,
	|	НачислениеЗарплаты.Подразделение КАК Подразделение
	|ПОМЕСТИТЬ ВТСуществующиеДокументы
	|ИЗ
	|	Документ.&ИмяТаблицыДокумента КАК НачислениеЗарплаты
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОперацииРасчетаЗарплаты КАК ОперацииРасчетаЗарплаты
	|		ПО НачислениеЗарплаты.Ссылка = ОперацииРасчетаЗарплаты.Документ
	|ГДЕ
	|	НачислениеЗарплаты.Организация = &Организация
	|	И НачислениеЗарплаты.МесяцНачисления = &НачалоПериода
	|	И НачислениеЗарплаты.Подразделение В
	|			(ВЫБРАТЬ
	|				ВТПодразделения.Подразделение
	|			ИЗ
	|				ВТПодразделения КАК ВТПодразделения)
	|	И НЕ НачислениеЗарплаты.ПометкаУдаления
	|	И &УсловиеОтбораДокументов
	|	И &УсловиеОтбораПоВидуОперации
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВТПодразделения.Подразделение КАК Подразделение,
	|	ПРЕДСТАВЛЕНИЕ(ВТПодразделения.Подразделение) КАК ПодразделениеПредставление,
	|	ПРЕДСТАВЛЕНИЕ(ЕСТЬNULL(ВТСуществующиеДокументы.Документ, ЗНАЧЕНИЕ(Документ.&ИмяТаблицыДокумента.ПустаяСсылка))) КАК Документ,
	|	ВЫБОР
	|		КОГДА ВТСуществующиеДокументы.Документ ЕСТЬ NULL
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК СоздаватьНовыйДокумент
	|ИЗ
	|	ВТПодразделения КАК ВТПодразделения
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВТСуществующиеДокументы КАК ВТСуществующиеДокументы
	|		ПО ВТПодразделения.Подразделение = ВТСуществующиеДокументы.Подразделение
	|
	|УПОРЯДОЧИТЬ ПО
	|	ВТПодразделения.Подразделение,
	|	ВТСуществующиеДокументы.Документ
	|ИТОГИ
	|	МАКСИМУМ(СоздаватьНовыйДокумент)
	|ПО
	|	Подразделение
	|АВТОУПОРЯДОЧИВАНИЕ";
	
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИмяТаблицыДокумента", ТипДокумента);
	
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеОтбораДокументов", 
		?(ТипДокумента = "НачислениеЗарплаты", "НЕ НачислениеЗарплаты.РежимДоначисления", "(ИСТИНА)"));
		
	Если ТипЗнч(ВидОперацииРасчетаЗП) <> Тип("Строка") Тогда
		ТекстУсловияОтбораПоВидуОперации = "ЕСТЬNULL(ОперацииРасчетаЗарплаты.ВидОперации, ЗНАЧЕНИЕ(Справочник.ВидыОперацийРасчетаЗарплаты.ПустаяСсылка)) = &ВидДокумента";
	Иначе
		ТекстУсловияОтбораПоВидуОперации = "(ИСТИНА)";
	КонецЕсли;
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеОтбораПоВидуОперации", ТекстУсловияОтбораПоВидуОперации);
	
	Запрос.УстановитьПараметр("ДанныеПодразделений", ДанныеПодразделений);
	
	
	НаборОперацииРасчетаЗарплаты = РегистрыСведений.ОперацииРасчетаЗарплаты.СоздатьНаборЗаписей();
	
	ВыборкаПодразделения = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	Пока ВыборкаПодразделения.Следующий() Цикл
		
		Если ВыборкаПодразделения.СоздаватьНовыйДокумент Тогда
			
			НачислениеОбъект = Документы[ТипДокумента].СоздатьДокумент();
			Если ТипДокумента = "НачислениеЗаПервуюПоловинуМесяца" Тогда
				НачислениеОбъект.ОкончаниеПериодаНачисления = Дата(Год(Период), Месяц(Период), 15);
				НачислениеОбъект.Дата = НачислениеОбъект.ОкончаниеПериодаНачисления;
			Иначе
				НачислениеОбъект.Дата = НачалоДня(КонецМесяца(Период));
			КонецЕсли;
			НачислениеОбъект.Организация = Организация;
			НачислениеОбъект.Подразделение = ВыборкаПодразделения.Подразделение;
			НачислениеОбъект.МесяцНачисления = НачалоМесяца(Период);
			НачислениеОбъект.Ответственный = Пользователи.ТекущийПользователь();
			НачислениеОбъект.Записать(РежимЗаписиДокумента.Запись);
			
			Если ЗначениеЗаполнено(ВидОперацииРасчетаЗП) Тогда
				НаборОперацииРасчетаЗарплаты.Отбор.Документ.Установить(НачислениеОбъект.Ссылка);
				НаборОперацииРасчетаЗарплаты.Очистить();
				Запись = НаборОперацииРасчетаЗарплаты.Добавить();
				Запись.Документ = НачислениеОбъект.Ссылка;
				Запись.ВидОперации = ВидОперацииРасчетаЗП;
				НаборОперацииРасчетаЗарплаты.Записать();
			КонецЕсли; 
			
			ТекстСообщения = СтрШаблон("Создан новый документ по подразделению %1 за период %2",
				ВыборкаПодразделения.ПодразделениеПредставление,
				Формат(Период, "ДФ='MMMM yyyy'"));
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
			
		Иначе
			
			СуществующиеДокументыПоПодразделению = Новый Массив;
			
			ВыборкаДокументы = ВыборкаПодразделения.Выбрать();
			Пока ВыборкаДокументы.Следующий() Цикл
				СуществующиеДокументыПоПодразделению.Добавить(ВыборкаДокументы.Документ);
			КонецЦикла;
			
			ТекстСообщения = СтрШаблон("По подразделению %1 уже создан документ за период %2: %3",
				ВыборкаПодразделения.ПодразделениеПредставление,
				Формат(Период, "ДФ='MMMM yyyy'"),
				СтрСоединить(СуществующиеДокументыПоПодразделению, ", "));
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
			
		КонецЕсли; 
		
	КонецЦикла;
	
КонецФункции