Хитрая нумерация документов в 1С 8.2

У многих встает вопрос а как бы ввести документ "задним числом", но чтобы с номерами все было красиво. Решение достаточно очевидное + есть его реализация.

Небольшая заметочка на заданную тему. В моем конкретном случае документы вводились много и часто «задним числом». Для решения проблеммы выработали следующие правила нумерации:

(Префикс)(Месяц)(День)/(Порядковый номер внутри дня)

Все это хозяйство прописывается в учетной политике, чтобы потом не было ни у кого претензий.

Далее находим подписку на событие «ПриУстановкеНовогоНомера» и в нее добавляем немного кода. При минимальных изменениях мы получаем возможность автоматической нумерации документов в пределах дня и красоту при вводе документов задним числом. Плюс гибкие возможности распространить данный механизм только на определенные виды документов и только по определенным организациям.

Буду рад если это кому то поможет. 

На примере БП 2.0  подписку на событие «ПриУстановкеНовогоНомера» отрабатывет следующая процедура  

Процедура ПриУстановкеНовогоНомераДокумента(Источник, СтандартнаяОбработка, Префикс) Экспорт

ОбщегоНазначения.ДобавитьПрефиксОрганизации(Источник, Префикс);

ОбщегоНазначения.ДобавитьПрефиксУзла(Префикс);

Конецпроцедуры

Нам нужно добавить немного кода в процедуру ДобавитьПрефиксОрганизации.  Для ленивых код в файле на примере Бухгалтерия Предприятия 2.0. 

 P.S. Внимание! Решение не полностью универсальное и верно только при создании новых документов. При изменении даты ранее сохраненного  документа с номером ничего не произойдет — он останется старым. Решения пути два — либо пользователь сам следит за теми документами в которых меняется дата, либо нужно создавать подписку на событие «ПередЗаписью» и в ней контролировать соответствие префикса номера и даты документа. 

P.P.S. Механизм нумерации в БП 3 изменился и приведенный код работать там не будет.

Пишу это, чтобы потом ни у кого не было претензий и недоразумений, как правильно мне указали товарищи в комментариях.

25 Comments

  1. Некто A. Petti

    Это уже такое бородатое ноу-хау. Еще помнится году в 1999 такое на 7.5 клиенту делал.

    Только слэш я бы не ставил. Не красиво 🙂 Лучше дефис после префикса.

    Reply
  2. KonstB

    (1) Некто A. Petti, да уж… старье

    Reply
  3. serg_info

    (1) (2) Полностью с Вами согласен. И всем это известно, кто давно в автоматизации. Тут показано как просто это делается в 1С 8.2 типовых (ну не было в 7-ке механизма событий без использования внешних компонент). При этом 1С сама занимается автонумерацией внутри дня. Да и я знаю что решение не полностью универсальное. Ну опять же очевидное, при изменении даты документа с номером ничего не произойдет — он останется старым. Наверное можно что-то еще накопать из менее очевидного.

    Статья была призвана показать где и как такой тип нумерации делается.

    Reply
  4. ditiatko

    А как решается изменение дня в уже записанном документе?

    Reply
  5. software1c

    Ничего в этой нумерации хитрого нет…. Накладные — да, Счет-фактуры и Кассовые ордеры — НЕТ!

    Reply
  6. dryms

    У нас так договоры нумеруются(они документами оформляются). Но может кому-нибудь такая информация пригодится поэтому +

    Reply
  7. friday1

    а с фига ли извините за вопрос счета фактуры так не могут нумероваться?))

    и второе, почему то у меня в 3.0 не заходит в эту подписку на событие, хоть прибей ее(

    Reply
  8. Чертова Кошка

    в ноябре пропустила 1 сч-ф, корячилась в рукопашную. Вашу бы информацию мне тогда….

    Reply
  9. gosizo

    возьмем на заметку

    Reply
  10. Totoro

    Без ответа на (4) это только часть механизма, который может привести к плачевным последствиям. Особенно если дату поменять на другой год …

    Да и в новых типовых на БСП номер по другому формируется.

    Reply
  11. serg_info

    (10) Я не говорил, что задача решена целиком. В (3) я сам написал, что есть такая проблема. Но красивого и короткого решения тут не получится. Навскидку, чтобы не корячить много кода и форм документов нужно делать подписку на событие «ПриЗаписи» и в нем проверять соответствие префикса номера и даты документа. И тут возникнет дилема, а отправлен ли данный документ покупателю и можно ли менять его номер вообще….

    Тут скорее вопрос не в программировании был, а в том чтобы подсказать как можно организовать нумерацию документов, чтобы не было проблемм с вводом документов задним числом не более того.

    Reply
  12. serg_info

    (10) Да, видимо, пора уже глянуть на БП 3. Уже и формирование номеров по другому сделали. Посмотрю что да как там и отпишусь как это реализовать там. Спасиб за информацию.

    Reply
  13. Totoro

    (11) Поэтому и нужно предупредить читателей в статье (а некоторые пока не очень опытны в программировании), что может возникнуть такая проблема, пусть и не описывая конкретное решении (через подписку или через изменение формы).

    Reply
  14. internetname

    Может пригодиться

    Reply
  15. Borisych
    // Проверим номер документа на сответствие принятой нумерации (вида АТРmmdd/xxx)
    // Если номер не соответствует — определим следующий в пределах дня и используем его
    Если Лев(Номер,СтрДлина(Организация.Префикс)+5) <> НомерДокументаПоДате(Дата) Тогда
    Запрос = Новый Запрос;
    Запрос.Текст = «ВЫБРАТЬ ПЕРВЫЕ 1
    | ПОДСТРОКА(СчетФактураВыданный.Номер, 9, 3) КАК Индекс,
    | СчетФактураВыданный.Дата КАК ДатаПоследнегоДокумента
    |ИЗ
    | Документ.СчетФактураВыданный КАК СчетФактураВыданный
    |ГДЕ
    | СчетФактураВыданный.Дата >= &ДатаНачала
    | И СчетФактураВыданный.Дата <= &ДатаОкончания
    | И СчетФактураВыданный.Организация = &Организация
    | И СчетФактураВыданный.Ссылка <> &Ссылка
    | И ПОДСТРОКА(СчетФактураВыданный.Номер, &ИндексНачалаНомера, 5) = &MMdd
    |
    |УПОРЯДОЧИТЬ ПО
    | Индекс УБЫВ»;
    
    Запрос.УстановитьПараметр(«ДатаНачала»,   НачалоДня(Дата));
    Запрос.УстановитьПараметр(«ДатаОкончания»,   КонецДня(Дата));
    Запрос.УстановитьПараметр(«Организация»,   Организация);
    Запрос.УстановитьПараметр(«Ссылка»,    Ссылка);
    Запрос.УстановитьПараметр(«ИндексНачалаНомера», СтрДлина(Организация.Префикс)+1);
    Запрос.УстановитьПараметр(«MMdd»,     Прав(НомерДокументаПоДате(Дата),5));
    
    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
    Номер = НомерДокументаПоДате(Дата, 1);
    Иначе
    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    Номер = НомерДокументаПоДате(Дата, Число(Выборка.Индекс)+1);
    //Если Выборка.ДатаПоследнегоДокумента+1 <= КонецДня(Дата)  Тогда
    // Дата = Выборка.ДатаПоследнегоДокумента+1;
    //КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    // rarus gand 2009.03.13 8:50:37 }
    
    // rarus gand 2009.03.03 14:12:23 {
    // Возвращаемое значение:
    // 1. Если указан ИнкрементДня, то номер документа вида: «ММДД/ххх»
    // 2. Если не указан, то     префикс номера документа: «ММДД/»
    //
    Функция НомерДокументаПоДате(ДатаДокумента, знач ИнкрементДня = 0)
    Если ИнкрементДня = 0 тогда
    Возврат Организация.Префикс + Формат(Месяц(ДатаДокумента), «ЧЦ=2; ЧВН=») + Формат(День(ДатаДокумента), «ЧЦ=2; ЧВН=») + «/»;
    Иначе
    Возврат Организация.Префикс + Формат(Месяц(ДатаДокумента), «ЧЦ=2; ЧВН=») + Формат(День(ДатаДокумента), «ЧЦ=2; ЧВН=») + «/» + Формат(ИнкрементДня, «ЧЦ=3; ЧВН=»);
    КонецЕсли;
    КонецФункции // НомерДокПоДате()
    // rarus gand 2009.03.03 14:12:33 }
    
    

    Показать

    давно очень — делали такой вариант

    Reply
  16. BabySG

    (7) friday1, счет-фактуры так не могут нумероваться по причине постановления 1137, где указано, что располагается за символом «/»

    Reply
  17. friday1

    (16) BabySG, ну про / это понятно, а я говорю про тирэ))

    / должны нумероватсья счета фактуры обособленнок, это то мы в курсе:)

    автор, посмотри пожалуста на 3.0)

    очень надо для себя:)

    заранее благоадарен)

    Reply
  18. serg_info

    (17) В БП 3 нумерация происходит по следующей подписке на событие

    ПрефиксацияОбъектовСобытия.УстановитьПрефиксИнформационнойБазыИОрганизации

    Далее рассмотрим ее код

    // Устанавливает префикс источника подписки в соответствии с префиксом информационной базы и префиксом организации.
    // Источник подписки должен содержать
    // обязательный реквизит шапки «Организация», тип: «СправочникСсылка.Организации»
    //
    // Параметры:
    //  Источник — Источник события подписки.
    //             Любой объект из множества [Справочник, Документ, План видов характеристик, Бизнес процесс, Задача]
    // СтандартнаяОбработка — Булево — флаг стандартной обработки подписки
    // Префикс — Строка — префикс объекта, который нужно изменить
    //
    Процедура УстановитьПрефиксИнформационнойБазыИОрганизации(Источник, СтандартнаяОбработка, Префикс) Экспорт
    
    УстановитьПрефикс(Источник, Префикс, Истина, Истина);
    
    КонецПроцедуры
    

    Показать

    Идем в процедуру УстановитьПрефикс….

    И там дописываем для нужных организаций и типов документов расширенную префиксацию вида ммгг

    Как-то так. Лепить еще один файл для скачки лениво.

    Reply
  19. ValeryZ

    (1) А я вот формат делал такой, еще на семерках:

    ПФ-ГГММДД.nnn

    ПФ- префикс фирмы,

    ГГММДД — год+месяц+число

    .nnn — нумер с ведущими нулями.

    Вполне так классно было, сразу ясно, когда выписано: КГ-091204.027

    Даже налоговые документы так оформляли, пока ГНИ не указала, что номера должны идти по ихним правилам 🙁

    Reply
  20. bluntschi

    (16) BabySG, а как можно подпилить тогда это для счет фактур выданных?

    Reply
  21. @Sonya

    (3) а в нумерации нужных документов не нужно установить периодичность День? Как она сама будет нумеровать в пределах дня? извините, если глупый вопрос.

    Reply
  22. @Sonya

    (21) Поняла, внутри префикса идет уникальная нумерация)

    Reply
  23. AAZ

    Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)

    СтандартнаяОбработка =Ложь;

    ОбщегоНазначения.ДобавитьПрефиксОрганизации(ЭтотОбъект, Префикс);

    Запрос = Новый Запрос;

    Запрос.Текст = «ВЫБРАТЬ ПЕРВЫЕ 1

    | СчетФактураВыданный.Ссылка,

    | СчетФактураВыданный.Номер КАК Номер,

    | СчетФактураВыданный.Дата

    |ИЗ

    | Документ.СчетФактураВыданный КАК СчетФактураВыданный

    |ГДЕ

    | СчетФактураВыданный.Дата МЕЖДУ &Дата1 И &Дата2

    | И СчетФактураВыданный.Организация = &Организация

    |

    |УПОРЯДОЧИТЬ ПО

    | Номер УБЫВ»;

    Запрос.УстановитьПараметр(«Дата1», НачалоДня(ЭтотОбъект.Дата)); //Дата

    Запрос.УстановитьПараметр(«Дата2», КонецДня(ЭтотОбъект.Дата)); //Дата

    Запрос.УстановитьПараметр(«Организация», ЭтотОбъект.Организация); //Организации

    РезультатЗапроса = Запрос.Выполнить().Выбрать();

    Порядковый=0;

    Если РезультатЗапроса.Следующий() Тогда

    Порядковый=Формат(Число(Прав(РезультатЗапроса.Номер,3))+1,»ЧЦ=3; ЧВН=»);

    Номер=Префикс+Формат(РезультатЗапроса.Дата,»ДФ=гг»)+Формат(РезультатЗапроса.Дата,»ДФ=ММ»)+Формат(РезультатЗапроса.Дата,»ДФ=дд»)+»/»+Строка(Порядковый);

    иначе

    Номер=Префикс+Формат(ЭтотОбъект.Дата,»ДФ=гг»)+Формат(ЭтотОбъект.Дата,»ДФ=ММ»)+Формат(ЭтотОбъект.Дата,»ДФ=дд»)+»/001″;

    КонецЕсли;

    Если Исправление Тогда

    Префикс = «И» + Префикс;

    ИначеЕсли ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.НаАванс

    ИЛИ ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.НаАвансКомитента Тогда

    Если Константы.ОтдельнаяНумерацияСчетовФактурНаАванс.Получить() Тогда

    Префикс = «А» + Префикс;

    КонецЕсли;

    КонецЕсли;

    ОбщегоНазначения.ДобавитьПрефиксУзла(Префикс);

    КонецПроцедуры

    Reply
  24. Anyu-n

    Обожаю Инфостат, потому что здесь сидят очень умные и находчивые люди! Они доказывают, что любой бред руководителя можно исполнить! Воспользовалась вашей идеей для УТ 10.3! Все счастливы и довольны! Но новая проблема возникла…. нужно сделать такую же «хитрую» нумерацию, но НЕ СНИМАЯ С ПОДДЕРЖКИ конфу УТ 11.1 !!!!! Может есть у кого какие мысли? Думала привязать как-нибудь дополнительные реквизиты, но как…. может кнопку внешней обработки какой… но как вызывать непосредственно из документа перед записью…. короче ужас…. помогите полезной идейкой….

    Reply
  25. abdulaev_s

    Добрый день! Нужна ваша помощь по нумерации в 1С 8.3. Как с вами можно связаться?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *