Каждый расчетчик зарплаты или администратор системы хотя бы раз сталкивался с ситуацией, когда программа 1С:Зарплата и Управление Персоналом (ЗУП) редакции 3.1 начинает вести себя непредсказуемо. Одной из самых коварных проблем является внезапное «обнуление» показателей расчета в документах начисления. Пользователь открывает документ Начисление зарплаты и взносов, пытается рассчитать сотрудников, но табличные части остаются пустыми, а все плановые показатели (оклады, тарифные ставки, надбавки) на форме «Начисления и удержания» отображаются равными нулю.
При этом детальный анализ базы показывает парадоксальную картину: в регистрах сведений Значения показателей... и Плановые начисления все записи присутствуют, история изменений кадровых данных открывается корректно, но расчетный механизм программы их упорно игнорирует. Давайте подробно разберем по шагам, почему возникает этот критический сбой и как его оперативно устранить без разрушительного отката к резервным копиям.
Первоисточником описанной проблемы является очистка служебного реквизита Головная организация в справочнике Организации. В архитектуре 1С:ЗУП 3.1 этот реквизит имеет фундаментальное значение:
Если по какой-то причине поле Головная организация очищается и превращается в пустую ссылку, механизмы расчета зарплаты полностью ломаются. В пользовательском интерфейсе карточки организации это поле по умолчанию скрыто, если снят флаг «Это филиал (обособленное подразделение)». Поэтому визуально обнаружить проблему без использования специальных инструментов администрирования практически невозможно.
Проанализируем основные причины, из-за которых происходит автоматическое или случайное затирание этого реквизита:
Организации по уникальным идентификаторам (GUID) может происходить перезапись карточки организации, затирающая внутреннюю ссылку «на саму себя».Рассмотрим подробнее внутреннюю логику работы расчетных механизмов 1С:ЗУП 3.1. Современная архитектура программы базируется на так называемом механизме представлений и сложных запросах к виртуальным таблицам.
При заполнении расчетных документов система формирует пакетные запросы, которые собирают информацию о кадровых состояниях сотрудников, их плановых начислениях и значениях тарифов. Практически все эти запросы содержат жесткое соединение (JOIN) таблиц кадрового учета и регистров сведений по условию:
Где ТаблицаКадров.Организация.ГоловнаяОрганизация = ТаблицаПоказателей.Организация.ГоловнаяОрганизация
Когда реквизит ГоловнаяОрганизация в карточке вашей компании пуст, СУБД пытается выполнить левое или внутреннее соединение таблиц по значению ЗначениеЗаполнено(ГоловнаяОрганизация) = Ложь (пустая ссылка). В результате такого соединения выборка возвращает пустой набор записей. Программа считает, что у сотрудника нет действующих плановых начислений и показателей на дату расчета, поэтому выводит нули на форме и отказывается производить расчет.
Помимо нулевых показателей в расчете зарплаты, пустая головная организация провоцирует каскад других ошибок в системе:
Плановые начисления интервальный), где данное поле является обязательным ключевым измерением.Если вы столкнулись с подобным поведением системы, не спешите откатывать базу данных на вчерашний день и заново переносить документы. Проблему можно гарантированно устранить за несколько минут. Рассмотрим три альтернативных способа восстановления реквизита.
Этот способ является самым простым и доступным для обычных пользователей и кадровиков, не требующим административных прав программиста.
Если в вашей базе ведется учет по нескольким организациям и сбой затронул многие из них, эффективнее воспользоваться стандартным инструментом администратора.
Если интерактивные методы по какой-то причине заблокированы или вы хотите автоматизировать процесс исправления в коде внешней обработки, используйте следующий программный код на языке 1С. Мы программно отключаем бизнес-процессы проверки записи с помощью свойства ОбменДанными.Загрузка = Истина, чтобы гарантировать успешную запись изменений.
ВыборкаОрганизаций = Справочники.Организации.Выбрать();
Пока ВыборкаОрганизаций.Следующий() Цикл
Если Не ЗначениеЗаполнено(ВыборкаОрганизаций.ГоловнаяОрганизация) Тогда
ОрганизацияОбъект = ВыборкаОрганизаций.ПолучитьОбъект();
// Заполняем реквизит ссылкой на саму себя
ОрганизацияОбъект.ГоловнаяОрганизация = ОрганизацияОбъект.Ссылка;
ОрганизацияОбъект.ОбменДанными.Загрузка = Истина;
Попытка
ОрганизацияОбъект.Записать();
Сообщить("Успешно восстановлена головная организация для: " + ОрганизацияОбъект.Наименование);
Исключение
Сообщить("Ошибка записи организации: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
Просто перезаписать реквизит в карточке организации недостаточно, поскольку программа уже успела сформировать искаженные данные в интервальных кадровых регистрах. Чтобы изменения вступили в силу и расчетные документы снова начали «видеть» оклады и тарифные ставки сотрудников, необходимо запустить обновление интервальных регистров.
Для этого выполните следующие действия:
После успешного завершения пересчета ФОТ вернитесь в любой проблемный документ начисления зарплаты, нажмите кнопку Заполнить или пересчитайте конкретного сотрудника. Вы увидите, что показатели плановых начислений снова корректно подтягиваются в табличную часть, а расчет зарплаты производится в штатном режиме.