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