7.7 Выгрузка данных справочника с условием

Тема в разделе "Отчеты и обработки для "1С:Предприятие 7.7"", создана пользователем trolley, 12 дек 2010.

  1. TopicStarter Overlay
    trolley
    Offline

    trolley

    Регистрация:
    14 ноя 2010
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Доброго времени суток!
    Взял из "копилки" обработку "Выгрузка в excel из 1c export.ert"
    Потребовалось добавить условия по двум реквизитам, первый реквизит ДатаВнесенияЭлемента справочника(возможно период), а второй реквизит выгрузка данных по значению реквизита ("ЗначРекв"). Сначала попробовал сделать по ЗначРекв.
    Далее код процедуры сформировать:

    Код:
    Процедура Сформировать()
    КолРек=СпсРек.РазмерСписка();
    Если КолРек=0 Тогда
    Сообщить("Нет выбранных полей для экспорта");
    Возврат;
    КонецЕсли;
    ИмяСпр="Справочник."+СокрЛП(ТипСпр.ПолучитьЗначение(СписСпр.ТекущаяСтрока(),"Идентификатор"));
    Спр    = СоздатьОбъект(ИмяСпр);
    
    КолУр=Метаданные.Справочник(СокрЛП(ТипСпр.ПолучитьЗначение(СписСпр.ТекущаяСтрока(),"Идентификатор"))).КоличествоУровней;
    
    Спс=СоздатьОбъект("СписокЗначений");
    Для НомУр=1 По КолУр Цикл
    Спс.ДобавитьЗначение(0);
    КонецЦикла;
    НовыеРабочиеКниги=ExcelApp.WorkBooks;
    РабочаяКнига    =НовыеРабочиеКниги.Add();
    Страница=РабочаяКнига.Worksheets(1);
    Страница.Name = СокрЛП(ТипСпр.ПолучитьЗначение(СписСпр.ТекущаяСтрока(),"Представление"));
    Для Ном=1 По КолРек Цикл
    ExcelApp.Cells(1,Ном).Value=СпсРек.ПолучитьЗначение(Ном);
    КонецЦикла;
    Стр=1;
    Если ВыбЭлем.Выбран() > 0 Тогда
    Спр.ВключатьПодчиненные(1);
    Если ВыбЭлем.ЭтоГруппа()=1 Тогда
    Спр.ИспользоватьРодителя(ВыбЭлем);
    КонецЕсли;
    КонецЕсли;
    НомСорт=СпсСорт.ТекущаяСтрока();
    Если НомСорт=2 Тогда
    Спр.ПорядокКодов();
    ИначеЕсли НомСорт=3 Тогда
    Спр.ПорядокНаименований();
    ИначеЕсли НомСорт > 3 Тогда
    Спр.ПорядокРеквизита(СокрЛП(СпсСорт.ПолучитьЗначение(НомСорт)));
    КонецЕсли;
    Если ОбрПорядок > 0 Тогда
    Спр.ОбратныйПорядок(1);
    КонецЕсли;
    Спр.ИспользоватьДату(РабочаяДата());
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент() > 0 Цикл
    Нум = Нум + 1;
    Если Спр.ПометкаУдаления() > 0 Тогда
    Продолжить;
    КонецЕсли;
    Если (ВыбЭлем.Выбран()=1) И (ВыбЭлем.ЭтоГруппа()=0) И (ВыбЭлем <> Спр.ТекущийЭлемент() ) Тогда
    Продолжить;
    КонецЕсли;          
    Стр=Стр+1;
    Для Ном=1 По КолРек Цикл
    ИмяРек=СокрЛП(СпсРек.ПолучитьЗначение(Ном));
    сообщить (ИмяРек);
    Если СокрЛП(СпсРек.ПолучитьЗначение(Ном))="Id" Тогда
    МЗнач=ЗначениеВСтрокуВнутр(Спр.ТекущийЭлемент());
    ИначеЕсли СокрЛП(СпсРек.ПолучитьЗначение(Ном))="Код" Тогда
    МЗнач=Спр.Код;
    ИначеЕсли СокрЛП(СпсРек.ПолучитьЗначение(Ном))="Уровень" Тогда
    МЗнач=Спр.Уровень();
    ИначеЕсли СокрЛП(СпсРек.ПолучитьЗначение(Ном))="Наименование" Тогда
    МЗнач=Спр.Наименование;
    ИначеЕсли СокрЛП(СпсРек.ПолучитьЗначение(Ном))="Группа" Тогда
    МЗнач=Спр.ЭтоГруппа();
    ИначеЕсли СпсТипСпр.НайтиЗначение(ИмяРек) > 0 Тогда
    МЗнач=Спр.ПолучитьАтрибут(ИмяРек).Наименование;
    ИначеЕсли СпсТипПер.НайтиЗначение(ИмяРек) > 0 Тогда
    МЗнач=Спр.ПолучитьАтрибут(ИмяРек).Идентификатор();
    ИначеЕсли СпсТипСч.НайтиЗначение(ИмяРек) > 0 Тогда
    МЗнач=Спр.ПолучитьАтрибут(ИмяРек).Код+" "+Спр.ПолучитьАтрибут(ИмяРек).Наименование;
    ИначеЕсли СпсТипВРас.НайтиЗначение(ИмяРек) > 0 Тогда
    МЗнач=Спр.ПолучитьАтрибут(ИмяРек).Наименование;
    Иначе 
    МЗнач=СокрЛП(Спр.ПолучитьАтрибут(ИмяРек));
    сообщить (МЗнач);
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // вот здесь ставлю такое условие, результатом получаю все значения кроме "ЗначРекв"
    // НО когда меняю "равно" на "не равно" - Если МЗнач <> СокрЛП(ЗначРекв) получаю в файле
    // только последнюю запись справочника(причем только с первыми тремя ревизитами)
    // ЗначРекв задается вручную в форме обработки
    //
    Если МЗнач = СокрЛП(ЗначРекв) <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/тогда')">Тогда	</span>
    //перебор по реквизитам завершаю
    Ном=КолРек; 
    //смещаю строку след.записи на эту запись
    //т.е. перезаписываю новыми данными
    стр=стр-1;
    продолжить;
    КонецЕсли;           
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    КонецЕсли;
    ExcelApp.Cells(Стр,Ном).Value=МЗнач;
    Если (Спр.ЭтоГруппа() > 0) И (ВыдГруппу > 0) Тогда
    ExcelApp.Cells(Стр,Ном).Font.Bold=1;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    Страница.Outline.SummaryRow = 0;
    ExcelApp.Visible=1;
    КонецПроцедуры
    
    
    Проблема описано в коментариях кода. Подскажите в чем проблема, где я неправильно думаю? Может быть у кого-то есть более практичное решение данного вопроса?
  2. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Код:
    МЗнач <> СокрЛП(ЗначРекв)
    
    
    Пытаетесь сравнивать строковые величины... Попробуйте так:
    Код:
    СокрЛП(МЗнач) <> СокрЛП(ЗначРекв)
    
    
  3. TopicStarter Overlay
    trolley
    Offline

    trolley

    Регистрация:
    14 ноя 2010
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    У меня выше в коде
    Код:
    МЗнач=СокрЛП(Спр.ПолучитьАтрибут(ИмяРек));
    
    ну я все равно проверил, сделал как вы говорите, неа, аналогично, последняя строка и три реквизита.
    попробовал аналогично с датами, не знаю можно ли так делать, но всё же вот так сравнивал даты:
    Код:
    МЗнач <> СокрЛП(Дата)
    
    получаю точно такой же результат, последняя строка с тремя реквизитами, НО если поставить =, вот так:
    Код:
    МЗнач = СокрЛП(Дата)
    
    или
    Код:
    МЗнач = СокрЛП(ЗначРекв)
    
    тогда выгрузка данные выгружает данные.
    если сделать вот таким условием:
    Код:
    Если МЗнач = СокрЛП(ЗначРекв) тогда //ничего не далем, записываем данные в excel
    
    Иначе Ном=КолРек; //если не равно, то пропускаем данную строку(не записываем)
    стр=стр-1;
    продолжить;
    КонецЕсли;       
    
    
    тоже не работает - точно такой-же результат.
  4. TopicStarter Overlay
    trolley
    Offline

    trolley

    Регистрация:
    14 ноя 2010
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Не ну я не говорю чтоб обязательно мой алгоритм использовать...
    Может кто-то может что-то другое предложить?
Похожие темы
  1. zayaroslava
    Ответов:
    2
    Просмотров:
    597
  2. KIA
    Ответов:
    1
    Просмотров:
    365
  3. Reader
    Ответов:
    2
    Просмотров:
    2.194
  4. andrew76
    Ответов:
    1
    Просмотров:
    578
  5. GreenSH
    Ответов:
    3
    Просмотров:
    589
Загрузка...

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