Есть обработка, которой загружаем накладные в базу, предварительно выгруженные в файл из идентичных конфигураций, подскажите что поправить в коде обработки загрузки, чтобы номер загружаемого документа был не указанный в файле, а присваивался следующий по порядку в текущей базе.
Ниже код
Ниже код
Функция ЗаполнитьСписокЗначений(Стр)
Сп = СоздатьОбъект("СписокЗначений");
Пока 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 Тогда
ДокВН.Товар = СпрНом.ТекущийЭлемент();
Иначе
ДокВН.Товар = "";
КонецЕсли;
ДокВН.Количество = Количество;
ДокВН.ЦенаРозничная = ЦенаРозничная;
ДокВН.СуммаРозничная = СуммаРозничная;
ДокВН.ЦенаОптовая = ЦенаОптовая;
ДокВН.СуммаОптовая = СуммаОптовая;
ДокВН.Вес = Вес;
КонецЕсли;
КонецЦикла;
ДокВН.Записать();
ДокВН.Провести();
Если Ответ="Нет" Тогда
Сообщить("Загрузка отменена пользователем: "+ИмяПользователя());
Возврат;
Иначе
Предупреждение("Загрузка завершена! Загружено: "+СчДок+" документов.");
КонецЕсли;
КонецПроцедуры
ПоказатьПо теме из базы знаний
- Переходим на БП 3.0. Мой вариант
- Обмен документами Поступления-Реализации и Счетами-фактурами в базах 1С Бухгалтерия 8.2, 8.3 с возможностью преобразования
- Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2/3.0
- Загрузка документов из Excel в 1С: УПД, ТОРГ-12, отчеты маркетплейсов, заказы, счета, прайсы
- Распознавание и загрузка сканов в 1С "одним нажатием". УПД, ТОРГ-12, накладные, счета, номенклатура, заказы и т.д.
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
ДокВН.УстановитьНовыйНомер();
УстановитьНовыйНомер(<?>);
Синтаксис:
УстановитьНовыйНомер(<Префикс>)
Назначение:
Установить новый номер документа с заданным префиксом.
Параметры:
<Префикс> - строка с префиксом номера документа.
УстановитьНовыйНомер(<?>);
Синтаксис:
УстановитьНовыйНомер(<Префикс>)
Назначение:
Установить новый номер документа с заданным префиксом.
Параметры:
<Префикс> - строка с префиксом номера документа.
(2)
Изменил на ДокВН.НомерДок = ДокВН.УстановитьНовыйНомер("Цск");
выдаёт ошибку
Обращение к процедуре объекта как к функции (УстановитьНовыйНомер)
Если же в базе есть такой документ с таким же номером как в файле, то обработка документ в базе просто заменяет документом из файла.
Изменил на ДокВН.НомерДок = ДокВН.УстановитьНовыйНомер("Цск");
выдаёт ошибку
Обращение к процедуре объекта как к функции (УстановитьНовыйНомер)
Если же в базе есть такой документ с таким же номером как в файле, то обработка документ в базе просто заменяет документом из файла.
Достаточно закомментировать строки
Только если нумерация будет идти согласно текущей базы данных, то теряется смысл в поиске документа по его номеру из загружаемой БД. Я бы сказал, что это нанесет вред уже существующим документам при условии совпадения номеров.
ДокВН.НомерДок = НомерДок;
Только если нумерация будет идти согласно текущей базы данных, то теряется смысл в поиске документа по его номеру из загружаемой БД. Я бы сказал, что это нанесет вред уже существующим документам при условии совпадения номеров.
Закоментировал
Присваивается следующий порядковый номер с префиксом из файла, мне нужен следующий порядковый номер с префиксом Цск. И ещё заметил, если в базе есть такой документ с таким же номером как в файле, то обработка документ в базе просто заменяет документом из файла.
ДокВН.НомерДок = НомерДок;
Присваивается следующий порядковый номер с префиксом из файла, мне нужен следующий порядковый номер с префиксом Цск. И ещё заметил, если в базе есть такой документ с таким же номером как в файле, то обработка документ в базе просто заменяет документом из файла.
(8) ну вы же просили. чтобы было "сам присваивал следующий номер" - вот он и присваивает. а так как особо умные ручками влезли в нумерацию документов то варианта всего два
1. и дальше нумеровать ручками
2. привести существующую нумерацию к виду, позволяющему работать шататным типовым механизмам нумерации.
подсказка.
если где-то есть номер типа
ЧтоТоНечисловое1
то после Чтотонечисловое9
(мы видим что под числовую часть номер отведена ОДНА позиция)
будет нихрена не
Чтотонечисловое10 - нолик не влазит, это втроая числовая позиция, а под номер всего олдна
получится
Чтотонечисловое1
результат - номер неуникальный. ССЗБ
1. и дальше нумеровать ручками
2. привести существующую нумерацию к виду, позволяющему работать шататным типовым механизмам нумерации.
подсказка.
если где-то есть номер типа
ЧтоТоНечисловое1
то после Чтотонечисловое9
(мы видим что под числовую часть номер отведена ОДНА позиция)
будет нихрена не
Чтотонечисловое10 - нолик не влазит, это втроая числовая позиция, а под номер всего олдна
получится
Чтотонечисловое1
результат - номер неуникальный. ССЗБ
(9) Если я не ошибаюсь, ниже часть кода из этого документа, который присваивает номер:
Процедура ВыборНомераДокумента()
Док = СоздатьОбъект("Документ.РасходнаяНакладнаяВнутр");
Док.ОбратныйПорядок(1);
Док.ВыбратьДокументы(НачГода(ТекущаяДата()),ТекущаяДата());
ДокументОбнаружен = 0;
ПоследнийНомерДокумента = 0;
Если ФлагНовогоДокумента <> 1 Тогда
Если Лев(НачальныйНомерДокумента,3)=СокрЛП(МестоХранения.Код) Тогда
НомерДок = НачальныйНомерДокумента;
Возврат;
КонецЕсли;
КонецЕсли;
Пока Док.ПолучитьДокумент()>0 Цикл
Если Лев(Док.НомерДок,3)<>СокрЛП(МестоХранения.Код) Тогда
Продолжить;
КонецЕсли;
ДокументОбнаружен = 1;
ТекущийНомерДокумента = Число(Прав(Док.НомерДок,7));
Если ТекущийНомерДокумента > ПоследнийНомерДокумента Тогда
ПоследнийНомерДокумента = ТекущийНомерДокумента;
КонецЕсли;
КонецЦикла;
Если ДокументОбнаружен = 1 Тогда
НовыйНомДок = Число(ПоследнийНомерДокумента)+1;
НомерДок = МестоХранения.Код + Лев("0000000",7-СтрДлина(Строка(НовыйНомДок)))+Строка(НовыйНомДок);
Иначе
НовыйНомДок = 1;
НомерДок = МестоХранения.Код + Лев("0000000",7-СтрДлина(Строка(НовыйНомДок)))+Строка(НовыйНомДок);
КонецЕсли;
КонецПроцедуры
Показать
Вроде бы разобрался, префикс нужно было указать ЦСк (первые буквы заглавные). Есть ещё один нюанс. В некоторых случаях можно (даже нужно) загружать номер документа из файла не изменяя его, в случае если в документе из файла указан определённый "Получатель", если другие "Получатель" то присваивать номер как обсуждали выше.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот