🔥 Горящие вакансии
Все статьи

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

Эту и другие технические статьи написали наши программисты 1С и получили за них премии. Если вы тоже работаете с 1С и любите делиться опытом, приходите разработчиком в Neti

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

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

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

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

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

Оставить коментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Отправить резюме

    Я согласен на обработку персональных данных в соответствии
    со ст. 9 ФЗ № 152-ФЗ «О персональных данных»

    Отправить резюме

      Я согласен на обработку персональных данных в соответствии
      со ст. 9 ФЗ № 152-ФЗ «О персональных данных»

      Pекомендовать друга

        Отправьте контактные данные вашего друга и предупредите его, что мы с ним свяжемся. Когда друг успешно отработает 3 месяца, вы получите 20 000 ₽.


        Выбрать вакансию
        • Bitrix-разработчик
        • Программист 1С
        • Консультант-аналитик 1С
        • Проекты для команды специалистов 1С
        • Проекты для специалистов 1С
        • Стажёр-программист 1С
        • Ведущий консультант Microsoft Dynamics 365 Sales
        • Руководитель проектов Microsoft Dynamics 365 FO и AX 2012
        • Консультант Microsoft Dynamics AX на зарубежные проекты
        • Ведущий консультант Microsoft Dynamics 365 Finance and Operation
        • Ведущий разработчик Microsoft Dynamics AX на зарубежные проекты
        Я согласен на обработку персональных данных в соответствии
        со ст. 9 ФЗ № 152-ФЗ «О персональных данных»

        Pекомендовать друга

          Отправьте контактные данные вашего друга и предупредите его, что мы с ним свяжемся. Когда друг успешно отработает 3 месяца, вы получите 20 000 ₽.


          Выбрать вакансию
          • Bitrix-разработчик
          • Программист 1С
          • Консультант-аналитик 1С
          • Проекты для команды специалистов 1С
          • Проекты для специалистов 1С
          • Стажёр-программист 1С
          • Ведущий консультант Microsoft Dynamics 365 Sales
          • Руководитель проектов Microsoft Dynamics 365 FO и AX 2012
          • Консультант Microsoft Dynamics AX на зарубежные проекты
          • Ведущий консультант Microsoft Dynamics 365 Finance and Operation
          • Ведущий разработчик Microsoft Dynamics AX на зарубежные проекты
          Я согласен на обработку персональных данных в соответствии
          со ст. 9 ФЗ № 152-ФЗ «О персональных данных»

          Спасибо!

          Мы получили ваше резюме. Менеджер свяжется с вами в течение трех дней

          Горящие вакансии