Как изменить документ в 1С:ЗУП 3 при действующей дате запрета редактирования?

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

В практике ведения кадрового учета и расчетов с персоналом часто возникает ситуация: договор ГПХ (документ Договор (работы, услуги)) был заключен в закрытом расчетном периоде, а фактическая дата его окончания становится известна гораздо позже. При попытке скорректировать дату окончания система блокирует запись, так как дата начала договора или дата самого документа попадает под действие даты запрета изменения данных.

Проанализируем структуру работы подсистемы Даты запрета изменения данных Библиотеки стандартных подсистем (БСП) в 1С:Зарплата и Управление Персоналом 3 и разберем все возможные способы решения этой задачи — от типовых методологических приемов до программной доработки через расширение.

Особенности проверки даты запрета в 1С:ЗУП 3

В типовых конфигурациях на базе БСП контроль даты запрета выполняется не только для самого документа, но и при записи наборов записей связанных с ним регистров (например, регистров учета договоров ГПХ и плановых начислений). Механизм проверяет даты по разделам (в частности, разделы «Зарплата» и «Кадры») и по конкретным пользователям.

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

Способ 1. Использование встроенного механизма «Исправить»

Разберем самый безопасный и методологически верный способ в 1С:ЗУП 3, не требующий программирования и отключения дат запрета:

  1. Открываем исходный документ Договор (работы, услуги).
  2. В левом нижнем углу формы находим гиперссылку Исправить.
  3. Система создает документ-исправление текущим периодом. В нем указываем фактическую дату окончания договора.
  4. Проводим документ. Все движения будут скорректированы текущим открытым периодом без изменения закрытого расчетного месяца.

Способ 2. Корректировка через типовую групповую обработку

Если требуется изменить исключительно реквизит шапки без пересчета и перезаписи движений, рассмотрим использование типовой обработки изменения реквизитов:

  1. Переходим в раздел Администрирование — Обслуживание — Корректировка данных — Групповое изменение реквизитов.
  2. Выбираем объект Договоры (работы, услуги) и настраиваем отбор по конкретному документу.
  3. В дополнительных параметрах (кнопка «Дополнительные параметры») включаем флаг Редактировать служебные реквизиты.
  4. Указываем новое значение для реквизита Дата окончания и выполняем изменение.

Способ 3. Программный обход проверки через расширение конфигурации

Если необходимо предоставить возможность точечного интерактивного редактирования документа определенному пользователю или роли, используем расширение конфигурации. В подсистеме дат запрета БСП предусмотрен механизм переопределения проверки.

Посмотрим на пример доработки в модуле ДатыЗапретаИзмененияПереопределяемый:


&Вместо("ПередПроверкойЗапретаИзменения")
Процедура Расш_ПередПроверкойЗапретаИзменения(ЭлементДанных, Отказ, ПроверятьЗапрет)
    
    // Проверяем тип объекта
    Если ТипЗнч(ЭлементДанных) = Тип("ДокументОбъект.ДоговорРаботыУслуги") Тогда
        // Проверяем наличие роли или конкретного пользователя
        Если РольДоступна("ПолныеПрава") Или Пользователи.ТекущийПользователь().Наименование = "Иванов И.И." Тогда
            ПроверятьЗапрет = Ложь;
            Возврат;
        КонецЕсли;
    КонецЕсли;
    
    ПродолжитьВызов(ЭлементДанных, Отказ, ПроверятьЗапрет);
    
КонецПроцедуры

Способ 4. Программная запись с флагом пропуска проверки БСП

Когда пишется внешняя обработка для выборочной корректировки дат, можно отключить контроль запрета БСП для конкретного объекта через дополнительные свойства:


ДокументОбъект = СсылкаНаДоговор.ПолучитьОбъект();
ДокументОбъект.ДатаОкончания = НоваяДатаОкончания;

// Указываем БСП пропустить контроль даты запрета
ДокументОбъект.ДополнительныеСвойства.Вставить("ПропуститьПроверкуЗапретаИзменения", Истина);

Попытка
    ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
    Сообщить("Ошибка при записи договора: " + ОписаниеОшибки());
КонецПопытки;

Способ 5. Запись в режиме загрузки данных

Разберем еще один программный вариант с использованием свойства ОбменДанными.Загрузка. Данный режим отключает все платформенные и прикладные проверки, включая проверку дат запрета и обработчики проведения:


ДокументОбъект = СсылкаНаДоговор.ПолучитьОбъект();
ДокументОбъект.ОбменДанными.Загрузка = Истина;
ДокументОбъект.ДатаОкончания = НоваяДатаОкончания;
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);

Важно: режим ОбменДанными.Загрузка = Истина не выполняет перезапись движений в регистрах. Если дата окончания используется в регистрах расчета или для регламентированной отчетности, необходимо также обновить соответствующие записи в регистрах сведений вручную или через проведение с флагом ПропуститьПроверкуЗапретаИзменения.

← На главную