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