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