8.х Загрузка из дбф

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем lanna_oops, 9 дек 2008.

  1. TopicStarter Overlay
    lanna_oops
    Offline

    lanna_oops

    Регистрация:
    8 окт 2008
    Сообщения:
    30
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте! Помогите пожалуйста в решении следующей проблемы...
    у нас немного нестандартная конфигурация на платформе 8.1. а точнее, конфигурация написана разработчиками нашего предприятия для учета электроэнергии. есть у нас там справочник абонентов, которые пользуются электроэнергией. изначально операторами были неправильно занесены номера домашних телефонов этих абонентов. а теперь возникла необходимость эти телефоны извлечь...мы достали достоверный справочник телефонов и извлекли из него данные в формате dbf.
    нам необходимо загрузить номера телефонов абонентов из дбф-ки в справочник абонентов, но соблюсти такое условие: если адрес абонента из дбф-ки соответствует адресу в справочнике (то есть абонент с таким адресом уже есть), то записать номер телефона в справочник из этой дбф-ки. если адрес не соответствует (то есть абонента с таким адресом нет), то пропустить... но еще есть один нюанс: адрес абонента в справочнике записан одной строкой... например...Перевозчикова, д.31
    а в выгруженном dbf файле отдельные столбцы: улица, дом, квартира.
    делаю обработку с кнопкой на кнопку прописываю:
    Код:
    Процедура ЗагрузитьИзДБФНажатие(Элемент)
    файлДБФ=новый XBase;
    файлДБФ.ОткрытьФайл("E:\Documents and Settings\xz\Рабочий стол\zyrianovsk\tel_k.dbf",,истина);
    файлДБФ.Первая();
    Тел=файлДБФ.NOMER;
    пока не файлДБФ.ВКонце() цикл
    если Справочники.ТочкиУчетаФизическихЛиц.НайтиПоНаименованию(файлДБФ.YLICA+", "+файлДБФ.DOM,истина).Адрес=Справочники.ТочкиУчетаФизическихЛиц.ПустаяСсылка() тогда
    Телеф=Справочники.ТочкиУчетаФизическихЛиц.НайтиПоКоду("Телефон",истина).Телефон;	
    Телеф=Тел;
    если не файлДБФ.ВКонце() тогда
    файлДБФ.Следующая();
    Тел=файлДБФ.NOMER;
    иначе прервать;
    конецесли;
    продолжить;
    конецесли;
    
    конеццикла;	
    файлДБФ.ЗакрытьФайл();	
    
    КонецПроцедуры
    
    но ничего не меняется в справочнике...что неправильно делаю...подскажите...пожалуйста...
  2. DmitryS
    Offline

    DmitryS Опытный в 1С

    Регистрация:
    20 июл 2007
    Сообщения:
    119
    Симпатии:
    0
    Баллы:
    26
    Для изменения справочника нужно пользоватся ОБЪЕКТАМИ.

    Код:
    // ...............
    СправочникСсылка=Справочники.ТочкиУчетаФизическихЛиц.НайтиПоКоду("Телефон",истина);
    Если НЕ СправочникСсылка.Пустая() Тогда
    
    СправочникОбъект = СправочникСсылка.ПолучитьОбъект();
    
    СправочникОбъект.Телеф=Тел;
    СправочникОбъект.Записать();
    
    КонецЕсли;
    // ...............
    
  3. tirk
    Offline

    tirk Опытный в 1С

    Регистрация:
    1 сен 2008
    Сообщения:
    1.142
    Симпатии:
    0
    Баллы:
    26
    Мало того что объектами, так еще и надо полное соответствие адресов, со всеми пробелами и точками)))
    Так что как то наверное не очень получиться.... сделай сначало вывод и сравнение с тем справочником что есть.. а то позаменяешь все...
    а еще зачем у тебя стоят операторы прервать и продолжить????
    прервать - прекращает если условие не выполняется?? А если это первая запись или предпоследняя? ?потом все заново запускать и отлавливать ошибку?? Так....
    а продолжить зачем.?? Если условие не выполняется то и он пойдет на след запись.... странно как то)))
    и сделай еще проверку на открыт файл или нет.. а то мало ли))
  4. TopicStarter Overlay
    lanna_oops
    Offline

    lanna_oops

    Регистрация:
    8 окт 2008
    Сообщения:
    30
    Симпатии:
    0
    Баллы:
    1
    воспользовалась всеми подсказками (спасибо, кстати за помощь! :unsure: )...но увы...данные в справочнике не меняются, хотя никаких ошибок не выявлено...
    вот что получилось:
    Код:
    Процедура ЗагрузитьИзДБФНажатие(Элемент)
    файлДБФ=новый XBase;
    файлДБФ.ОткрытьФайл("E:\Documents and Settings\xz\Рабочий стол\zyrianovsk\tel_k.dbf",,истина);
    если файлДБФ.Открыта() тогда
    файлДБФ.Первая();
    
    пока не файлДБФ.ВКонце() цикл
    Тел=СокрЛП(файлДБФ.ПолучитьЗначениеПоля("NOMER"));
    Рай=СокрЛП(файлДБФ.ПолучитьЗначениеПоля("RAION"));
    Ул=СокрЛП(файлДБФ.ПолучитьЗначениеПоля("YLICA"));
    До=СокрЛП(файлДБФ.ПолучитьЗначениеПоля("DOM"));
    ЛиДо=СокрЛП(файлДБФ.ПолучитьЗначениеПоля("DOM_L"));
    Ква=СокрЛП(файлДБФ.ПолучитьЗначениеПоля("KVARTIRA"));
    ЛиКва=СокрЛП(файлДБФ.ПолучитьЗначениеПоля("KVARTIRA_L"));
    
    СправочникСсылкаАдрес=Справочники.ТочкиУчетаФизическихЛиц.НайтиПоКоду("Адрес",истина).Адрес;	
    СправочникСсылкаТелефон=Справочники.ТочкиУчетаФизическихЛиц.НайтиПоКоду("Телефон",истина);
    Если СправочникСсылкаАдрес.Владелец=Ул и СправочникСсылкаАдрес.НомерДома=До и СправочникСсылкаАдрес.Литера=ЛиДо Тогда
    СправочникОбъект = СправочникСсылкаТелефон.ПолучитьОбъект();
    СправочникОбъект.Телефон=Тел;
    СправочникОбъект.Записать();
    КонецЕсли;
    файлДБФ.Следующая();
    конеццикла;
    конецесли;	
    сообщить("Изменения внесены успешно!");
    
    файлДБФ.ЗакрытьФайл();
    КонецПроцедуры
    
  5. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    А что вот эти строчки делают? :)

    Код:
    СправочникСсылкаАдрес=Справочники.ТочкиУчетаФизическихЛиц.НайтиПоКоду("Адрес",истина).Адрес;    
    СправочникСсылкаТелефон=Справочники.ТочкиУчетаФизическихЛиц.НайтиПоКоду("Телефон",истина);
    
  6. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    Если СправочникСсылкаАдрес.Владелец=Ул

    В этом условии "Владелец" как-то настораживает.
  7. tirk
    Offline

    tirk Опытный в 1С

    Регистрация:
    1 сен 2008
    Сообщения:
    1.142
    Симпатии:
    0
    Баллы:
    26
    проверь .. работает ли у тебя условие.. очень подозрительное)))
  8. TopicStarter Overlay
    lanna_oops
    Offline

    lanna_oops

    Регистрация:
    8 окт 2008
    Сообщения:
    30
    Симпатии:
    0
    Баллы:
    1
    с помощью этих строк происходит обращение в справочнике к Телефону и адресу абонентов...мне так посоветовал сделать...


    я ж говорю, у нас нестандартная конфигурация...такой кроме как у нас больше нигде нет...и владелец- это не то что в типовых конфигурациях...это именно и есть адрес...
  9. tirk
    Offline

    tirk Опытный в 1С

    Регистрация:
    1 сен 2008
    Сообщения:
    1.142
    Симпатии:
    0
    Баллы:
    26
    Засунь сюда лучше сообщить()

    Код:
    	Если СправочникСсылкаАдрес.Владелец=Ул и СправочникСсылкаАдрес.НомерДома=До и СправочникСсылкаАдрес.Литера=ЛиДо Тогда
    СправочникОбъект = СправочникСсылкаТелефон.ПолучитьОбъект();
    СправочникОбъект.Телефон=Тел;
    попытка
    СправочникОбъект.Записать();
    собщить("Успешно")
    Иначе
    Сообщить("Запись не произведена");
    КонецПопытки
    КонецЕсли;
    
  10. TopicStarter Overlay
    lanna_oops
    Offline

    lanna_oops

    Регистрация:
    8 окт 2008
    Сообщения:
    30
    Симпатии:
    0
    Баллы:
    1
    только вместо иначе- исключение...
    никакого сообщения не выводится, но ошибок нет...
  11. TopicStarter Overlay
    lanna_oops
    Offline

    lanna_oops

    Регистрация:
    8 окт 2008
    Сообщения:
    30
    Симпатии:
    0
    Баллы:
    1
    немного изменила конструкцию...
    Код:
    Если СправочникСсылкаАдрес.Владелец=Ул Тогда
    СправочникОбъект = СправочникСсылкаТелефон.ПолучитьОбъект();
    СправочникОбъект.Телефон=Тел;
    попытка
    СправочникОбъект.Записать();
    сообщить("Успешно");
    исключение
    КонецПопытки;
    иначе
    Сообщить("Запись не произведена");
    КонецЕсли;
    
    теперь выводит сообщение что запись не произведена...
  12. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    Ну так условие не выполняется, вот и выводит такое сообщение. Смотрите отладчиком или вставьте перед если
    Код:
    Сообщить(СправочникСсылкаАдрес.Владелец);
    Сообщить(Ул);
    
    
    и смотрите сообщения.
    P.S. Даже если "Владелец" - это адрес, Вы его сравниваете с улицей только

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