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