Проблема с поиском по коду 1с 8.2 Ут 10.3
Есть номенклатура в УТ 10.3 загруженная, есть ексель файл, в котором 900 позиций номенклатуры, нужно сделать обработку синхронизации данных из екселя и номенклатуры, если синхронизация есть, то записываем в созданный заранее РС. все вроде получилось, но из 900 позиций записалось только 881, то есть 19 не записались, начал разбираться в чем дело, оказалось, что в номенклатуре у некоторых элементов, которые не прошли синхронизацию код следующего вида:
123456(пробел)(пробел)(пробел)
а в экселе записано просто как 123456 без пробела, и в итоге программа ищет 123456, находит 123456(пробел)(пробел) и не выдает соответствия, как убрать эти пробелы у самой уже номенклатуры? сокр не подходит(
вот код:
НомерЛиста = 1;
Попытка
Док = новый COMОбъект("Excel.Application");
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Док.Workbooks.Open(ПутьКФайлу);
Док.Sheets(НомерЛиста).select();
Версия = Лев(Док.Version,Найти(Док.Version,".")-1);
Если Версия = "8" тогда
ФайлСтрок = Док.Cells.CurrentRegion.Rows.Count;
ФайлКолонок = Макс(Док.Cells.CurrentRegion.Columns.Count, 13);
Иначе
ФайлСтрок = Док.Cells(1,1).SpecialCells(11).Row;
ФайлКолонок = Док.Cells(1,1).SpecialCells(11).Column;
КонецЕсли;
НомерКолонкиКодаТовара = 3;
НомерКолонкиНаименованияТовара = 2;
НомерКолонкиИдентефикатораТовар = 4;
НомерКолонкиКодаТовараИз8рки = 7;
Для а = 2 по ФайлСтрок -1 Цикл
КодТовара = СокрЛП(Док.Cells(а,НомерКолонкиКодаТовара).Value);
КодТовара = Формат(Число(КодТовара), "ЧН=0; ЧГ=0");
НаименованиеТовара = СокрЛП(Док.Cells(а,НомерКолонкиНаименованияТовара).Value);
Идентификатор = СокрЛП(Док.Cells(а,НомерКолонкиИдентефикатораТовар).Value);
Код8ки = Строка(Док.Cells(а,НомерКолонкиКодаТовараИз8рки).Value);
Код8ки = ДобавитьНули(Код8ки, 8);
Товар = Справочники.Номенклатура.НайтиПоКоду(Код8ки);
Если НЕ Товар = Справочники.Номенклатура.ПустаяСсылка() Тогда
НовоеСоответствиеОбъектов = РегистрыСведений.ттСоответствиеОбъектов.СоздатьМенеджерЗаписи();
НовоеСоответствиеОбъектов.Идентификатор = Идентификатор;
НовоеСоответствиеОбъектов.Прочитать();
Если НЕ НовоеСоответствиеОбъектов.Выбран() Тогда
НовоеСоответствиеОбъектов.Идентификатор = Идентификатор;
КонецЕсли;
НовоеСоответствиеОбъектов.Код77 = КодТовара;
НовоеСоответствиеОбъектов.НомерБазы = НомерБазы;
НовоеСоответствиеОбъектов.Наименование77 = НаименованиеТовара;
НовоеСоответствиеОбъектов.Ссылка = Товар;
Попытка
НовоеСоответствиеОбъектов.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Товар " + НаименованиеТовара + " не найден");
КонецЕсли;
КонецЦикла;
Док.ActiveWorkbook.Close();
123456(пробел)(пробел)(пробел)
а в экселе записано просто как 123456 без пробела, и в итоге программа ищет 123456, находит 123456(пробел)(пробел) и не выдает соответствия, как убрать эти пробелы у самой уже номенклатуры? сокр не подходит(
вот код:
НомерЛиста = 1;
Попытка
Док = новый COMОбъект("Excel.Application");
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Док.Workbooks.Open(ПутьКФайлу);
Док.Sheets(НомерЛиста).select();
Версия = Лев(Док.Version,Найти(Док.Version,".")-1);
Если Версия = "8" тогда
ФайлСтрок = Док.Cells.CurrentRegion.Rows.Count;
ФайлКолонок = Макс(Док.Cells.CurrentRegion.Columns.Count, 13);
Иначе
ФайлСтрок = Док.Cells(1,1).SpecialCells(11).Row;
ФайлКолонок = Док.Cells(1,1).SpecialCells(11).Column;
КонецЕсли;
НомерКолонкиКодаТовара = 3;
НомерКолонкиНаименованияТовара = 2;
НомерКолонкиИдентефикатораТовар = 4;
НомерКолонкиКодаТовараИз8рки = 7;
Для а = 2 по ФайлСтрок -1 Цикл
КодТовара = СокрЛП(Док.Cells(а,НомерКолонкиКодаТовара).Value);
КодТовара = Формат(Число(КодТовара), "ЧН=0; ЧГ=0");
НаименованиеТовара = СокрЛП(Док.Cells(а,НомерКолонкиНаименованияТовара).Value);
Идентификатор = СокрЛП(Док.Cells(а,НомерКолонкиИдентефикатораТовар).Value);
Код8ки = Строка(Док.Cells(а,НомерКолонкиКодаТовараИз8рки).Value);
Код8ки = ДобавитьНули(Код8ки, 8);
Товар = Справочники.Номенклатура.НайтиПоКоду(Код8ки);
Если НЕ Товар = Справочники.Номенклатура.ПустаяСсылка() Тогда
НовоеСоответствиеОбъектов = РегистрыСведений.ттСоответствиеОбъектов.СоздатьМенеджерЗаписи();
НовоеСоответствиеОбъектов.Идентификатор = Идентификатор;
НовоеСоответствиеОбъектов.Прочитать();
Если НЕ НовоеСоответствиеОбъектов.Выбран() Тогда
НовоеСоответствиеОбъектов.Идентификатор = Идентификатор;
КонецЕсли;
НовоеСоответствиеОбъектов.Код77 = КодТовара;
НовоеСоответствиеОбъектов.НомерБазы = НомерБазы;
НовоеСоответствиеОбъектов.Наименование77 = НаименованиеТовара;
НовоеСоответствиеОбъектов.Ссылка = Товар;
Попытка
НовоеСоответствиеОбъектов.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Товар " + НаименованиеТовара + " не найден");
КонецЕсли;
КонецЦикла;
Док.ActiveWorkbook.Close();
По теме из базы знаний
- Удаление данных с отбором и построением дерева ссылок в базах 1С 8.1-8.3 УТ 10.3./11, БП 2/3, ЗУП 2.5/3, КА 1.1/2, УНФ 1.6/3.0
- Перенос документов из УТ 10.3 в Бухгалтерию 3.0
- Бонусная система в 1С для УТ 10.3
- Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2
- Робот-загрузчик и архив документов. Распознавание/загрузка сканов документов в 1С8(7.7), архив сканированных документов.
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(9) Вожак, на диске ИТС точно есть в конфе наверно тоже где-то вшита но я не помню, на крайняк сам напиши делов то
СправочникВыборка = Справочники.Номенклатура.Выбрать();
Пока СправочникВыборка.Следующий() Цикл
Если СправочникВыборка.ЭтоГруппа тогда продолжить КонецЕсли;
Если СправочникВыборка.ПометкаУдаления тогда продолжить КонецЕсли;
ОбъектСправочника = СправочникВыборка.Ссылка.ПолучитьОбъект();
ОбъектСправочника.Код = СокрЛП(ОбъектСправочника.Код);
Попытка
ОбъектСправочника.Записать();
Исключение
Сообщить(ОписаниеОшибки()+" не удалось записать номенклатуру "+Строка(СправочникВыборка.Ссылка));
КонецПопытки;
КонецЦикла;
СправочникВыборка = Справочники.Номенклатура.Выбрать();
Пока СправочникВыборка.Следующий() Цикл
Если СправочникВыборка.ЭтоГруппа тогда продолжить КонецЕсли;
Если СправочникВыборка.ПометкаУдаления тогда продолжить КонецЕсли;
ОбъектСправочника = СправочникВыборка.Ссылка.ПолучитьОбъект();
ОбъектСправочника.Код = СокрЛП(ОбъектСправочника.Код);
Попытка
ОбъектСправочника.Записать();
Исключение
Сообщить(ОписаниеОшибки()+" не удалось записать номенклатуру "+Строка(СправочникВыборка.Ссылка));
КонецПопытки;
КонецЦикла;
Функция ДобавитьНули(Значение, НужнаяДлинаЗначения)
Значение = СтрЗаменить(Значение, " ", "");
Значение = СтрЗаменить(Значение, Символы.НПП, "");
НадоНулей = НужнаяДлинаЗначения - СтрДлина(Значение);
ВедущиеНули = Формат(0,"ЧЦ="+НадоНулей+";ЧН=; ЧВН=; ЧГ=0");
Возврат ВедущиеНули + Значение;
КонецФункции
вот для добавления нулей слева дописал, а как справа пробелы?
Значение = СтрЗаменить(Значение, " ", "");
Значение = СтрЗаменить(Значение, Символы.НПП, "");
НадоНулей = НужнаяДлинаЗначения - СтрДлина(Значение);
ВедущиеНули = Формат(0,"ЧЦ="+НадоНулей+";ЧН=; ЧВН=; ЧГ=0");
Возврат ВедущиеНули + Значение;
КонецФункции
вот для добавления нулей слева дописал, а как справа пробелы?
Для а = 2 по ФайлСтрок -1 Цикл
КодТовара = СокрЛП(Док.Cells(а,НомерКолонкиКодаТовара).Value);
КодТовара = Формат(Число(КодТовара), "ЧН=0; ЧГ=0");
НаименованиеТовара = СокрЛП(Док.Cells(а,НомерКолонкиНаименованияТовара).Value);
Идентификатор = СокрЛП(Док.Cells(а,НомерКолонкиИдентефикатораТовар).Value);
Код8ки = Строка(Док.Cells(а,НомерКолонкиКодаТовараИз8рки).Value);
СТРБуфер = " "; // здесь забей 11 пробелов!!!
Код8ки = Код8Ки +Прав(СТРБуфер,11-СтрДлина(Код8ки));
Код8ки = ДобавитьНули(Код8ки, 8);
Товар = Справочники.Номенклатура.НайтиПоКоду(Код8ки);
Если НЕ Товар = Справочники.Номенклатура.ПустаяСсылка() Тогда
НовоеСоответствиеОбъектов = РегистрыСведений.ттСоответствиеОбъектов.СоздатьМенеджерЗаписи();
НовоеСоответствиеОбъектов.Идентификатор = Идентификатор;
НовоеСоответствиеОбъектов.Прочитать();
Если НЕ НовоеСоответствиеОбъектов.Выбран() Тогда
НовоеСоответствиеОбъектов.Идентификатор = Идентификатор;
КонецЕсли;
НовоеСоответствиеОбъектов.Код77 = КодТовара;
НовоеСоответствиеОбъектов.НомерБазы = НомерБазы;
НовоеСоответствиеОбъектов.Наименование77 = НаименованиеТовара;
НовоеСоответствиеОбъектов.Ссылка = Товар;
Попытка
НовоеСоответствиеОбъектов.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Товар " + НаименованиеТовара + " не найден");
//Сообщить(Строка(КодСимвола (Код)));
КонецЕсли;
КонецЦикла;
вот так сделал, все равно те же 19 элементов не попадают из за кодов их
КодТовара = СокрЛП(Док.Cells(а,НомерКолонкиКодаТовара).Value);
КодТовара = Формат(Число(КодТовара), "ЧН=0; ЧГ=0");
НаименованиеТовара = СокрЛП(Док.Cells(а,НомерКолонкиНаименованияТовара).Value);
Идентификатор = СокрЛП(Док.Cells(а,НомерКолонкиИдентефикатораТовар).Value);
Код8ки = Строка(Док.Cells(а,НомерКолонкиКодаТовараИз8рки).Value);
СТРБуфер = " "; // здесь забей 11 пробелов!!!
Код8ки = Код8Ки +Прав(СТРБуфер,11-СтрДлина(Код8ки));
Код8ки = ДобавитьНули(Код8ки, 8);
Товар = Справочники.Номенклатура.НайтиПоКоду(Код8ки);
Если НЕ Товар = Справочники.Номенклатура.ПустаяСсылка() Тогда
НовоеСоответствиеОбъектов = РегистрыСведений.ттСоответствиеОбъектов.СоздатьМенеджерЗаписи();
НовоеСоответствиеОбъектов.Идентификатор = Идентификатор;
НовоеСоответствиеОбъектов.Прочитать();
Если НЕ НовоеСоответствиеОбъектов.Выбран() Тогда
НовоеСоответствиеОбъектов.Идентификатор = Идентификатор;
КонецЕсли;
НовоеСоответствиеОбъектов.Код77 = КодТовара;
НовоеСоответствиеОбъектов.НомерБазы = НомерБазы;
НовоеСоответствиеОбъектов.Наименование77 = НаименованиеТовара;
НовоеСоответствиеОбъектов.Ссылка = Товар;
Попытка
НовоеСоответствиеОбъектов.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Товар " + НаименованиеТовара + " не найден");
//Сообщить(Строка(КодСимвола (Код)));
КонецЕсли;
КонецЦикла;
вот так сделал, все равно те же 19 элементов не попадают из за кодов их
Набросал "на коленке" функцию, которая режет "лишние" символы.
Не проверял :)
Не проверял :)
Функция ПорезатьЛишниеСимволы(ВходящаяСтрока)
РезСтрока = ВходящаяСтрока;
ДлинаВхСтроки = СтрДлина(ВходящаяСтрока);
РазрешенныеСимволы = "0123456789";
Для й = 1 по ДлинаВхСтроки Цикл
ТекСимвол = Сред(ВходящаяСтрока,й,1);
Если Найти(РазрешенныеСимволы,ТекСимвол) = 0 Тогда
СтрЗаменить(РезСтрока,ТекСимвол,"");
КонецЕсли;
КонецЦикла;
Возврат РезСтрока;
КонецФункции
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот