Как правильно получить и отформатировать место рождения в 1С:ЗУП 3.1 без лишних запятых и цифр

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

Разработчики, создающие печатные формы или кастомные отчеты в программе «1С:Зарплата и управление персоналом» (ЗУП 3.1), часто сталкиваются с неожиданным поведением реквизита МестоРождения у справочника ФизическиеЛица. При попытке напрямую вывести это значение на печать или в отчет система выдает нечто подобное: "0,Москва,,Московская," или "1,г. Берлин,,Германия".

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

Почему место рождения хранится с цифрами и запятыми?

Для начала проанализируем ситуацию и выясним причину такого странного форматирования. Реквизит МестоРождения в справочнике ФизическиеЛица — это не просто текстовое поле произвольной длины. Это строго структурированная сериализованная строка. Такой жесткий формат необходим для того, чтобы программа могла корректно выгружать данные в регламентированную отчетность для Социального фонда России (СФР, ранее ПФР), например, для форм ЕФС-1 или СЗВ-ДТ.

Эта строка всегда состоит из пяти полей, разделенных запятыми:

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

Когда вы напрямую обращаетесь к реквизиту ФизическоеЛицо.МестоРождения, вы получаете именно эту сырую технологическую строку. Попытка выводить ее в печатные формы напрямую приводит к появлению лишних запятых (на месте незаполненных полей) и технического префикса «0» или «1» в самом начале.

Как делать не надо: разбор типичной ошибки

В попытках быстро решить задачу разработчики иногда прибегают к строковым функциям платформы 1С. Например, используют конструкцию вида:


// Неудачный пример ручной обрезки
СтрокаМестаРождения = Сред(СтрокаМестаРождения, 3);

Рассмотрим подробнее, почему такой подход является плохой практикой и может привести к ошибкам:

Штатный способ №1: Получение красивого представления через общий модуль

В конфигурациях на базе БСП (включая ЗУП 3.1) разработчики уже предусмотрели все необходимые инструменты для работы с форматированием. Самый простой и правильный способ получить готовую строку для вывода на печать — использовать функцию общего модуля ПерсонифицированныйУчетКлиентСервер.

Разберем по шагам пример программного получения красивого представления места рождения:


// Получаем сырые данные из справочника
СтрокаМестаРождения = СсылкаНаФизЛицо.МестоРождения;

// Используем штатную функцию для форматирования
СокращатьСлова = Истина; // Если Истина, то слова "город", "область" будут выведены как "г.", "обл."
ПредставлениеМестаРождения = ПерсонифицированныйУчетКлиентСервер.ПредставлениеМестаРождения(СтрокаМестаРождения, СокращатьСлова);

// Теперь переменная ПредставлениеМестаРождения содержит чистый текст: "г. Москва, Московская обл."

Этот метод самостоятельно проанализирует первый символ строки (флаг особого места рождения), корректно пропустит незаполненные поля, уберет все лишние запятые и расставит правильные знаки препинания и сокращения.

Штатный способ №2: Разбор строки в структуру для сложной логики

Иногда стандартного текстового представления бывает недостаточно. Например, если вам требуется вывести в печатную форму только город рождения, либо как-то специфически склонять названия регионов. В таких случаях нам поможет функция, которая преобразует сериализованную строку в удобную объектную структуру 1С.

Проанализируем пример использования такой функции:


СтрокаМестаРождения = СсылкаНаФизЛицо.МестоРождения;

// Преобразуем строку в структуру с отдельными полями
СтруктураДанных = ПерсонифицированныйУчет.ПреобразоватьСтрокуМестаРожденияВСтруктуру(СтрокаМестаРождения);

// На выходе получаем структуру со следующими ключами:
// - ОсобоеМестоРождения (Булево)
// - Город (Строка)
// - Район (Строка)
// - Область (Строка)
// - Страна (Строка)

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

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

Как вывести красивое Место Рождения в отчетах СКД

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

Рассмотрим, как решить эту задачу в схеме компоновки данных:

  1. В схеме компоновки данных перейдите на вкладку Наборы данных.
  2. В поле запроса выберите реквизит места рождения как есть: ФизическиеЛица.МестоРождения КАК МестоРождения.
  3. Перейдите на вкладку Вычисляемые поля.
  4. Добавьте новое поле. Задайте ему имя, например, МестоРожденияПредставление.
  5. В колонке Выражение пропишите вызов нашей штатной функции: ПерсонифицированныйУчетКлиентСервер.ПредставлениеМестаРождения(МестоРождения, Истина).
  6. В настройках вывода отчета (вкладка Настройки) добавьте в выбранные поля именно ваше новое вычисляемое поле МестоРожденияПредставление вместо исходного реквизита.

При таком подходе СКД при генерации отчета автоматически передаст сырые строки из базы данных в метод общего модуля на сервере и выведет пользователю красивый, очищенный от служебных символов адрес.

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

← На главную