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