Имя: Пароль:
1C
1С v8
Быдло-Коддинг 2
0 Azxcvbn
 
11.03.13
08:50
Предупреждаю! Некоторые моменты могут вызвать у вас дикий хохот.
Хотелось посмотреть как вы решили бы данную задачку.
Задача такая сравнить справочники Контрагенты БП и УТ и если наименования одинаковые, но коды разные, заменить Код в торговли на Код из Бухгалтерии.
Я сделал запрос с Торговли через Comobject.
И начал сравнивать его с


Результат = Запрос.Выполнить().Выборка();
Выборка = Справочники.Контрагенты.Выборка();
Пока Результат.Следующий() Цикл
  Пока Выборка.Следующий() Цикл
      Если Результат.Наименование = Выборка.Наименование Тогда
          Если Результат.Код <> Выборка.Код Тогда
          // Так как в Торговле Код Контрагента может быть занят, вначале прохожусь и затираю код, вставляю вместо перового нолика единичку в 9-значный код(Я знаю что эти Коды не заняты, программа будет использована 1 раз
          Код1 = "1" + Сред(Выборка.Код, 2);
          КомСправочник = Connection.Справочники.Контрагенты.НайтиПоНаименованию(Результат.Наименование).ПолучитьОбъект();
      КомСправочник.Код = Код1;
      КомСправочник.Записать();
          // Сохраняю нужные данные  в массив
      Массив.Вставить(Колво,Выборка.Код);
      Массив2.Вставить(Колво,Результат.Наименование);
      Колво = Колво+1;
          КонецЕсли;
      КонецЕсли;
  КонецЦИкла;
КонецЦикла;

Для каждого Элемент2 из Массив2 Цикл
       //Номер = Массив.Получить(Колвл);
       //Теперь вставляю нужный Код с Бухгалтерии в Торговлю
       КомСправочник2 = Connection.Справочники.Контрагенты.НайтиПоНаименованиею(Элемент2).ПолучитьОбъект();
       КомСправочник2.Код = Массив[Колвл];
       КомСправочник2.Записать();
       Колвл = Колвл+1;
КонецЦикла;



З.Ы. Все работает, прочту всю критику.
1 zak555
 
11.03.13
08:51
сравнивать по ИНН/КПП и в случае совпадении делать перезапись ?
2 lopus
 
11.03.13
08:52
Зачем тебе это
3 scanduta
 
11.03.13
08:52
В разовых случаях быдло кодинг допустим...так что не прься если все работает
4 mikecool
 
11.03.13
08:53
код не отформатирован, даже смотреть не буду
5 tdm
 
11.03.13
08:53
работает не трожь!)
6 tdm
 
11.03.13
08:54
(3) +1, если нет проблем с производительностью и нет необходимости дальше это дело дорабатывать т.е. работает как есть
7 tdm
 
11.03.13
08:56
(0) >>Хотелось посмотреть как вы решили бы данную задачку
запросы) в 8-ке кошерно все делать через запросы...
8 Azxcvbn
 
11.03.13
08:56
Люди учусь программировать, мне бы очень помогли ваши советы, мне не нравится как я их решаю, лучшее в голову не пришло, поэтому хотелось бы увидеть точки зрения более опытных людей.
9 scanduta
 
11.03.13
08:57
Иди сдавай спеца по платформе, там основы хорошие получишь.
10 Галахад
 
гуру
11.03.13
08:59
(0) Ну наверное, можно получить из Торговли запросом
наименование и код. Выгрузить в таблицу значений.
Таблицу в строку ЗначениевСтрокуВнутр.
В БП получить таблицу ЗначениеизСтрокиВнутр.
Ну и запрос.
11 zak555
 
11.03.13
08:59
(8) учи КД
12 Эмбеддер
 
11.03.13
08:59
(0) восхваляют быдлокодинг только быдлокодеры. ты же себя к ним не причисляешь, зачем такие темы создавать)))
13 Azxcvbn
 
11.03.13
08:59
(7) Можно ли как нибудь сделать 1 запрос и взять данные из БП и УТ? или Прийдется делать 2 запроса и потом их сравнвать?
14 Azxcvbn
 
11.03.13
09:00
(12) Отучиться от него
15 tdm
 
11.03.13
09:03
(8) >>справочники Контрагенты БП и УТ и если наименования одинаковые
я бы сопоставлял по ИНН и КПП а не по наименованию для начала, т.к. лишний пробел и "Результат.Наименование = Выборка.Наименование" уже не сработает)
 
(13) можно получать таблицы, передавать и обрабатывать их внутри запросов)
16 be-may
 
11.03.13
09:06
А тебе нужно полное соответствие наименований?
Т.е., например в торговле "Иванов И" а в  бухии "Иванов И." (с точкой). и как ты понимаешь, с точки зрения 1С это будут разные Ивановы. Не хочешь поискать на вхождение ?


--
Вообще если брать именно твой алгоритм , то я бы выборку, полученную запросом, отсортировала бы по Наименованию. Затем перебор справочника, а вторую не перебираем, а делаем поиск с помощью метода Найти(). Как только нашли подходящее наименование в выборке, начинаем двигаться в цикле. Как только наименование не совпадает с текущим наименованием элемента справочника  - Прервать.
чуть быстрее бы работала, т.к. не нужно каждый раз перебирать всю выборку..
17 MrStomak
 
11.03.13
09:07
Запросы или выборки тут наверное непринципиально, из кода непонятно что за запрос используется, непонятно зачем поиск по наименованию при этом еще везде присутствует - проседает производительность. Непонятно, зачем вся эта байда с массивами - почему сразу нельзя было поменять как надо? В ряде случаев можно существенно увеличить быстродействие, если выгружать данные в ТЗ и индексировать её по полю поиска, затем перебирать не вложенный цикл, а через поиск по ТЗ (требует оперативной памяти, если размер справочника очень большой, то так делать не стоит)
18 be-may
 
11.03.13
09:11
(13) можно. Ты б текст запроса  к УТ написал бы, а мы б тебе помогли его  "допилить"
19 Azxcvbn
 
11.03.13
09:11
(17) нелья поменять сразу так как будет ругаться что код не уникален
20 VladZ
 
11.03.13
09:11
(0) Лучший способ разрулить проблему - не создавать ее. Поэтому на этапе выгрузке из УТ в БП нужно сразу передавать правильный код. Если это изначально не сделано - со временем полезут расхождения по наименованиям. Т.е. соответствие объектов по наименованию не проканает...
21 eduspec82
 
11.03.13
09:12
хорошо что топикстартер понял кто он есть, катарсис :)
22 MrStomak
 
11.03.13
09:12
(18) Как это - одним запросом из БП и УТ?
23 Azxcvbn
 
11.03.13
09:13
(18) Запрс:


Ком = Новый COMObject("V81.COMConnector");
   // создается объект COM-соединение
   Попытка
      connection = Ком.Connect("Srvr=""PC001"";Ref=""base01"";"+
       "Usr=""Admin"";Pwd=111");
   Исключение
      Сообщить(ОписаниеОшибки());
      Возврат
   КонецПопытки;
   Запрос = connection.NewObject("Запрос");  
   Запрос.Текст = "ВЫБРАТЬ
                  |    Контрагенты.Наименование,
                  |    Контрагенты.Код,
                  |ИЗ
                  |    Справочник.Контрагенты КАК Контрагенты
24 VladZ
 
11.03.13
09:14
Я бы сравнил процесс автоматизации с игрой в шахматы... Ты должен думать, чем "система" ответит на твой ход. И какой будет твой последующих ход... И чем больше ходов ты можешь просчитывать - тем ты профессиональнее...
25 Nandarou
 
11.03.13
09:16
Весь код верхний первый избыточен из-за "НайтиПоНаименованию(Результат.Наименование)". Гонять две выборки а потом искать по наименованию бред.

Что верхний что нижний код работает только если справочники практически полностью совпадают и нет дублей по наименованию.
Иначе НайтиПоНаименованию будет искать только первый из элементов справочника.
26 MrStomak
 
11.03.13
09:16
(19) Есть ОбменДанными.Загрузка, есть префиксы...
27 be-may
 
11.03.13
09:42
(22) сорри, у автора ж 8.1.
в 8.2 есть внешние источники данных (http://v8.1c.ru/overview/Term_000000795.htm#1). Вот там можно

В 7 с помощью прямых запросов тоже можно было. Только надо было убедиться, что сервер прилинкован.
в 8.1. так сходу - не знаю как.
Но, думаю, автору, на том уровне знаний, который есть сейчас, не стоит лезть в такие дебри, пусть оптимизирует свой алгоритм в (0). Тем более, что "все работает"