Почему не обновляются выплаты в расчетном листке из документа начисления зарплаты в 1С:ERP и ЗУП

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При расчете и выплате заработной платы в конфигурациях 1С:ERP Управление предприятием 2 и 1С:Зарплата и управление персоналом 3 пользователи часто сталкиваются со странным поведением программы. После проведения ведомостей на выплату зарплаты (через банк или кассу) эти суммы не отражаются в расчетном листке сотрудников, если открывать его непосредственно из формы документа Начисление зарплаты и взносов. Данные обновляются только в том случае, если закрыть форму документа, перепровести его или открыть заново. Давайте детально разберем, почему так происходит, проанализируем логику работы системы и найдем оптимальные пути решения этой проблемы как для обычных пользователей, так и для программистов 1С.

Выясняем техническую причину проблемы

Для того чтобы понять природу этого странного поведения, нам необходимо заглянуть в программный код формы документа Начисление зарплаты и взносов. Разработчики фирмы 1С внедрили механизм оптимизации (кэширования) печатных форм, чтобы повторное открытие сформированных отчетов происходило мгновенно и не нагружало сервер базы данных.

В модуле управляемой формы документа присутствует специализированная переменная клиентского контекста — ПечатныеФормыСотрудников. Эта переменная представляет собой структуру, которая хранит уже сформированные табличные документы расчетных листков в оперативной памяти клиентского сеанса. Давайте проанализируем фрагмент кода, отвечающий за подготовку печатных форм:


&НаКлиенте
Процедура ПодготовитьКоллекциюПечатныхФорм(Идентификатор)
    
    Если ПечатныеФормыСотрудников = Неопределено Тогда
        ПечатныеФормыСотрудников = Новый Структура;
    КонецЕсли;
    
    Если Не ПечатныеФормыСотрудников.Свойство(Идентификатор) Тогда
        ПечатныеФормыСотрудников.Вставить(Идентификатор, Новый Структура("Порядок,ПечатныеФормы", Новый Массив, Новый Соответствие));
    КонецЕсли;
    
КонецПроцедуры

Алгоритм работает по следующей схеме:

  1. При первом нажатии кнопки печати расчетного листка переменная ПечатныеФормыСотрудников имеет значение Неопределено. Система обращается к серверу, собирает данные по регистрам накопления (таким как ВзаиморасчетыССотрудниками) и формирует отчет. Полученный результат записывается в структуру кэша.
  2. Если пользователь, не закрывая форму начисления зарплаты, переходит в другой интерфейс (например, в журнал ведомостей), проводит или отменяет выплаты по банку/кассе, данные в регистрах базы данных успешно меняются.
  3. Когда пользователь возвращается в открытую форму начисления зарплаты и снова нажимает кнопку печати расчетного листка, система видит, что в переменной ПечатныеФормыСотрудников уже присутствует готовый отчет по данному идентификатору. Программа мгновенно выводит старый сохраненный отчет из памяти клиента, полностью игнорируя новые изменения в базе данных.
  4. Стандартная кнопка «Перечитать» на панели формы обновляет только данные самого документа начисления, но не очищает кэш печатных форм на клиенте. Именно поэтому отчет не меняется, пока мы полностью не закроем и снова не откроем форму документа (что приводит к уничтожению клиентского контекста и очистке кэша) либо пока не перепроведем сам документ.

Вариант 1. Использование стандартного отчета (решение для пользователей)

Самый простой и надежный способ увидеть актуальную картину по взаиморасчетам с сотрудниками без перезапуска документов — использовать специализированный отчет. Рекомендуем отказаться от формирования расчетных листков напрямую из документов начисления зарплаты в процессе оперативной работы.

Для получения актуальных данных выполните следующие шаги:

  1. Перейдите в раздел программы Зарплата.
  2. Выберите пункт Отчеты по зарплате.
  3. Найдите и откройте отчет Расчетный листок.
  4. Укажите необходимый период, организацию, при необходимости выберите конкретное подразделение или сотрудника и нажмите кнопку Сформировать.

Этот отчет всегда обращается напрямую к регистрам накопления 1С:Предприятия при каждом нажатии кнопки формирования. В нем нет кэширования клиентского контекста формы документа, поэтому любые только что проведенные или отмененные выплаты сразу же корректно отобразятся в колонках отчета.

Вариант 2. Быстрый сброс кэша вручную (решение для пользователей)

Если для вас принципиально важно видеть актуальный расчетный листок именно из формы документа Начисление зарплаты и взносов, вы можете принудительно заставить систему очистить кэш без выполнения перепроведения (которое может занимать длительное время на больших базах). Для этого достаточно выполнить простое действие: закрыть форму документа и открыть её заново через журнал документов. При закрытии формы весь её клиентский кэш полностью уничтожается, и при следующем открытии расчетный листок будет сформирован с нуля на основе свежих данных из базы.

Вариант 3. Кардинальное решение проблемы через расширение (для программистов)

Если пользователи вашей системы регулярно жалуются на эту особенность кэширования и требуют автоматического обновления данных без лишних манипуляций, мы можем легко отключить кэширование конкретно для этой формы с помощью механизма расширений конфигурации. Это позволит сохранить конфигурацию на поддержке и гарантировать корректное обновление данных.

Давайте по шагам разберем процесс создания такого исправления:

  1. Откройте конфигуратор базы данных и создайте новое расширение (или используйте уже существующее).
  2. Добавьте в расширение документ НачислениеЗарплатыВзносов и его основную форму документа (обычно это ФормаДокумента).
  3. В модуле формы расширения добавьте обработчик перед вызовом процедуры подготовки печатных форм. Нам нужно принудительно сбрасывать кэш при каждом вызове печати. Для этого отлично подойдет аннотация &Перед.

Напишем следующий несложный код в модуле формы расширения:


&Перед("ПодготовитьКоллекциюПечатныхФорм")
Процедура Расш_ПередПодготовитьКоллекциюПечатныхФорм(Идентификатор)
    
    // Принудительно очищаем кэш печатных форм перед формированием,
    // чтобы система всегда обращалась к актуальным данным в базе данных
    ПечатныеФормыСотрудников = Неопределено;
    
КонецПроцедуры

Давайте разберем, как работает это исправление. При каждом нажатии на кнопку печати расчетного листка сначала сработает наш метод из расширения. Он принудительно установит переменную ПечатныеФормыСотрудников в значение Неопределено. Сразу после этого управление передается в типовой метод платформы. Программа увидит, что структура кэша пуста, и выполнит полноценный запрос к базе данных, собрав самые свежие и актуальные данные по всем начислениям и выплатам.

Такой подход полностью решает проблему неактуальных данных в расчетном листке из документа и избавляет расчетчиков от необходимости совершать лишние действия по перепроведению или перезапуску окон программы.

← На главную