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