Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Если "номер не ункален", тогда +1

Если "номер не ункален", тогда +1
Я
   citruss87
 
30.04.20 - 14:52
Доброго времени суток всем!
Давно читаю форум, но зарегаться решил только сегодня.
В общем давайте ближе к теме. Есть 1с БП 8.3, есть обработка которая разбивает указанную сумму на множество документов (реализаций) в заданном интервале даты и и диапазоне сумм документа и указания начального номера, который меняется таким образом: в один день создается 7 документов попорядку начиная от начального номера (х), далее пропускает 20 номеров, и уже на следующую дату продолжает создавать документы попорядку.
Суть вопроса следующая, обработка иногда останавливается с сообщением "Значение "префикс-номер" поля "номер" не уникально". Думаю можно дописать код проверки уникальности, т.е. какое-то условие типа: Если значение поля номер не уникально, тогда +1. Кто может помочь?
Ах да еще вопрос как выложить код сюда?
   Fish
 
1 - 30.04.20 - 14:59
" как выложить код сюда?" - Скопировать и вставить в сообщение. Неожиданно, правда?
   NorthWind
 
2 - 30.04.20 - 15:00
ну и в чем конкретно проблема? Обрабатываем исключение, добавляем номер. Для семерки делал когда-то в лохматых годах, работало.
   Ray Zexter
 
3 - 30.04.20 - 15:00
Попытка
    Записать документ
Исключение 
    Номер документа +1
    Записать документ
КонецПопытки;

Хотя не вижу смысл таких наворотов.
   NorthWind
 
4 - 30.04.20 - 15:03
(3) если обработка создает множество документов и при этом такие же документы создаются человеками, то бывает что сбивается нумерация, соответственно, робат-ипопат должен как-то эту историю обойти
   citruss87
 
5 - 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;
        
        ЗаполнитьЗначенияСвойств(Реализация, НалоговыйУчетУСН.ДеятельностьНаПатентеПоУмолчанию(Реализация.Организация, Реализация.Дата));
        ОтветственныеЛицаБП.УстановитьОтветственныхЛиц(Реализация);
        СчетаУчетаВДокументах.ЗаполнитьПередОтображениемПользователю(Реализация);
         
       Реализация.Записать();
   Ray Zexter
 
6 - 30.04.20 - 15:12
Документ у тебя записывает последняя строка. Вот от неё и пляши.
   citruss87
 
7 - 30.04.20 - 15:17
(6) Это я понял что Реализация.Записать(); и есть ключ, но я так понимаю между скобками нужно что-то вписать.
Я со строкой Реализация.Номер=Объект.Префикс+Прав("0000000000000000000000000000" + Формат(НомерДок,"ЧГ=0"), 6); парился почти неделю не знал как оформить изначально было Реализация.Номер=НомерДок; и все номера записывались без нулей префикса, да еще и с разделителем разрядов:)
   vova1122
 
8 - 30.04.20 - 15:35
Перед этой строкой Реализация.Номер=Объект.Префикс+Прав("0000000000000000000000000000" + Формат(НомерДок,"ЧГ=0"), 6);
   vova1122
 
9 - 30.04.20 - 15:43
Перед этой строкой написать поиск документа по номеру.
НомерДляПроверки=Объект.Префикс+Прав("0000000000000000000000000000" + Формат(НомерДок,"ЧГ=0"), 6);
СсылкаНаДокумент=Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру(НомерДляПроверки?ДатаДок);
Пока СсылкаНаДокумент<>Документы.ПоступлениеТоваровУслуг.ПустаяССылка() цикл 
НомерДок=НомерДок+1;
СсылкаНаДокумент=Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру(НомерДляПроверки?ДатаДок);
НомерДляПроверки=Объект.Префикс+Прав("0000000000000000000000000000" + Формат(НомерДок,"ЧГ=0"), 6);
КонецЦикла
// и свою строку заменить на 

Реализация.Номер=НомерДляПроверки;
   VladZ
 
10 - 30.04.20 - 15:44
(0) К чему эти нелепые телодвижения?
   VladZ
 
11 - 30.04.20 - 15:45
Оставьте номер документа в покое. Пусть формируется по порядку.
   vova1122
 
12 - 30.04.20 - 15:45
Очепятка
СсылкаНаДокумент=Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру(НомерДляПроверки,ДатаДок);
   citruss87
 
13 - 30.04.20 - 15:53
(9) Спасибо за подсказку буду пробовать
(11) Я бы сам не против оставить по умолчанию, но так надо
   vova1122
 
14 - 30.04.20 - 15:55
Строки в цикле СсылкаНаДокумент=    и  НомерДляПроверки=   нужно поменять местами
   VladZ
 
15 - 30.04.20 - 16:04
(13) Кому надо?
   citruss87
 
16 - 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. Я думаю достаточно подробно объяснил.

Всем еще раз спасибо. Тему можно закрыть. Если кому нужна данная обработка, могу поделиться бесплатно.
   Ray Zexter
 
17 - 30.04.20 - 17:20
(16)Предлагаю вариант проще. Тупо вбиваете все подряд, не обращая внимания на нумерацию. В конце месяца, когда уже точно новых документов не будет, причесывать нумерацию обработкой.
   Сергиус
 
18 - 30.04.20 - 17:30
(17) +100, намного проще будет.
   breezee
 
19 - 30.04.20 - 18:37
Если юзерам нужна нумерация - добавляете новый реквизит. Номер нужно получать через "УстановитьНовыйНомер()"
   citruss87
 
20 - 30.04.20 - 19:49
(17) Спасибо, сам так и хотел сделать изначально, но номера контрагенты запрашивают сразу, т.е. конца месяца я не могу ждать. Ну в общем работает все, все устраивает, спасибо большое

Список тем форума
Рекламное место пустует  Рекламное место пустует
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.