я вставлял с целью диагностики проблемы. Пришел к выводу, что условие
Если ТЗ.Сотрудник = Расх.Инженер Тогда
не выполняется , когда оно должно выполняться. Реквизит Инженер в РасходныхНакладных берется из Справочника Сотрудники. Оттуда же берется и значение ТЗ. Сотрудник. Почему же при совпадении этих значений программа считает, что они не равны?! Программа в таблицу записывает К= 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 одинаковых строки и для каждого будет суммарное количество документов.
Поэтому сравнивать, конечно, лучше ссылки и правильный код тогда:
ТЗ.Сотрудник = Спр.ТекущийЭлемент();
//////
......
//////Если ТЗ.Сотрудник = Расх.Инженер Тогда
Завсегдатай
Группа: Пользователи
Сообщений: 203
Из: Новая Каховка
Спасибо сказали: 210 раз
Рейтинг: 243.7
Подсчет делается внутри перебора элементов справочника, нет смысла писать сотрудника в таблицу и потом сравнивать с таблицей. Нужно сделать выборку накладных по текущему элементу справочника, потом добавить все в строку таблицы.
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1Цикл
К = 0;
Расх.ВыбратьДокументы(НачДата,КонДата);
Пока Расх.ПолучитьДокумент()=1ЦиклЕсли Спр.ТекущийЭлемент() = Расх.Инженер Тогда
К=К+1;
КонецЕсли;
КонецЦикла;
ТЗ.НоваяСтрока();
ТЗ.Сотрудник = Спр.Наименование;
ТЗ.КолСис = К;
КонецЦикла;
Оратор
Группа: Пользователи
Сообщений: 492
Из: Казахстан
Спасибо сказали: 56 раз
Рейтинг: 56
Цитата(mut @ 16.09.19, 14:07)
Подсчет делается внутри перебора элементов справочника, нет смысла писать сотрудника в таблицу и потом сравнивать с таблицей. Нужно сделать выборку накладных по текущему элементу справочника, потом добавить все в строку таблицы.
Этт точно !.Я с Вами совершенно согласен !
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка ("Инженер");
ТЗ.НоваяКолонка ("КолСис"); // количество систем
Расх.ВыбратьДокументы(НачДата,КонДата);
Пока Расх.ПолучитьДокумент()=1Цикл
ТЗ.НоваяСтрока();
ТЗ.Инженер=Расх.Инженер;
ТЗ.КолСис=1;
КонецЦикла;
ТЗ.Свернуть("Инженер","КолСис"); //Подсчет итогов по каждому из инженеров
Завсегдатай
Группа: Пользователи
Сообщений: 231
Из: Київ
Спасибо сказали: 5 раз
Рейтинг: 0
Всем большое спасибо за помощь. Мне до вас далеко))). Но нужно стремиться! Думаю, последний вариант для меня будет самым эффективным. Все оказалось гораздо проще!
Оратор
Группа: Пользователи
Сообщений: 492
Из: Казахстан
Спасибо сказали: 56 раз
Рейтинг: 56
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С форуме!