8.х Подскажите идею, как реализовать парралельную нумерацию документов?

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Greck, 21 янв 2008.

  1. TopicStarter Overlay
    Greck
    Offline

    Greck Опытный в 1С

    Регистрация:
    11 дек 2006
    Сообщения:
    94
    Симпатии:
    0
    Баллы:
    26
    Всем приветики! заранее всем спасибо за помощь) Вобщем суть проблемы такая, есть документ - РеализацияТовИУслуг, в нем есть стандартная нумерация. Мне необходимо сделать паралелльную нумерацию с условием. Условие состоит в том, что "парралельные номера" должны выдаватся в зависимости от выбранного "грузоотправителя", то есть создаем документ реализация тов и услуг:
    Вариант1:
    Поле Грузоотправитель не заполненно, номер документа 1, парралельный номер документа 0
    ....
    Поле Грузоотправитель не заполненно, номер документа ...n, парралельный номер документа 0

    Вариант2:
    Поле Грузоотправителя заполненно значением = Контрагент1, номер документа 1, парралельній номер документа 1
    Поле Грузоотправителя заполненно значением = Контрагент1, номер документа 2, парралельній номер документа 2
    Поле Грузоотправителя заполненно значением = Контрагент2, номер документа 3, парралельній номер документа 1
    Поле Грузоотправителя заполненно значением = Контрагент2, номер документа 4, парралельній номер документа 2


    То есть для каждого нового контрагента выбранного в поле Грузоотправитель, мне нуобходимо вести новую парралельную нумерацию в пределах периода - календарного года...
  2. dend
    Offline

    dend Опытный в 1С

    Регистрация:
    9 апр 2007
    Сообщения:
    175
    Симпатии:
    0
    Баллы:
    26
    Я бы сделал так :
    1. Добавил реквизит "ПараллельныйНомер"
    2. Сделал непериодический регистр сведений "НомераДокументовГрузотправителей", куда бы записывал последний номер документа по каждому грузоотправителю
    Измерение - контрагент
    Ресурс - Номер.
    Можно ресур сделать измерением, чтобы контролировать уникальность записи в рег. сведений.
    3. При проведении документа изменял бы запись регистра сведений.
    (Здесь нужно еще учесть оперативное и неоперативное проведение).
  3. TopicStarter Overlay
    Greck
    Offline

    Greck Опытный в 1С

    Регистрация:
    11 дек 2006
    Сообщения:
    94
    Симпатии:
    0
    Баллы:
    26
    это была идея 1, идея два - это искать запросом последний номер для этого контрагента и делать +1...
    какие еще идеи будут?

    Средствами нумератора документов можно что-то сделать?
  4. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Это врядли (если не считать возможности почесывать левое ухо правой ногой закинутой за спину).
    А чем регистр сведений не устраивает?
  5. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Средствами нумераторов не получится, вариант с регистром наиболее верный, но еще есть вариант с реквизитом. Все зависит от дальнейшего использования этого номера.

    Вариант с регистром - методологически корректен и несложно реализуем, единственное нужно четко следить за удалением документов.

    Вариант с реквизитом - несколько тяжелее поиск нужного номера, но зато легче выводить в форме списка документов и сделать поиск по нему.

    Гиьридный вариант - это и реквизит и регистр, я бы наверное сделал так. Регистр хранит в себе информацию о номерах по контрагентам, а реквизит помогает искать документ по номеру в списке (журнале) документов. Кроме этого легче отработать удаление документа.

    Я бы сделал регистр со следующими данными:
    Измерения:
    Контрагент (Ведущее)
    Документ (Ведущее)
    Ресурсы
    НомерПараллельный

    Ведущее измерение позволит беспрепятственно удалять из базы данных записи и не сильно заботиться об автоматчиеской очистке регистра.
  6. TopicStarter Overlay
    Greck
    Offline

    Greck Опытный в 1С

    Регистрация:
    11 дек 2006
    Сообщения:
    94
    Симпатии:
    0
    Баллы:
    26
    Вобщем сделал все по вашим советам) Спасибо!


    сделал регистр сведений со следующими данными:
    непереодический,независимый
    Измерения:
    Контрагент (Ведущее)
    Документ (Ведущее)
    Ресурсы
    Номер

    Перед записью Документа присваиваю ему Номер

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

    Код:
    // Движения по документу
    Если Не Отказ Тогда
    Если ЗначениеЗаполнено(Грузоотправитель) Тогда
    НомерДокументаГрузоотправителя = РегистрыСведений.НомераДокументовГрузотправителей.СоздатьМенеджерЗаписи();
    НомерДокументаГрузоотправителя.Контрагент = Грузоотправитель;
    НомерДокументаГрузоотправителя.Документ = ЭтотОбъект.Ссылка;
    НомерДокументаГрузоотправителя.Номер = НомерОтЧП;
    НомерДокументаГрузоотправителя.Период = Дата;
    НомерДокументаГрузоотправителя.Записать();
    КонецЕсли;
    КонецЕсли;
    
    
    При отмене проведения удаляю запись из регистра:

    Код:
    Если Не Отказ Тогда
    НомерДокументаГрузоотправителя = РегистрыСведений.НомераДокументовГрузотправителей.СоздатьМенеджерЗаписи();
    НомерДокументаГрузоотправителя.Документ = ЭтотОбъект.Ссылка;
    НомерДокументаГрузоотправителя.Номер = НомерОтЧП;
    НомерДокументаГрузоотправителя.Контрагент = Грузоотправитель;
    НомерДокументаГрузоотправителя.Прочитать();
    Если НомерДокументаГрузоотправителя.Выбран() Тогда 
    НомерДокументаГрузоотправителя.Удалить();
    КонецЕсли;
    КонецЕсли;
    
    

    ВОт думаю будет правильно, при удалении записи из регистра, смотреть есть ли уже номер следующий после удаляемого, и если есть - запрещать отмену проведения, пока не отменаят следующий??? какие у вас мнения?
  7. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    На последний вопрос:

    Лучше решить это организационно сначала с пользователями. Если нужна поддержка сквозной нумерации, то они могут предложить автоматически перенумеровывать, а могут и еще что-нибудь, а возможно сквозная нумерация не требуется и пропуски в номерах естесственны ;)
  8. TopicStarter Overlay
    Greck
    Offline

    Greck Опытный в 1С

    Регистрация:
    11 дек 2006
    Сообщения:
    94
    Симпатии:
    0
    Баллы:
    26
    Нумерация должна быть всегда только по рядку! (Законодательство такое :unsure: )

    Уже вобщем изменил алгоритм работы:
    Если запись в регистр делать во время проведения документа, то последний номер+1 - будет приставиватся всем новым непроведенным документам РеализацияТовИУслуг :D Так, что переделал, запись в регистр идет тепреь сразу при Записи документа, и при удалении документа соответсвенно удаляется, и удаляется при отмене проведения... B)
  9. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Законодательство регламентирует нумерацию по порядку счетов фактур по компании. Остальное не важно ;)

    Да... подумайте, после удаления документа в номерах будет дырка :)
  10. TopicStarter Overlay
    Greck
    Offline

    Greck Опытный в 1С

    Регистрация:
    11 дек 2006
    Сообщения:
    94
    Симпатии:
    0
    Баллы:
    26
    Да забыл написать, перед удалением записи из регистра, делается проверка нет ли записи после нее, и если запись есть - то чтобы между документами небыло дырки, удаление - запрещается, пользователи будуд рады B) Зато не обнаружат кучу дырок через пол года :unsure:

    Проверка на наличие следующего номера))

    Код:
    Функция ПроверкаНаНаличиеСледующегоНомера(ТекущийНомер)
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    МАКСИМУМ(НомераДокументовГрузотправителей.Номер) КАК Номер
    |ИЗ
    |    РегистрСведений.НомераДокументовГрузотправителей КАК НомераДокументовГрузотправителей
    |ГДЕ
    |    НомераДокументовГрузотправителей.Контрагент = &Контрагент";
    Запрос.УстановитьПараметр("Контрагент",Грузоотправитель);
    Результат = Запрос.Выполнить().Выбрать();
    
    
    Если Результат.Следующий() Тогда
    СледующийНомер = ?(НЕ ЗначениеЗаполнено(Результат.Номер),0,Результат.Номер);
    Иначе
    СледующийНомер = 0;
    КонецЕсли;
    
    Если СледующийНомер >  ТекущийНомер Тогда
    Запрет = Истина
    Иначе
    Запрет = Ложь;
    КонецЕсли;
    
    Возврат Запрет;
    КонецФункции
    
    
  11. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Ой, как пользователям плохо то будет... Готовьтесь к бою

Поделиться этой страницей