|
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) Не ругайтесь
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |