8.х Выделить повторяющую строку

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

  1. TopicStarter Overlay
    Sonya
    Offline

    Sonya Опытный в 1С

    Регистрация:
    16 окт 2008
    Сообщения:
    75
    Симпатии:
    0
    Баллы:
    26
    Как на восьмерке сделать отчет чтобы строка где встречается одинаковое ФИО повторное выделить красным цветом.
    На 7.7 вот такой код отчета:
    Код:
    Процедура ЖурналУчета() 
    Таб.ИсходнаяТаблица("ЖурналУчета");
    Запрос = СоздатьОбъект("Запрос");
    ТЗ = 	
    "//{{ЗАПРОС(ЖурналУчета)
    |ОбрабатыватьДокументы Проведенные;
    |Период с ВыбНачПериода по ВыбКонПериода;
    |ДатаДок = Документ.Льгота.ДатаДок; 
    |НомерДок = Документ.Льгота.НомерДок;
    |Сотрудники = Документ.Льгота.Сотрудники.Наименование;
    |ВидУслуги = Документ.Льгота.ВидУслуги;
    |Комментарий=Документ.Льгота.Примечание;
    |Ммесяцы = Документ.Льгота.Ммесяцы;
    |ТекущийДокумент = Документ.Льгота.ТекущийДокумент;
    |Группировка Ммесяцы;
    |Группировка Сотрудники все;
    |Группировка ВидУслуги;
    |Группировка ДатаДок;
    |Группировка НомерДок;
    |Группировка ТекущийДокумент; 
    |Группировка Комментарий;
    |Условие(Ммесяцы в ВыбМмесяцы);
    |Условие(ВидУслуги в ВыбВидУслуги);
    |"//}}ЗАПРОС
    ;
    Если Запрос.Выполнить(ТЗ) = 0 Тогда
    Возврат;
    КонецЕсли;      
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Список=СоздатьОбъект("СписокЗначений");      //для выделения красным
    Пока Запрос.Группировка(1) = 1 Цикл
    Пока Запрос.Группировка(2) = 1 Цикл
    Пока Запрос.Группировка(3) = 1 Цикл
    Пока Запрос.Группировка(4) = 1 Цикл
    Пока Запрос.Группировка(5) = 1 Цикл
    Пока Запрос.Группировка(6) = 1 Цикл
    
    Пока Запрос.Группировка(7) = 1 Цикл 
    РасшДок = Запрос.ТекущийДокумент;
    //ВывестиСтроку(Запрос);
    Если  Список.НайтиЗначение(Запрос.Сотрудники)>0 Тогда
    Таб.ВывестиСекцию("Строка1");
    Иначе
    Список.ДобавитьЗначение(Запрос.Сотрудники);
    Таб.ВывестиСекцию("Строка"); 
    КонецЕсли; 
    КонецЦикла;
    
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;   
    Таб.Опции(0,0,2,2,"Параметры печати книги продаж" );
    Таб.ОбластьПечати(2);
    Таб.ПараметрыСтраницы(2,,,,,,,,,1);
    Таб.ТолькоПросмотр(1);
    Таб.Показать("ЖурналУчета","");
    КонецПроцедуры // ЖурналУчета()	
    
    На восьмерке пытаюсь вот что получается

    Код:
    Процедура ПроверкаКвитанций(ТабДок, ВыбКонец, ВыбНачало) Экспорт
    Макет = ОтчетОбъект.ПолучитьМакет("ПроверкаКвитанций");
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	НачислениеЗарплатыРаботникамОрганизаций.Дата,
    |	НачислениеЗарплатыРаботникамОрганизаций.Номер,
    |	НачислениеЗарплатыРаботникамОрганизаций.Начисления.(
    |		Физлицо КАК Физлицо,
    |		ПРЕДСТАВЛЕНИЕ(НачислениеЗарплатыРаботникамОрганизаций.Начисления.Физлицо),
    |		ВидУслуги,
    |		Месяц
    |	)
    |ИЗ
    |	Документ.НачислениеЗарплатыРаботникамОрганизаций КАК НачислениеЗарплатыРаботникамОрганизаций
    |ГДЕ
    |	НачислениеЗарплатыРаботникамОрганизаций.Дата МЕЖДУ &ВыбНачало И &ВыбКонец
    |
    |УПОРЯДОЧИТЬ ПО
    |	Физлицо";
    
    Запрос.УстановитьПараметр("ВыбКонец", ВыбКонец);
    Запрос.УстановитьПараметр("ВыбНачало", ВыбНачало);
    
    Результат = Запрос.Выполнить();
    
    ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
    ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
    ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");
    ОбластьДетальныхЗаписей1 = Макет.ПолучитьОбласть("Детали1");
    
    ТабДок.Очистить();
    ТабДок.Вывести(ОбластьЗаголовок);
    ТабДок.Вывести(ОбластьШапкаТаблицы);
    ТабДок.НачатьАвтогруппировкуСтрок();
    
    ВыборкаДетали = Результат.Выбрать();
    Список=Новый СписокЗначений; //для выделения красным
    
    Пока ВыборкаДетали.Следующий() Цикл
    НачисленияВыборкаДетали = ВыборкаДетали.Начисления.Выбрать();
    Пока НачисленияВыборкаДетали.Следующий() Цикл
    ОбластьДетальныхЗаписей.Параметры.Заполнить(НачисленияВыборкаДетали);
    ОбластьДетальныхЗаписей1.Параметры.Заполнить(НачисленияВыборкаДетали);
    
    КонецЦикла;
    //Запрос.Физлицо - не найдено пишет физлицо
    Если    Список.НайтиПоЗначению(Запрос.Физлицо) >0     Тогда
    ТабДок.Вывести(ОбластьДетальныхЗаписей1, ВыборкаДетали.Уровень());
    Иначе
    Список.Добавить(Запрос.Физлицо);
    ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());
    КонецЕсли;
    
    ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
    ОбластьДетальныхЗаписей1.Параметры.Заполнить(ВыборкаДетали);
    
    ТабДок.НачатьГруппуСтрок();
    ТабДок.НачатьАвтогруппировкуСтрок();
    
    
    ТабДок.ЗакончитьАвтогруппировкуСтрок();
    ТабДок.ЗакончитьГруппуСтрок();
    КонецЦикла;
    
    ТабДок.ЗакончитьАвтогруппировкуСтрок();
    
    Что то не правильно вообще делаю со списком значений. Как правильно задать условие Список.НайтиПоЗначению(Запрос.Физлицо) >0 ???
  2. BabySG
    Offline

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

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Используйте соответствие, в качестве значение соответствия - массив областей, которые надо выделять. Задача очень простая, как и решение.
  3. TopicStarter Overlay
    Sonya
    Offline

    Sonya Опытный в 1С

    Регистрация:
    16 окт 2008
    Сообщения:
    75
    Симпатии:
    0
    Баллы:
    26
    Про соответствие мало что говориться, так и не поняла решение задачи не смотря на то что она очень простая. :(
  4. TopicStarter Overlay
    Sonya
    Offline

    Sonya Опытный в 1С

    Регистрация:
    16 окт 2008
    Сообщения:
    75
    Симпатии:
    0
    Баллы:
    26
    Помогите пожалуйста объясните про соответствие, и как использовать массив обастей?
  5. vitaly_mnpz
    Offline

    vitaly_mnpz Опытный в 1С

    Регистрация:
    15 фев 2009
    Сообщения:
    267
    Симпатии:
    0
    Баллы:
    26
    Измененный фрагмент.
    Попробуйте так.

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

    Sonya Опытный в 1С

    Регистрация:
    16 окт 2008
    Сообщения:
    75
    Симпатии:
    0
    Баллы:
    26
    Попробывала
    1. Ругается на Метод объекта не обнаружен (Найти)
    Если КэшФизлиц.Найти(НачисленияВыборкаДетали.ФизЛицо) <> Неопределено Тогда
    Так как КэшФизлиц - это масив там нет функции Найти
    2. Ругается на Метод объекта не обнаружен (ТекущаяОбласть)
    МассивОбластей.Добавить(ОбластьДетальныхЗаписей.ТекущаяОбласть());
    3. Ругается на ЦветТекста тоже не обнаружен
    Элемент.ЦветТекста = Новый Цвет(255, 0, 0);
  7. vitaly_mnpz
    Offline

    vitaly_mnpz Опытный в 1С

    Регистрация:
    15 фев 2009
    Сообщения:
    267
    Симпатии:
    0
    Баллы:
    26
    Как это нет??? Какая версия платформы? Хотя, по-моему поиск в массиве был всегда...

    Да, здесь я ошибся. Не было 1с-ки под рукой

    нужно не так,
    Код:
    ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());		
    Если  КэшФизлиц.Найти(НачисленияВыборкаДетали.ФизЛицо) <> Неопределено  Тогда   // Физ лицо найдено, добавляем область для раскрашивания
    МассивОбластей.Добавить(ОбластьДетальныхЗаписей.ТекущаяОбласть());	
    Иначе                                                    // Физлицо не найдено, добавляем в кэш
    КэшФизлиц.Добавить(НачисленияВыборкаДетали.ФизЛицо);
    КонецЕсли; 
    
    а вот так
    Код:
    ОбластьЯчеек = ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());		
    Если  КэшФизлиц.Найти(НачисленияВыборкаДетали.ФизЛицо) <> Неопределено  Тогда   // Физ лицо найдено, добавляем область для раскрашивания
    МассивОбластей.Добавить(ОбластьЯчеек);	
    Иначе                                                    // Физлицо не найдено, добавляем в кэш
    КэшФизлиц.Добавить(НачисленияВыборкаДетали.ФизЛицо);
    КонецЕсли; 
    
  8. TopicStarter Overlay
    Sonya
    Offline

    Sonya Опытный в 1С

    Регистрация:
    16 окт 2008
    Сообщения:
    75
    Симпатии:
    0
    Баллы:
    26
    1С:Предприятие 8.0 (8.0.14.39)
    старая платформа но суть не в этом вот Методы:
    ВГраница (UBound)
    Вставить (Insert)
    Добавить (Add)
    Количество (Count)
    Очистить (Clear)
    Получить (Get)
    Удалить (Delete)
    Установить (Set)
    а Найти нет?:( поэтому и ругается

    вот нашла
    Есть две таблицы значений. Как получить массив совпадающих имен колонок?
    Код:
    МассивСовпадающихКолонок = Новый Массив(); 
    Для Каждого Колонка Из ТаблицаПриемник.Колонки Цикл 
    ИмяКолонкиПриемника = Колонка.Имя; 
    Если ТаблицаИсточник.Колонки.Найти(ИмяКолонкиПриемника) <> Неопределено Тогда 
    МассивСовпадающихКолонок.Добавить(ИмяКолонкиПриемника); 
    КонецЕсли; 
    КонецЦикла; 
    
    Метод Найти используют не для массива, хотя может это не удачный пример.
  9. vitaly_mnpz
    Offline

    vitaly_mnpz Опытный в 1С

    Регистрация:
    15 фев 2009
    Сообщения:
    267
    Симпатии:
    0
    Баллы:
    26
    Суть в этом :) 1С:Предприятие 8.1 (8.1.13.41)
    Методы:
    ВГраница (UBound)
    Вставить (Insert)
    Добавить (Add)
    Количество (Count)
    Найти (Find)
    Очистить (Clear)
    Получить (Get)
    Удалить (Delete)
    Установить (Set)

    Используйте соответствие тогда.
    Код:
    КэшФизлиц = Новый Соответствие; //конструктор
    
    КэшФизлиц.Вставить(ЗначениеФизЛица,Истина); // Вставка
    
    Кэшфизлиц[ЗначениеФизЛица] = Истина // Поиск (Физлицо найдено в соответствии)
    Кэшфизлиц[ЗначениеФизЛица] = Неопределено //Поиск (Физлицо не найдено в соответствии)
    
    
    
  10. TopicStarter Overlay
    Sonya
    Offline

    Sonya Опытный в 1С

    Регистрация:
    16 окт 2008
    Сообщения:
    75
    Симпатии:
    0
    Баллы:
    26
    Ага суть получается в этом:)

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