|
Если "номер не ункален", тогда +1 | ☑ | ||
---|---|---|---|---|
0
citruss87
30.04.20
✎
14:52
|
Доброго времени суток всем!
Давно читаю форум, но зарегаться решил только сегодня. В общем давайте ближе к теме. Есть 1с БП 8.3, есть обработка которая разбивает указанную сумму на множество документов (реализаций) в заданном интервале даты и и диапазоне сумм документа и указания начального номера, который меняется таким образом: в один день создается 7 документов попорядку начиная от начального номера (х), далее пропускает 20 номеров, и уже на следующую дату продолжает создавать документы попорядку. Суть вопроса следующая, обработка иногда останавливается с сообщением "Значение "префикс-номер" поля "номер" не уникально". Думаю можно дописать код проверки уникальности, т.е. какое-то условие типа: Если значение поля номер не уникально, тогда +1. Кто может помочь? Ах да еще вопрос как выложить код сюда? |
|||
1
Fish
30.04.20
✎
14:59
|
" как выложить код сюда?" - Скопировать и вставить в сообщение. Неожиданно, правда?
|
|||
2
NorthWind
30.04.20
✎
15:00
|
ну и в чем конкретно проблема? Обрабатываем исключение, добавляем номер. Для семерки делал когда-то в лохматых годах, работало.
|
|||
3
Ray Zexter
30.04.20
✎
15:00
|
Попытка
Записать документ Исключение Номер документа +1 Записать документ КонецПопытки; Хотя не вижу смысл таких наворотов. |
|||
4
NorthWind
30.04.20
✎
15:03
|
(3) если обработка создает множество документов и при этом такие же документы создаются человеками, то бывает что сбивается нумерация, соответственно, робат-ипопат должен как-то эту историю обойти
|
|||
5
citruss87
30.04.20
✎
15:09
|
(1) Спасибо, реально не ожиданно
(2) Я не программист 1с, в юнешестве программировал на бейсике и паскале, небольшой опыт программирования есть, обработку поправил под себя (мелочи всякие). (3) Спасибо, может подскажите в какую часть кода надо это вставить? Сам код генератора: Процедура СформироватьНаСервере() КоличествоДней = (Объект.Дата2 - Объект.Дата1) / 60 / 60 / 24; СредняяСумма = Объект.min+(Объект.max-Объект.min)/2; КоличествоДокументов = Объект.Сумма/СредняяСумма; КоличествоДокументовДень = Объект.Сумма/КоличествоДней/СредняяСумма; флаг=1; ГрадиенСуммы=(Объект.max-Объект.min)/КоличествоДокументов+0.01; min=99999999999999; Пока флаг=1 Цикл ГрадиенСуммы=ГрадиенСуммы-0.01; СуммаДок=ОКР(Объект.max-ГрадиенСуммы,2); флаг=0; СчетчикСуммы=0; для сч=1 по 9999999999999 Цикл СуммаДок=ОКР(СуммаДок-ГрадиенСуммы,2); Если (СчетчикСуммы+СуммаДок>Объект.Сумма) или (СуммаДок>Объект.max) или (СуммаДок<Объект.min) тогда флаг=1; прервать; ИначеЕсли (ОКР(СчетчикСуммы+СуммаДок,2)=Объект.Сумма) и (СуммаДок<=Объект.max) тогда флаг=2; прервать; КонецЕсли; СчетчикСуммы=ОКР(СчетчикСуммы+СуммаДок,2); КонецЦикла; //Если флаг=1 тогда // СуммаДок=Объект.Сумма-СчетчикСуммы; //КонецЕсли; если СчетчикСуммы<>Объект.Сумма тогда флаг=1; КонецЕсли; Если флаг=2 тогда прервать; КонецЕсли; Если Объект.Сумма-СчетчикСуммы<min тогда min=Объект.Сумма-СчетчикСуммы; ГрадиенСуммыMIN=ГрадиенСуммы; Если min<(Объект.max-Объект.min)/2 тогда СуммаДок = СуммаДок+min; Прервать; КонецЕсли; КонецЕсли; КонецЦикла; СуммаДок=ОКР(Объект.max-ГрадиенСуммыMIN,2); СчетчикСуммы=0; НомерДок=Объект.НачНом; //НомерДок=Формат(НомерДок1, "ЧГ=0"); //Формат(НомерДок, "ЧГ=0"); ДатаДок=Объект.Дата1; док=0; КоличествоДокументовДень=0; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеДоговорыКонтрагента.Договор КАК Договор |ИЗ | РегистрСведений.ОсновныеДоговорыКонтрагента КАК ОсновныеДоговорыКонтрагента |ГДЕ | ОсновныеДоговорыКонтрагента.Организация = &Организация | И ОсновныеДоговорыКонтрагента.Контрагент = &Контрагент"; Запрос.УстановитьПараметр("Контрагент", Объект.Контрагент); Запрос.УстановитьПараметр("Организация", Объект.Организация); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Договор = ВыборкаДетальныеЗаписи.Договор; КонецЦикла; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДоговорыКонтрагентов.Ссылка КАК Договор |ИЗ | Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов |ГДЕ | ДоговорыКонтрагентов.Владелец = &Контрагент | И ДоговорыКонтрагентов.ВидДоговора = &ВидДоговора"; Запрос.УстановитьПараметр("Контрагент", Справочники.Контрагенты.НайтиПоРеквизиту("ИНН",объект.Организация.ИНН)); Запрос.УстановитьПараметр("ВидДоговора", Перечисления.ВидыДоговоровКонтрагентов.СПоставщиком); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл ДоговорСПоставщиком = ВыборкаДетальныеЗаписи.Договор; КонецЦикла; для сч2=1 по сч-2 цикл Если НачалоДня(ДатаДок)<>НачалоДня(Объект.Дата2) тогда Если КоличествоДокументовДень<7 тогда//ЦЕЛ((сч-1)/КоличествоДней) тогда КоличествоДокументовДень = КоличествоДокументовДень+1; иначе ДатаДок=Дата(ДатаДок + 86400); КоличествоДокументовДень=1; НомерДок=номерДок+20; //номерДок=формат(номерДок, "ЧГ=0"); КонецЕсли; КонецЕсли; СуммаДок=ОКР(СуммаДок-ГрадиенСуммыMIN,2); СчетчикСуммы=ОКР(СчетчикСуммы+СуммаДок,2); флаг=1; пока флаг=1 ЦИкл флаг = 0; Запрос = новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваровУслуг.Ссылка КАК Ссылка |ИЗ | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг |ГДЕ | РеализацияТоваровУслуг.Дата МЕЖДУ &НачГода И &КонГода | И РеализацияТоваровУслуг.Номер = &НомерДок"; Запрос.УстановитьПараметр("НомерДок", Строка(НомерДок)); Запрос.УстановитьПараметр("НачГода", НачалоГода(Объект.Дата1)); Запрос.УстановитьПараметр("КонГода", КонецГода(Объект.Дата2)); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл флаг=1; НомерДок=НомерДок+1; //НомерДок=формат(НомерДок, "ЧГ=0"); продолжить; КонецЦикла; КонецЦикла; Реализация=Документы.РеализацияТоваровУслуг.СоздатьДокумент(); Если Объект.Номенклатура.ВидНоменклатуры.Услуга тогда Реализация.ВидОперации=Перечисления.ВидыОперацийРеализацияТоваров.Услуги; иначе Реализация.ВидОперации=Перечисления.ВидыОперацийРеализацияТоваров.Товары; КонецЕсли; Реализация.Организация=Объект.Организация; Реализация.ДоговорКонтрагента=Договор; Реализация.Дата=ДатаДок; //Реализация.Номер=Объект.Префикс+Формат(НомерДок,"ЧГ=0"); Реализация.Номер=Объект.Префикс+Прав("0000000000000000000000000000" + Формат(НомерДок,"ЧГ=0"), 6); Реализация.Контрагент=Объект.Контрагент; Реализация.СпособЗачетаАвансов = Перечисления.СпособыЗачетаАвансов.Автоматически; Реализация.СуммаВключаетНДС=Истина; Реализация.ВалютаДокумента = Константы.ВалютаРегламентированногоУчета.Получить(); Реализация.КурсВзаиморасчетов=1; Реализация.КратностьВзаиморасчетов=1; Если Объект.Номенклатура.ВидНоменклатуры.Услуга тогда СтрокаРеализации=Реализация.Услуги.Добавить(); иначе СтрокаРеализации=Реализация.Товары.Добавить(); СтрокаРеализации.Количество=1; КонецЕсли; СтрокаРеализации.Номенклатура=Объект.Номенклатура; СтрокаРеализации.СтавкаНДС=Перечисления.СтавкиНДС.НДС20; СтрокаРеализации.Цена=СуммаДок; СтрокаРеализации.Сумма=СуммаДок; СтрокаРеализации.СуммаНДС=СуммаДок/120*20; ЗаполнитьЗначенияСвойств(Реализация, НалоговыйУчетУСН.ДеятельностьНаПатентеПоУмолчанию(Реализация.Организация, Реализация.Дата)); ОтветственныеЛицаБП.УстановитьОтветственныхЛиц(Реализация); СчетаУчетаВДокументах.ЗаполнитьПередОтображениемПользователю(Реализация); Реализация.Записать(); |
|||
6
Ray Zexter
30.04.20
✎
15:12
|
Документ у тебя записывает последняя строка. Вот от неё и пляши.
|
|||
7
citruss87
30.04.20
✎
15:17
|
(6) Это я понял что Реализация.Записать(); и есть ключ, но я так понимаю между скобками нужно что-то вписать.
Я со строкой Реализация.Номер=Объект.Префикс+Прав("0000000000000000000000000000" + Формат(НомерДок,"ЧГ=0"), 6); парился почти неделю не знал как оформить изначально было Реализация.Номер=НомерДок; и все номера записывались без нулей префикса, да еще и с разделителем разрядов:) |
|||
8
vova1122
30.04.20
✎
15:35
|
Перед этой строкой Реализация.Номер=Объект.Префикс+Прав("0000000000000000000000000000" + Формат(НомерДок,"ЧГ=0"), 6);
|
|||
9
vova1122
30.04.20
✎
15:43
|
Перед этой строкой написать поиск документа по номеру.
НомерДляПроверки=Объект.Префикс+Прав("0000000000000000000000000000" + Формат(НомерДок,"ЧГ=0"), 6); СсылкаНаДокумент=Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру(НомерДляПроверки?ДатаДок); Пока СсылкаНаДокумент<>Документы.ПоступлениеТоваровУслуг.ПустаяССылка() цикл НомерДок=НомерДок+1; СсылкаНаДокумент=Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру(НомерДляПроверки?ДатаДок); НомерДляПроверки=Объект.Префикс+Прав("0000000000000000000000000000" + Формат(НомерДок,"ЧГ=0"), 6); КонецЦикла // и свою строку заменить на Реализация.Номер=НомерДляПроверки; |
|||
10
VladZ
30.04.20
✎
15:44
|
(0) К чему эти нелепые телодвижения?
|
|||
11
VladZ
30.04.20
✎
15:45
|
Оставьте номер документа в покое. Пусть формируется по порядку.
|
|||
12
vova1122
30.04.20
✎
15:45
|
Очепятка
СсылкаНаДокумент=Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру(НомерДляПроверки,ДатаДок); |
|||
13
citruss87
30.04.20
✎
15:53
|
(9) Спасибо за подсказку буду пробовать
(11) Я бы сам не против оставить по умолчанию, но так надо |
|||
14
vova1122
30.04.20
✎
15:55
|
Строки в цикле СсылкаНаДокумент= и НомерДляПроверки= нужно поменять местами
|
|||
15
VladZ
30.04.20
✎
16:04
|
(13) Кому надо?
|
|||
16
citruss87
30.04.20
✎
16:26
|
(14) Спасибо большое вы упростили мне работу своей подсказкой. Благодарю от всей души!
(15) Нужно в первую очередь мне, так как бывает, когда надо разбить 5000000 на весь квартал, и если оставить нумерацию по порядку, то когда надо будет выписать реализацию вручную в середине квартала, то мне нужно будет продолжать нумерацию по порядку, т.е. получится реализация №236 от 10.02.2020, дальше реализация №237 от 11.02.2020 и т.д. до конца периода к примеру реализация №3046 от 30.04.2020, а теперь допустим нужно в ручную добавить реализацию допустим 11.02.2020 и как вы думаете с каким номером у меня добавиться реализация? Да правильно получится реализация №3047 от 11.02.2020, хотя на 10 число и тут же 11 нумерация была 236 и 237. Я думаю достаточно подробно объяснил. Всем еще раз спасибо. Тему можно закрыть. Если кому нужна данная обработка, могу поделиться бесплатно. |
|||
17
Ray Zexter
30.04.20
✎
17:20
|
(16)Предлагаю вариант проще. Тупо вбиваете все подряд, не обращая внимания на нумерацию. В конце месяца, когда уже точно новых документов не будет, причесывать нумерацию обработкой.
|
|||
18
Сергиус
30.04.20
✎
17:30
|
(17) +100, намного проще будет.
|
|||
19
breezee
30.04.20
✎
18:37
|
Если юзерам нужна нумерация - добавляете новый реквизит. Номер нужно получать через "УстановитьНовыйНомер()"
|
|||
20
citruss87
30.04.20
✎
19:49
|
(17) Спасибо, сам так и хотел сделать изначально, но номера контрагенты запрашивают сразу, т.е. конца месяца я не могу ждать. Ну в общем работает все, все устраивает, спасибо большое
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |