![]() |
|
Изменение Артикула Элемента Справочника Номенклатура из файла | ☑ | ||
---|---|---|---|---|
0
slavabatov
23.08.17
✎
20:14
|
Здравствуйте.
Читаю csv файл таким кодом Процедура ИмяФайлаНачалоВыбора(Элемент, СтандартнаяОбработка) ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ДиалогВыбора.Заголовок = "Выберите файл"; // Фильтр = "csv|*.csv"; ДиалогВыбора.Фильтр = Фильтр; // Если ДиалогВыбора.Выбрать() Тогда ИмяФайла = ДиалогВыбора.ПолноеИмяФайла; КонецЕсли; КонецПроцедуры Процедура ПрочитатьНажатие(Элемент) //очищаем таблицу и удаляем колонки Таблица.Очистить(); Таблица.Колонки.Очистить(); ЭлементыФормы.Таблица.Колонки.Очистить(); // чтение файла ЗагружаемыйФайл = Новый ТекстовыйДокумент; ЗагружаемыйФайл.Прочитать(ИмяФайла); //шапка по умолчанию 1 строка, из первой строки делаем колонки таблицы Шапка = ЗагружаемыйФайл.ПолучитьСтроку(1); //раскладываем строку в массив МассивКолонок = РазложитьСтрокуВМассивПодстрок(Шапка,Разделитель); //генерируем колонки Для Каждого ИмяКолонки Из МассивКолонок Цикл ИмяБезПробелов = СтрЗаменить(ИмяКолонки," ",""); // убираем из имени колонок пробелы Таблица.Колонки.Добавить(ИмяБезПробелов,,ИмяКолонки); НоваяКолонка = ЭлементыФормы.Таблица.Колонки.Добавить(ИмяБезПробелов, ИмяКолонки); НоваяКолонка.Данные = ИмяБезПробелов; КонецЦикла; Для НомерСтроки=2 по ЗагружаемыйФайл.КоличествоСтрок() Цикл Состояние("Обрабатывается "+Строка(Формат(?(ЗагружаемыйФайл.КоличествоСтрок()=0,0,((100*НомерСтроки)/ЗагружаемыйФайл.КоличествоСтрок())),"ЧЦ=3; ЧДЦ=0"))+" %"); ОбработкаПрерыванияПользователя(); //указав данный оператор, цикл можно прервать в любой момент нажатие ctrl+break // получить строку файла с указанным номером и преобразуем её в массив Строка = ЗагружаемыйФайл.ПолучитьСтроку(НомерСтроки); МассивКолонок = РазложитьСтрокуВМассивПодстрок(Строка,Разделитель); НоваяСтрока = Таблица.Добавить(); Если МассивКолонок.Количество() <> Таблица.Колонки.Количество() Тогда Сообщить("Ошибка со строкой " + Строка); Продолжить; // скорее всего в тексте содержит разделитель КонецЕсли; Для НомерКолонки = 1 по МассивКолонок.Количество() Цикл //заполняем строку значениями ТекущееЗначение = МассивКолонок[НомерКолонки-1]; ИмяКолонки = Таблица.Колонки[НомерКолонки-1].Имя; НоваяСтрока[ИмяКолонки] = ТекущееЗначение; КонецЦикла; КонецЦикла; КонецПроцедуры Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") МассивСтрок = Новый Массив(); Если Разделитель = " " Тогда Стр = СокрЛП(Стр); Пока Истина Цикл Поз = Найти(Стр,Разделитель); Если Поз=0 Тогда МассивСтрок.Добавить(Стр); Возврат МассивСтрок; КонецЕсли; МассивСтрок.Добавить(Лев(Стр,Поз-1)); Стр = СокрЛ(Сред(Стр,Поз)); КонецЦикла; Иначе ДлинаРазделителя = СтрДлина(Разделитель); Пока Истина Цикл Поз = Найти(Стр,Разделитель); Если Поз=0 Тогда МассивСтрок.Добавить(Стр); Возврат МассивСтрок; КонецЕсли; МассивСтрок.Добавить(Лев(Стр,Поз-1)); Стр = Сред(Стр,Поз+ДлинаРазделителя); КонецЦикла; КонецЕсли; КонецФункции Процедура КнопкаВыполнитьНажатие(Кнопка) КонецПроцедуры Разделитель = ";"; И ни как не могу сообразить, как мне практически реализовать - Отобрать Номенклатуру по значению (это значение Артикул) в одной колонке полученной Таблицы и заменить этот самый Артикул на значения из другой колонки. Просто тупик в голове уже. Спасибо за советы и ответы. |
|||
1
kubik_live
23.08.17
✎
21:51
|
Файл csv то покажи
|
|||
2
slavabatov
23.08.17
✎
22:10
|
(1) Вот кусок
Дата;Новый код САЕ;Старый код САЕ;Марка 01.08.2017 12:32:50;F8397;F8397P;Yokohama 01.08.2017 12:33:18;F9710;F9710P;Yokohama 01.08.2017 12:33:48;R1657;F9643;Yokohama 01.08.2017 17:37:48;WHS145101old;WHS145101;Replay 01.08.2017 17:42:34;WHS063963old;WHS063963;MAK 01.08.2017 17:43:01;WHS129145old;WHS129145;Скад 01.08.2017 17:43:25;WHS155030old;WHS155030;LegeArtis Concept 01.08.2017 17:43:53;WHS056888old;WHS056888;OZ 01.08.2017 17:44:22;WHS142367old;WHS142367;LS 01.08.2017 17:44:56;WHS113069old;WHS113069;MAK 02.08.2017 12:39:47;TS00836;TS00836.;Toyo 03.08.2017 17:17:07;WHS158377old;WHS158377;Alutec 03.08.2017 17:18:10;WHS064258old;WHS064258;FR replica 07.08.2017 17:32:31;E4723;E4102;Yokohama 17.08.2017 13:55:04;WHS131412old;WHS131412;N2O |
|||
3
Tateossian
23.08.17
✎
23:18
|
Обходи потом полученную ЭлементыФормы.Таблица, получай номенклатуру по артикулу запросом, меняй на значение из соседней колонки и записывай.
|
|||
4
slavabatov
23.08.17
✎
23:36
|
(3) Большое спасибо за совет, но как я писал в (0) "не могу сообразить, как мне практически реализовать". "получай номенклатуру по артикулу запросом" - какие условия запроса?Я понимаю, что Запрос.Текст = ВЫБРАТЬ |Номенклатура.Артикул ИЗ |Справочник.Номенклатура КАК Номенклатура Но что должно быть в |ГДЕ?
"меняй на значение из соседней колонки и записывай." Я понимаю, что ТаблицаЗначений = Результат.Выгрузить(); Но как меняй Строка из ТаблицаЗначений на значение из соседней колонки? |
|||
5
h-sp
24.08.17
✎
00:18
|
ВЫБРАТЬ Номенклатура.Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Артикул = &хреньИзКолонки
|
|||
6
Fram
24.08.17
✎
00:22
|
(4) а ты программист или дворник?
|
|||
7
slavabatov
24.08.17
✎
00:24
|
(5) Спасибо, попробую. (6) Скорее второе, но выбора нет)
|
|||
8
slavabatov
24.08.17
✎
01:15
|
Не могу понять чему должно быть равно "ГДЕ Номенклатура.Артикул = "? Как отобрать по значениям в колонке? Через ВыгрузитьКолонку?
|
|||
9
Fram
24.08.17
✎
01:45
|
(8) все ж просто.. если условие справедливо, запись попадет в выборку, иначе нет.
|
|||
10
slavabatov
24.08.17
✎
02:17
|
(9) Пожалуйста, скажите, какое условие? Номенклатура.Артикул должно быть равно чему? Я понимаю, что значению из колонки, но как звучит это условие? (5) "Номенклатура.Артикул = &хреньИзКолонки" для меня не понятно
|
|||
11
Fram
24.08.17
✎
02:19
|
(10) что такое параметры запроса знаешь?
|
|||
12
slavabatov
24.08.17
✎
05:05
|
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ |Номенклатура.Ссылка |ИЗ |Справочник.Номенклатура КАК Номенклатура |ГДЕ |Номенклатура.Артикул В (&МассивCAE)" ; Список = Новый Массив; Список.Добавить(Таблица.Колонки.Найти("Старый код CAE")); Запрос.УстановитьПараметр("МассивCAE",Список); Результат = Запрос.Выполнить(); ТаблицаЗначений = Результат.Выгрузить(); // Где я ошибаюсь? |
|||
13
igorPetrov
24.08.17
✎
05:27
|
(12) Что за имя колонки?
|
|||
14
darius357
24.08.17
✎
07:55
|
ну как всегда побакланили, и нифига толку
|
|||
15
FIXXXL
24.08.17
✎
08:29
|
(12) Таблицу соответствий артикулов обходи в цикле
На каждую строку - поиск по старому артикулу, получение объекта, замена, запись |
|||
16
FIXXXL
24.08.17
✎
08:29
|
(15) да. это - дворниккод :)
|
|||
17
slavabatov
24.08.17
✎
09:28
|
(13) Имя колонки взято из Таблицы. (15) (16) я не спорю про дворниккод. "На каждую строку - поиск по старому артикулу, получение объекта, замена, запись" как это выглядит в коде? хотя бы приблизительно.
|
|||
18
h-sp
24.08.17
✎
09:32
|
(17) ну кинь эту задачку в 1clancer, там тебе за 500 рублей уже к обеду сделают. Чего париться попусту?
|
|||
19
slavabatov
24.08.17
✎
10:33
|
(18) возможно ты прав)
|
|||
20
Fram
24.08.17
✎
23:38
|
(14) ну, мы могли бы, конечно, решение выложить, но задачка то "плюнуть и растереть" даже для начинающего. никаких сакральных знаний иметь не надо.
|
|||
21
Fram
24.08.17
✎
23:42
|
загружаешь во врем таблицу, соединяешь со справочником и выплевываешь ссылку и новый артикул для обработки. все!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |