Как правильно заполнять дату действия сведений воинского учета в 1С:ЗУП и обходить дату запрета программно

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

Работа с кадровыми данными в программе «1С:Зарплата и управление персоналом» (ЗУП) требует особой внимательности, особенно когда речь идет о воинском учете. Специфика заключается в том, что сведения в этой подсистеме хранятся в периодических регистрах, а значит, каждая запись привязана к определенной дате. Часто возникают ситуации, когда данные нужно внести «задним числом» или загрузить их из другой системы (например, при синхронизации с УПП), но установленная дата запрета изменения данных блокирует эти действия. В этой статье мы подробно разберем, как правильно работать с датами сведений и как технически обойти ограничения системы, если это необходимо для корректной работы.

Методологический аспект: поле «Сведения действуют с»

Прежде чем переходить к коду, давайте выясним, какую дату следует указывать в поле «Сведения действуют с». Это поле определяет начало периода, в котором актуальны внесенные данные воинского учета. Проанализируем основные сценарии:

  1. Первичный ввод данных: Если мы принимаем сотрудника на работу, логично устанавливать дату приема. Однако, если сотрудник уже работает и просто принес военный билет, рекомендуется ставить дату выдачи документа или дату фактического предоставления сведений в отдел кадров.
  2. Изменение звания или состава: В случае повышения воинского звания или изменения категории годности, создается новая запись. Дата в поле «Сведения действуют с» должна соответствовать дате приказа или документа, на основании которого произошли изменения.
  3. Влияние на отчетность: Это критически важный момент. Программа использует эти даты для формирования отчетности в военкоматы. Если вы внесете данные слишком старой датой, они могут не попасть в текущие листки сообщений об изменениях, так как система будет считать, что событие произошло в глубоком прошлом. Срок уведомления военкомата по закону сейчас составляет всего 5 дней, поэтому за датами нужно следить очень строго.

Техническая проблема: работа с менеджером записи и ошибка «Поле объекта не обнаружено»

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


ЗаписьВоенкомат = РегистрыСведений.ВоинскийУчет.СоздатьМенеджерЗаписи(); 
// ... заполнение полей ...
ЗаписьВоенкомат.ОбменДанными.Загрузка = Истина; // Здесь возникнет ошибка!
ЗаписьВоенкомат.Записать();

Проанализируем причину ошибки: у объекта типа РегистрСведенийМенеджерЗаписи отсутствует свойство ОбменДанными. Этот механизм предназначен для массовой загрузки данных и доступен только для Наборов записей, справочников и документов.

Решение №1: Использование Набора записей и режима загрузки

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

  1. Создаем объект набора записей.
  2. Устанавливаем фильтр (отбор) по ключевым измерениям (обычно это ФизическоеЛицо).
  3. Устанавливаем свойство Загрузка = Истина.
  4. Выполняем запись.

Посмотрим на пример кода:


НаборСведений = РегистрыСведений.ВоинскийУчет.СоздатьНаборЗаписей();
НаборСведений.Отбор.ФизЛицо.Установить(СсылкаНаФизЛицо);

НоваяЗапись = НаборСведений.Добавить();
НоваяЗапись.ФизЛицо = СсылкаНаФизЛицо;
НоваяЗапись.Период = ДатаНачалаДействия;
// Заполнение остальных реквизитов воинского учета...

НаборСведений.ОбменДанными.Загрузка = Истина;
НаборСведений.Записать();

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

Решение №2: Программный обход даты запрета через БСП

В современных версиях ЗУП 3.1, построенных на базе Библиотеки стандартных подсистем (БСП), обычного флага Загрузка = Истина иногда бывает недостаточно, если проверка даты запрета прописана в специфических подписках. Для таких случаев в БСП предусмотрены дополнительные параметры.

Рассмотрим вариант передачи специальной структуры, которая сообщает системе, что проверку даты запрета выполнять не нужно:


ДополнительныеПараметры = Новый Структура("ПроверкаЗапретаИзменения", Ложь);
НаборЗаписей = РегистрыСведений.ВоинскийУчет.СоздатьНаборЗаписей();
// ... настройка отбора и заполнение данных ...
НаборЗаписей.ДополнительныеСвойства.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
НаборЗаписей.Записать();

Этот метод часто используется при интеграции систем, когда данные приходят извне и мы точно уверены в их легитимности, несмотря на закрытый период в ЗУП.

Решение №3: Глобальное отключение проверок в сеансе

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

Разберем пример кода:


// Отключаем проверку дат запрета изменения для текущего сеанса
ДатыЗапретаИзменения.ОтключитьПроверкуДатЗапрета(Истина);

Попытка
    // Здесь выполняем все необходимые операции записи данных
    // Например, через МенеджерЗаписи или НаборЗаписей
    ЗаписьВоенкомат = РегистрыСведений.ВоинскийУчет.СоздатьМенеджерЗаписи();
    // ... заполнение полей ...
    ЗаписьВоенкомат.Записать();
Исключение
    ТекстОшибки = ОписаниеОшибки();
    // Обязательно включаем проверку обратно перед выводом ошибки!
    ДатыЗапретаИзменения.ОтключитьПроверкуДатЗапрета(Ложь);
    ВызватьИсключение "Ошибка при записи данных: " + ТекстОшибки;
КонецПопытки;

// Возвращаем контроль дат запрета в нормальный режим
ДатыЗапретаИзменения.ОтключитьПроверкуДатЗапрета(Ложь);

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

Синхронизация с УПП и целостность данных

Когда данные воинского учета передаются из УПП в ЗУП напрямую через запись в регистры, важно помнить, что в ЗУП 3.1 воинский учет — это не только один регистр. Данные распределены между несколькими объектами (сведения о военном билете, бронирование, данные о составе семьи и т.д.).

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

← На главную