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