При работе в программе 1С:Зарплата и Управление Персоналом 3.1 пользователи часто сталкиваются с ситуацией, когда номер документа в интерфейсе программы выглядит корректно, но при выводе на печать (например, формы Т-1) в поле "Номер документа" попадают лишние символы, нули или части префикса. Особенно остро эта проблема проявляется в организациях, чьи префиксы содержат цифры. В данной статье мы подробно разберем, почему это происходит и как настроить систему так, чтобы нумерация на печати была "чистой".
Для начала выясним причину такого поведения системы. В конфигурациях на базе БСП (Библиотеки стандартных подсистем), к которым относится и ЗУП 3.1, существует стандартный механизм обработки номера перед его выводом в макет печатной формы. За этот процесс отвечает функция ОчиститьНомерОтПрефиксаИНулей(), расположенная в общем модуле ПрефиксацияОбъектовКлиентСервер.
Алгоритм этой функции работает по следующему принципу: программа просматривает строку номера слева направо и ищет первый встретившийся цифровой символ. Все, что находится левее этой цифры, считается префиксом и отсекается. Рассмотрим ситуацию на примере из темы форума:
МАС), а номер в базе хранится как МАС00-00008, алгоритм находит первую цифру после букв, отсекает МАС и последующие разделители, оставляя на печати просто 8. Это ожидаемое и правильное поведение.МЗ2), номер в базе принимает вид МЗ200-00002. Программа видит цифру 2 в самом префиксе и ошибочно принимает ее за начало значащей части номера. В результате механизм очистки "спотыкается", и в печатную форму попадает строка 200-00002.Таким образом, мы имеем дело с ограничением стандартного алгоритма 1С, который не рассчитан на использование цифр внутри префиксов организаций или информационных баз.
Прежде чем приступать к программным изменениям, проверим, включена ли стандартная опция удаления префиксов. Разберем по шагам, где она находится:
Если эта галочка не установлена, система будет выводить номер в печатную форму ровно в том виде, в котором он записан в базе данных (со всеми префиксами и лидирующими нулями). Однако, как показывает практика, при наличии цифр в префиксе эта настройка может не помочь, так как алгоритм очистки все равно отработает некорректно.
Проанализируем ситуацию: если проблема вызвана наличием цифры в префиксе, самым простым и "чистым" способом с точки зрения методологии 1С будет отказ от использования цифровых префиксов. Рассмотрим, как это сделать правильно:
МЗ2 используйте МЗД или просто МЗ, если это не приведет к дублированию с другими организациями.Этот способ является рекомендуемым, так как он исключает ошибки не только при печати, но и при последующих обменах данными между базами (например, при синхронизации ЗУП с Бухгалтерией предприятия).
Если изменить префикс невозможно (например, это жесткое требование учетной политики или регламента), нам придется "допилить" процедуру обработки номера. Лучше всего это сделать с помощью расширения конфигурации, чтобы не снимать основную программу с поддержки. Рассмотрим примерный алгоритм действий:
Нам необходимо перехватить вызов печати или модифицировать работу функции в общем модуле. Проанализируем пример кода, который можно внедрить в расширение для принудительной очистки конкретного префикса:
&Вместо("ПолучитьНомерНаПечать")
Функция Мой_ПолучитьНомерНаПечать(Знач Номер, УдалятьПрефиксИнформационнойБазы = Ложь, УдалятьПрефиксОрганизации = Ложь)
// Если префикс нашей организации "МЗ2"
Если Найти(Номер, "МЗ2") > 0 Тогда
// Принудительно удаляем первые 3 символа префикса
Номер = Сред(Номер, 4);
// Далее удаляем лишние тире и лидирующие нули
Пока Лев(Номер, 1) = "0" Или Лев(Номер, 1) = "-" Цикл
Номер = Сред(Номер, 2);
КонецЦикла;
Возврат Номер;
КонецЕсли;
// Для остальных случаев вызываем стандартную логику
Возврат ПродолжитьВызов(Номер, УдалятьПрефиксИнформационнойБазы, УдалятьПрефиксОрганизации);
КонецФункции
При использовании этого метода мы создаем "заплатку", которая будет срабатывать только для документов с проблемным префиксом, не нарушая работу остальных механизмов системы.
Если вы не хотите вносить изменения в логику работы всей системы, наиболее безопасным вариантом будет создание внешней печатной формы для приказа Т-1. Разберем преимущества этого подхода:
СтрЗаменить() или Прав().В модуле внешней печатной формы в процедуре заполнения параметров макета найдите строку, отвечающую за номер документа, и примените к ней форматирование. Например, если вы знаете, что значащая часть номера — это всегда последние 5 символов, можно использовать НомерДляПечати = Прав(ДокументСсылка.Номер, 5);.
Подводя итог, можно сказать, что проблема "кривой" нумерации при печати в 1С:ЗУП 3.1 — это следствие архитектурной особенности платформы, которая не "любит" цифры в префиксах. Мы рассмотрели несколько путей решения:
ПолучитьНомерНаПечать для обработки специфических префиксов.Выбор метода зависит от ваших полномочий в системе и жесткости требований к ведению учета в организации. Для большинства случаев оптимальным будет переход на буквенные префиксы, что навсегда избавит от подобных ошибок во всех типах документов.