"Функция в глобальном модуле. Исправление в нескольких местах. Вот что ей надо было!:<br><br>Функция глСобратьДанныеДляСЗВ2010(ТаблицаСтажиСотрудников, ОбобщенныйСотрудник, ТаблицаСотрудниковСКатегориямиЗЛ, ДатаНачала, ДатаОкончания, Форма ="""", Режим = """") Экспорт<br><br>// Структура таблицы ТаблицаСотрудниковСКатегориямиЗЛ<br>// Сотрудник<br>// ТаблицаПериодов - таблица значений<br><br>// далее в запросах будем использовать список сотрудников<br>Если ТипЗначения(ОбобщенныйСотрудник)=11 Тогда //здесь был передан элемент справочника - добавим его в только что созданный список<br>Сотрудники=СоздатьОбъект("СписокЗначений");<br>Сотрудники.ДобавитьЗначение(ОбобщенныйСотрудник);<br>Иначе //а здесь был передан список элементов - будем использовать непосредственно его<br>Сотрудники=ОбобщенныйСотрудник;<br>КонецЕсли;<br>ВсегоСотров = Сотрудники.РазмерСписка();<br><br>// Структура таблицы ТаблицаСтажиСотрудников<br>// Сотрудник<br>// ТаблицаСтажаСотрудника - таблица значений<br>ТаблицаСтажиСотрудников = СоздатьОбъект("ТаблицаЗначений");<br>ТаблицаСтажиСотрудников.НоваяКолонка("Сотрудник","Справочник.Сотрудники");<br>ТаблицаСтажиСотрудников.НоваяКолонка("ТаблицаСтажаСотрудника", "ТаблицаЗначений");<br><br>// Структура ТаблицаСтажаСотрудника<br>// КатегорияЗЛ<br>// ТаблицаСоСтажем - таблица значений<br>// ИсчисленоСтраховая<br>// ИсчисленоНакопительная<br>ТаблицаСтажаСотрудника = СоздатьОбъект("ТаблицаЗначений");<br>ТаблицаСтажаСотрудника.НоваяКолонка("КатегорияЗЛ","Перечисление.КатегорииЗастрахованныхЛицПФР");<br>ТаблицаСтажаСотрудника.НоваяКолонка("ТаблицаСоСтажем", "ТаблицаЗначений");<br>ТаблицаСтажаСотрудника.НоваяКолонка("ИсчисленоСтраховая","Число",15,2,,,,);<br>ТаблицаСтажаСотрудника.НоваяКолонка("ИсчисленоНакопительная","Число",15,2,,,,);<br><br>// Структура ТаблицаСоСтажем<br>// это собственно таблица с записями о стаже<br>ТаблицаСоСтажем = СоздатьОбъект("ТаблицаЗначений");<br>ТаблицаСоСтажем.НоваяКолонка("ТипЗаписи","Строка",14,,,,,); // Основная или дополнительная<br>ТаблицаСоСтажем.НоваяКолонка("НомерЗаписи","Число",2,0,,,,);<br>ТаблицаСоСтажем.НоваяКолонка("Начало","Дата",,,,,,);<br>ТаблицаСоСтажем.НоваяКолонка("Окончание","Дата",,,,,,);<br>ТаблицаСоСтажем.НоваяКолонка("ТерриториальныеУсловия","Перечисление.ТерриториальныеУсловия",,,,,,);<br>ТаблицаСоСтажем.НоваяКолонка("УсловияТруда","Перечисление.СЗВОсобыеУсловияТруда2002",,,,,,);<br>ТаблицаСоСтажем.НоваяКолонка("ИТСОснование","Перечисление.СЗВОснованияИТС2002",,,,,,);<br>ТаблицаСоСтажем.НоваяКолонка("ИТСДопСведения1","Число",5,0,,,,);<br>ТаблицаСоСтажем.НоваяКолонка("ИТСДопСведения2","Число",2,0,,,,);<br>ТаблицаСоСтажем.НоваяКолонка("ИТСДопСведения3","Перечисление.СЗВПараметр3ИТС2010",,,,,,);<br>ТаблицаСоСтажем.НоваяКолонка("ВыслугаЛетОснование","Перечисление.СЗВОснованияВыслугиЛет2002",,,,,,);<br>ТаблицаСоСтажем.НоваяКолонка("ВыслугаЛетДопСведения1","Число",5,0,,,,);<br>ТаблицаСоСтажем.НоваяКолонка("ВыслугаЛетДопСведения2","Число",4,0,,,,);<br>ТаблицаСоСтажем.НоваяКолонка("ВыслугаЛетДопСведения3","Число",8,2,,,,);<br>ТаблицаСоСтажем.НоваяКолонка("КодПозицииСписка","Строка",20,,,,,);<br>ТаблицаСоСтажем.НоваяКолонка("ПараметрТерриториальныхУсловий","Число",5,2,,,,);<br><br>глСтатусСтрока(Форма,"Обрабатываются данные стажа");<br><br>// данные о стаже из справочника<br>ЗапросПоСтажу=СоздатьОбъект("Запрос");<br><br>ТекстЗапроса="//{{ЗАПРОС(ЗапросПоСтажу)<br>|Сотр = Справочник.СЗВСтаж2010.Владелец.ТекущийЭлемент;<br>|КатегорияЗЛ = Справочник.СЗВСтаж2010.КатегорияЗЛ;<br>|Запись = Справочник.СЗВСтаж2010.ТекущийЭлемент;<br>|ОтчетныйПериод = Справочник.СЗВСтаж2010.ОтчетныйПериод;<br>|ОсновнаяЗапись = Справочник.СЗВСтаж2010.ОсновнаяЗапись;<br>|Начало = Справочник.СЗВСтаж2010.Начало;<br>|Окончание = Справочник.СЗВСтаж2010.Окончание;<br>|УсловияТруда = Справочник.СЗВСтаж2010.УсловияТруда;<br>|КодПозицииСписка = Справочник.СЗВСтаж2010.КодПозицииСписка;<br>|ИТСОснование = Справочник.СЗВСтаж2010.ИТСОснование;<br>|ИТСДопСведения1 = Справочник.СЗВСтаж2010.ИТСДопСведения1;<br>|ИТСДопСведения2 = Справочник.СЗВСтаж2010.ИТСДопСведения2;<br>|ИТСДопСведения3 = Справочник.СЗВСтаж2010.ИТСДопСведения3;<br>|ВыслугаЛетОснование = Справочник.СЗВСтаж2010.ВыслугаЛетОснование;<br>|ВыслугаЛетДопСведения1 = Справочник.СЗВСтаж2010.ВыслугаЛетДопСведения1;<br>|ВыслугаЛетДопСведения2 = Справочник.СЗВСтаж2010.ВыслугаЛетДопСведения2;<br>|ВыслугаЛетДопСведения3 = Справочник.СЗВСтаж2010.ВыслугаЛетДопСведения3;<br>|ТерриториальныеУсловия = Справочник.СЗВСтаж2010.ТерриториальныеУсловия;<br>|ПараметрТерриториальныхУсловий = Справочник.СЗВСтаж2010.ПараметрТерриториальныхУсловий;<br>|Группировка Сотр без упорядочивания без групп;<br>|Группировка КатегорияЗЛ;<br>|Группировка Запись упорядочить по Запись.Код;<br>|Условие(Сотр в Сотрудники);<br>|Условие(ОтчетныйПериод = ДатаНачала);<br>|"//}}ЗАПРОС<br>;<br><br>Если Режим <> "СохранениеДанных" Тогда<br>ПопытокВыполненияЗапроса = 10;<br>Для Сч = 1 По ПопытокВыполненияЗапроса Цикл<br>Если ЗапросПоСтажу.Выполнить(ТекстЗапроса)=1 Тогда<br>Прервать<br>КонецЕсли;<br>КонецЦикла;<br>Если Сч = ПопытокВыполненияЗапроса + 1 Тогда<br>Сообщить("Не удалось обработать данные о стаже работников!");<br>Возврат 0;<br>КонецЕсли;<br>КонецЕсли;<br>// получим таблицу значений в которй будут сотрудники, имевшие в периоде отчета<br>// отпуск без сохранения ЗП, больничные или отпуска, исключаемые из льготного стажа<br>ТаблицаСотрудниковСОсобымиПериодами=СоздатьОбъект("ТаблицаЗначений");<br>ТаблицаСотрудниковСОсобымиПериодами.НоваяКолонка("Сотрудник");<br>ТаблицаСотрудниковСОсобымиПериодами.НоваяКолонка("ЕстьБЛ", "Число", 1, 0);<br>ТаблицаСотрудниковСОсобымиПериодами.НоваяКолонка("ЕстьОтпускЗаСвойСчет", "Число", 1, 0);<br>ТаблицаСотрудниковСОсобымиПериодами.НоваяКолонка("ЕстьОтпуск", "Число", 1, 0);<br><br>//глЗаполнитьТаблицуСотрудниковСОсобымиПериодами(ТаблицаСотрудниковСОсобымиПериодами, Сотрудники, ДатаНачала, ДатаОкончания,<br>// СписокВРБольничныеЛисты,СписокВРОтпускаБезСохранения,СписокВРОтпускаИсключаемыеИзСтажа);<br><br>//таблица для сбора периодов состояния физлица в разрезе месяцев<br>ТаблицаПериодов=СоздатьОбъект("ТаблицаЗначений");<br>ТаблицаПериодов.НоваяКолонка("Месяц"); //число<br>ТаблицаПериодов.НоваяКолонка("КатегорияЗЛ");<br>ТаблицаПериодов.НоваяКолонка("НачалоПериода");<br>ТаблицаПериодов.НоваяКолонка("ОкончаниеПериода");<br>ТаблицаПериодов.НоваяКолонка("СостояниеФизлица");<br>ТаблицаПериодов.НоваяКолонка("Документ");<br>ТаблицаПериодов.НоваяКолонка("ЕстьЕНВД");<br><br>//таблица для сбора периодов стажа сотрудника, внутри периода состояния физлица<br>ТаблицаПериодовСтажа=СоздатьОбъект("ТаблицаЗначений");<br>ТаблицаПериодовСтажа.НоваяКолонка("НачалоПериода");<br>ТаблицаПериодовСтажа.НоваяКолонка("ОкончаниеПериода");<br>ТаблицаПериодовСтажа.НоваяКолонка("Должность");<br>ТаблицаПериодовСтажа.НоваяКолонка("Подразделение");<br><br>//списки значений в котоых будем хранить наборы по стажу<br>НаборДляСтажа = СоздатьОбъект("СписокЗначений");<br>СтарыйНаборДляСтажа = СоздатьОбъект("СписокЗначений");<br><br>ПервыйМесяц = ДатаМесяц(ДатаНачала);<br>ПоследнийМесяц = ДатаМесяц(ДатаОкончания);<br>Год = ДатаГод(ДатаНачала);<br><br>ПромТаблицаСоСтажем = СоздатьОбъект("ТаблицаЗначений");<br>ТаблицаСоСтажем.Выгрузить(ПромТаблицаСоСтажем);<br><br>Для СчСотров = 1 По ВсегоСотров Цикл<br><br>Сотрудник = Сотрудники.ПолучитьЗначение(СчСотров);<br><br>КодСотра=Сотрудник.Код;<br>ИмяСотра=Сотрудник.Наименование;<br><br>Если ПустоеЗначение(""""+КодСотра+ИмяСотра)=1 Тогда<br>Продолжить<br>КонецЕсли;<br><br>СтажВСправочнике=0;<br>Если Режим <> "СохранениеДанных" Тогда<br>ЗапросПоСтажу.вНачалоВыборки();<br>Если ЗапросПоСтажу.Получить(Сотрудник,,)=1 Тогда<br>СтажВСправочнике=1;<br>КонецЕсли;<br>КонецЕсли;<br><br>НовыйПроцент = Окр(СчСотров/ВсегоСотров*100);<br>Если СчСотров < ВсегоСотров Тогда<br>глСтатусСтрока(Форма,"Обрабатываются данные стажа"+?(ВсегоСотров=1,""""," ("+НовыйПроцент+"%)")+": "+ИмяСотра);<br>КонецЕсли;<br><br>ВремТаблицаСтажаСотрудника = СоздатьОбъект("ТаблицаЗначений");<br>ТаблицаСтажаСотрудника.Выгрузить(ВремТаблицаСтажаСотрудника);<br>НомерСтрокиСтажа = 0;<br>// стаж<br>Если СтажВСправочнике = 1 Тогда<br><br>Пока ЗапросПоСтажу.Группировка("КатегорияЗЛ")=1 Цикл<br><br>КатегорияЗЛ = ЗапросПоСтажу.КатегорияЗЛ;<br>НомерСтрокиСтажа = 0;<br><br>ВремТаблицаСоСтажем = СоздатьОбъект("ТаблицаЗначений");<br>ТаблицаСоСтажем.Выгрузить(ВремТаблицаСоСтажем);<br><br>Пока ЗапросПоСтажу.Группировка("Запись")=1 Цикл<br><br>Если ЗапросПоСтажу.ОсновнаяЗапись = 1 Тогда<br>ВремТаблицаСоСтажем.НоваяСтрока();<br>НомерСтрокиТаблицы = ВремТаблицаСоСтажем.КоличествоСтрок();<br>НомерСтрокиСтажа = НомерСтрокиСтажа + 1;<br>ВремТаблицаСоСтажем.ТипЗаписи = "Основная";<br>ВремТаблицаСоСтажем.НомерЗаписи = НомерСтрокиСтажа;<br>ИначеЕсли НомерСтрокиСтажа > 0 Тогда<br>ВремТаблицаСоСтажем.НоваяСтрока();<br>НомерСтрокиТаблицы = ВремТаблицаСоСтажем.КоличествоСтрок();<br>ВремТаблицаСоСтажем.ТипЗаписи = "Дополнительная";<br>ВремТаблицаСоСтажем.НомерЗаписи = 0;<br>Иначе<br>Продолжить<br>КонецЕсли;<br><br>ВремТаблицаСоСтажем.Начало = ЗапросПоСтажу.Начало;<br>ВремТаблицаСоСтажем.Окончание = ЗапросПоСтажу.Окончание;<br>ВремТаблицаСоСтажем.УсловияТруда = ЗапросПоСтажу.УсловияТруда;<br>ВремТаблицаСоСтажем.КодПозицииСписка = ЗапросПоСтажу.КодПозицииСписка;<br>ВремТаблицаСоСтажем.ИТСОснование = ЗапросПоСтажу.ИТСОснование;<br>ВремТаблицаСоСтажем.ИТСДопСведения1 = ЗапросПоСтажу.ИТСДопСведения1;<br>ВремТаблицаСоСтажем.ИТСДопСведения2 = ЗапросПоСтажу.ИТСДопСведения2;<br>ВремТаблицаСоСтажем.ИТСДопСведения3 = ЗапросПоСтажу.ИТСДопСведения3;<br>ВремТаблицаСоСтажем.ВыслугаЛетОснование = ЗапросПоСтажу.ВыслугаЛетОснование;<br>ВремТаблицаСоСтажем.ВыслугаЛетДопСведения1 = ЗапросПоСтажу.ВыслугаЛетДопСведения1;<br>ВремТаблицаСоСтажем.ВыслугаЛетДопСведения2 = ЗапросПоСтажу.ВыслугаЛетДопСведения2;<br>ВремТаблицаСоСтажем.ВыслугаЛетДопСведения3 = ЗапросПоСтажу.ВыслугаЛетДопСведения3;<br>ВремТаблицаСоСтажем.ТерриториальныеУсловия = ЗапросПоСтажу.ТерриториальныеУсловия;<br>ВремТаблицаСоСтажем.ПараметрТерриториальныхУсловий = ЗапросПоСтажу.ПараметрТерриториальныхУсловий;<br><br>КонецЦикла;<br><br>Если ВремТаблицаСоСтажем.КоличествоСтрок() > 0 Тогда<br>// для этой категории ЗЛ есть стаж<br>ВремТаблицаСтажаСотрудника.НоваяСтрока();<br>ВремТаблицаСтажаСотрудника.КатегорияЗЛ = КатегорияЗЛ;<br>ВремТаблицаСтажаСотрудника.ТаблицаСоСтажем = ВремТаблицаСоСтажем;<br>КонецЕсли;<br><br>КонецЦикла;<br><br>Если ВремТаблицаСтажаСотрудника.КоличествоСтрок() > 0 Тогда<br>ТаблицаСтажиСотрудников.НоваяСтрока();<br>ТаблицаСтажиСотрудников.Сотрудник = Сотрудник;<br>ТаблицаСтажиСотрудников.ТаблицаСтажаСотрудника = ВремТаблицаСтажаСотрудника;<br>КонецЕсли;<br><br>Иначе //записи справочника не найдены - "эмулируем" стаж по-умолчанию<br>КатЗЛ=ТаблицаСотрудниковСКатегориямиЗЛ.ПолучитьЗначение(1,"ТаблицаПериодов");<br>КатегорияЗЛ = КатЗЛ.ПолучитьЗначение(1,"КатегорияЗЛ");<br><br>ДатаНачалаСтажа = Дата(0);<br>ДатаОкончанияСтажа = Дата(0);<br><br>ХарактерРаботы = СоздатьОбъект("Периодический");<br>ХарактерРаботы.ИспользоватьОбъект("ХарактерРаботы", Сотрудник);<br>ХарактерРаботы.ВыбратьЗначения(,ДатаОкончания);<br>Пока ХарактерРаботы.ПолучитьЗначение() = 1 Цикл<br>Если (ХарактерРаботы.Значение = Перечисление.ХарактерРаботы.ДоговорГражданскоПравовогоХарактераВзносы)<br>ИЛИ (ХарактерРаботы.Значение = Перечисление.ХарактерРаботы.ТрудовойДоговор)<br>ИЛИ (ХарактерРаботы.Значение = Перечисление.ХарактерРаботы.ДоговорГражданскоПравовогоХарактера) Тогда<br>ДатаНачалаСтажа = ХарактерРаботы.ДатаЗнач;<br>КонецЕсли;<br><br>Если ХарактерРаботы.Значение = Перечисление.ХарактерРаботы.ТрудовыеОтношенияПрекращены Тогда<br>ДатаОкончанияСтажа = ХарактерРаботы.ДатаЗнач;<br>КонецЕсли;<br>КонецЦикла;<br><br>Если ДатаНачалаСтажа = Дата(0) Тогда<br>Продолжить;<br>Иначе<br>ДатаНачалаСтажа = Макс(ДатаНачалаСтажа,ДатаНачала);<br>КонецЕсли;<br><br>Если ДатаОкончанияСтажа = Дата(0) Тогда<br>ДатаОкончанияСтажа = ДатаОкончания;<br>Иначе<br>ДатаОкончанияСтажа = Мин(ДатаОкончанияСтажа,ДатаОкончания);<br>КонецЕсли;<br><br>Если ДатаНачалаСтажа >= ДатаОкончанияСтажа Тогда<br>ДатаОкончанияСтажа = ДатаОкончания;<br>КонецЕсли;<br><br>ВремТаблицаСоСтажем = СоздатьОбъект("ТаблицаЗначений");<br>ТаблицаСоСтажем.Выгрузить(ВремТаблицаСоСтажем);<br><br>ВремТаблицаСоСтажем.НоваяСтрока();<br>НомерСтрокиТаблицы = ВремТаблицаСоСтажем.КоличествоСтрок();<br>НомерСтрокиСтажа = НомерСтрокиСтажа + 1;<br>ВремТаблицаСоСтажем.ТипЗаписи = "Основная";<br>ВремТаблицаСоСтажем.НомерЗаписи = НомерСтрокиСтажа;<br>ВремТаблицаСоСтажем.Начало = ДатаНачалаСтажа;<br>ВремТаблицаСоСтажем.Окончание = ДатаОкончанияСтажа;<br>ВремТаблицаСоСтажем.ТерриториальныеУсловия = Константа.ТерриториальныеУсловия;<br>Если ВремТаблицаСоСтажем.КоличествоСтрок() > 0 Тогда<br>// для этой категории ЗЛ есть стаж<br>ВремТаблицаСтажаСотрудника.НоваяСтрока();<br>ВремТаблицаСтажаСотрудника.КатегорияЗЛ = КатегорияЗЛ;<br>ВремТаблицаСтажаСотрудника.ТаблицаСоСтажем = ВремТаблицаСоСтажем;<br>КонецЕсли;<br><br>ТаблицаСтажиСотрудников.НоваяСтрока();<br>ТаблицаСтажиСотрудников.Сотрудник = Сотрудник;<br>ТаблицаСтажиСотрудников.ТаблицаСтажаСотрудника = ВремТаблицаСтажаСотрудника;<br><br>КонецЕсли; //рассмотрели оба варианта - когда в справочнике есть стаж и когда его в справочнике не было<br><br>КонецЦикла; // обхода сотров и физлиц<br><br>ТаблицаСтажиСотрудников.Сортировать("1");<br><br>глСтатусСтрока(Форма,"""");<br><br>Возврат 1;<br><br>КонецФункции // глСобратьДанныеДляСЗВ2010()<br><br>"