ТЗ.НоваяКолонка ("Сотрудник"); ТЗ.НоваяКолонка ("КолСис"); // количество систем ............................................................................. ............................................................................. Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент()=1 Цикл ТЗ.НоваяСтрока(); ТЗ.Сотрудник = Спр.Наименование; ................................................... .................................................. К = 0;
Расх.ВыбратьДокументы(НачДата,КонДата);
Пока Расх.ПолучитьДокумент()=1 Цикл // Сообщить("Сотр:"+ ТЗ.Сотрудник); // Сообщить("Инж:"+ Расх.Инженер); // Сообщить("След. накл");
Если ТЗ.Сотрудник = Расх.Инженер Тогда К=К+1; // Иначе К=10; КонецЕсли;
я вставлял с целью диагностики проблемы. Пришел к выводу, что условие
Если ТЗ.Сотрудник = Расх.Инженер Тогда
не выполняется , когда оно должно выполняться. Реквизит Инженер в РасходныхНакладных берется из Справочника Сотрудники. Оттуда же берется и значение ТЗ. Сотрудник. Почему же при совпадении этих значений программа считает, что они не равны?! Программа в таблицу записывает К= 10. А если закомментировать тестовую строку Иначе К=10, тогда в столбце ТЗ.КолСис вообще ничего не прописывается. То есть, условие железно должно выполняться, а программа ведет себя так, вроде оно не выполняется. Уже сутки ломаю голову. Спасибо!
Это, конечно, не решение описанной ошибки, но решения для достижения результата - ТЗ со списком у какого из инженеров сколько документов. Возможно кто-то поправит, не помню есть ли в 7.7 в запросе функция по аналогии с "Количество различных", кажется нет, поэтому складываю количество в обработке запроса.
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли;
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка ("Сотрудник"); ТЗ.НоваяКолонка ("КолСис"); // количество систем
Пока Запрос.Группировка(1) = 1 Цикл ТЗ.НоваяСтрока(); ТЗ.Сотрудник = Запрос.Автор;
К = 0; Пока Запрос.Группировка(2) = 1 Цикл К = К + 1; КонецЦикла;
ТЗ.КолСис = К; КонецЦикла;
а в целом в такой ситуации, когда непонятно почему так происходит - отладчик в помощь, точку останова на "Если ТЗ.Сотрудник = Расх.Инженер" и смотреть что в одном поле и в другом. Но в первую очередь - согласен с предыдущим оратором - типы разные, строка сравнивается со справочником. Как варик - привести всё к строкам:
ТЗ.Сотрудник = Спр.Наименование; ////// ...... ////// Если ТЗ.Сотрудник = Расх.Инженер.Наименование Тогда
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 0
1Cv77 @ Сегодня, 21:26
, я вставлял в это место программы Сообщить. Значения переменных одинаковые. Я об этом писал в стартовом посте.
Макс1С @ Сегодня, 21:23
, спасибо за помощь! В Вашем варианте
ТЗ.Сотрудник = Спр.Наименование; ////// ...... ////// Если ТЗ.Сотрудник = Расх.Инженер.Наименование Тогда
все заработало! Век живи, век учись. Я бы не додумался. Если бы Вы еще объяснили, причем тут Наименование до Инженера.) Инженер - это же реквизит Расходной накладной. Идентификатор. Мне не понятно(
ZUBR @ Вчера, 23:13
, во-первых: Сообщить() возвращает строковое представление, для справочников это по-умолчанию наименование. во-вторых: без отладчика точно сказать по куску кода невозможно, как писали выше. в 3-х: .Наименование - просто реквизит справочника(надеюсь Сотрудники)
из всего этого выплывает: возможно в документе тип не Сотрудник, а Пользователи например, и мы сравниваем только названия разнотипных справочников (что в целом не очень хорошо) даже если справочник правильный, может быть ситуация когда случайно задублировали сотрудника - в таблицу попадет 2 одинаковых строки и для каждого будет суммарное количество документов.
Поэтому сравнивать, конечно, лучше ссылки и правильный код тогда:
ТЗ.Сотрудник = Спр.ТекущийЭлемент(); ////// ...... ////// Если ТЗ.Сотрудник = Расх.Инженер Тогда
Группа: Пользователи
Сообщений: 200
Из: Новая Каховка
Спасибо сказали: 203 раз
Рейтинг: 237.5
Подсчет делается внутри перебора элементов справочника, нет смысла писать сотрудника в таблицу и потом сравнивать с таблицей. Нужно сделать выборку накладных по текущему элементу справочника, потом добавить все в строку таблицы.
Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент()=1 Цикл
К = 0; Расх.ВыбратьДокументы(НачДата,КонДата);
Пока Расх.ПолучитьДокумент()=1 Цикл
Если Спр.ТекущийЭлемент() = Расх.Инженер Тогда К=К+1; КонецЕсли;
Группа: Пользователи
Сообщений: 445
Из: Казахстан
Спасибо сказали: 43 раз
Рейтинг: 43
Цитата(mut @ 16.09.19, 14:07)
Подсчет делается внутри перебора элементов справочника, нет смысла писать сотрудника в таблицу и потом сравнивать с таблицей. Нужно сделать выборку накладных по текущему элементу справочника, потом добавить все в строку таблицы.
Этт точно !.Я с Вами совершенно согласен !
ТЗ = СоздатьОбъект("ТаблицаЗначений"); ТЗ.НоваяКолонка ("Инженер"); ТЗ.НоваяКолонка ("КолСис"); // количество систем
Расх.ВыбратьДокументы(НачДата,КонДата);
Пока Расх.ПолучитьДокумент()=1 Цикл ТЗ.НоваяСтрока(); ТЗ.Инженер=Расх.Инженер; ТЗ.КолСис=1; КонецЦикла;
ТЗ.Свернуть("Инженер","КолСис"); //Подсчет итогов по каждому из инженеров
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 0
Всем большое спасибо за помощь. Мне до вас далеко))). Но нужно стремиться! Думаю, последний вариант для меня будет самым эффективным. Все оказалось гораздо проще!
Группа: Пользователи
Сообщений: 445
Из: Казахстан
Спасибо сказали: 43 раз
Рейтинг: 43
ZUBR @ Сегодня, 18:59
,
Не за что,вариант с запросом (моё сообщение Сегодня, 13:17) и вариант с перебором документов (моё сообщение Сегодня, 15:43)-они оба аналогичны. Удачи !
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!