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