gifts2017

Подбор свободного кода справочника "Номенклатура" без захвата одного и того же кода несколькими операторами.

Опубликовал Rusk (Rusk51) в раздел Программирование - Практика программирования

При использовании в справочнике Номенклатура конструкции подбора не занятых кодов менее максимального, при работе нескольких операторов возникла проблема захвата одного и того же кода, если не использовать Записать() при создании нового элемента.

Моё решение:

//==================================================================================
Процедура ВводНового(ПризнКопирования)             
    Спр = СоздатьОбъект("Справочник.Номенклатура"); 
    ФП = СоздатьОбъект("Текст");
    ТабКод = СоздатьОбъект("ТаблицаЗначений");
    ТабКод.НоваяКолонка("КодНом","Число");
    Файл = ФС.НайтиПервыйФайл(КаталогИБ()+"*.nomer"); 
    Пока   ПустаяСтрока(Файл) = 0 цикл
        ТабКод.НоваяСтрока();
        ТабКод.КодНом     = Число(СокрЛП(Лев(Файл,СтрДлина(СокрЛП(Файл))-6))); 
        Файл              = ФС.НайтиСледующийФайл();
    КонецЦикла;
    Если ТабКод.КоличествоСтрок() > 0  Тогда 
        ТабКод.ВыбратьСтроки();
        Пока ТабКод.ПолучитьСтроку() = 1 Цикл 
            КН = Число(ТабКод.КодНом); 
        КонецЦикла;  
    Иначе
        КН = 0;
    КонецЕсли;
    Для К = КН + 1 ПО 99999 Цикл 
        Если (Спр.НайтиПоКоду(К) = 0)Тогда 
            Код=К; 
            Прервать; 
        КонецЕсли; 
    КонецЦикла;
    ФП.Записать(КаталогИБ()+Код+".nomer"); 
КонецПроцедуры
//=========================================================================================================================

В конец процедур ПриЗаписи() и ПриЗакрытии()  вставляем:

ФС.УдалитьФайл(КаталогИБ()+Код+".nomer");

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Альтаир (Altair777) 05.11.10 17:06
(0) А зачем в ПриЗакрытии()?
2. Rusk (Rusk51) 05.11.10 17:19
(1)На случай отмены ввода нового.
3. Аркадий Кучер (Abadonna) 07.11.10 08:03
кхм....
Процедура ПрисвоитьНовыйКод(пКод) 
	Спр=СоздатьОбъект("Справочник."+Вид());
	Для А=пКод По пКод+1000 Цикл
		Если (Спр.НайтиПоКоду(А)=1) И (Спр.ТекущийЭлемент()<>ТекущийЭлемент())  Тогда   
			// если такой есть и это ДРУГОЙ элемент
			Сообщить("Код " +А+" был занят","!");
			Продолжить;            
		Иначе 
			Код=А;
			Записать();     
			Сообщить("Записан с кодом "+А,"i");  
			Прервать;  
		КонецЕсли;
	КонецЦикла; 
КонецПроцедуры

Процедура ПриЗаписи() 
	ПрисвоитьНовыйКод(Число(Код));
КонецПроцедуры
...Показать Скрыть
Прикрепленные файлы:
4. Rusk (Rusk51) 08.11.10 11:53
(3) а при отмене ввода нового что делать?
5. Аркадий Кучер (Abadonna) 08.11.10 12:00
(4) А ничего не делать. Он просто не запишется, ибо ПрисвоитьНовыйКод(Число(Код)) не сработает. Я никогда не кладу код, который не проверяю;)
6. Rusk (Rusk51) 08.11.10 12:00
(3) Если использовать процедуру ПриЗаписи() то и огород городить не надо
7. Rusk (Rusk51) 08.11.10 12:02
только как вы присвоите штрих код весовому?
8. Аркадий Кучер (Abadonna) 08.11.10 12:03
(6) Что-то я тебя не понял тогда... Проблема была в том, что при вводе нового получался один код у операторов сразу? Так? Ну и пусть себе появляется, а при записи они расположатся по порядку кодов: кто быстрее нажать успел
P.S. Ну и штрих при записи присвоить можно. Правда, тут я не спец: никогда розницей не занимался ;)
9. Alexander Nick (nickkey) 28.09.11 13:49
Разрабатывал конфиг с нуля пригодилось