7.7 Обход справоничка

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем igorekkrav, 25 фев 2011.

  1. TopicStarter Overlay
    igorekkrav
    Offline

    igorekkrav Опытный в 1С

    Регистрация:
    29 апр 2010
    Сообщения:
    223
    Симпатии:
    0
    Баллы:
    26
    Добрый день!!
    Подскажите есть справочник в нем реквизиты Дата и Дата1
    В форме списке отображается так
    Код | Дата | Дата1 | Наименование
    1 | 20.02.11 | 21.02.11 | .......
    2 | 21.02.11

    Как можно получить значения когда Дата1 <> Дата (следующий)

    То есть если код (1) Дата1 не равно или отсутствует код(2) Дата.


    :angry:
  2. Mitay_D
    Offline

    Mitay_D Опытный в 1С

    Регистрация:
    16 фев 2010
    Сообщения:
    314
    Симпатии:
    0
    Баллы:
    26
    Может не правильно понял, а что если в цикле перебрать элементы списка вначале ты получаешь Дата1, прибавляешь к ней 1 и проверяешь на сходство со следующей строкой.
  3. TopicStarter Overlay
    igorekkrav
    Offline

    igorekkrav Опытный в 1С

    Регистрация:
    29 апр 2010
    Сообщения:
    223
    Симпатии:
    0
    Баллы:
    26
    1ницу мне нужно прибавить к самой дате? Мне главное проверить сходство Даты 1 и Даты (код2).
    Если они соответствуют тогда сказать об этом.
  4. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Какой-то экзотический подход к использованию справочника... Может озвучь задачу?
  5. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Как-то так:
    Код:
    Спр = СоздатьОбъект("Справочник.ИмяСправочника");
    ПредЭлемент = ""; ТекЭлемент = "";
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
    Если (Спр.ЭтоГруппа() = 1) Или (Спр.ПометкаУдаления() = 1) Тогда Продолжить; КонецЕсли;
    ТекЭлемент = Спр.ТекущийЭлемент();
    
    Если ПредЭлемент.Выбран() = 1 Тогда
    Если ПредЭлемент.Дата1 <> ТекЭлемент.Дата Тогда
    // искомый элемент
    Сообщить("" + ПредЭлемент);
    КонецЕсли;
    КонецЕсли;
    ПредЭлемент = Спр.ТекущийЭлемент();
    КонецЦикла;
    
    
  6. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    небольшая ошибка
    Код:
    Если ПредЭлемент.Дата1 <> ТекЭлемент.Дата1 Тогда
    
    
  7. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
  8. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Да. Действительно. Это я не внимательно в первом посте посмотрел. Показалось что нужно сравнивать одноименные реквизиты
  9. TopicStarter Overlay
    igorekkrav
    Offline

    igorekkrav Опытный в 1С

    Регистрация:
    29 апр 2010
    Сообщения:
    223
    Симпатии:
    0
    Баллы:
    26
    Сделал так . Пишет ошибку( {Справочник.ХКК.ФормаСписка.ФормаСписка.Модуль(73)}: Значение не представляет агрегатный объект (Выбран) )

    Код:
    Спр = СоздатьОбъект("Справочник.ХКК");
    ПредЭлемент = ""; 
    ТекЭлемент = "";
    Спр.ВыбратьЭлементы(0);
    Пока Спр.ПолучитьЭлемент() = 1 Цикл   
    ДатаК = Спр.Наименование;  
    ДатаП = Спр.ДатаКонтакта1;  
    Если (Спр.ЭтоГруппа() = 1) Или (Спр.ПометкаУдаления() = 1) Тогда Продолжить; КонецЕсли;
    ТекЭлемент = Спр.ТекущийЭлемент();
    
    Если ПредЭлемент.Выбран() = 1 Тогда
    Если ПредЭлемент.ДатаП <> ТекЭлемент.ДатаК Тогда
    // искомый элемент
    Сообщить("" + ПредЭлемент);
    КонецЕсли;
    КонецЕсли;
    ПредЭлемент = Спр.ТекущийЭлемент();
    КонецЦикла;
    
  10. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Да, небольшая неточность: при первой итерации ПредЭлемент имеет тип - строка.
    Код:
    Если ПустоеЗначение(ПредЭлемент) = 0 Тогда
    
    И вот эта строчка меня смущает. Все таки правильно выбирать через владельца.
    Код:
    Спр = СоздатьОбъект("Справочник.ХКК");
    СпрВл = СоздатьОбъект("Справочник.ВладелецХКК");
    СпрВл.ВыбратьЭлементы();
    Пока СпрВл.ПолучитьЭлемент() = 1 Тогда
    Спр.ИспользоватьВладельца(СпрВл.ТекущийЭлемент());
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент() = 1 Тогда
    //
    КонецЦикла;
    КонецЦикла;
    
  11. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    А я не согласен. Все зависит от задачи. Зачем делать еще одну выборку, если она может не понадобится?
  12. TopicStarter Overlay
    igorekkrav
    Offline

    igorekkrav Опытный в 1С

    Регистрация:
    29 апр 2010
    Сообщения:
    223
    Симпатии:
    0
    Баллы:
    26
    Написал я обработку но не получается не делает она того что нужно . Напомню (подскажите есть справочник ХКК в нем реквизиты Дата и Дата1
    В форме списке отображается так
    Код | Дата | Дата1 | Наименование
    1 | 20.02.11 | 21.02.11 | .......
    2 | 21.02.11

    Как можно получить значения когда Дата1 <> Дата (следующий)

    То есть если код (1) Дата1 не равно или отсутствует код(2) Дата.
    Он подчинен справочнику Клиенты.



    Код:
    Процедура Сформировать()  
    ПредЭлемент = ""; 
    ТекЭлемент = ""; 
    Таб = СоздатьОбъект("Таблица"); 
    Спр = СоздатьОбъект("Справочник.ХКК");  
    СпрВл = СоздатьОбъект("Справочник.Клиенты");
    СпрВл.ВыбратьЭлементы();
    Пока СпрВл.ПолучитьЭлемент() = 1 Цикл
    Спр.ИспользоватьВладельца(СпрВл.ТекущийЭлемент());
    Спр.ВыбратьЭлементы();    
    ДатаК = Спр.ДатаКонтакта;  
    ДатаП = Спр.ДатаКонтакта1;
    Пока Спр.ПолучитьЭлемент() = 1 Цикл   
    Клиент = Спр.Владелец.ПолнНаим;	
    Если (Спр.ЭтоГруппа() = 1) Или (Спр.ПометкаУдаления() = 1) Тогда Продолжить; 
    КонецЕсли;
    ТекЭлемент = Спр.ТекущийЭлемент();  
    Если ПустоеЗначение(ДатаП)  = 0 <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/тогда')">Тогда	</span>
    Если ПустоеЗначение(ПредЭлемент)  = 0 Тогда
    Если ПредЭлемент.ДатаКонтакта <> ТекЭлемент.ДатаКонтакта1 Тогда
    // искомый элемент  
    Таб.ИсходнаяТаблица("Таблица");
    Таб.ВывестиСекцию("Рабочая");
    КонецЕсли;  
    КонецЕсли;
    КонецЕсли;
    ПредЭлемент = Спр.ТекущийЭлемент(); 
    КонецЦикла;
    КонецЦикла;    
    Таб.ТолькоПросмотр(1);   
    Таб.Показать("Сформировать", ""); 
    КонецПроцедуры
    
  13. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Попробуйте так:
    Код:
    Процедура Сформировать()  
    ПредЭлемент = ""; 
    ТекЭлемент = ""; 
    Таб = СоздатьОбъект("Таблица"); 
    
    Спр = СоздатьОбъект("Справочник.ХКК");  
    СпрВл = СоздатьОбъект("Справочник.Клиенты");
    СпрВл.ВыбратьЭлементы();
    Пока СпрВл.ПолучитьЭлемент() = 1 Цикл
    Спр.ИспользоватьВладельца(СпрВл.ТекущийЭлемент());
    Спр.ВыбратьЭлементы();    
    Пока Спр.ПолучитьЭлемент() = 1 Цикл   
    Если (Спр.ЭтоГруппа() = 1) Или (Спр.ПометкаУдаления() = 1) Тогда Продолжить; КонецЕсли;
    
    ДатаК = Спр.ДатаКонтакта;  
    ДатаП = Спр.ДатаКонтакта1;
    Клиент = СпрВл.ПолнНаим;    
    ТекЭлемент = Спр.ТекущийЭлемент();  
    
    Если ПустоеЗначение(ДатаП)  = 1 Тогда
    Таб.ИсходнаяТаблица("Таблица");
    Таб.ВывестиСекцию("Рабочая");
    Иначе    
    Если ПустоеЗначение(ПредЭлемент)  = 0 Тогда
    Если ПредЭлемент.ДатаКонтакта1 <> ТекЭлемент.ДатаКонтакта Тогда
    Таб.ИсходнаяТаблица("Таблица");
    Таб.ВывестиСекцию("Рабочая");
    КонецЕсли;  
    КонецЕсли;
    КонецЕсли;
    ПредЭлемент = Спр.ТекущийЭлемент(); 
    КонецЦикла;
    КонецЦикла;    
    
    Таб.ТолькоПросмотр(1);   
    Таб.Показать("Сформировать", ""); 
    КонецПроцедуры
    
    
    
  14. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Дополнение:
    Код:
    //...
    Если ПустоеЗначение(ДатаП)  = 1 Тогда
    // здесь искомое значение будет [b]ТекЭлемент[/b]
    Иначе    
    Если ПустоеЗначение(ПредЭлемент)  = 0 Тогда
    Если ПредЭлемент.ДатаКонтакта1 <> ТекЭлемент.ДатаКонтакта Тогда
    // здесь искомое значение будет [b]ПредЭлемент[/b]
    КонецЕсли;  
    КонецЕсли;
    КонецЕсли;
    //...
    
    
  15. TopicStarter Overlay
    igorekkrav
    Offline

    igorekkrav Опытный в 1С

    Регистрация:
    29 апр 2010
    Сообщения:
    223
    Симпатии:
    0
    Баллы:
    26
    Вроде что-то получилось!!! :angry: Тока сразу возникли 2 вопроса.
    Он когда обходит справочник сортирует не по дате а по числу в дате ? Возможно ли сортировка в отчете. И еще чувство что обходя справочник он не по порядку , возможно ли такое?


    И самый главный вопрос , можно ли имея значения запроса

    Запрос.Дата1 Запрос.Дата сделать тоже самое?
    То есть справочник обработать так же только через запрос?
  16. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Выборка у вас в разрезе владельца. По умолчанию сортировка по коду или по наименованию (это смотря какое основное представление). Если у реквизита (например, ДатаКонтакта) установить свойство Сортировка, то можно перед выборкой отсортировать по дате:
    Код:
    Спр.ПорядокРеквизита("ДатаКонтакта");
    
    По идее - можно. Показывайте, что хотите отбирать в запросе - будем думать.
  17. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Хотя одним запросом вряд ли получиться.
  18. TopicStarter Overlay
    igorekkrav
    Offline

    igorekkrav Опытный в 1С

    Регистрация:
    29 апр 2010
    Сообщения:
    223
    Симпатии:
    0
    Баллы:
    26
    Код:
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса="";
    ТекстЗапроса=ТекстЗапроса+"
    ПЕРИОД С ВыбНачПериода По ВыбКонПериода;";
    ТекстЗапроса=ТекстЗапроса+"
    Владелец = Справочник.ХКК.Владелец;   
    ТекущийЭлемент = Справочник.ХКК.ТекущийЭлемент; 
    Менеджер = Справочник.ХКК.Владелец.Менеджер;
    ДатаКонтакта = Справочник.ХКК.ДатаКонтакта;
    ДатаКонтакта1 = Справочник.ХКК.ДатаКонтакта1; 
    Группировка ТекущийЭлемент упорядочить по ТекущийЭлемент.ДатаКонтакта без групп;
    Условие(Менеджер в ВыбМенеджер); 
    
    Вот запрос . Сейчас опишу как выглядит справочник :
    В форме списке отображается так
    Код | ДатаКонтакта | ДатаКонтакта1 | Наименование
    1 | 20.02.11 |21.02.11 | .......
    2 | 26.02.11

    Хочу в результате этого запроса вывести в отчет все значения справочника (по владельцу) когда
    ДатаКонтакта1 (код1) <> ДатаКонтакта (2)

    Значений в списке может быть не два соответственно. Как такое можно осуществить? Или реально ли ?
    Попробовал просто через обход справочника вроде что-то получилось , а тут не знаю как сделать .
  19. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    2 последующих элемента в запросе вы не сравните. Только перебором
  20. TopicStarter Overlay
    igorekkrav
    Offline

    igorekkrav Опытный в 1С

    Регистрация:
    29 апр 2010
    Сообщения:
    223
    Симпатии:
    0
    Баллы:
    26
    Возможно ли совместить это потом с запросом?То есть в форме отчета и вывести в одной единой форме ?

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