Имя: Пароль:
1C
1С v8
Нестандартный нумератор документов
0 drkovalex
 
15.04.15
12:24
Приветствую!

Особенность задачи такова, что нумерация документов происходит в рамках не календарного года, а с некоторым смещением назад: например, новый отчётный период начинается 20 декабря 2014 года.

Подскажите, есть ли возможность создать свой периодический нестандартный нумератор, используя стандартный механизм нумераторов или проще определять через константу начало нового периода и назначать номер документа при его первичной записи?
1 chelentano
 
15.04.15
12:36
(0) имхо, придётся самому писать нумерацию
2 fisher
 
15.04.15
12:37
Альтернативный нумератор - не такая тривиальная задача, как кажется.  Я бы попробовал выкрутиться стандартным нумератором без периодичности, разруливая нестандартные периоды разными префиксами.
3 drkovalex
 
15.04.15
13:02
(2) К сожалению, формат нумерации цифровой - строго определён.

Благодарю за помощь, значит, буду использовать план "Б".
4 Лефмихалыч
 
15.04.15
13:05
(0) в префикс включи какую-нибудь фигню, которая до 20го декабря будет одна, а после - другая. Тогда номер штатными средствами будет иметь хитрую периодичность.
Но это геморрой, как по мне...
5 fisher
 
15.04.15
13:05
(3) Тебе ничего не мешает там где надо (для печати, в списках и т.п.) отображать цифровой номер. Можно даже сохранять его в отдельном реквизите.
6 Лефмихалыч
 
15.04.15
13:06
(3) что мешает при выводе на печать выкидывать префикс. Или номер для печати хранить в отдельном реквизите и вычислять его из автоматически сгенерированного номера?
7 Лефмихалыч
 
15.04.15
13:06
вот ведь...
8 drkovalex
 
15.04.15
13:49
(5) (6) В принципе, то же на то же и выходит.
Жаль штатной возможности нет свою периодичность определять.
9 Serg_1960
 
15.04.15
13:59
(8) Без префикса - не "тоже на тоже" :( В пределах календарного года, в начале нумерации твоего периода, ты можешь "догнать" нумерацию предыдущего периода - проблема с дублированием номеров. Придётся отключать проверку уникальности номера. И тогда можно получить ещё одну проблему - не уникальность номера, но уже по вине юзверов.
10 fisher
 
15.04.15
14:04
(8) То же на то же, говоришь? Ну, поделись алгоритмами реализации своего нумератора. А мы покритикуем и сравним.
11 Serg_1960
 
15.04.15
14:05
Я "за" изменение префикса по дате (префикс - год даты). В типовых даже есть место, где это удобно реализовать - при добавлении префиксов узла и организации.

Кстати, если мне память не изменяет, то в типовых префиксы "отрезаются" при печати.
12 Serg_1960
 
15.04.15
14:07
*(11) "префикс - год даты" --> "префикс - производная от года даты"
13 drkovalex
 
15.04.15
14:12
(10) Вижу так:

При первичной записи документа:
1. Запросить крайний назначенный номер в пределах текущего периода;
2. Увеличить номер на единицу;
3. Присвоить реквизиту документа новый номер;
4. Записать документ.

Параллельная работа более 2 человек со специальным документом, в котором нужен особый порядок нумерации не предполагается.
14 fisher
 
15.04.15
14:41
(13) Ну вот. То есть будет запрос. При записи, как я понимаю? И даже при параллельной работе двух человек нужно решать вопрос, чтобы один номер параллельно не выдался двум документам.
15 fisher
 
15.04.15
14:42
Вот и интересно, как именно ты его будешь решать.
16 bodri
 
15.04.15
14:54
(14) в чем проблема параллельной работы? При записи будет выдаваться номер, а не при открытии, а одновременная запись двумя пользователями, маловероятна, а если все таки так случится, то проверочку прикрутить там же можно.
17 fisher
 
15.04.15
15:00
(16) Ага. А вот мы уже оперируем вероятностями. Которые резко меняются, если под одним из пользователей пакетная обработка. Вот уже появляется вариант проверочку прикрутить. Которая всего лишь уменьшает вероятность. Причем не так уж сильно при той же пакетной обработке.
18 drkovalex
 
15.04.15
15:07
(14) Возможности 1С я пока знаю относительно поверхностно. Видел в книге раздел о блокировках, думаю, это решаемо, надо освежить в голове знания.

(16), (17) действительно, как я уже указал, в данной задаче интенсивность настолько низка, что можно легко этим пренебречь (пренебречь, вальсируем :).
19 fisher
 
15.04.15
15:12
(18) Блокировка решит. Но! Это таки придется решать (усложнение). И блокировку придется накладывать до конца транзакции (прощай параллельное проведение). Еще варианты?
Ты молод и глуп, юный падаван. Мудрый предпочитает не разбрасывать грабли вместо того, чтобы надеяться в будущем не наступить на них.
20 kosts
 
15.04.15
15:12
А так же предусмотреть изменение даты документа с попаданием в другой период. И не забыть отключить этот механизм в момент обмена.
21 fisher
 
15.04.15
15:14
(20) С этим придется разбираться в любом из вариантов.
22 drkovalex
 
15.04.15
15:19
(19) в контексте моей задачи параллельное проведение не актуально. P.S. Да не так уж я и молод, грабли раскладываю продуманно :D

(20) вот это тоже ценное замечание!
23 fisher
 
15.04.15
15:24
(22) Был бы опытен, то знал бы - пути удачных решений и конфигураций неисповедимы. А так остается надеяться, что твоя поделка не пойдет дальше твоего ларька, который так никогда и не вырастет в нечто большее.
24 ЧеловекДуши
 
15.04.15
15:45
(20) Самое страшно, это один и тот же номер под двум документам у разных пользователей в один момент.

...А еще самое не адекватное в таком, требование заказчика, соблюдение 100% порядка в нумерации :)
25 ЧеловекДуши
 
15.04.15
15:47
(22) Почитай, просветись https://ru.wikipedia.org/wiki/Закон_Мерфи
26 ЧеловекДуши
 
15.04.15
15:47
(25) когда заказчик сулит о том, что никто не будет параллельно работать с документом, то перед вами недалекий человек :)
27 drkovalex
 
15.04.15
16:16
(23) а давайте будем без оскорблений и переходов на личности обсуждать существо вопроса, хорошо?

Я посмотрел в разделе Уровни изоляции транзакций, считаю что READ COMMITED будет для решения моей задачи достаточно.
Укажите, если я не прав.
28 fisher
 
15.04.15
16:50
(27) По существу - проще решать через префиксы и стандартную нумерацию. Минимум усилий, максимум эффекта.
Достаточно в каком смысле и при какой схеме автонумерации? Две параллельные транзакции спокойно прочитают один и тот же последний номер.
29 drkovalex
 
15.04.15
18:11
(28) благодарю, за подсказку, попробовал сделать через префиксы - в принципе, приемлемо. Потом, да вырезать

Если кому пригодится, следуем плану:
1. Создать в подписках на события новый элемент.
2. Элемент закрепить за нужным источником (в моём случае это Документ, событие ПриУстановкеНовогоНомера).
3. В обработчике пишем следующий код:

ТекущаяДата = ТекущаяДата();

// Получить и обработать значение константы (тип данных Дата, вычленить месяц и день)
ЗначениеКонстанты = Константы.КонстантаНачалоНовогоПериодаНумерацииСправок.Получить();
ГраницаПериода = Дата(Год(ТекущаяДата), Месяц(ЗначениеКонстанты), День(ЗначениеКонстанты));

// По умолчанию, находимся в пределах текущего периода
ГодНачалаПериода = Год(ГраницаПериода);

// Проверить, пора ли обновить префикс для нового периода
Если ТекущаяДата >= ГраницаПериода Тогда
  ГодНачалаПериода = ГодНачалаПериода + 1;
КонецЕсли;

// Сформировать префикс документа вида "МСХХХХ "
Префикс = "МС" + Формат(ГодНачалаПериода, "ЧГ=0") + " ";
30 Bell
 
16.04.15
15:03
(0) На всех версиях использовали и используем нумератор формата  ГГММДДххх, проблем не возникает.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн