При разработке печатных форм в системе 1С программисты часто сталкиваются с ситуацией, когда текстовые данные (серия, номер паспорта, кем выдан) выводятся корректно, а поле с датой выдачи остается пустым. Это происходит даже в тех случаях, когда в консоли запросов или в интерфейсе программы данные кажутся заполненными. Рассмотрим причины этой проблемы и способы ее решения, проанализировав структуру запросов и особенности хранения данных в типовых конфигурациях.
В большинстве конфигураций 1С (таких как «Зарплата и управление персоналом», «ERP» или отраслевые решения для образования) регистр сведений ПаспортныеДанныеФизЛиц является периодическим. Это означает, что каждая запись в нем привязана к определенному моменту времени. По методике проектирования 1С, реквизит Период в таких регистрах часто и является датой выдачи документа.
Проанализируем ситуацию: если в структуре регистра нет отдельного ресурса ДатаВыдачи, это не ошибка разработчика, а следование стандартам. Когда физлицо получает новый паспорт, в систему вносится новая запись, где Период — это дата выдачи нового документа. Таким образом, система хранит историю изменений. Если ваш запрос пытается получить поле ДатаВыдачи, которого нет в ресурсах, он вернет пустое значение. В этом случае в запросе необходимо обращаться к полю Период.
Одной из скрытых причин отсутствия данных может быть неверное условие связи между таблицами. Рассмотрим фрагмент типичного ошибочного запроса:
ИЗ
РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДвижениеКонтингента.СрезПоследних КАК ДвижениеКонтингентаСрезПоследних
ПО ПаспортныеДанныеФизЛиц.Физлицо = ДвижениеКонтингентаСрезПоследних.Студент.Контрагент
В чем здесь заключается проблема? В системе 1С справочники Контрагенты и ФизическиеЛица — это разные объекты метаданных. Если в регистре паспортных данных измерение Физлицо ссылается на справочник ФизическиеЛица, а в таблице движений используется ссылка на Контрагенты, то внутреннее соединение (Inner Join) просто отсечет эти строки, так как ссылки разных типов никогда не будут равны. Для исправления ситуации следует связывать таблицы через прямое обращение к физическому лицу, например: ДвижениеКонтингентаСрезПоследних.Студент.ФизЛицо.
Если мы обращаемся к физической таблице периодического регистра (РегистрСведений.ПаспортныеДанныеФизЛиц), мы рискуем получить несколько записей на одного человека, если у него менялись паспорта. Чтобы всегда получать актуальные данные на нужную дату, необходимо использовать виртуальную таблицу СрезПоследних.
Посмотрим на пример правильного построения запроса, который извлекает дату выдачи (через поле Период):
ВЫБРАТЬ
ПаспортныеДанные.Период КАК ДатаВыдачи,
ПаспортныеДанные.Серия КАК Серия,
ПаспортныеДанные.Номер КАК Номер,
ПаспортныеДанные.КемВыдан КАК КемВыдан
ИЗ
РегистрСведений.ПаспортныеДанныеФизЛиц.СрезПоследних(&Период, Физлицо = &Физлицо) КАК ПаспортныеДанные
В данном случае поле ДатаВыдачи гарантированно получит значение из стандартного реквизита Период виртуальной таблицы.
Иногда данные в запросе есть, но они «теряются» при выводе в макет. Рассмотрим два основных способа решения этой проблемы:
ДФ=dd.MM.yyyy. Если дата в базе пустая (01.01.0001), 1С может выводить ее как пустую строку, что иногда путает разработчика.Если вы работаете на современной версии платформы, можно избежать проблем с форматированием в макете, подготовив строку даты прямо в запросе. Для этого используем функцию ФОРМАТ:
ВЫБРАТЬ
ФОРМАТ(ПаспортныеДанные.Период, "ДФ=dd.MM.yyyy") КАК ДатаВыдачиСтрокой
ИЗ
РегистрСведений.ПаспортныеДанныеФизЛиц.СрезПоследних(&Период, ) КАК ПаспортныеДанные
Этот метод удобен тем, что в параметр макета передается уже готовая строка, и настройки ячеек макета не смогут исказить отображение.
Если вы проверили запрос, и он возвращает пустую дату выдачи при наличии данных в интерфейсе, проанализируйте следующие моменты:
СрезПоследних, 1С берет данные на текущий момент времени. Если паспорт был выдан будущим числом (что редко, но бывает при ошибках ввода) или запись помечена на удаление, результат может быть пустым.Подведем итог: при работе с паспортными данными в 1С всегда проверяйте, не является ли дата выдачи системным полем Период, и строго соблюдайте типы ссылок (Физическое лицо против Контрагента) при соединении таблиц.