Переход на новые редакции и релизы в экосистеме 1С:Предприятие — это всегда баланс между получением нового функционала и стабильностью работы системы. Особенно остро этот вопрос встает в конфигурации «Зарплата и управление персоналом» (ЗУП), где любая ошибка в коде может привести к искажению кадрового учета, неверному расчету налогов, взносов и самой заработной платы.
В этой статье мы подробно разберем дилемму перехода с ветки 3.1.5 на 3.1.6, проанализируем критический баг релиза 3.1.6.54 (ошибка 10194465) и предоставим готовые практические решения — как программные (для разработчиков), так и методологические (для кадровиков и расчетчиков).
При подготовке к обновлению конфигурации «1С:ЗУП КОРП» или «1С:ЗУП ПРОФ» пользователи часто сталкиваются с ситуацией выбора. Фирма «1С» практикует выпуск двух параллельных веток:
Если в штате вашей компании нет квалифицированного разработчика 1С, наиболее разумная стратегия — оставаться на стабильной ветке длительной поддержки (в данном случае 3.1.5.222) до самого конца ее жизненного цикла (конец 2018 — начало 2019 года), обновляясь на более высокие версии только после технологической паузы.
Если же вы решили перейти на версию 3.1.6, вам нужно быть готовыми к исправлению локальных багов. Одним из самых серьезных в релизе 3.1.6.54 стал сбой кадровых состояний сотрудников.
Давайте выясним причину возникновения этой проблемы. Ошибка проявляется в базах, где кадровый учет начинался с ввода документа НачальнаяШтатнаяРасстановка.
Симптомы проблемы: при установке обновления до версии 3.1.6.54 по сотрудникам, у которых Отпуск по уходу за ребенком начался до даты начала эксплуатации программы (т. е. до месяца, указанного в документе НачальнаяШтатнаяРасстановка), состояние в регистре сведений ошибочно сменяется на Работает. Программа «забывает», что сотрудник находится в отпуске, прекращает освобождение ставки и начинает рассчитывать плановое начисление (оклад, тарифную ставку) при расчете зарплаты за месяц.
Этот баг признан разработчиками «1С» под кодом 10194465. Ниже мы детально разберем два способа его устранения.
Если вы уже обновили информационную базу на релиз 3.1.6.54, откатываться назад на 3.1.5 технологически сложно и небезопасно для данных. Чтобы оперативно устранить проблему, необходимо внести изменения в код конфигурации через расширение или напрямую (если база снята с поддержки).
Нам потребуется скорректировать модуль объекта документа НачальнаяШтатнаяРасстановка. Проанализируем алгоритм: ошибка крылась в формировании временных таблиц состояний сотрудников, из-за чего кадровые движения затирали информацию об отпусках по уходу. Заменим функцию ДанныеДляПроведения приведенным ниже исправленным кодом, после чего перепроведем документы НачальнаяШтатнаяРасстановка:
Функция ДанныеДляПроведения() Экспорт
ДанныеДляПроведения = Новый Структура;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.Текст =
"ВЫБРАТЬ
| НачальнаяШтатнаяРасстановкаСотрудники.Ссылка.Месяц КАК ДатаСобытия,
| ДАТАВРЕМЯ(1, 1, 1) КАК ДействуетДо,
| НачальнаяШтатнаяРасстановкаСотрудники.Сотрудник КАК Сотрудник,
| НачальнаяШтатнаяРасстановкаСотрудники.Сотрудник.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
| НачальнаяШтатнаяРасстановкаСотрудники.ДолжностьПоШтатномуРасписанию КАК Позиция,
| НачальнаяШтатнаяРасстановкаСотрудники.Подразделение КАК Подразделение,
| НачальнаяШтатнаяРасстановкаСотрудники.Должность КАК Должность,
| НачальнаяШтатнаяРасстановкаСотрудники.КоличествоСтавок КАК КоличествоСтавок,
| НачальнаяШтатнаяРасстановкаСотрудники.ГрафикРаботы КАК ГрафикРаботы,
| НачальнаяШтатнаяРасстановкаСотрудники.СпособРасчетаАванса КАК СпособРасчетаАванса,
| НачальнаяШтатнаяРасстановкаСотрудники.Аванс КАК Аванс,
| НачальнаяШтатнаяРасстановкаСотрудники.ВидЗанятости КАК ВидЗанятости,
| НачальнаяШтатнаяРасстановкаСотрудники.Ссылка.ВидДоговора КАК ВидДоговора,
| ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.НачальныеДанные) КАК ВидСобытия,
| НачальнаяШтатнаяРасстановкаСотрудники.Сотрудник.ФизическоеЛицо КАК ФизическоеЛицо,
| НачальнаяШтатнаяРасстановкаСотрудники.Сотрудник.ГоловнойСотрудник КАК ГоловнойСотрудник,
| ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК ОтсутствующийСотрудник,
| ВЫБОР
| КОГДА НачальнаяШтатнаяРасстановкаСотрудники.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.Подработка)
| ТОГДА ИСТИНА
| КОГДА НачальнаяШтатнаяРасстановкаСотрудники.Сотрудник <> НачальнаяШтатнаяРасстановкаСотрудники.Сотрудник.ГоловнойСотрудник
| И НачальнаяШтатнаяРасстановкаСотрудники.Сотрудник.ГоловнойСотрудник <> ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка)
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК ЭтоПодработка,
| НачальнаяШтатнаяРасстановкаСотрудники.ПорядокРасчетаСтоимостиЕдиницыВремени КАК ПорядокРасчетаСтоимостиЕдиницыВремени,
| НачальнаяШтатнаяРасстановкаСотрудники.СовокупнаяТарифнаяСтавка КАК СовокупнаяТарифнаяСтавка,
| НачальнаяШтатнаяРасстановкаСотрудники.ВидТарифнойСтавки КАК ВидТарифнойСтавки,
| НачальнаяШтатнаяРасстановкаСотрудники.РазрядКатегория КАК РазрядКатегория,
| НачальнаяШтатнаяРасстановкаСотрудники.Грейд КАК Грейд,
| НачальнаяШтатнаяРасстановкаСотрудники.ПКУ КАК ПКУ,
| НачальнаяШтатнаяРасстановкаСотрудники.ДатаПрисвоения КАК ДатаПрисвоения,
| НачальнаяШтатнаяРасстановкаСотрудники.КлассныйЧинРанг КАК КлассныйЧинРанг,
| НачальнаяШтатнаяРасстановкаСотрудники.ВоинскоеСпециальноеЗвание КАК ВоинскоеСпециальноеЗвание
|ПОМЕСТИТЬ ВТСотрудники
|ИЗ
| Документ.НачальнаяШтатнаяРасстановка.Сотрудники КАК НачальнаяШтатнаяРасстановкаСотрудники
|ГДЕ
| НачальнаяШтатнаяРасстановкаСотрудники.Ссылка = &Ссылка";
Запрос.Выполнить();
Запрос.УстановитьПараметр("ДатаНачала", ЗарплатаКадрыКлиентСервер.ДатаОтсчетаПериодическихСведений);
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.ДатаСобытия КАК ДатаСобытия,
| Сотрудники.ДействуетДо КАК ДействуетДо,
| Сотрудники.Сотрудник КАК Сотрудник,
| Сотрудники.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
| Сотрудники.Позиция КАК Позиция,
| Сотрудники.Подразделение КАК Подразделение,
| Сотрудники.Должность КАК Должность,
| Сотрудники.КоличествоСтавок КАК КоличествоСтавок,
| Сотрудники.ГрафикРаботы КАК ГрафикРаботы,
| Сотрудники.СпособРасчетаАванса КАК СпособРасчетаАванса,
| Сотрудники.Аванс КАК Аванс,
| Сотрудники.ВидДоговора КАК ВидДоговора,
| Сотрудники.ВидСобытия КАК ВидСобытия,
| Сотрудники.ФизическоеЛицо КАК ФизическоеЛицо,
| Сотрудники.ГоловнойСотрудник КАК ГоловнойСотрудник,
| Сотрудники.ОтсутствующийСотрудник КАК ОтсутствующийСотрудник,
| Сотрудники.ЭтоПодработка КАК ЭтоПодработка
|ИЗ
| ВТСотрудники КАК Сотрудники
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| &ДатаНачала,
| Сотрудники.ДействуетДо,
| Сотрудники.Сотрудник,
| Сотрудники.ГоловнаяОрганизация,
| Сотрудники.Позиция,
| Сотрудники.Подразделение,
| Сотрудники.Должность,
| Сотрудники.КоличествоСтавок,
| Сотрудники.ГрафикРаботы,
| Сотрудники.СпособРасчетаАванса,
| Сотрудники.Аванс,
| Сотрудники.ВидДоговора,
| ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.НеподтвержденныеДанные),
| Сотрудники.ФизическоеЛицо,
| Сотрудники.ГоловнойСотрудник,
| Сотрудники.ОтсутствующийСотрудник,
| Сотрудники.ЭтоПодработка
|ИЗ
| ВТСотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.ДатаСобытия > &ДатаНачала";
КадровыеДвижения = Запрос.Выполнить().Выгрузить();
ДанныеДляПроведения.Вставить("КадровыеДвижения", КадровыеДвижения);
Запрос.Текст =
"ВЫБРАТЬ
| &ДатаНачала КАК ДатаСобытия,
| Сотрудники.ДействуетДо КАК ДействуетДо,
| Сотрудники.Сотрудник КАК Сотрудник,
| Сотрудники.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
| Сотрудники.ГрафикРаботы КАК ГрафикРаботы,
| Сотрудники.СпособРасчетаАванса КАК СпособРасчетаАванса,
| Сотрудники.Аванс КАК Аванс,
| Сотрудники.ВидСобытия КАК ВидСобытия,
| Сотрудники.ФизическоеЛицо КАК ФизическоеЛицо
|ИЗ
| ВТСотрудники КАК Сотрудники";
ГрафикиРаботы = Запрос.Выполнить().Выгрузить();
ДанныеДляПроведения.Вставить("ГрафикиРаботы", ГрафикиРаботы);
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.ДатаСобытия КАК ДатаСобытия,
| Сотрудники.ДействуетДо КАК ДействуетДо,
| Сотрудники.Сотрудник КАК Сотрудник,
| Сотрудники.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
| Сотрудники.ГрафикРаботы КАК ГрафикРаботы,
| Сотрудники.СпособРасчетаАванса КАК СпособРасчетаАванса,
| Сотрудники.Аванс КАК Аванс,
| Сотрудники.ВидСобытия КАК ВидСобытия,
| Сотрудники.ФизическоеЛицо КАК ФизическоеЛицо
|ИЗ
| ВТСотрудники КАК Сотрудники";
ПлановыеВыплаты = Запрос.Выполнить().Выгрузить();
ДанныеДляПроведения.Вставить("ПлановыеВыплаты", ПлановыеВыплаты);
Запрос.Текст =
"ВЫБРАТЬ
| &ДатаНачала КАК Период,
| Сотрудники.Сотрудник,
| Сотрудники.ГоловнаяОрганизация,
| Сотрудники.ФизическоеЛицо,
| Сотрудники.ВидЗанятости,
| Сотрудники.ДействуетДо
|ИЗ
| ВТСотрудники КАК Сотрудники";
ДвиженияВидовЗанятости = Запрос.Выполнить().Выгрузить();
ДанныеДляПроведения.Вставить("ДвиженияВидовЗанятости", ДвиженияВидовЗанятости);
Запрос.Текст =
"ВЫБРАТЬ
| ВЫБОР
| КОГДА НачальнаяШтатнаяРасстановкаНачисления.ДатаНачала = ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА НачальнаяШтатнаяРасстановкаНачисления.Ссылка.Месяц
| ИНАЧЕ НачальнаяШтатнаяРасстановкаНачисления.ДатаНачала
| КОНЕЦ КАК ДатаСобытия,
| ВЫБОР
| КОГДА НачальнаяШтатнаяРасстановкаНачисления.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА ДАТАВРЕМЯ(1, 1, 1)
| ИНАЧЕ ДОБАВИТЬКДАТЕ(НачальнаяШтатнаяРасстановкаНачисления.ДатаОкончания, ДЕНЬ, 1)
| КОНЕЦ КАК ДействуетДо,
| НачальнаяШтатнаяРасстановкаНачисления.Сотрудник КАК Сотрудник,
| НачальнаяШтатнаяРасстановкаНачисления.Начисление,
| ИСТИНА КАК Используется,
| ВЫБОР
| КОГДА НачальнаяШтатнаяРасстановкаНачисления.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК ИспользуетсяПоОкончании,
| НачальнаяШтатнаяРасстановкаНачисления.Сотрудник.ФизическоеЛицо КАК ФизическоеЛицо,
| НачальнаяШтатнаяРасстановкаНачисления.Сотрудник.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
| НачальнаяШтатнаяРасстановкаНачисления.Размер
|ИЗ
| Документ.НачальнаяШтатнаяРасстановка.Начисления КАК НачальнаяШтатнаяРасстановкаНачисления
|ГДЕ
| НачальнаяШтатнаяРасстановкаНачисления.Ссылка = &Ссылка
| И НачальнаяШтатнаяРасстановкаНачисления.Начисление ССЫЛКА ПланВидовРасчета.Начисления
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| НачальнаяШтатнаяРасстановкаЛьготы.Ссылка.Месяц,
| ДАТАВРЕМЯ(1, 1, 1),
| НачальнаяШтатнаяРасстановкаЛьготы.Сотрудник,
| НачальнаяШтатнаяРасстановкаЛьготы.Льгота,
| ИСТИНА,
| ИСТИНА,
| НачальнаяШтатнаяРасстановкаЛьготы.Сотрудник.ФизическоеЛицо,
| НачальнаяШтатнаяРасстановкаЛьготы.Сотрудник.ГоловнаяОрганизация,
| НачальнаяШтатнаяРасстановкаЛьготы.Размер
|ИЗ
| Документ.НачальнаяШтатнаяРасстановка.Льготы КАК НачальнаяШтатнаяРасстановкаЛьготы
|ГДЕ
| НачальнаяШтатнаяРасстановкаЛьготы.Ссылка = &Ссылка
| И НачальнаяШтатнаяРасстановкаЛьготы.Льгота ССЫЛКА ПланВидовРасчета.Начисления";
ПлановыеНачисления = Запрос.Выполнить().Выгрузить();
ПлановыеНачисления.Колонки.Добавить("ДокументОснование", Новый ОписаниеТипов(Метаданные.ОпределяемыеТипы.ОснованиеНачисления.Тип));
ДанныеДляПроведения.Вставить("ПлановыеНачисления", ПлановыеНачисления);
Запрос.Текст =
"ВЫБРАТЬ
| ВЫБОР
| КОГДА НачальнаяШтатнаяРасстановкаНачисления.ДатаНачала = ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА НачальнаяШтатнаяРасстановкаНачисления.Ссылка.Месяц
| ИНАЧЕ НачальнаяШтатнаяРасстановкаНачисления.ДатаНачала
| КОНЕЦ КАК ДатаСобытия,
| НачальнаяШтатнаяРасстановкаНачисления.Ссылка.Организация,
| ВЫБОР
| КОГДА НачальнаяШтатнаяРасстановкаНачисления.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА ДАТАВРЕМЯ(1, 1, 1)
| ИНАЧЕ ДОБАВИТЬКДАТЕ(НачальнаяШтатнаяРасстановкаНачисления.ДатаОкончания, ДЕНЬ, 1)
| КОНЕЦ КАК ДействуетДо,
| НачальнаяШтатнаяРасстановкаПоказатели.Сотрудник КАК Сотрудник,
| СправочникСотрудники.ФизическоеЛицо,
| НачальнаяШтатнаяРасстановкаПоказатели.Показатель,
| НачальнаяШтатнаяРасстановкаПоказатели.Значение
|ПОМЕСТИТЬ ВТПоказатели
|ИЗ
| Документ.НачальнаяШтатнаяРасстановка.Показатели КАК НачальнаяШтатнаяРасстановкаПоказатели
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.НачальнаяШтатнаяРасстановка.Начисления КАК НачальнаяШтатнаяРасстановкаНачисления
| ПО НачальнаяШтатнаяРасстановкаПоказатели.Ссылка = НачальнаяШтатнаяРасстановкаНачисления.Ссылка
| И НачальнаяШтатнаяРасстановкаПоказатели.ИдентификаторСтрокиВидаРасчета = НачальнаяШтатнаяРасстановкаНачисления.ИдентификаторСтрокиВидаРасчета
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК СправочникСотрудники
| ПО НачальнаяШтатнаяРасстановкаПоказатели.Сотрудник = СправочникСотрудники.Ссылка
|ГДЕ
| НачальнаяШтатнаяРасстановкаПоказатели.Показатель <> ЗНАЧЕНИЕ(Справочник.ПоказателиРасчетаЗарплаты.ПустаяСсылка)
| И НачальнаяШтатнаяРасстановкаПоказатели.Ссылка = &Ссылка
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| НачальнаяШтатнаяРасстановкаЛьготы.Ссылка.Месяц,
| НачальнаяШтатнаяРасстановкаЛьготы.Ссылка.Организация,
| ДАТАВРЕМЯ(1, 1, 1),
| НачальнаяШтатнаяРасстановкаПоказатели.Сотрудник,
| СправочникСотрудники.ФизическоеЛицо,
| НачальнаяШтатнаяРасстановкаПоказатели.Показатель,
| НачальнаяШтатнаяРасстановкаПоказатели.Значение
|ИЗ
| Документ.НачальнаяШтатнаяРасстановка.Показатели КАК НачальнаяШтатнаяРасстановкаПоказатели
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.НачальнаяШтатнаяРасстановка.Льготы КАК НачальнаяШтатнаяРасстановкаЛьготы
| ПО НачальнаяШтатнаяРасстановкаПоказатели.Ссылка = НачальнаяШтатнаяРасстановкаЛьготы.Ссылка
| И НачальнаяШтатнаяРасстановкаПоказатели.ИдентификаторСтрокиВидаРасчета = НачальнаяШтатнаяРасстановкаЛьготы.ИдентификаторСтрокиВидаРасчета
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК СправочникСотрудники
| ПО НачальнаяШтатнаяРасстановкаПоказатели.Сотрудник = СправочникСотрудники.Ссылка
|ГДЕ
| НачальнаяШтатнаяРасстановкаПоказатели.Показатель <> ЗНАЧЕНИЕ(Справочник.ПоказателиРасчетаЗарплаты.ПустаяСсылка)
| И НачальнаяШтатнаяРасстановкаПоказатели.Ссылка = &Ссылка
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| НачальнаяШтатнаяРасстановкаПоказатели.Ссылка.Месяц,
| НачальнаяШтатнаяРасстановкаПоказатели.Ссылка.Организация,
| ДАТАВРЕМЯ(1, 1, 1),
| НачальнаяШтатнаяРасстановкаПоказатели.Сотрудник,
| СправочникСотрудники.ФизическоеЛицо,
| НачальнаяШтатнаяРасстановкаПоказатели.Показатель,
| НачальнаяШтатнаяРасстановкаПоказатели.Значение
|ИЗ
| Документ.НачальнаяШтатнаяРасстановка.Показатели КАК НачальнаяШтатнаяРасстановкаПоказатели
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК СправочникСотрудники
| ПО НачальнаяШтатнаяРасстановкаПоказатели.Сотрудник = СправочникСотрудники.Ссылка
|ГДЕ
| НачальнаяШтатнаяРасстановкаПоказатели.Показатель <> ЗНАЧЕНИЕ(Справочник.ПоказателиРасчетаЗарплаты.ПустаяСсылка)
| И НачальнаяШтатнаяРасстановкаПоказатели.ИдентификаторСтрокиВидаРасчета = 0
| И НачальнаяШтатнаяРасстановкаПоказатели.Ссылка = &Ссылка;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Показатели.ДатаСобытия,
| Показатели.Организация,
| Показатели.ДействуетДо,
| Показатели.Сотрудник,
| Показатели.ФизическоеЛицо,
| Показатели.Показатель,
| МАКСИМУМ(Показатели.Значение) КАК Значение
|ИЗ
| ВТПоказатели КАК Показатели
|
|СГРУППИРОВАТЬ ПО
| Показатели.ДатаСобытия,
| Показатели.Организация,
| Показатели.ДействуетДо,
| Показатели.Сотрудник,
| Показатели.ФизическоеЛицо,
| Показатели.Показатель";
ЗначенияПоказателей = Запрос.Выполнить().Выгрузить();
ЗначенияПоказателей.Колонки.Добавить("ДокументОснование", Новый ОписаниеТипов(Метаданные.ОпределяемыеТипы.ОснованиеНачисления.Тип));
ДанныеДляПроведения.Вставить("ЗначенияПоказателейНачислений", ЗначенияПоказателей);
Запрос.Текст =
"ВЫБРАТЬ
| ВЫБОР
| КОГДА НачальнаяШтатнаяРасстановкаЕжегодныеОтпуска.ДатаОстатка = ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА НачальнаяШтатнаяРасстановка.Месяц
| ИНАЧЕ ВЫБОР
| КОГДА НачальнаяШтатнаяРасстановкаЕжегодныеОтпуска.ВидЕжегодногоОтпуска.ХарактерЗависимостиДнейОтпуска = ЗНАЧЕНИЕ(Перечисление.ХарактерЗависимостиКоличестваДнейОтпуска.ЗависитОтСтажа)
| ТОГДА ДОБАВИТЬКДАТЕ(НачальнаяШтатнаяРасстановкаЕжегодныеОтпуска.ДатаОстатка, ДЕНЬ, 1)
| ИНАЧЕ НачальнаяШтатнаяРасстановкаЕжегодныеОтпуска.ДатаОстатка
| КОНЕЦ
| КОНЕЦ КАК ДатаСобытия,
| НачальнаяШтатнаяРасстановкаЕжегодныеОтпуска.Сотрудник,
| НачальнаяШтатнаяРасстановкаЕжегодныеОтпуска.ВидЕжегодногоОтпуска,
| НачальнаяШтатнаяРасстановкаЕжегодныеОтпуска.КоличествоДнейВГод,
| НЕ НачальнаяШтатнаяРасстановкаЕжегодныеОтпуска.НеИспользовать КАК Используется,
| НачальнаяШтатнаяРасстановкаЕжегодныеОтпуска.КоличествоДней
|ИЗ
| Документ.НачальнаяШтатнаяРасстановка.ЕжегодныеОтпуска КАК НачальнаяШтатнаяРасстановкаЕжегодныеОтпуска
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыОтпусков КАК ВидыОтпусков
| ПО НачальнаяШтатнаяРасстановкаЕжегодныеОтпуска.ВидЕжегодногоОтпуска = ВидыОтпусков.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.НачальнаяШтатнаяРасстановка КАК НачальнаяШтатнаяРасстановка
| ПО НачальнаяШтатнаяРасстановкаЕжегодныеОтпуска.Ссылка = НачальнаяШтатнаяРасстановка.Ссылка
|ГДЕ
| НачальнаяШтатнаяРасстановкаЕжегодныеОтпуска.Ссылка = &Ссылка
| И (НачальнаяШтатнаяРасстановкаЕжегодныеОтпуска.КоличествоДнейВГод > 0
| ИЛИ ВидыОтпусков.ХарактерЗависимостиДнейОтпуска = ЗНАЧЕНИЕ(Перечисление.ХарактерЗависимостиКоличестваДнейОтпуска.ЗависитОтСтажа))";
ПоложенныеЕжегодныеОтпуска = Запрос.Выполнить().Выгрузить();
ДанныеДляПроведения.Вставить("ЕжегодныеОтпуска", ПоложенныеЕжегодныеОтпуска);
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.ДатаСобытия КАК ДатаСобытия,
| Сотрудники.Сотрудник КАК Сотрудник,
| Сотрудники.ФизическоеЛицо КАК ФизическоеЛицо,
| Сотрудники.ПорядокРасчетаСтоимостиЕдиницыВремени КАК ПорядокРасчета,
| ДАТАВРЕМЯ(1, 1, 1) КАК ДействуетДо
|ИЗ
| ВТСотрудники КАК Сотрудники";
ПорядокПересчетаТарифнойСтавки = Запрос.Выполнить().Выгрузить();
ДанныеДляПроведения.Вставить("ПорядокПересчетаТарифнойСтавки", ПорядокПересчетаТарифнойСтавки);
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.ДатаСобытия КАК ДатаСобытия,
| Сотрудники.Сотрудник КАК Сотрудник,
| Сотрудники.ФизическоеЛицо КАК ФизическоеЛицо,
| Сотрудники.СовокупнаяТарифнаяСтавка КАК Значение,
| ВЫБОР
| КОГДА Сотрудники.СовокупнаяТарифнаяСтавка = 0
| ТОГДА ЗНАЧЕНИЕ(Перечисление.ВидыТарифныхСтавок.ПустаяСсылка)
| ИНАЧЕ Сотрудники.ВидТарифнойСтавки
| КОНЕЦ КАК ВидТарифнойСтавки,
| ДАТАВРЕМЯ(1, 1, 1) КАК ДействуетДо
|ИЗ
| ВТСотрудники КАК Сотрудники";
ДанныеСовокупныхТарифныхСтавок = Запрос.Выполнить().Выгрузить();
ДанныеДляПроведения.Вставить("ДанныеСовокупныхТарифныхСтавок", ДанныеСовокупныхТарифныхСтавок);
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.ДатаСобытия КАК ДатаСобытия,
| Сотрудники.Сотрудник КАК Сотрудник,
| Сотрудники.РазрядКатегория КАК РазрядКатегория,
| ДАТАВРЕМЯ(1, 1, 1) КАК ДействуетДо
|ИЗ
| ВТСотрудники КАК Сотрудники";
РазрядыКатегорииСотрудников = Запрос.Выполнить().Выгрузить();
ДанныеДляПроведения.Вставить("РазрядыКатегорииСотрудников", РазрядыКатегорииСотрудников);
// В ЭТОЙ ЧАСТИ УДАЛЕНО ОШИБОЧНОЕ ПРИНУДИТЕЛЬНОЕ УСТАНОВЛЕНИЕ СОСТОЯНИЯ "РАБОТА"
// ДЛЯ ВСЕХ СОТРУДНИКОВ, ЧТО ЗАТИРАЛО ДЕКРЕТНЫЕ ОТПУСКА НА НАЧАЛО РАБОТЫ
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Сотрудник КАК Сотрудник,
| ЗНАЧЕНИЕ(Перечисление.СостоянияСотрудника.Работа) КАК Состояние,
| &ДатаНачала КАК Начало,
| ДАТАВРЕМЯ(1, 1, 1) КАК Окончание,
| НЕОПРЕДЕЛЕНО КАК ВидВремени
|ИЗ
| ВТСотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.ВидЗанятости <> ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.Подработка)";
ДанныеСостояний = Запрос.Выполнить().Выгрузить();
ДанныеДляПроведения.Вставить("ДанныеСостояний", ДанныеСостояний);
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.ДатаСобытия КАК ДатаСобытия,
| Сотрудники.Сотрудник КАК Сотрудник
|ИЗ
| ВТСотрудники КАК Сотрудники";
СотрудникиДаты = Запрос.Выполнить().Выгрузить();
ДанныеДляПроведения.Вставить("СотрудникиДаты", СотрудникиДаты);
Запрос.Текст =
"ВЫБРАТЬ
| НачальнаяШтатнаяРасстановкаПоказатели.Ссылка.Месяц КАК ДатаСобытия,
| НачальнаяШтатнаяРасстановкаПоказатели.Ссылка.Организация КАК Организация,
| НачальнаяШтатнаяРасстановкаПоказатели.Сотрудник КАК Сотрудник,
| НачальнаяШтатнаяРасстановкаПоказатели.Сотрудник.ФизическоеЛицо КАК ФизическоеЛицо,
| НачальнаяШтатнаяРасстановкаПоказатели.Показатель КАК Показатель,
| ИСТИНА КАК Применение
|ИЗ
| Документ.НачальнаяШтатнаяРасстановка.Показатели КАК НачальнаяШтатнаяРасстановкаПоказатели
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.НачальнаяШтатнаяРасстановка.Показатели КАК НачальнаяШтатнаяРасстановкаПоказателиНачислений
| ПО НачальнаяШтатнаяРасстановкаПоказатели.Ссылка = НачальнаяШтатнаяРасстановкаПоказателиНачислений.Ссылка
| И НачальнаяШтатнаяРасстановкаПоказатели.Сотрудник = НачальнаяШтатнаяРасстановкаПоказателиНачислений.Сотрудник
| И НачальнаяШтатнаяРасстановкаПоказатели.Показатель = НачальнаяШтатнаяРасстановкаПоказателиНачислений.Показатель
| И (НачальнаяШтатнаяРасстановкаПоказателиНачислений.ИдентификаторСтрокиВидаРасчета <> 0)
|ГДЕ
| НачальнаяШтатнаяРасстановкаПоказатели.ИдентификаторСтрокиВидаРасчета = 0
| И НачальнаяШтатнаяРасстановкаПоказатели.Ссылка = &Ссылка
| И НачальнаяШтатнаяРасстановкаПоказатели.Показатель <> ЗНАЧЕНИЕ(Справочник.ПоказателиРасчетаЗарплаты.ПустаяСсылка)
| И НачальнаяШтатнаяРасстановкаПоказателиНачислений.Показатель ЕСТЬ NULL";
ПрименениеДополнительныхПоказателей = Запрос.Выполнить().Выгрузить();
ДанныеДляПроведения.Вставить("ПрименениеДополнительныхПоказателей", ПрименениеДополнительныхПоказателей);
Запрос.Текст =
"ВЫБРАТЬ
| НачальнаяШтатнаяРасстановкаОстаткиОтпусковПоРабочимГодам.ДатаОстатка,
| НачальнаяШтатнаяРасстановкаОстаткиОтпусковПоРабочимГодам.Сотрудник,
| НачальнаяШтатнаяРасстановкаОстаткиОтпусковПоРабочимГодам.ВидЕжегодногоОтпуска,
| НачальнаяШтатнаяРасстановкаОстаткиОтпусковПоРабочимГодам.РабочийГодНачало,
| НачальнаяШтатнаяРасстановкаОстаткиОтпусковПоРабочимГодам.РабочийГодОкончание,
| НачальнаяШтатнаяРасстановкаОстаткиОтпусковПоРабочимГодам.Остаток КАК КоличествоДней
|ИЗ
| Документ.НачальнаяШтатнаяРасстановка.ОстаткиОтпусковПоРабочимГодам КАК НачальнаяШтатнаяРасстановкаОстаткиОтпусковПоРабочимГодам
|ГДЕ
| НачальнаяШтатнаяРасстановкаОстаткиОтпусковПоРабочимГодам.Ссылка = &Ссылка";
НачальныеОстаткиОтпусков = Запрос.Выполнить().Выгрузить();
ДанныеДляПроведения.Вставить("НачальныеОстаткиОтпусков", НачальныеОстаткиОтпусков);
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.ДатаСобытия КАК ДатаСобытия,
| Сотрудники.Сотрудник КАК Сотрудник,
| Сотрудники.ПКУ КАК ПКУ,
| ДАТАВРЕМЯ(1, 1, 1) КАК ДействуетДо
|ИЗ
| ВТСотрудники КАК Сотрудники";
ПКУСотников = Запрос.Выполнить().Выгрузить();
ДанныеДляПроведения.Вставить("ПКУСотрудников", ПКУСотников);
Если ОбщегоНазначения.ПодсистемаСуществует("ЗарплатаКадрыКорпоративнаяПодсистемы.Грейды") Тогда
Модуль = ОбщегоНазначения.ОбщийМодуль("Грейды");
ДанныеГрейдовСотрудников = Модуль.ДанныеДляПроведенияНачальнойШтатнойРасстановкиГрейдыСотрудников(Ссылка);
ДанныеДляПроведения.Вставить("ДанныеГрейдовСотрудников", ДанныеГрейдовСотрудников);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("ЗарплатаКадрыПриложения.ГосударственнаяСлужба.КлассныеЧиныРанги") Тогда
Модуль = ОбщегоНазначения.ОбщийМодуль("КлассныеЧиныРанги");
КлассныеЧиныРангиФизическихЛиц = Модуль.НачальнаяШтатнаяРасстановкаСведенияОКлассныхЧинахРангах(Ссылка);
ДанныеДляПроведения.Вставить("КлассныеЧиныРангиФизическихЛиц", КлассныеЧиныРангиФизическихЛиц);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("ЗарплатаКадрыПриложения.ГосударственнаяСлужба.ВоинскиеСпециальныеЗвания") Тогда
Модуль = ОбщегоНазначения.ОбщийМодуль("ВоинскиеСпециальныеЗвания");
ВоинскиеСпециальныеЗванияФизическихЛиц = Модуль.НачальнаяШтатнаяРасстановкаСведенияОВоинскихСпециальныхЗваниях(Ссылка);
ДанныеДляПроведения.Вставить("ВоинскиеСпециальныеЗванияФизическихЛиц", ВоинскиеСпециальныеЗванияФизическихЛиц);
КонецЕсли;
НастройкиПрограммыБюджетногоУчреждения = ЗарплатаКадрыРасширенный.НастройкиПрограммыБюджетногоУчреждения;
ИспользоватьРасчетДенежногоДовольствияВоеннослужащих = НастройкиПрограммыБюджетногоУчреждения.ИспользоватьРасчетДенежногоДовольствияВоеннослужащих;
ШтатнаяРасстановкаВоеннослужащих = ВидДоговора = Перечисления.ВидыДоговоровССотрудниками.ВоеннослужащийПоПризыву
Или ВидДоговора = Перечисления.ВидыДоговоровССотрудниками.КонтрактВоеннослужащего;
ДанныеДляПроведения.Вставить("РегистрироватьГрафикиРаботы", Не ШтатнаяРасстановкаВоеннослужащих Или Не ИспользоватьРасчетДенежногоДовольствияВоеннослужащих);
ДанныеДляПроведения.Вставить("ШтатнаяРасстановкаВоеннослужащих", ШтатнаяРасстановкаВоеннослужащих);
Возврат ДанныеДляПроведения;
КонецФункции
После применения данного программного кода при проведении Начальной штатной расстановки система перестанет перезаписывать состояние на «Работает», и у декретниц сохранится верный статус, предотвращая начисление незапланированной заработной платы.
Рассмотрим ситуацию с точки зрения методологии учета в программе «1С:ЗУП 3.1». Ошибки при обновлении часто накладываются на не совсем корректный ввод начальных данных пользователями. Чтобы декретницы учитывались в системе правильно, проанализируем базовый алгоритм ввода таких сотрудников при старте работы в программе:
НачальнаяШтатнаяРасстановка.НачальнаяШтатнаяРасстановка в обязательном порядке должен быть установлен флаг «Освобождена» (ставка) и заполнена колонка «Отп. по уходу до». Это позволяет программе высвободить ставку для приема временного сотрудника на период замещения.Отпуск по уходу за ребенком. Дата начала документа должна соответствовать реальной дате ухода сотрудницы в отпуск (даже если это было в период до начала эксплуатации программы, например, в 2017 году), а дата окончания — плановой дате завершения отпуска.Проанализировав данную цепочку действий, мы увидим, что при наличии полноценно оформленного документа Отпуск по уходу за ребенком вероятность получить ошибочное начисление оклада декретнице даже на проблемном релизе значительно снижается.
Релиз 3.1.6.54 принес пользователям немало других сложностей, о которых полезно знать перед обновлением:
comcntr.dll.Выяснив все технические детали, подведем итог. Если вы находитесь на стабильном релизе 3.1.5.222 и перед вами нет острой технологической необходимости переходить на новые функции 3.1.6, оптимальное решение — оставаться на ветке 3.1.5. Фирма «1С» поддерживала законодательные изменения в ней до конца 2018 года, что позволило пользователям спокойно сдать годовую отчетность.
Если же переход на 3.1.6 или 3.1.7 уже совершен:
НачальнаяШтатнаяРасстановка.Отпуск по уходу за ребенком по всем историческим декретным позициям.