7.7 Обход ТЗ

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

  1. TopicStarter Overlay
    igorekkrav
    Offline

    igorekkrav Опытный в 1С

    Регистрация:
    29 апр 2010
    Сообщения:
    223
    Симпатии:
    0
    Баллы:
    26
    Нет стоит представление в виде наименования

    Пишет ошибку
    {Отчет.Планирование.Форма.Модуль(109)}: Значение не представляет агрегатный объект (Наименование)
  2. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Смотрите отладчиком, что вноситься в представление при заполнении списка. Попробуйте (в заполнении списка) заменить Запрос.Владелец на СокрЛП(Запрос.Владелец).
  3. TopicStarter Overlay
    igorekkrav
    Offline

    igorekkrav Опытный в 1С

    Регистрация:
    29 апр 2010
    Сообщения:
    223
    Симпатии:
    0
    Баллы:
    26
    Помоголо спасибо!!!
  4. Requin
    Offline

    Requin Опытный в 1С

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

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

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Попробую повернуть мыслю в другую сторону.
    Я бы просто перебирал строки с конца, и выводил каждую строку, в которой контрагент отличается от предыдущего.
  6. TopicStarter Overlay
    igorekkrav
    Offline

    igorekkrav Опытный в 1С

    Регистрация:
    29 апр 2010
    Сообщения:
    223
    Симпатии:
    0
    Баллы:
    26
    Хорошая мысль! А как можно обойти с конца?
  7. Requin
    Offline

    Requin Опытный в 1С

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

    Lo1jke Опытный в 1С

    Регистрация:
    14 мар 2011
    Сообщения:
    136
    Симпатии:
    0
    Баллы:
    26
    Вопрос смежной тематики:
    Как сделать поиск по ТЗ, сразу по нескольким значениям колонок, не прибегая к обходу построчно всей ТЗ?

    ТЗ.НайтиЗначение(<Знач>,<Строка>,<Колонка>);

    Делает выборку первого по введенному значению.
  9. alp
    Offline

    alp Опытный в 1С

    Регистрация:
    8 янв 2009
    Сообщения:
    432
    Симпатии:
    0
    Баллы:
    26
    Ни как .
  10. WaRDeR
    Offline

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

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    обычно сортируется ТЗ по нужным колонкам, по первой ищется значение, а потом уже перебор.

    Код:
    Функция ПолучитьНомерСтроки(ТЗ, СписокКлючей) Экспорт
    
    НаименованиеКлюча = "";
    ЗначениеКлюча = СписокКлючей.ПолучитьЗначение(1, НаименованиеКлюча);
    
    ИскСтрока = "";
    Если ТЗ.НайтиЗначение(ЗначениеКлюча, ИскСтрока, НаименованиеКлюча) = 0 Тогда
    Возврат 0;
    КонецЕсли;
    
    СписокФлаговНайденныхКлючей = СоздатьОбъект("СписокЗначений"); // если флаг определенного уровня найден, то устанавливается 1
    СписокФлаговНайденныхКлючей.Установить("1", 1);
    
    Пока ИскСтрока <= ТЗ.КоличествоСтрок() Цикл
    // Проверяем найденные ключи
    Для пц1 = 1 По СписокКлючей.РазмерСписка() Цикл
    Если СписокФлаговНайденныхКлючей.Получить(Строка(пц1)) <> 1 Тогда
    Прервать;
    КонецЕсли;
    НаименованиеКлюча = "";
    ЗначениеКлюча = СписокКлючей.ПолучитьЗначение(пц1, НаименованиеКлюча);
    Если ТЗ.ПолучитьЗначение(ИскСтрока, НаименованиеКлюча) <> ЗначениеКлюча Тогда
    Возврат 0;
    КонецЕсли;
    КонецЦикла;
    
    // Сравниваем новые ключи
    Для пц2 = пц1 По СписокКлючей.РазмерСписка() Цикл
    НаименованиеКлюча = "";
    ЗначениеКлюча = СписокКлючей.ПолучитьЗначение(пц2, НаименованиеКлюча);
    Если ТЗ.ПолучитьЗначение(ИскСтрока, НаименованиеКлюча) = ЗначениеКлюча Тогда
    СписокФлаговНайденныхКлючей.Установить(Строка(пц2), 1);
    Иначе
    Прервать;
    КонецЕсли;
    КонецЦикла;
    
    // Если найдены все ключи и предыдущий цикл полностью отработал, то пц2 > СписокКлючей.РазмерСписка()
    Если пц2 > СписокКлючей.РазмерСписка() Тогда
    Возврат ИскСтрока;
    КонецЕсли; 
    
    ИскСтрока = ИскСтрока + 1;
    
    КонецЦикла;
    
    Возврат 0;
    
    КонецФункции
    
    
    думаю описывать входящие параметры не нужно?
  11. Lo1jke
    Offline

    Lo1jke Опытный в 1С

    Регистрация:
    14 мар 2011
    Сообщения:
    136
    Симпатии:
    0
    Баллы:
    26
    WaRDeR , нет не нужно, спасибо.
    Попробую прикрутить к отчету, посмотрим на производительность.

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