Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
06 дек 2025, 19:33

Сравнение данных

Автор art78593, Вчера в 09:36

0 Пользователей и 1 гость просматривают эту тему.

art78593

здравствуйте помогите пожалуйста сделать так чтобы при нажатии кнопки сравнивались данные ит ТабДока и Таблицы Значений при помощи массивов и если в таб доке есть данные которых нет в таблице значений то надо окрасить эту строку в красный цвет в таб доке

&НаКлиенте
Процедура Имя_ФайлаНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
      Имя_Файла="";
ПоместитьФайл(Имя_Файла,,Имя_Файла,Истина);

КонецПроцедуры

&НаКлиенте
Процедура Прочитать(Команда)
  ПрочитатьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПрочитатьНаСервере()
   ТабДок.Прочитать(Имя_Файла,СпособЧтенияЗначенийТабличногоДокумента.Текст);
КонецПроцедуры
&НаСервере
Процедура ЗагрузтьСотрудникиНаСервере()
   // Вставить содержимое обработчика.   
   // запрос для получения сотрудников
   Запрос=Новый Запрос;
   Запрос.Текст="ВЫБРАТЬ
                |   Сотрудники.Наименование КАК Наименование
                |ИЗ
                |   Справочник.Сотрудники КАК Сотрудники";
   Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
   
    // Заполняем таблицу
    Пока Выборка.Следующий() Цикл
        НоваяСтрока = ТС.Добавить();
        НоваяСтрока.Наименование = Выборка.Наименование;
    КонецЦикла;      
   КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьСотрудников(Команда)
   ЗагрузтьСотрудникиНаСервере();
КонецПроцедуры   


&НаСервере
Процедура СравнитьИсполнителейПоТабДок(ТабДок, ТС)

    Если ТабДок = Неопределено Тогда
        Возврат;
    КонецЕсли;

    // --- 1. Собираем массив сотрудников из ТС ---
    МассивСотрудников = Новый Массив;
    Если ТС <> Неопределено Тогда
        Для Каждого СтрТС Из ТС Цикл
            Если НЕ ПустаяСтрока(СтрТС.Наименование) Тогда
                МассивСотрудников.Добавить(СокрЛП(СтрТС.Наименование));
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;

    // --- 2. Находим заголовок колонки с исполнителем ---
    ЗаголовокИскомый = "Исполнитель"; // или "ИсполнительФИО", "ИсполнительФИО/ФИО" — подбери своё
    ОбластьЗаголовка = ТабДок.НайтиЯчейку(ЗаголовокИскомый);

    Если ОбластьЗаголовка = Неопределено Тогда
        // Попробуем найти точнее по другим вариантам
        ОбластьЗаголовка = ТабДок.НайтиЯчейку("ИсполнительФИО");
    КонецЕсли;

    Если ОбластьЗаголовка = Неопределено Тогда
        // Не нашли заголовок — можно перебрать первые N строк и попытаться угадать колонку
        // В этом примере прекращаем выполнение
        Сообщить("Не найден заголовок колонки с исполнителем в ТабДок.");
        Возврат;
    КонецЕсли;

    НомерКолонки = ОбластьЗаголовка.НомерКолонки;
    НомерСтрокиНачало = ОбластьЗаголовка.НомерСтроки + 1; // данные начинаются ниже заголовка

    // --- 3. Проходим по строкам вниз, пока есть ячейки в этой колонке ---
    ТекСтрока = НомерСтрокиНачало;
    Пока Истина Цикл

        Попытка
            Ячейка = ТабДок.ПолучитьЯчейку(ТекСтрока, НомерКолонки);
        Исключение
            // Если метод недоступен или индекс вышел за пределы — выходим
            Прервать;
        КонецПопытки;

        Если Ячейка = Неопределено Тогда
            // Больше строк нет — выходим
            Прервать;
        КонецЕсли;

        Значение = Ячейка.Значение;
        Если Значение = Неопределено Тогда
            ЗначениеСтр = "";
        Иначе
            ЗначениеСтр = СокрЛП(Строка(Значение));
        КонецЕсли;

        // Если пустая строка — пропускаем
        Если ПустаяСтрока(ЗначениеСтр) Тогда
            ТекСтрока = ТекСтрока + 1;
            Продолжить;
        КонецЕсли;

        // Сравниваем с массивом сотрудников (нормализуем регистр/пробелы)
        Если Не МассивСотрудников.Содержит(ЗначениеСтр) Тогда

            // Подсветка найденной ячейки
            Попытка
                Ячейка.ЦветФона = Новый Цвет(255,200,200); // светло-красный
            Исключение
                // Если свойство недоступно, можно попробовать через Область
                Попытка
                    Обл = ТабДок.НайтиЯчейку(Значение);
                    Если Обл <> Неопределено Тогда
                        Обл.ЦветФона = Новый Цвет(255,200,200);
                    КонецЕсли;
                Исключение
                КонецПопытки;
            КонецПопытки;

            // Если нужно подсветить всю строку — пробуем получить область строки
            Попытка
                ОблСтроки = Ячейка.ПолучитьОбластьСтроки();
                Если ОблСтроки <> Неопределено Тогда
                    ОблСтроки.ЦветФона = Новый Цвет(255,200,200);
                КонецЕсли;
            Исключение
            КонецПопытки;

        КонецЕсли;

        ТекСтрока = ТекСтрока + 1;
    КонецЦикла;

КонецПроцедуры
&НаКлиенте
Процедура СравнитьДанные(Команда)
    СравнитьИсполнителейПоТабДок(ТабДок, ТС);
КонецПроцедуры

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск