Присвоение номера документа при загрузке

1. antares2010 03.11.16 13:11 Сейчас в теме
Есть обработка, которой загружаем накладные в базу, предварительно выгруженные в файл из идентичных конфигураций, подскажите что поправить в коде обработки загрузки, чтобы номер загружаемого документа был не указанный в файле, а присваивался следующий по порядку в текущей базе.

Ниже код


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

Процедура ВыбратьФайл()    
	
	Перем Каталог;          
	
	ИмяФайла = СокрЛП(ФайлЗагрузки);
	
	Каталог = "C:\";
	
	Если ФС.ВыбратьФайл(0, ИмяФайла, Каталог, "Выберите файл", "Текстовые (*.txt) |*.txt|Все файлы (*.*) |*.*")=1 Тогда
		ФайлЗагрузки=Каталог+ИмяФайла;
	КонецЕсли;
	
КонецПроцедуры      
//*******************************************

Процедура ОткрытьФайл()
	
	ИмяФайла = СокрЛП(ФайлЗагрузки);
	
	Текст=СоздатьОбъект("Текст");
	Текст.КодоваяСтраница(0);
	
	Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда
		Текст.Открыть(ИмяФайла);
		Текст.Показать("Файл",ИмяФайла);
	Иначе
		Предупреждение("Указанный файл не существует");
	КонецЕсли;
	
КонецПроцедуры

//*******************************************
Процедура Загрузить()
   	
	ДокВН = СоздатьОбъект("Документ.РасходнаяНакладнаяВнутр");
    
	СпрМХ = СоздатьОбъект("Справочник.МестаХранения");
	
	СпрНом = СоздатьОбъект("Справочник.Номенклатура");
	
	СпРекв = СоздатьОбъект("СписокЗначений");
	
	Текст = СоздатьОбъект("Текст");
	
	Текст.КодоваяСтраница(0);
	
	Если ФС.СуществуетФайл(СокрЛП(ФайлЗагрузки)) = 1 Тогда
		Текст.Открыть(СокрЛП(ФайлЗагрузки));
	Иначе
		Предупреждение("Указанный файл не существует");
	КонецЕсли;
	СчДок = 0;
	Сч = 0;
	Стр = "";
	
	Для Сч=1 По Текст.КоличествоСтрок() Цикл
		
		Стр = Текст.ПолучитьСтроку(Сч);
		
		Стр = СтрЗаменить(Стр,",","$");
		Стр = СтрЗаменить(Стр,"|",",");
		
		СпРекв = ЗаполнитьСписокЗначений(Стр);
		
		Если (СпРекв.РазмерСписка()=5) И (Лев(СпРекв.ПолучитьЗначение(1),1)="#") Тогда
			
			Ответ = Вопрос("Файл: "+ФайлЗагрузки+" включает документы: "+СпРекв.ПолучитьЗначение(2)+" за период с: "+СпРекв.ПолучитьЗначение(3)+"-"+СпРекв.ПолучитьЗначение(4)+" по месту отгрузки: "+СпРекв.ПолучитьЗначение(5)+". Загрузить?","Да+Нет");
			Если Ответ="Нет" Тогда
				Прервать;
			КонецЕсли;
			
		ИначеЕсли (СпРекв.РазмерСписка()=7) И (Лев(СпРекв.ПолучитьЗначение(1),1)="*") Тогда
			
			Если Сч>2 Тогда  // т.е. если текущий док-т не первый - записываем и проводим предшествующий документ
				ДокВН.Записать();
				ДокВН.Провести();
				СчДок = СчДок + 1;
			КонецЕсли;
			
			НомерДок = СпРекв.ПолучитьЗначение(2);
			ДатаДок =  Дата(СпРекв.ПолучитьЗначение(3));
			
			Если СпрМХ.НайтиПоНаименованию(СпРекв.ПолучитьЗначение(4),0,1)=1 Тогда
				МестоХранения = СпрМХ.ТекущийЭлемент();
			Иначе
				МестоХранения = "";
			КонецЕсли;                                
			
			Если СпрМХ.НайтиПоНаименованию(СпРекв.ПолучитьЗначение(6),0,1)=1 Тогда
				Получатель = СпрМХ.ТекущийЭлемент();
			Иначе
				Получатель = "";
			КонецЕсли;
			
			Если ДокВН.НайтиПоНомеру(НомерДок,ДатаДок)=1 Тогда
				ДокВН.СделатьНеПроведенным(); 
				ДокВН.НомерДок = НомерДок;
				ДокВН.ДатаДок = ДатаДок;
				ДокВН.МестоХранения = МестоХранения;
				ДокВН.Получатель = Получатель;
				ДокВН.УдалитьСтроки();
			Иначе
				ДокВН.Новый();
				ДокВН.НомерДок = НомерДок;
				ДокВН.ДатаДок = ДатаДок;
				ДокВН.МестоХранения = МестоХранения;
				ДокВН.Получатель = Получатель;
				
			КонецЕсли;
			
		ИначеЕсли СпРекв.РазмерСписка()=8 Тогда
			КодТовара = СпРекв.ПолучитьЗначение(1);
			НаимТовара = СпРекв.ПолучитьЗначение(2);
			Количество = СпРекв.ПолучитьЗначение(3);
			ЦенаРозничная = СпРекв.ПолучитьЗначение(4);
			СуммаРозничная = СпРекв.ПолучитьЗначение(5);
			ЦенаОптовая = СпРекв.ПолучитьЗначение(6);
			СуммаОптовая = СпРекв.ПолучитьЗначение(7);
			Вес = СпРекв.ПолучитьЗначение(8);
			
			ДокВН.НоваяСтрока();
			Если СпрНом.НайтиПоКоду(КодТовара,0)=1 Тогда
				ДокВН.Товар = СпрНом.ТекущийЭлемент();
			ИначеЕсли СпрНом.НайтиПоКоду(НаимТовара,0)=1 Тогда
				ДокВН.Товар = СпрНом.ТекущийЭлемент();
			Иначе
				ДокВН.Товар = "";
			КонецЕсли;	
			
			ДокВН.Количество 		= Количество;
			ДокВН.ЦенаРозничная 	= ЦенаРозничная;
			ДокВН.СуммаРозничная 	= СуммаРозничная;
			ДокВН.ЦенаОптовая 		= ЦенаОптовая;
			ДокВН.СуммаОптовая 		= СуммаОптовая;
			ДокВН.Вес 				= Вес;
			
		КонецЕсли;	
	КонецЦикла;
	ДокВН.Записать();
	ДокВН.Провести();
	Если Ответ="Нет" Тогда
		Сообщить("Загрузка отменена пользователем: "+ИмяПользователя());
		Возврат;
	Иначе
		Предупреждение("Загрузка завершена! Загружено: "+СчДок+" документов.");
	КонецЕсли;
	
КонецПроцедуры


Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. citicat 119 03.11.16 13:35 Сейчас в теме
ДокВН.УстановитьНовыйНомер();

УстановитьНовыйНомер(<?>);
Синтаксис:
УстановитьНовыйНомер(<Префикс>)
Назначение:
Установить новый номер документа с заданным префиксом.
Параметры:
<Префикс> - строка с префиксом номера документа.
6. antares2010 07.11.16 11:34 Сейчас в теме
(2)
Изменил на ДокВН.НомерДок = ДокВН.УстановитьНовыйНомер("Цск");

выдаёт ошибку

Обращение к процедуре объекта как к функции (УстановитьНовыйНомер)

Если же в базе есть такой документ с таким же номером как в файле, то обработка документ в базе просто заменяет документом из файла.

7. YNik 07.11.16 12:16 Сейчас в теме
(6), надо просто:
ДокВН.УстановитьНовыйНомер("Цск");
15. antares2010 10.11.16 13:01 Сейчас в теме
Разобрался, надо так

Если СокрЛП(СпРекв.ПолучитьЗначение(6)) = "Магазин" Тогда
16. Slypower 2 10.11.16 15:32 Сейчас в теме
(15) или так:
Получатель= СокрЛП(СпРекв.ПолучитьЗначение(6));
Если Получатель="Магазин" Тогда
    ДокВН.НомерДок = НомерДок;
иначе
    ДокВН.УстановитьНовыйНомер("ЦСК");
КонецЕсли;  
3. Harry_udm 2 06.11.16 15:12 Сейчас в теме
Достаточно закомментировать строки
ДокВН.НомерДок = НомерДок;

Только если нумерация будет идти согласно текущей базы данных, то теряется смысл в поиске документа по его номеру из загружаемой БД. Я бы сказал, что это нанесет вред уже существующим документам при условии совпадения номеров.
antares2010; +1 Ответить
4. imax26 91 07.11.16 02:35 Сейчас в теме
УстановитьНовыйНомер не всегда корректно работает . Например, нумератор назначен "все документы", и с начала года он не сбросится на 1.
Я обычно пишу некую самописанную процедуру
5. antares2010 07.11.16 09:01 Сейчас в теме
Закоментировал

ДокВН.НомерДок = НомерДок;


Присваивается следующий порядковый номер с префиксом из файла, мне нужен следующий порядковый номер с префиксом Цск. И ещё заметил, если в базе есть такой документ с таким же номером как в файле, то обработка документ в базе просто заменяет документом из файла.
8. antares2010 07.11.16 12:43 Сейчас в теме
выдаёт Номер не уникальный!
9. CheBurator 3121 08.11.16 04:01 Сейчас в теме
(8) ну вы же просили. чтобы было "сам присваивал следующий номер" - вот он и присваивает. а так как особо умные ручками влезли в нумерацию документов то варианта всего два
1. и дальше нумеровать ручками
2. привести существующую нумерацию к виду, позволяющему работать шататным типовым механизмам нумерации.

подсказка.
если где-то есть номер типа
ЧтоТоНечисловое1
то после Чтотонечисловое9
(мы видим что под числовую часть номер отведена ОДНА позиция)
будет нихрена не
Чтотонечисловое10 - нолик не влазит, это втроая числовая позиция, а под номер всего олдна
получится
Чтотонечисловое1
результат - номер неуникальный. ССЗБ
10. antares2010 08.11.16 08:05 Сейчас в теме
(9) Да, возможно Вы правы. Но, когда создаем вручную новый документ в базе, номер присваивается правильно автоматически.
11. antares2010 08.11.16 08:09 Сейчас в теме
(9) Если я не ошибаюсь, ниже часть кода из этого документа, который присваивает номер:
Процедура ВыборНомераДокумента()
	Док = СоздатьОбъект("Документ.РасходнаяНакладнаяВнутр");
	Док.ОбратныйПорядок(1);
	Док.ВыбратьДокументы(НачГода(ТекущаяДата()),ТекущаяДата());
	ДокументОбнаружен = 0;
	ПоследнийНомерДокумента = 0; 
	Если ФлагНовогоДокумента <> 1 Тогда
		Если Лев(НачальныйНомерДокумента,3)=СокрЛП(МестоХранения.Код) Тогда
			НомерДок = НачальныйНомерДокумента;			
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	Пока Док.ПолучитьДокумент()>0 Цикл
		Если Лев(Док.НомерДок,3)<>СокрЛП(МестоХранения.Код) Тогда
			Продолжить;
		КонецЕсли;
	    ДокументОбнаружен = 1;
		ТекущийНомерДокумента = Число(Прав(Док.НомерДок,7));
		Если ТекущийНомерДокумента > ПоследнийНомерДокумента Тогда
		    ПоследнийНомерДокумента = ТекущийНомерДокумента;
		КонецЕсли;
		
		
	КонецЦикла;	              
	Если ДокументОбнаружен = 1 Тогда
		НовыйНомДок = Число(ПоследнийНомерДокумента)+1;
		НомерДок = МестоХранения.Код + Лев("0000000",7-СтрДлина(Строка(НовыйНомДок)))+Строка(НовыйНомДок);
	Иначе
		НовыйНомДок = 1;
		НомерДок = МестоХранения.Код + Лев("0000000",7-СтрДлина(Строка(НовыйНомДок)))+Строка(НовыйНомДок);
	КонецЕсли;
	
КонецПроцедуры
Показать
12. CheBurator 3121 08.11.16 23:43 Сейчас в теме
(11) И что? какая-то самописная база, какой-то самописный код. Вполне м.б. даже нумерацию создает корректно.
в загрузку доков скопипастите код из документа (когда вручном вводе номер создается правильно). адаптируйте его и наслаждайтесь.
13. antares2010 09.11.16 06:55 Сейчас в теме
Вроде бы разобрался, префикс нужно было указать ЦСк (первые буквы заглавные). Есть ещё один нюанс. В некоторых случаях можно (даже нужно) загружать номер документа из файла не изменяя его, в случае если в документе из файла указан определённый "Получатель", если другие "Получатель" то присваивать номер как обсуждали выше.
14. antares2010 10.11.16 12:01 Сейчас в теме
Делаю так:

Если Получатель="Магазин" Тогда
    ДокВН.НомерДок = НомерДок;
иначе
    ДокВН.УстановитьНовыйНомер("ЦСК");
КонецЕсли;        


не работает
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот