7.7 не получается записать элемент справочника

Тема в разделе "Общие вопросы "1С:Предприятие 7.7"", создана пользователем x(mxcrew), 27 июн 2012.

  1. TopicStarter Overlay
    x(mxcrew)
    Offline

    x(mxcrew)

    Регистрация:
    11 ноя 2009
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
    Пытаюсь записать перенести элементы из справочника одной базы в другую

    есть таблица значений в которой записаны данные с первого справочника

    пытаюсь перенести ее в другой - новые позиции создаются отлично а вот те в которых нужно только поменять наименование или ИНН или КПП записываться отказываются


    Код:
    Пока тб.получитьстроку()=1 Цикл
    
    Если спр.НайтиПоРеквизиту("ИНН",СокрЛП(тб.ИНН),1)=0 Тогда
    Сообщить("Создан новый элемент справочника: "+тб.Код+тб.Наименование+тб.ИНН+тб.КПП);
    
    Спр.Новый();
    Спр.Наименование=тб.Наименование;
    Спр.ИНН=тб.ИНН;
    Спр.КПП=тб.КПП;
    Спр.Записать();
    
    Иначе
    
    вр=0;
    
    спр.НайтиПоРеквизиту("ИНН",СокрЛП(тб.ИНН),1);
    
    Если (СокрЛП(Спр.Наименование)<>СокрЛП(тб.Наименование)) И (ПустоеЗначение(Спр.Наименование)=0) Тогда
    
    Сообщить("Изменен элемент справочника: "+Спр.Наименование);
    
    
    Спр.Наименование=тб.Наименование;
    
    Спр.Записать();
    вр=1;
    
    
    КонецЕсли;
    
    
    Если (СокрЛП(Спр.ИНН)<>СокрЛП(тб.ИНН)) И (ПустоеЗначение(Спр.ИНН)=0)Тогда
    
    
    Спр.ИНН=тб.ИНН;
    
    Сообщить("изменено: "+тб.ИНН);
    Спр.Записать();
    вр=1;
    
    КонецЕсли;
    
    Если (СокрЛП(Спр.КПП)<>СокрЛП(тб.КПП)) И (ПустоеЗначение(Спр.КПП)=0)Тогда
    
    
    Спр.КПП=тб.КПП;
    
    Сообщить("изменено: "+тб.КПП);
    Спр.Записать();
    вр=1;
    
    КонецЕсли;
    
    Если вр=1 Тогда
    подсчет=подсчет+1;
    
    КонецЕсли;
    
    КонецЕсли;
    
    
    
    КонецЦикла;
  2. Allizar
    Offline

    Allizar Опытный в 1С

    Регистрация:
    24 сен 2006
    Сообщения:
    413
    Симпатии:
    0
    Баллы:
    26
    Во-первых, используйте тэги.
    Во-вторых, какая ошибка возникает при записи?
    В-третьих, не следует трижды записывать один и тот же элемент и дважды искать его по реквизиту..
    В-четвертых, зачем сравнивать ИНН элемента с ИНН из таблицы, по которому Вы и нашли элемент?
  3. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    в пятых. повторный поиск по реквизиту после иначе...
  4. TopicStarter Overlay
    x(mxcrew)
    Offline

    x(mxcrew)

    Регистрация:
    11 ноя 2009
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
    Ошибки при записи не возникает

    не изменяется наименование в справочнике

    сейчас код такой



    Код:
    Пока тб.получитьстроку()=1 Цикл
    
    Если спр.НайтиПоРеквизиту("ИНН",СокрЛП(тб.ИНН),1)=0 Тогда
    Сообщить("Создан новый элемент справочника: "+тб.Код+тб.Наименование+тб.ИНН+тб.КПП);
    
    Спр.Новый();
    Спр.Наименование=тб.Наименование;
    Спр.ИНН=тб.ИНН;
    Спр.КПП=тб.КПП;
    Спр.Записать();
    
    Иначе
    
    вр=0;
    
    
    
    Если (СокрЛП(Спр.Наименование)<>СокрЛП(тб.Наименование)) И (ПустоеЗначение(Спр.Наименование)=0) Тогда
    
    Сообщить("Изменен элемент справочника: "+Спр.Наименование);
    
    
    Спр.Наименование=тб.Наименование;
    
    
    вр=1;
    
    
    КонецЕсли;
    
    
    
    
    Если (СокрЛП(Спр.КПП)<>СокрЛП(тб.КПП)) И (ПустоеЗначение(Спр.КПП)=0)Тогда
    
    
    Спр.КПП=тб.КПП;
    
    Сообщить("изменено: "+тб.КПП);
    
    вр=1;
    
    КонецЕсли;
    
    Если вр=1 Тогда
    Спр.Записать();
    подсчет=подсчет+1;
    
    КонецЕсли;
    
    КонецЕсли;
    
    
    
    КонецЦикла;
    
  5. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Попробуйте использовать промежуточный обЪект:

    [CODE1C]СпрЭл = СоздатьОбъект("Справочник.ИмяСправочника");

    Пока тб.получитьстроку()=1 Цикл
    Если спр.НайтиПоРеквизиту("ИНН",СокрЛП(тб.ИНН),1)=0 Тогда
    Сообщить("Создан новый элемент справочника: "+тб.Код+тб.Наименование+тб.ИНН+тб.КПП);

    СпрЭл.Новый();
    СпрЭл.Наименование=тб.Наименование;
    СпрЭл.ИНН=тб.ИНН;
    СпрЭл.КПП=тб.КПП;
    СпрЭл.Записать();
    Иначе
    СпрЭл.НайтиЭлемент(Спр.ТекущийЭлемент());
    вр=0;
    Если (СокрЛП(Спр.Наименование)<>СокрЛП(тб.Наименование)) И (ПустоеЗначение(Спр.Наименование)=0) Тогда
    Сообщить("Изменен элемент справочника: "+Спр.Наименование);

    СпрЭл.Наименование=тб.Наименование;
    вр=1;
    КонецЕсли;

    Если (СокрЛП(Спр.КПП)<>СокрЛП(тб.КПП)) И (ПустоеЗначение(Спр.КПП)=0)Тогда
    Сообщить("изменено: "+тб.КПП);

    СпрЭл.КПП=тб.КПП;
    вр=1;
    КонецЕсли;

    Если вр=1 Тогда
    СпрЭл.Записать();
    подсчет=подсчет+1;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;[/CODE1C]
  6. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Да. Именно так и нужно. Внутри цикла по элементам нельзя изменять порядок этого же объекта.
  7. TopicStarter Overlay
    x(mxcrew)
    Offline

    x(mxcrew)

    Регистрация:
    11 ноя 2009
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
    К сожалению не могу понять в чем причина того что элемент не записывается. Теперь все работает через другой справочник (как в коде выше), но элемент все равно не записывается .
  8. TopicStarter Overlay
    x(mxcrew)
    Offline

    x(mxcrew)

    Регистрация:
    11 ноя 2009
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
    Код:
    спр=создатьобъект("справочник.Заводы");
    спр_врем=создатьобъект("справочник.Заводы");
    
    
    тб.выбратьстроки();
    подсчет=0;
    Пока тб.получитьстроку()=1 Цикл
    
    Если спр.НайтиПоРеквизиту("ИНН",СокрЛП(тб.ИНН),1)=0 Тогда
    Сообщить("Создан новый элемент справочника: "+тб.Код+тб.Наименование+тб.ИНН+тб.КПП);
    
    
    
    спр_врем.Новый();
    спр_врем.Наименование=тб.Наименование;
    спр_врем.ИНН=тб.ИНН;
    спр_врем.КПП=тб.КПП;
    спр_врем.Записать();
    
    Иначе
    
    спр_врем.НайтиЭлемент(Спр.ТекущийЭлемент());
    
    вр=0;
    
    
    
    Если (СокрЛП(Спр.Наименование)<>СокрЛП(тб.Наименование)) И (ПустоеЗначение(Спр.Наименование)=0) Тогда
    
    Сообщить("Изменен элемент справочника: "+Спр.Наименование);
    
    Сообщить("на: "+тб.Наименование);
    
    спр_врем.Наименование=строка(сокрЛП(тб.Наименование));
    
    
    вр=1;
    
    
    КонецЕсли;
    
    
    
    
    Если (СокрЛП(Спр.КПП)<>СокрЛП(тб.КПП)) И (ПустоеЗначение(Спр.КПП)=0)Тогда
    
    
    спр_врем.КПП=тб.КПП;
    
    Сообщить("изменено: "+тб.КПП);
    
    вр=1;
    
    КонецЕсли;
    
    Если вр=1 Тогда
    спр_врем.Записать();
    подсчет=подсчет+1;
    
    КонецЕсли;
    
    КонецЕсли;
    
    
    
    КонецЦикла;
    
  9. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    А сообщения об изменении обЪекта выводятся?
    Попробуйте пройтись отладчиком.
  10. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    может у вас с нумерацией что? вручную новый элемент создать/записать можно?
  11. TopicStarter Overlay
    x(mxcrew)
    Offline

    x(mxcrew)

    Регистрация:
    11 ноя 2009
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
    цикл проходит внутрь

    Код:
    Если вр=1 Тогда
    спр_врем.Записать();
    подсчет=подсчет+1;Если вр=1 Тогда
    спр_врем.Записать();
    подсчет=подсчет+1;
    
    но элемент справочника, а точнее его наименование остается прежним.

    да создается - и вручную и этим же кодом, новый элемент создается и записывается, не изменяется только наименование и кпп, а с созданием новых все ОК
  12. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Чудеса.... Посмотрите еще... Может у вас в начале стоит НачатьТранзакцию, а в конце нет ЗафиксироватьТранзакцию ?
  13. TopicStarter Overlay
    x(mxcrew)
    Offline

    x(mxcrew)

    Регистрация:
    11 ноя 2009
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
    вот собственно процедура целиком

    Код:
    Процедура Загрузить()
    
    //******************************Загрука заводов********************************************
    
    
    тб=создатьобъект("таблицазначений");
    тб.НоваяКолонка("Код",,,,,,,);
    тб.НоваяКолонка("Наименование",,,,,,,);
    тб.НоваяКолонка("ИНН",,,,,,,);
    тб.НоваяКолонка("КПП",,,,,,,);
    
    
    текст_файл=создатьобъект("текст");
    
    текст_файл.Открыть(КаталогИБ()+"spool\Заводы.txt");
    
    
    i=1;
    
    Пока i <=текст_файл.КоличествоСтрок() Цикл
    
    t=текст_файл.ПолучитьСтроку(i);
    
    тб.НоваяСтрока();
    тб.Код=Сред(t,1,Найти(t,"|")-1);
    t=Сред(t,Найти(t,"|")+1);
    тб.Наименование=Сред(t,1,Найти(t,"|")-1);
    t=Сред(t,Найти(t,"|")+1);
    тб.ИНН=Сред(t,1,Найти(t,"|")-1);
    t=Сред(t,Найти(t,"|")+1);
    тб.КПП=Сред(t,1,Найти(t,"|")-1);
    t=Сред(t,Найти(t,"|")+1);
    
    
    i=i+1;
    
    КонецЦикла;
    
    спр=создатьобъект("справочник.Заводы");
    спр_врем=создатьобъект("справочник.Заводы");
    
    
    тб.выбратьстроки();
    подсчет=0;
    Пока тб.получитьстроку()=1 Цикл
    
    Если спр.НайтиПоРеквизиту("ИНН",СокрЛП(тб.ИНН),1)=0 Тогда
    Сообщить("Создан новый элемент справочника: "+тб.Код+тб.Наименование+тб.ИНН+тб.КПП);
    
    
    
    спр_врем.Новый();
    спр_врем.Наименование=тб.Наименование;
    спр_врем.ИНН=тб.ИНН;
    спр_врем.КПП=тб.КПП;
    спр_врем.Записать();
    
    Иначе
    
    спр_врем.НайтиЭлемент(Спр.ТекущийЭлемент());
    
    вр=0;
    
    
    
    Если (СокрЛП(Спр.Наименование)<>СокрЛП(тб.Наименование)) И (ПустоеЗначение(Спр.Наименование)=0) Тогда
    
    Сообщить("Изменен элемент справочника: "+Спр.Наименование);
    
    Сообщить("на: "+тб.Наименование);
    
    спр_врем.Наименование=строка(сокрЛП(тб.Наименование));
    
    
    вр=1;
    
    
    КонецЕсли;
    
    
    
    
    Если (СокрЛП(Спр.КПП)<>СокрЛП(тб.КПП)) И (ПустоеЗначение(Спр.КПП)=0)Тогда
    
    
    спр_врем.КПП=тб.КПП;
    
    Сообщить("изменено: "+тб.КПП);
    
    вр=1;
    
    КонецЕсли;
    
    Если вр=1 Тогда
    спр_врем.Записать();
    подсчет=подсчет+1;
    
    КонецЕсли;
    
    КонецЕсли;
    
    
    
    КонецЦикла;
    
    Если подсчет>0 Тогда
    Сообщить("Загрузка справочника (Заводы) завершена");
    Сообщить("Загружено "+подсчет+ " строк из файла C:\Заводы.txt");
    Иначе
    Сообщить("В справочник (Заводы) пуст");
    КонецЕсли;
    
    
    //******************************Конец загрузки заводов********************************************
    
    а сам текстовой фал состоит из таких строк

    14|АЙ-ЭЛ-ЭС ГЛОБАЛВИН|5030052372|503001001
    41|БАКАРДИ РУС ООО|7706244940|501703001
    36|ГУП КИЗЛЯРСКИЙ КОНЬЯЧНЫЙ ЗАВОД|547000050|54150001
    14|АЙ-ЭЛ-ЭС ГЛОБАЛВИН|5030052372|503001001
    41|БАКАРДИ РУС ООО|7706244940|501703001
    36|ГУП КИЗЛЯРСКИЙ КОНЬЯЧНЫЙ ЗАВОД|547000050|5415000114|АЙ-ЭЛ-ЭС ГЛОБАЛВИН|5030052372|503001001
    41|БАКАРДИ РУС ООО|7706244940|501703001
    36|ГУП КИЗЛЯРСКИЙ КОНЬЯЧНЫЙ ЗАВОД|547000050|5415000114|АЙ-ЭЛ-ЭС ГЛОБАЛВИН|5030052372|503001001
    41|БАКАРДИ РУС ООО|7706244940|501703001
    36|ГУП КИЗЛЯРСКИЙ КОНЬЯЧНЫЙ ЗАВОД|547000050|5415000114|АЙ-ЭЛ-ЭС ГЛОБАЛВИН|5030052372|503001001
    41|БАКАРДИ РУС ООО|7706244940|501703001
    36|ГУП КИЗЛЯРСКИЙ КОНЬЯЧНЫЙ ЗАВОД|547000050|5415000114|АЙ-ЭЛ-ЭС ГЛОБАЛВИН|5030052372|503001001
    41|БАКАРДИ РУС ООО|7706244940|501703001
    36|ГУП КИЗЛЯРСКИЙ КОНЬЯЧНЫЙ ЗАВОД|547000050|54150001
  14. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Ну внешне то все верно. Нет ошибки в алгоритме. Только вопрос: у вас хоть один раз она пишет что изменен элемент справочника?

    И еще.... Обнаружил ошибку в логике...
    Вы осуществляете поиск по реквизиту ИНН

    Код:
    Если спр.НайтиПоРеквизиту("ИНН",СокрЛП(тб.ИНН),1)=0 Тогда
    в найденном элементе (условие=1)
    вот эта строчка

    Код:
    Если (СокрЛП(Спр.КПП)<>СокрЛП(тб.КПП)) И (ПустоеЗначение(Спр.КПП)=0)Тогда

    не сработает никогда! ИНН то найден и совпадает
  15. TopicStarter Overlay
    x(mxcrew)
    Offline

    x(mxcrew)

    Регистрация:
    11 ноя 2009
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
    Пишет каждый раз

    например

    Изменен элемент справочника: ООО АЙ-эЛ-эС ГЛОбАЛВИН
    на: АЙ-ЭЛ-ЭС ГЛОБАЛВИН

    при этом элемент справочника не записан.

    При каждом старте обработке пишет то же самое, при этом не меняя элементы



    Немного не понял почему не сработает этот код, если я ищу по реквизиту ИНН, а тут проверяется КПП
  16. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Добавьте дополнительную строчку кода:
    [CODE1C]
    Если вр=1 Тогда
    спр_врем.Записать();
    Сообщить(СокрЛП(спр_врем.Код) + " " + СокрЛП(спр_врем.Наименование));
    подсчет=подсчет+1;
    КонецЕсли;
    [/CODE1C]

    Что выдает в окне сообщений?

    Элементов с одинаковыми ИНН нет? Может меняет элемент, да не тот?
  17. TopicStarter Overlay
    x(mxcrew)
    Offline

    x(mxcrew)

    Регистрация:
    11 ноя 2009
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
    Мне кажется, я разобрался

    У меня оказалось все нормально с логикой, а вот у наших товароведов нет

    Пример в справочнике в который я загружаю заводы есть позиция

    ООО АЙ-эЛ-эС ГЛОбАЛВИН

    в файле из которого я загружаю этот завод называется
    АЙ-ЭЛ-ЭС ГЛОБАЛВИН

    По логике ООО АЙ-эЛ-эС ГЛОбАЛВИН должен заменится на АЙ-ЭЛ-ЭС ГЛОБАЛВИН
    После работы обработки я смотрю в справочник и вижу, что в нем по прежнему стоит ООО АЙ-эЛ-эС ГЛОбАЛВИН
    Думаю, что обработка не работает взрываю мозг себе и вам.

    И только сейчас понял что дело видимо не в обработке, а в первом справочнике из которого я беру данные
    оказалось, что там есть как позиция АЙ-ЭЛ-ЭС ГЛОБАЛВИН так и ООО АЙ-эЛ-эС ГЛОбАЛВИН у них одинаковые ИНН (в сущности это одна и та же позиция внесенная 2 раза)

    Соответственно отчет сначала меняет ООО АЙ-эЛ-эС ГЛОбАЛВИН на АЙ-ЭЛ-ЭС ГЛОБАЛВИН, а затем находит ООО АЙ-эЛ-эС ГЛОбАЛВИН (в первом справочнике) и меняет ее обратно.
    В итоге кажется что отчет не отработал.

    Прошу прощение за ваше потраченное время. Я должен был быть внимательнее и конечно написать проверку для дурака - чтобы в изначальный справочник нельзя было внести позиции с одинаковым ИНН

Поделиться этой страницей