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