При расчете и выплате заработной платы в конфигурациях 1С:ERP Управление предприятием 2 и 1С:Зарплата и управление персоналом 3 пользователи часто сталкиваются со странным поведением программы. После проведения ведомостей на выплату зарплаты (через банк или кассу) эти суммы не отражаются в расчетном листке сотрудников, если открывать его непосредственно из формы документа Начисление зарплаты и взносов. Данные обновляются только в том случае, если закрыть форму документа, перепровести его или открыть заново. Давайте детально разберем, почему так происходит, проанализируем логику работы системы и найдем оптимальные пути решения этой проблемы как для обычных пользователей, так и для программистов 1С.
Для того чтобы понять природу этого странного поведения, нам необходимо заглянуть в программный код формы документа Начисление зарплаты и взносов. Разработчики фирмы 1С внедрили механизм оптимизации (кэширования) печатных форм, чтобы повторное открытие сформированных отчетов происходило мгновенно и не нагружало сервер базы данных.
В модуле управляемой формы документа присутствует специализированная переменная клиентского контекста — ПечатныеФормыСотрудников. Эта переменная представляет собой структуру, которая хранит уже сформированные табличные документы расчетных листков в оперативной памяти клиентского сеанса. Давайте проанализируем фрагмент кода, отвечающий за подготовку печатных форм:
&НаКлиенте
Процедура ПодготовитьКоллекциюПечатныхФорм(Идентификатор)
Если ПечатныеФормыСотрудников = Неопределено Тогда
ПечатныеФормыСотрудников = Новый Структура;
КонецЕсли;
Если Не ПечатныеФормыСотрудников.Свойство(Идентификатор) Тогда
ПечатныеФормыСотрудников.Вставить(Идентификатор, Новый Структура("Порядок,ПечатныеФормы", Новый Массив, Новый Соответствие));
КонецЕсли;
КонецПроцедуры
Алгоритм работает по следующей схеме:
ПечатныеФормыСотрудников имеет значение Неопределено. Система обращается к серверу, собирает данные по регистрам накопления (таким как ВзаиморасчетыССотрудниками) и формирует отчет. Полученный результат записывается в структуру кэша.ПечатныеФормыСотрудников уже присутствует готовый отчет по данному идентификатору. Программа мгновенно выводит старый сохраненный отчет из памяти клиента, полностью игнорируя новые изменения в базе данных.Самый простой и надежный способ увидеть актуальную картину по взаиморасчетам с сотрудниками без перезапуска документов — использовать специализированный отчет. Рекомендуем отказаться от формирования расчетных листков напрямую из документов начисления зарплаты в процессе оперативной работы.
Для получения актуальных данных выполните следующие шаги:
Этот отчет всегда обращается напрямую к регистрам накопления 1С:Предприятия при каждом нажатии кнопки формирования. В нем нет кэширования клиентского контекста формы документа, поэтому любые только что проведенные или отмененные выплаты сразу же корректно отобразятся в колонках отчета.
Если для вас принципиально важно видеть актуальный расчетный листок именно из формы документа Начисление зарплаты и взносов, вы можете принудительно заставить систему очистить кэш без выполнения перепроведения (которое может занимать длительное время на больших базах). Для этого достаточно выполнить простое действие: закрыть форму документа и открыть её заново через журнал документов. При закрытии формы весь её клиентский кэш полностью уничтожается, и при следующем открытии расчетный листок будет сформирован с нуля на основе свежих данных из базы.
Если пользователи вашей системы регулярно жалуются на эту особенность кэширования и требуют автоматического обновления данных без лишних манипуляций, мы можем легко отключить кэширование конкретно для этой формы с помощью механизма расширений конфигурации. Это позволит сохранить конфигурацию на поддержке и гарантировать корректное обновление данных.
Давайте по шагам разберем процесс создания такого исправления:
НачислениеЗарплатыВзносов и его основную форму документа (обычно это ФормаДокумента).&Перед.Напишем следующий несложный код в модуле формы расширения:
&Перед("ПодготовитьКоллекциюПечатныхФорм")
Процедура Расш_ПередПодготовитьКоллекциюПечатныхФорм(Идентификатор)
// Принудительно очищаем кэш печатных форм перед формированием,
// чтобы система всегда обращалась к актуальным данным в базе данных
ПечатныеФормыСотрудников = Неопределено;
КонецПроцедуры
Давайте разберем, как работает это исправление. При каждом нажатии на кнопку печати расчетного листка сначала сработает наш метод из расширения. Он принудительно установит переменную ПечатныеФормыСотрудников в значение Неопределено. Сразу после этого управление передается в типовой метод платформы. Программа увидит, что структура кэша пуста, и выполнит полноценный запрос к базе данных, собрав самые свежие и актуальные данные по всем начислениям и выплатам.
Такой подход полностью решает проблему неактуальных данных в расчетном листке из документа и избавляет расчетчиков от необходимости совершать лишние действия по перепроведению или перезапуску окон программы.