Как реализовать автоматическое начисление «Оплата питания» с учетом срока действия в 1С?

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

В процессе разработки часто возникают задачи, требующие проверки истории начислений сотрудника. В данном случае мы разберем ситуацию, когда требуется начислять «Оплату питания» в размере 30% от суммы только в течение первых трех месяцев с момента первого начисления данного вида расчета. После прохождения этого срока сотрудник должен оплачивать питание в полном объеме. Давайте детально разберем, как правильно подойти к этой задаче, какие ошибки могут возникнуть при написании запросов и почему важно выбирать архитектурно верные решения.

Этап 1: Анализ ошибки в запросе к регистру расчета

Частая проблема новичков при работе с РегистрРасчета.Начисления заключается в некорректном использовании параметров. Например, при попытке найти записи за прошлые периоды, автор темы столкнулся с тем, что записи не возвращались. Проанализируем основные причины:

  1. Неправильная типизация параметров: Передача строкового значения «Оплата питания» вместо ссылки на ПланВидовРасчета. Запрос не найдет соответствие, если в базе хранится ссылка, а не строка. Используйте методы НайтиПоНаименованию() или НайтиПоКоду(), либо берите ссылку непосредственно из объекта документа.
  2. Фильтрация по строковому представлению: Использование Начисления.ФизическоеЛицо.Наименование вместо ссылки на справочник ФизическиеЛица или Сотрудники ведет к ошибкам и низкой производительности.
  3. Работа с датами: При расчете периода (откат на 3 месяца) важно учитывать корректность вычисления границ.

Рассмотрим пример правильного формирования запроса для проверки наличия начислений:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |	Начисления.ПериодРегистрации
    |ИЗ
    |	РегистрРасчета.Начисления КАК Начисления
    |ГДЕ
    |	Начисления.Сотрудник = &Сотрудник
    |	И Начисления.ВидРасчета = &ВидНачисления
    |	И Начисления.ПериодРегистрации < &ДатаНачала";

Запрос.УстановитьПараметр("Сотрудник", Объект.Сотрудник);
Запрос.УстановитьПараметр("ВидНачисления", ПредопределенныйВидРасчета);
Запрос.УстановитьПараметр("ДатаНачала", ТекущаяДата());

Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
    // Записей нет, применяем льготный период (30%)
КонецЕсли;

Этап 2: Архитектурные рекомендации по решению задачи

Хотя задачу можно решить «подменой» процедур в расширении, важно помнить о поддержке системы в будущем. Переписывание типовых процедур формы ОбработатьИзменениеПоказателейНаСервере затрудняет обновления. Профессиональный подход предполагает использование встроенных механизмов 1С:

Этап 3: Практические советы по работе с кодом

При реализации логики начисления всегда проверяйте, не является ли выбор «Оплаты питания» определяющим фактором. Если пользователь выбирает данный вид расчета, система должна автоматически инициировать проверку регистра.

Важные замечания:

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

← На главную