Консультация № 168931
04.06.2009, 12:22
0.00 руб.
0 1 1
Приветствую всех. Бух77.Организована реализация талонов на бензин по штрихкоду, в него вошли номер контрагента 3 знака, номерТМЦ 2 знака, вид талона 2 знака, номер талона 5 знаков и последний по EAN, дошли 5 знаков номера талона до 99999, а дальше мне нужно чтобы опять начались с №1, по 80000 уже из программы удалены, с 80000 по 99999 еще используются их пока удалять нельзя, а справочник естественно пишет следующий после 99999

Приложение:
Процедура ЗаполнитьИзДокумента()
Ответ=Вопрос("Пред заполнением таблица будет очищена, очистить список талонов?","Да+Нет",30);
Если Ответ ="Да" Тогда
Талоны.УдалитьСтроки();
ИначеЕсли Ответ = "Нет" Тогда
СтатусВозврата(0);
Возврат;
EndIf;

СпрТалоны=CreateObject("Справочник.Талоны");

СпрТалоны.ПорядокКодов();
СпрТалоны.Новый();
_СледНомерТалонов=СпрТалоны.Код;
If ТипЗначения(_СледНомерТалонов)=2 Then
_СледНомерТалонов=Число(_СледНомерТалонов);
EndIf;
ТекДокум.ВыбратьСтроки();
While ТекДокум.ПолучитьСтроку()=1 Do
If ТекДокум.Количество>0 Then
ВсеПокаОк=1;
Else
ВсеПокаОк=0;
DoMessageBox("Не установлено количество!!!");
EndIf;
If ТекДокум.ВидТалона.Выбран()=1 Then
ВсеПокаОк=1;
Else
ВсеПокаОк=0;
DoMessageBox("Не выбран вид талона!!!");
EndIf;
If ВсеПокаОк=1 Then
If ТекДокум.ВидТалона.Кратность>0 Then
Else
ВсеПокаОк=0;
DoMessageBox("Необходимо установить кратность в виде талона "+ТекДокум.ВидТалона.Наименование);
EndIf;
EndIf;
If ВсеПокаОк=1 Then
КолТалонов=ТекДокум.Количество/ТекДокум.ВидТалона.Кратность;
ЦелКолТалонов=Цел(КолТалонов);
If ЦелКолТалонов=КолТалонов Then
Else
ВсеПокаОк=0;
DoMessageBox("Неверно выбран вид талона! "+ТекДокум.ВидТалона.Наименование);
EndIf;
EndIf;
If ВсеПокаОк=1 Then
_НачНомерТалонов=_СледНомерТалонов;
_КонНомерТалонов=_НачНомерТалонов+КолТалонов-1;
If КолТалонов>0 Then
For КолТал=_НачНомерТалонов To _КонНомерТалонов Do
СтрокаКолТал=глДополнитьСтрокуЛ(Строка(КолТал),"0",4);
СтрокаКонтр=глДополнитьСтрокуЛ(Строка(ТекДокум.Контрагент.Артикул),"0",4);
СтрокаТМЦ=глДополнитьСтрокуЛ(Строка(ТекДокум.ТМЦ.Артикул),"0",2);
_ШтрихКод=СтрокаКонтр+СтрокаТМЦ+ТекДокум.ВидТалона.Код+СтрокаКолТал;
_ШтрихКодЕАН=глКонтрольныйСимволEAN(_Штрихкод, 13);
_ШтрихКод=_ШтрихКод+_ШтрихКодЕАН;

Талоны.НоваяСтрока();
ТекСтрока=Талоны.КоличествоСтрок();
Талоны.УстановитьЗначение(ТекСтрока,1,ТекДокум.Контрагент.Наименование);
Талоны.УстановитьЗначение(ТекСтрока,2,ТекДокум.ТМЦ);
Талоны.УстановитьЗначение(ТекСтрока,3,ТекДокум.ВидТалона);
Талоны.УстановитьЗначение(ТекСтрока,4,КолТал);
Талоны.УстановитьЗначение(ТекСтрока,5,_ШтрихКод);
Талоны.УстановитьЗначение(ТекСтрока,11,ТекДокум.Цена);//=================N==================

Обсуждение

Неизвестный
04.06.2009, 17:26
общий
это ответ
Здравствуйте, Провоторов Николай Владимирович.

Навскидку, самый простой вариант - это увеличить длину кода. Но если увеличить разрядность номера нельзя и стоит задача нумеровать с начала, сделайте следующее:

  • Создайте константу, определяющую последний номер чека, например, НомерТалона.
  • При создании нового талона проверяйте значение константы, добавляйте единицу к этому номеру и присваивайте код. Также при этом необходимо увеличивать на единицу и значение константы.
  • Такую процедуру назначения номеров необходимо вставить во все модули, где создается новый талон


Запись нужно делать в транзакции, тогда есть гарантия того, что больше никто не изменит счетчик номеров и не запишет новый элемент. Дополнительно это отсеивает ошибку записи к записи элемента с одинаковым кодом (например ,два пользователя начали формировать талоны - оба прочитали значение константы, оба добавили по единице и получили один и тот же код.
Вот пример кода:
Код:

...
НачатьТранзакцию();
ЕстьОшибки=1; // Флаг ошибок
Пока ЕстьОшибки=1 Цикл
НомерТалона = Константа.НомерТалона;
СпрТалоны.Код = НомерТалона;
Попытка
СпрТалоны.Записать();
ЕстьОшибки=0;
Исключение
Если ОписаниеОшибки()="Код не уникальный!" Тогда
НомерТалона=НомерТалона+1;
Константа.НомерТалона = НомерТалона;
Иначе //ОписаниеОшибки()="Код не уникальный!"
// другая ошибка -написать обработкик для этой тошибки
КонецЕсли; //ОписаниеОшибки()="Код не уникальный!"
КонецПопытки;
КонецЦикла;
ЗафиксироватьТранзакцию();
...


Если возникнут вопросы - можем продолжить в мини-форуме.

Успехов!
С уважением, Владимир.
4
Приношу извинения, обстоятельства, у клиентов (IT-пожар), тушил. О моем вопросе, может быть вы не совсем поняли меня. Имеется док. реализ. талонов, из него открывается обработка, которая заполняется из документа и формирует штрихкод, только 13 цифр, КодКонтрагента 4 знака, КодТМЦ 2 знака, ВидТалона 1 знак, Код талона-5 знаков и контрольный EAN 1 знак, при сохранении сформированного списка->заполняется справочник талонов, где записываются только коды талонов из 5 знаков, при достижении кода следующего за 99999 справочник отказывается записывать элемент из-за неуникальности номера, мне нужно, чтобы при достижении кода 99999 програмно справочник начинал код талона с №1 или еще интересней, со свободного самого малого
Форма ответа