Имя: Пароль:
1C
1С v8
Изменение Артикула Элемента Справочника Номенклатура из файла
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
загружаешь во врем таблицу, соединяешь со справочником и выплевываешь ссылку и новый артикул для обработки. все!