Имя: Пароль:
1C
1С v8
1С КА проблема с нумерацией
0 dovenok
 
21.03.25
10:14
Добрый день! Появилась задача - отдельная нумерация для определенного контрагента(добавлять к номеру букву "К" , и что бы нумерация была отдельная и не пересекалась со стандартным нумератором. Я сделал регистр для хранения номера нужного контрагента, для которого требуется отдельная нумерация. В итоге при создании документа продажи с другими контрагентами, на первый взгляд с нумерацией все впорядке (она вида ХХ00-000044), но после создания документа с определенным контрагентом(который с буквой К и отдельной нумерацией, вида ХХ00-0001К) , ВСЕ последующие документы по другим контрагентам, выглядят так ХХ00-К00001 , не понимаю в чем дело, так же не получается достать последний номер из стандартного нумератора (нумератор документа РеализацияТоваровУслуг) . Уже всю голову сломал, мб кто укажет на ошибку?

Процедура ПриЗаписи(Отказ)
	Попытка
		Сообщить("Начало процедуры ПриЗаписи");

		// контрагент
		Если НЕ ЗначениеЗаполнено(Контрагент) Тогда
			Сообщить("Контрагент не указан. Прекращение обработки.");
			Возврат;
		КонецЕсли;

		// фильтр по контрагенту
		КонтрагентКлев = Справочники.Контрагенты.НайтиПоНаименованию("ООО КЛЕВ");

		// првоерка
		Если КонтрагентКлев <> Неопределено И Контрагент = КонтрагентКлев Тогда
			Сообщить("Контрагент совпадает: ООО КЛЕВ");

			
			Запрос = Новый Запрос;
			Запрос.Текст = 
				"ВЫБРАТЬ
				|   ПоследнийНомер
				|ИЗ
				|   РегистрСведений.НумерацияКлев
				|ГДЕ
				|   Контрагент = &Контрагент
				|ORDER BY ПериодДата DESC";

			Запрос.УстановитьПараметр("Контрагент", Контрагент);
			Результат = Запрос.Выполнить();
			ТаблицаРезультатов = Результат.Выгрузить();

			
			Если ТаблицаРезультатов.Количество() > 0 Тогда
				ПоследнийНомер = ТаблицаРезультатов[0].ПоследнийНомер + 1; // Увеличиваем на 1
			Иначе
				ПоследнийНомер = 1; // Если нет записей, начинаем с 1
			КонецЕсли;

			Сообщить("Последний номер для ООО КЛЕВ: " + ПоследнийНомер);

			// добавить нули,не работает
			НомерДокумента = "НЛ00-" + Формат(ПоследнийНомер, "ЧЦ=5; ЧН=") + "К";
			Сообщить("Номер документа: " + НомерДокумента);

			
			ЭтотОбъект.Номер = НомерДокумента;

			// Запись в регистр
			НаборЗаписей = РегистрыСведений.НумерацияКлевер.СоздатьНаборЗаписей();
			Запись = НаборЗаписей.Добавить();
			Запись.ПериодДата = ТекущаяДата();
			Запись.Контрагент = Контрагент;
			Запись.ПоследнийНомер = ПоследнийНомер;
			НаборЗаписей.Записать();

			Сообщить("Номер сохранен в регистр сведений");
		Иначе
			// Для других контрагентов используем стандартную нумерацию
			Сообщить("Контрагент не ООО КЛЕВ. Используется стандартная нумерация.");

			// Получаем номер из стандартного нумератора
			НомерДокумента = Документы.РеализацияТоваровУслуг.ПолучитьНовыйНомер();
			Сообщить("Номер документа: " + НомерДокумента);

			//  номер 
			ЭтотОбъект.Номер = НомерДокумента; // Переопределяем номер документа
		КонецЕсли;

		// Вызовы дополнительных процедур
		ПроведениеДокументов.ПриЗаписиДокумента(ЭтотОбъект, Отказ);
		РеализацияТоваровУслугЛокализация.ПриЗаписи(ЭтотОбъект, Отказ);

	Исключение
		// Обработка ошибки
		Сообщить("Ошибка: " + ОписаниеОшибки());
		Отказ = Истина;
	КонецПопытки;

	Сообщить("Конец процедуры ПриЗаписи");
КонецПроцедуры



Добавил этот код в модуль документа РеализацияТоваровУслуг. Я так понимаю проблема в том,что я не могу получить последний номер из стандартного нумератора?

НомерДокумента = Документы.РеализацияТоваровУслуг.ПолучитьНовыйНомер();
Сообщить("Номер документа: " + НомерДокумента);

Я пока только изучающий азы,поэтому другого способа не нашел.
1 Климов Сергей
 
21.03.25
09:04
Создав "хитрый" номер для одного контрагента вы вынуждаете платформу создавать новые номера и всех прочих документов, больше вашего "хитрого". ИМХО, если вы взялись ломать стандартную нумерацию, то вам придётся обрабатывать каждого контрагента, а не только "хитрого".
2 Климов Сергей
 
21.03.25
09:07
Возможно, проще будет создать новый реквизит в документе, НомерНаПечать. Для "простых" контрагентов копировать туда Номер, а для "хитрого" - присваивать по вашему алгоритму. И печатать НомерНаПечать. Не забыть при этом про ЭДО.
3 Участковый
 
21.03.25
09:13
Порушили всю идеологию 1С. Правильно пользоваться префиксами.

для всех делаешь префикс ХХ00
Для этого ХХК0
4 dovenok
 
21.03.25
10:10
(3) Так префикс же ставится на организацию, а мне нужна какая-то пометка для контрагента и чтобы не учитывался в стандартной нумерации. У нас две фирмы, и когда мы продаем сами себе в другое ООО, нам нужно эти документы «отсеять» из общей массы.
5 dovenok
 
21.03.25
10:13
(3) или получается адаптировать мой
6 dovenok
 
21.03.25
10:16
(3) или получается адаптировать мой код, чтобы он менял префикс на ХХК0- , и записывал в отдельный регистр? , просто я так понял, он все равно будет сбивать стандартный нумератор
7 shuhard
 
21.03.25
10:15
(5)
(6)
не взлетит
8 mikecool
 
21.03.25
10:16
задача такова, что не стоит ее делать
9 Климов Сергей
 
21.03.25
10:16
(4)
1) А условия Контрагент = Наша организация для отсева недостаточно?
2) Какие типы документов собираетесь нумеровать? Законодательство требует сплошной последовательной нумерации некоторых документов (кассовые ордера, счета-фактуры).
10 dovenok
 
21.03.25
11:08
(9) Документы продажи, реализация и счет фактура.

Подчеркну,что отдельная нумерация нужна только для документов,когда мы продаем САМИ СЕБЕ , у нас допустим ООО КЛЕВ  и ООО НЕЛ , вот когда из ООО КЕЛ продаем в ООО КЛЕВ , нужно чтобы документы выглядел что то вроде (НЛ00-000011К , или НЛ0К-000011) , а все другие документы продажи контрагентам выглядели как обычно НЛ00-000044,НЛ00-000045 и т.п. ) чтобы нумерация не сбивалась. Я сейчас поглубже покопал, мне кажется тут нужно всю логику нумерации ломать, ради буковки ?
11 Ivanich
 
21.03.25
11:07
Наберите в поиске "интеркампани в 1с ка".
Может вам это нужно, а не перенумерация
12 dovenok
 
21.03.25
11:26
(11) К сожалению не подходит, сказали что под наше взаимодействие между нашими юр.лицами не подойдет . Я еще думал мб сделать проверку номера документов из реестраДокументов там брать последний НомерДокументаИБ , по логике получается нумерация ООО КЛЕВ у меня пишется в отдельный регистр НумерацияДокументов, а стандартный нумератор хранит номера документов в регистре РеестрДокументов.НомерДокументаИБ , есть ли шанс что это заработает?
13 d4rkmesa
 
21.03.25
11:28
(0) >>Я пока только изучающий азы,поэтому другого способа не нашел.

Если вам дали такую задачу, то этот кто-то - идиот.
14 Serg_1960
 
21.03.25
11:35
Имхо, можно использовать любые префиксы для нумерации... лишь бы  создаваемые номера были меньше номеров с "обычными" префиксами.
15 dovenok
 
21.03.25
11:39
(14) тут еще дело в чем, общался с поддержкой 1С , чем короче номер,тем он считается больше, и если я меняю для конкретного контрагента префикс(добавляю букву) , то последующие документы формируются тоже с коротким номером. Было НЛ00-000040 , потом был контрагент с НЛК0-0001 , в итоге следующий документ (остальные контрагенты) стали НЛ00-0002
16 Serg_1960
 
21.03.25
11:43
Имхо, не стоит пытаться добавить свой префикс/суффикс к существующей нумерации - зачем провоцировать конкуренцию? :) а можно задействовать иные префиксы чем те, которые уже используются для организаций.

Например, для организаций уже используются "КЛ" ("Клев") и "НЛ" ("Нел") - тогда для документов "Клев"->"Нел" - префикс "КН", а для "Клев"<-"Нел" - "НК".
17 Мультук
 
гуру
21.03.25
11:42
(12)
>> а стандартный нумератор хранит номера документов
>>в регистре РеестрДокументов.НомерДокументаИБ

Нет. Вы думаете неправильно.
Этот регистр вовсе не для этого

>> отдельная нумерация нужна только для документов
Если это чисто "хозяйственная перепродажа" то наверняка есть документ "Передача товаров между организациями" - используйте его.


Главное. Не зная и не умея (уж простите) вы роете себе яму.

Ах да. Каждый год нумерация начинается с 1

На этом аминь и удачи.
18 Волшебник
 
21.03.25
11:42
Сделайте системный номер просто числовым без префикса, а на форму вынесите новый строковый реквизит НомерДок.
НомерДок формируйте при записи документа собственным алгоритмом.
19 dovenok
 
21.03.25
11:52
(16) у нас две базы 1с КА , одна по одной организации КЛЕВ (там перепродаж самим себе нет) , другая база для НЕЛ , вот там перепродажа уже есть, то есть у нас в базе одно юр лицо настроено)
20 dovenok
 
21.03.25
11:52
(18) спасибо,попробую этот вариант, только после обновлений я так полагаю нужно будет ручками корректировать снова?
21 d4rkmesa
 
21.03.25
11:53
(15) "Астанавитесь"(с)

Кстати, о какой версии КА речь?
22 dovenok
 
21.03.25
11:56
(18) забыл уточнить, но по факту системный номер будет все равно генерироваться для всех контрагентов подряд, то есть в печатной форме отобразится другой по сути номер(от стандартного нумератора) , правильно же я понимаю?
23 dovenok
 
21.03.25
11:55
(21) 1С КА 2
24 d4rkmesa
 
21.03.25
14:10
(22) Это будет отдельный, весьма интересный вопрос.

Для начала, почему бы не разобраться, как все работает в КА/ERP?
Чтобы не ходить вокруг да около, есть ПрефиксацияОбъектовСобытия.УстановитьПрефикс (...). Можно добавить в расширение написать что-то вроде, только под вашу задачу без лишних условий:

&Вместо("УстановитьПрефикс")
Процедура РасшПР_УстановитьПрефикс(Источник, Префикс, УстановитьПрефиксИнформационнойБазы, УстановитьПрефиксОрганизации)
	
	//++ ERP
	//Добавим формирование префикса с номером дня года в реализации (в ERP - перемещение между орг.-ми и другими документами реализации с единым нумератором)
	МетаданныеИсточника = Источник.Метаданные();
	
	Если Метаданные.Документы.Содержит(МетаданныеИсточника) И Источник.Дата >= Дата(2025, 1, 1) Тогда
		МетаданныеРеализаций = Метаданные.Документы.РеализацияТоваровУслуг;	
		// либо документ РеализацияТоваровУслуг, либо другой документ продажи с тем же нумератором
		ЭтоДокументРеализации = (МетаданныеИсточника = МетаданныеРеализаций Или МетаданныеИсточника.Нумератор <> Неопределено И МетаданныеИсточника.Нумератор = МетаданныеРеализаций.Нумератор);
		// для реализаций устанавливаем префикс
		Если ЭтоДокументРеализации И Не ЗначениеЗаполнено(Префикс) Тогда
			Префикс = Формат(ДеньГода(Источник.Дата), "ЧЦ=3; ЧДЦ=0; ЧВН=; ЧГ=0");	//номер года в виде строки от 001 до 365			
		КонецЕсли;
	КонецЕсли;
	//-- ERP
	
	ПродолжитьВызов(Источник, Префикс, УстановитьПрефиксИнформационнойБазы, УстановитьПрефиксОрганизации);
КонецПроцедуры
25 Волшебник
 
21.03.25
11:56
(22) Переделайте печатную форму
26 Serg_1960
 
21.03.25
11:58
(15) Это азбука :)
Механизм автонумерации выдает номера в разрезе пространств номеров и префиксов. Пространство номера в зависимости от типа объекта может содержать метаданные, владельца, период и др. В пределах пространства номеров номер выдается в разрезе префиксов. По каждому префиксу хранится максимальный выданный номер, на основании которого выдается следующий номер. Один и тот же максимальный номер может соответствовать нескольким префиксам.

Источник: https://its.1c.ru/db/metod8dev/content/1550/hdoc
27 Мультук
 
гуру
21.03.25
14:10
(0)
Ах да. И о знаниях/умениях.
--Папа, папа! еб@нёт ?
--Обязательно, сынок!

Опасный программный код
// Запись в регистр
НаборЗаписей = РегистрыСведений.НумерацияКлевер.СоздатьНаборЗаписей();
Запись = НаборЗаписей.Добавить();
Запись.ПериодДата = ТекущаяДата();
Запись.Контрагент = Контрагент;
Запись.ПоследнийНомер = ПоследнийНомер;
НаборЗаписей.Записать();
28 d4rkmesa
 
21.03.25
12:00
(24) Здесь вы можете ваш префикс отработать, а там где не надо - установить "0" в качестве такового, чтобы нумерация не путалась.
29 Волшебник
 
21.03.25
12:37
(27) Хороший код для очистки всего регистра
30 dovenok
 
21.03.25
14:11
Сделал по совету выше, добавил столбец с номером , сделаю возможность поиска по данному реквизиту что бы отсяить все доки с буквой К . Видимо самое безопасное и быстрое решение

&НаКлиенте
Процедура СписокДокументыПродажиОбновить(Команда)
	
	Для Каждого Строка Из ЭтотОбъект.ДанныеФормы.СписокДокументыПродажи Цикл  
		Если Строка.Контрагент.Наименование = "ООО КЛЕВ" Тогда  
			Строка.МойНомерК = Строка.НомерДокумента + "К";  
		Иначе  
			Строка.МойНомерК = Строка.НомерДокумента;  
		КонецЕсли;  
	КонецЦикла;  

	ЭтотОбъект.ОбновитьДанные();
	
	
КонецПроцедуры
31 d4rkmesa
 
21.03.25
13:04
Клинический случай необучаемости.
32 dovenok
 
21.03.25
14:11
(31) &Вместо("УстановитьПрефикс")
Процедура РасшПР_УстановитьПрефикс(Источник, Префикс, УстановитьПрефиксИнформационнойБазы, УстановитьПрефиксОрганизации)
    
    
    МетаданныеИсточника = Источник.Метаданные();
    
    Если Метаданные.Документы.Содержит(МетаданныеИсточника) Тогда
        МетаданныеРеализаций = Метаданные.Документы.РеализацияТоваровУслуг;    
        
        ЭтоДокументРеализации = (МетаданныеИсточника = МетаданныеРеализаций Или МетаданныеИсточника.Нумератор <> Неопределено И МетаданныеИсточника.Нумератор = МетаданныеРеализаций.Нумератор);
        
      
        Если ЭтоДокументРеализации Тогда
            Контрагент = Источник.Контрагент;
            Если Контрагент.Наименование = "ООО КЛЕВ" Тогда
                Префикс = "НК";  
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    
    
    ПродолжитьВызов(Источник, Префикс, УстановитьПрефиксИнформационнойБазы, УстановитьПрефиксОрганизации);
КонецПроцедуры


типо этого?
33 d4rkmesa
 
21.03.25
14:40
(32) Да, и проверить как будут работать номера там, где [пользовательский] префикс не нужен.
Скорее всего, понадобится установить префикс "0" таким номерам примерно там же через Иначе.
И, далее еще будет отдельный вопрос по номерам счетов-фактур (и УПД, как следствие).
Номера счетов-фактур (префиксы, точнее) по большей части отрабатывают через ДокументОбъект.СчетФактураВыданный.ПриУстановкеНовогоНомера(...), там тоже можно что-то дописать через расширение, но с учетом что длина номера 12, а не 11.
зы: А потом еще будут вопросы по представлению номера для печатных форм и ЭДО, ну может и типовой вариант устроит в таком случае.
34 dovenok
 
21.03.25
14:48
ну пока сделал так, но префикс так и не меняется

&Вместо("УстановитьПрефикс")  
Процедура РасшПР_УстановитьПрефикс(Источник, Префикс, УстановитьПрефиксИнформационнойБазы, УстановитьПрефиксОрганизации)

    Сообщить("Вызов УстановитьПрефикс для документа: " + Источник.Метаданные().Имя);

    
    Если Источник.Метаданные().ПолноеИмя = "Документ.РеализацияТоваровУслуг" Тогда
        
      
        Если Источник.Метаданные().Реквизиты.Найти("Контрагент") <> Неопределено Тогда
            
            Контрагент = Источник.Контрагент;

            Сообщить("Контрагент в документе: " + ?(Контрагент <> Неопределено, Контрагент.Наименование, "Не определен"));

            
            Если Контрагент <> Неопределено И Контрагент.Наименование = "ООО КЛЕВ" Тогда
                Префикс = "НК";  
                Сообщить("Изменен префикс на: " + Префикс);
            Иначе
                Сообщить("Оставлен стандартный префикс: " + Префикс);
            КонецЕсли;

        Иначе
            Сообщить("В документе нет реквизита 'Контрагент'");
        КонецЕсли;
    Иначе
        Сообщить("Документ не является Реализацией товаров и услуг");
    КонецЕсли;
    
      
    ПродолжитьВызов(Источник, Префикс, УстановитьПрефиксИнформационнойБазы, УстановитьПрефиксОрганизации);

КонецПроцедуры
35 d4rkmesa
 
21.03.25
14:56
(34) Это будет работать при установке нового номера, если очистить поле с номером или создать новый документ.
Плюс вопрос работы расширения, отключить галочку "безопасный режим". Эту процедуру достаточно несложно отладить.
36 Злоп
 
21.03.25
22:49
(9) насчет сплошной последовательной - единого мнения нет. Законодательство требует хронологической последовательности. А что это такое - каждый трактует как ему угодно.
.
Можно еще вспомнить отдельную нумерацию авансовых счф...
37 Злоп
 
21.03.25
22:52
А по (0) можно сказать классическое
Кг/ам
.
А вдруг если еще вывод на печать настроен без префиксов - в общем случае может случиться одинаковый номер в разных упд/счф. И будет жпс.
38 Волшебник
 
модератор
21.03.25
22:54
(37) Не ругайтесь
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.