gifts2017

Как изменить нумерацию документов в БП 3.0

Опубликовал Андрей Медведев (1cspbru) в раздел Программирование - Практика программирования

В статье (на примере Бухгалтерия предприятия, редакция 3.0 (3.0.35.27) ) рассматривается, как в БП 3.0 изменить алгоритм формирования префикса номера.

В БП 3.0 по сравнению с БП 2.0 существенно поменялась нумерация документов. Вот, что пишет «1С» по этому поводу (цитату можно найти в файле readme.txt, который прилагается к каждому апдейту конфигурации БП 3.0):

“Способ нумерации документов в редакции 3.0 изменен по сравнению с редакцией 2.0.
Для правильной нумерации документов необходимо изменить номер первого
создаваемого документа каждого вида так, чтобы он продолжал нумерацию из старой версии.
При этом номера документов, перенесенных из редакции 2.0,
в печатных формах будут отображаться правильно.
Например, последний номер документа «Реализация товаров и услуг» был 00000000131.
После обновления на редакцию 3.0 первый введенный документ будет иметь номер 0000-000001.
Чтобы сохранить правильную нумерацию, необходимо в этом документе изменить номер на 0000-000132.
В дальнейшем всем введенным документам «Реализация товаров, услуг»
будет присваиваться правильный номер.”


Другими словами, изменился принцип формирования префикса. Если в БП 2.0 мы имели дело с трехзначным префиксом документа, который брался из реквизита Префикс справочника Организации, то теперь, наш префикс имеет вид «XXXX-», где X – произвольный символ.

В общем виде, номер либо код объекта складывается по следующей схеме:
"ОР" + "ИБ" + "-" + номер/код, где:

* "ОР" —префикса организации (2 символа); если префикс организации не назначен, то "00". Префикс организации задается в справочнике «Организации».
* "ИБ" —префикс информационной базы (2 символа); если префикс информационной базы не назначен, то "00". Префикс информационной базы задается в настройках синхронизации данных (раздел Администрирование)
* "-" — раздеяет префикс и номер (код).

Еще одно существенное изменение, которое обычно упускают из вида, это тот факт, что реквизит Префикс в справочнике Организации в БП 3.0 уменьшился на один символ и теперь равен не трем, как в БП 2.0, а двум символам. В то же время, появился реквизит ПрефиксБП20 – строка три символа – в который при переходе на БП 3.0 с БП 2.0 сохраняется старый «длинный» префикс. Почему хочется обрать внимание на этот момент? Дело в том, что в случае, если в БП 2.0 у организации «Рога и копыта» был трехзначный префикс, и номер документа начинался с префикса РИК, то в БП 3.0 номер будет начинаться с РИ (именно этот префикс останется по умолчанию в реквизите Префикс справочника Организации). Пользователь может быть не в восторге от этого новшества.

За формирование префикса в БП 3.0 отвечают несколько подписок на событие, связанных с событием «ПриУстановкеНовогоКода»: или с событием «ПриУстановкеНовогоНомера»:

Источники у этих подписок разные. Напомню, что подписка срабатывает после срабатывания основного события, на которое она «вешается». Процедуры, которые являются обработчиками событий расположены в общих модулях, для которых установлены параметры «серверный» и «внешнее соединение».

Зададимся теперь вопросом, нельзя ли изменить алгоритм формирования префикса номера, скажем для документов. Будем считать, что наша информационная база не имеет префикса, а префикс организации в БП 2.0 состоял из трех значащих символов.

Внесем некоторые изменения в типовую конфигурацию БП 3.0.

Во-первых, создадим подсистему «МояНумерация» и включим в нее объекты конфигурации так или иначе имеющие отношение к решаемой задаче.

Внесем изменения в справочник Организации.

Во-первых выведем в форме реквизит справочника ПрефиксБП20 и сделаем его доступным.

Во-вторых, создадим реквизит ИспользоватьПрефиксБП20 типа булево, выведем его на форму элемента справочника. Будем считать,что если ИспользоватьПрефиксБП20 = истина, то в качестве префикса "ОР" должен браться префикс из реквизита ПрефиксБП20.

Создадим общий модуль «МояНумерация» с установленными свойствами «Сервер» и «Внешнее соединение». И поместим в него процедуру ПереформироватьПрефиксПоНовымПравилам(…)

Процедура ПереформироватьПрефиксПоНовымПравилам(Знач Источник, Префикс) Экспорт

Если НАЙТИ(Строка(ТипЗнч(Источник)),"Документ объект") = 0 Тогда

                //Это не документ, префикс не меняем

                Возврат;

КонецЕсли;

Если Источник.Метаданные().Реквизиты.Найти("Организация") = Неопределено Тогда

                //Нет реквизита "Организация", менять префикс не нужно

                Возврат;

КонецЕсли;

                              

мОрганизация = Источник.Организация;

Если мОрганизация.Метаданные().Реквизиты.Найти("ИспользоватьПрефиксБП20") = Неопределено Тогда

                //Реквизит ИспользоватьПрефиксБП20 отвечает за выбор стратегии формирования префикса

                //Если этого реквизита нет, то считаем, что префикс формируется, как в типовай конфигурации

                Возврат;

КонецЕсли;

Если НЕ мОрганизация.ИспользоватьПрефиксБП20 Тогда

                //Не усьтановлен флажок формирования префикаса номера по старому

                //Префикс формируем, как в типовой

                Возврат;

КонецЕсли;

                мПолныйПрефикс = Префикс;

               

                Если СтрДлина(СокрЛП(мОрганизация.ПрефиксБП20)) = 3 Тогда

                               мПолныйПрефикс = СтрЗаменить(мПолныйПрефикс,мОрганизация.Префикс + "0", мОрганизация.ПрефиксБП20);

                ИначеЕсли СтрДлина(СокрЛП(мОрганизация.ПрефиксБП20)) = 2 Тогда

                               Если СокрЛП(мОрганизация.ПрефиксБП20) <>СокрЛП(мОрганизация.Префикс) Тогда

                                               мПолныйПрефикс = СтрЗаменить(мПолныйПрефикс,мОрганизация.Префикс, мОрганизация.ПрефиксБП20);

                               КонецЕсли;

                КонецЕсли;

               

                Префикс = мПолныйПрефикс;

               

КонецПроцедуры

Вызов процедуры ПереформироватьПрефиксПоНовымПравилам(…) осуществляется из обработчиков вышеперечисленных событий (последней строкой в коде обработчика)

Общий модуль ПрефиксацияОбъектовБПСобытие:

Процедура УстановитьПрефиксИнформационнойБазыОрганизацииПодразделения(Источник, СтандартнаяОбработка, Префикс) Экспорт

               

<оригинальный код обработчика>…

                              

МояНумерация.ПереформироватьПрефиксПоНовымПравилам(Источник, Префикс);

КонецПроцедуры

Общий модуль ПрефиксацияОбъектовСобытия :

Процедура УстановитьПрефиксИнформационнойБазы(Источник, СтандартнаяОбработка, Префикс) Экспорт

<оригинальный код обработчика>…

МояНумерация.ПереформироватьПрефиксПоНовымПравилам(Источник,Префикс);

КонецПроцедуры

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

Буду рад развитию темы.

Мой сайт: 1c1c1c.ru

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Алексей Алексеев (Aleksey_3) 12.09.14 08:45
Что с печатью? Корректно ли обрабатывается такая нумерация при выводе на печать?

И самое главное цель переделки? Я понимаю когда цель изменить нумерацию с нумерации в течении года на нумерацию в течении дня, а тут что?

Поясню свою. мысль.
В БП 2.0 У нас был номер ПРФ0000123, которые при печати выводился как 123
В БП 3.0 У нас уже номер ПФИБ-00123, которые при печати будет так же выводится, т.е. 123

Тогда смысл всей этой переделки, если в конечном счете мы получим тот же номер в печатных формах документа, только вид сбоку?
2. Андрей Медведев (1cspbru) 12.09.14 11:18
Алексей, ваш вопрос понятен, но ситуации, как говорится бывают разные. Логика переделки такая- вот представьте, печатает бухгалтер какие-то своды документов с номерами для управленцев или кто-то из управленцев смотрит документы и привык к трехзначным префиксам... В общем, не критично, можно и к другим привыкнуть. Но не всегда программист влияет на ситуацию к чему и кому привыкать...

Второй вопрос - не поедет ли нумерация при печати документов. Нет, не поедет. Принципиально, чтобы префикс был выдержан в формате "XXXX-", где X - символ(ну почти любой:). Если префикс будет, скажем такой: "XXX_", то придется переделывать процедуры, отвечающие за формирование номера документа для печатной формы

Одно из возможных приложений описанного подхода в том, чтобы вообще сохранить нумерацию, как в БП 2.0. В этом случае, ЕСЛИ ПРЕФИКС СОВПАДАЕТ С ПРЕФИКСОМ бп20, то нумерация в печатных формах сбиваться не будет (во всяком случае так в том релизе, на который ссылается настоящая статья) Разумеется, код, приведенный в статье не предполагает сохранение нумерации, как в БП 2.0

Мне кажется, что информация, приведенная в статье может оказаться полезной тем, кто всё же столкнулся с проблемой изменения формата номера БП 3.0. Хочется еще раз обратить внимание, что подобное изменение формата возможно не во всех случаях. Например, если информационная база БП 3.0 активно синхронизируется с другими инфорамационными базами, то изменение формата номера может быть затруднительно.
3. Алексей Алексеев (Aleksey_3) 12.09.14 11:59
Принципиально, чтобы префикс был выдержан в формате "XXXX-", где X - символ(ну почти любой:). Если префикс будет, скажем такой: "XXX_", то придется переделывать процедуры, отвечающие за формирование номера документа для печатной формы


Там немножко другая логика заложена. При печати БП смотрит чтобы разделитель "-" был 3 или 5 символом, и если это так, то включается механизм новой нумерации, в противном случае БП использует "ПрефиксБП20" для удаления префикса из номера



Мне кажется, что информация, приведенная в статье может оказаться полезной тем, кто всё же столкнулся с проблемой изменения формата номера БП 3.0.


Для этого нужно как минимум расписать для каких документов используется та или иная подписка, чтобы было понятно, что чтобы изменить префикс у документа счет-фактуры нужно править в ПрефиксацияОбъектовСобытия, а для реализации править в ПрефиксацияОбъектовБПСобытия.


Лично у себя я не стал плодить сущности, а сразу прописал в коде

Процедура УстановитьПрефиксИнформационнойБазыОрганизацииПодразделения(Источник, СтандартнаяОбработка, Префикс) Экспорт
	
	ИмяОрганизации   = ПрефиксацияОбъектовСобытия.ИмяРеквизитаОрганизация(Источник.Метаданные());
	ИмяПодразделения = ИмяРеквизитаПодразделение(Источник.Ссылка);
	
	
	//Начало изменений
	МетаданныеДокумента = Источник.Метаданные();

	ТекПрефикс = Префикс;
	Если МетаданныеДокумента.Имя = "АктОбОказанииПроизводственныхУслуг" или
		МетаданныеДокумента.Имя = "АвансовыйОтчет" или		
		МетаданныеДокумента.Имя = "ВозвратТоваровОтПокупателя"          или
		МетаданныеДокумента.Имя = "ВозвратТоваровПоставщику"            или
		МетаданныеДокумента.Имя = "ОприходованиеТоваров"                или
		МетаданныеДокумента.Имя = "ОтчетОРозничныхПродажах"             или
		МетаданныеДокумента.Имя = "ПеремещениеТоваров"                  или
		МетаданныеДокумента.Имя = "ПоступлениеНаРасчетныйСчет"          или
		МетаданныеДокумента.Имя = "ПоступлениеТоваровУслуг"             или 
		МетаданныеДокумента.Имя = "ПриходныйКассовыйОрдер"              или
		МетаданныеДокумента.Имя = "РасходныйКассовыйОрдер"              или 
		МетаданныеДокумента.Имя = "РеализацияТоваровУслуг"              или 
		МетаданныеДокумента.Имя = "СписаниеСРасчетногоСчета"            или 
		МетаданныеДокумента.Имя = "СчетФактураВыданный"                 или
        МетаданныеДокумента.Имя = "СписаниеТоваров"	                    тогда
		
		Префикс = ...//Формируем Префикс по своим правилам
	Иначе
		Префикс = ПрефиксИнформационнойБазыОрганизацииПодразделения(Источник[ИмяОрганизации], Источник[ИмяПодразделения], Префикс);	
	КонецЕсли;
	
	//Префикс = ПрефиксИнформационнойБазыОрганизацииПодразделения(Источник[ИмяОрганизации], Источник[ИмяПодразделения], Префикс);	
	//Конец изменений от 09.02.2006 
	
	
	
КонецПроцедуры
...Показать Скрыть


В данном случае для "избранных" документов формируется префикс по нужному мне правилу.
ekomova; janpresnyakova; clev; +3 Ответить
4. Андрей Медведев (1cspbru) 12.09.14 13:32
Спасибо за идею, вполне симпатичный код. Я пошел немного другим путем - дожидаюсь, пока префикс сформируется по типовым правилам БП 3.0 и заменяю некие его части непосредственно в обработчике подписки на событие
5. haz haz (hazd) 12.10.14 01:03
спасибо, нужная информация.
6. Александр Астафьев (Astafan) 09.11.14 15:59
Спасибо за статью, оказалась очень полезной. Как раз сейчас разбираюсь с префиксами новых документов в БП 3.0, но с возможностью сохранения поддержки.
7. Сергей Незведов (woot) 12.02.15 01:06
Была Задача приравнять код к дате и чтоб каждый день нумерация начиналась с 1,не стал копаться долго в коде,потому как никакого обмена нету.Написал вот так,можт кому будет полезно у кого такая же ситуация появится.В модуле объекта прописал 1 процедуру и добавил её при записи:
Процедура УстановитьПредставлениеНомера()

Если НЕ ЗначениеЗаполнено(Номер) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СчетНаОплатуПокупателю.Номер
|ИЗ
| Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
|ГДЕ
| СчетНаОплатуПокупателю.Дата МЕЖДУ &Дн И &Дк" ;
Запрос.УстановитьПараметр("Дн",НачалоДня(ТекущаяДата()));
Запрос.УстановитьПараметр("Дк",КонецДня(ТекущаяДата()));

Запрос.Выполнить().Выбрать();
Выборка = Запрос.Выполнить().Выбрать();
Кол = (Выборка.Количество()+1);

НОмер1 = Строка(Сред(ТекущаяДата(),1,6));
НОмер1 = СтрЗаменить(НОмер1,".","")+"-000"+Кол+"";
НОмер = НОмер1;

КонецЕсли;
КонецПроцедуры

Так же в процедуре при записи пишем нашу процедуру:
УстановитьПредставлениеНомера();
Так же поставил нумерацию в пределах дня.
8. dim3740 (dim3740) 26.01.16 19:53
woot, да, код работает на 3.0... тестил в счетах и СФ выданных. Но, как писалось выше, на печатную форму полный номер не переносится((( А самое плохое - что и в книгу продаж попадает также неполный..
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа