Цикл Для Подсчета Записей В Таблице

06.06.2012
14
0
#1
Помогите добавить в код:
Процедура Кнопка4 - формирует отчет исходя из: сотрудника и ведомого им контрагента. Выдав в виде таблицы всех пациент из базы, проходящих по этому контрагенту за период.
Процедура Кнопка1 - формирует другой отчет в общем виде: сотрудники и ведомые за ними контрагенты.
Можно ли пересчитать количество пациентов, проходящих по контрагенту, и падающих в отчет по Кнопке4, в дополнительный столбец общего отчета : (кнопка1)
????
Здесь код обеих процедур, но куда добавить цикл, считающий пациентов ?

Процедура Кнопка4Нажатие(Элемент)

ТабДок = Новый ТабличныйДокумент();
Макет = ПолучитьМакет("Макет");

Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.УслП = "Отчет по оказанным услугам юр. лицам за период с " + Строка(НачПериода) + " по " + Строка(КонПериода);

Если ПолеВвода1.Пустая() Тогда
Область.Параметры.Стр2 = "По всем организациям";
Иначе
Область.Параметры.Стр2 = "Организация: " + Строка(ПолеВвода1);
КонецЕсли;

Если ПолеВвода3.Пустая() Тогда
Область.Параметры.Стр3 = "";
Иначе
Область.Параметры.Стр3 = "Менеджер по продажам: " + Строка(ПолеВвода3);
КонецЕсли;

Если ПолеВвода4.Пустая() Тогда
Область.Параметры.Стр4 = "";
Иначе
Область.Параметры.Стр4 = "Менеджер поддержки: " + Строка(ПолеВвода4);
КонецЕсли;

ТабДок.Вывести(Область);


Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СУММА(НазначениеНаОсмотр.СуммаДокумента) КАК СуммаДокумента,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Код КАК Код,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Наименование КАК Владелец,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Ссылка КАК ВладелецСсылка,
| НазначениеНаОсмотр.Организация.Ссылка,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.МенеджерПоПродажам КАК МенПрод,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.МенеджерПоддержки КАК МенПодд
|ИЗ
| Документ.НазначениеНаОсмотр КАК НазначениеНаОсмотр
|ГДЕ
| НазначениеНаОсмотр.Дата >= &ДатаНач
| И НазначениеНаОсмотр.Дата <= &ДатаКон
| И НазначениеНаОсмотр.Проведен = &Истина
| И НазначениеНаОсмотр.ВыставитьКОплате = &Ист
| И НазначениеНаОсмотр.ОсновнойДоговор.ВидДоговора = &ВидДог";



Если не ПолеВвода1.Пустая() Тогда
Запрос.Текст = Запрос.Текст + "
| И НазначениеНаОсмотр.Организация.Ссылка = &Орг";
КонецЕсли;
Запрос.УстановитьПараметр("Орг", ПолеВвода1);

Если не ПолеВвода2.Пустая() Тогда
Запрос.Текст = Запрос.Текст + "
| И НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Ссылка = &Контрагент";
КонецЕсли;
Запрос.УстановитьПараметр("Контрагент", ПолеВвода2);

Если не ПолеВвода3.Пустая() Тогда
Запрос.Текст = Запрос.Текст + "
| И НазначениеНаОсмотр.ОсновнойДоговор.Владелец.МенеджерПоПродажам = &Мен1";
КонецЕсли;
Запрос.УстановитьПараметр("Мен1", ПолеВвода3);

Если не ПолеВвода4.Пустая() Тогда
Запрос.Текст = Запрос.Текст + "
| И НазначениеНаОсмотр.ОсновнойДоговор.Владелец.МенеджерПоддержки = &Мен2";
КонецЕсли;
Запрос.УстановитьПараметр("Мен2", ПолеВвода4);



Запрос.Текст = Запрос.Текст +
"
|СГРУППИРОВАТЬ ПО
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Код,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Наименование,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Ссылка,
| НазначениеНаОсмотр.Организация.Ссылка,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.МенеджерПоПродажам,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.МенеджерПоддержки
|
|УПОРЯДОЧИТЬ ПО
| Владелец";


Запрос.УстановитьПараметр("ДатаНач", НачПериода);
Запрос.УстановитьПараметр("ДатаКон", КонПериода);
Запрос.УстановитьПараметр("Истина", Истина);
Запрос.УстановитьПараметр("Ист", Ложь);
Запрос.УстановитьПараметр("ВидДог", Перечисления.ВидДоговора.Предприятие);


Результат = Запрос.Выполнить().Выбрать();

н = 1;
СумОбщ = 0;
Пока Результат.Следующий() цикл

Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.н = н;
Область.Параметры.КонтрагентП = Результат.Владелец;
Область.Параметры.СуммаП = Результат.СуммаДокумента;
Область.Параметры.МенПродП = Результат.МенПрод;
Область.Параметры.ЭкономистП = Результат.МенПодд;
СумОбщ = СумОбщ + Результат.СуммаДокумента;

ТабДок.Вывести(Область);
н = н + 1;

КонецЦикла;

Область = Макет.ПолучитьОбласть("Подвал");
Область.Параметры.СумОбщП = СумОбщ;
ТабДок.Вывести(Область);

Табдок.Показать("Краткий финансовый отчет");

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

Процедура ПриОткрытии()

Орг = Справочники.Организации.Выбрать();
Пока Орг.Следующий() Цикл
Если Орг.Основная = Истина Тогда

ПолеВвода1 = Орг.Ссылка;
Прервать;

КонецЕсли;
КонецЦикла;
ЭлементыФормы.Флажок1.Значение = Ложь;

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




Процедура Кнопка1Нажатие(Элемент)

Если ПолеВвода2.Пустая() Тогда
Предупреждение("Не заполнено поле контрагент");
Возврат;
КонецЕсли;

ТабДок = Новый ТабличныйДокумент();
Макет = ПолучитьМакет("Макет1");

Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.УслП = "Отчет по оказанным услугам юр. лицам за период с " + Строка(НачПериода) + " по " + Строка(КонПериода);

Если ПолеВвода1.Пустая() Тогда
Область.Параметры.КонтрП = "По всем организациям";
Иначе
Область.Параметры.КонтрП = "Организация: " + Строка(ПолеВвода1);
КонецЕсли;

Если ПолеВвода3.Пустая() Тогда
Область.Параметры.Стр3 = "";
Иначе
Область.Параметры.Стр3 = "Менеджер по продажам: " + Строка(ПолеВвода3);
КонецЕсли;

Если ПолеВвода4.Пустая() Тогда
Область.Параметры.Стр4 = "";
Иначе
Область.Параметры.Стр4 = "Менеджер поддержки: " + Строка(ПолеВвода4);
КонецЕсли;

ТабДок.Вывести(Область);

// ********************************************************************************
*******************************************




Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СУММА(НазначениеНаОсмотр.СуммаДокумента) КАК СуммаДокумента,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Код КАК Код,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Наименование КАК Владелец,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Ссылка КАК ВладелецСсылка,
| НазначениеНаОсмотр.Организация.Ссылка,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.МенеджерПоПродажам КАК МенПрод,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.МенеджерПоддержки КАК МенПодд
|ИЗ
| Документ.НазначениеНаОсмотр КАК НазначениеНаОсмотр
|ГДЕ
| НазначениеНаОсмотр.Дата >= &ДатаНач
| И НазначениеНаОсмотр.Дата <= &ДатаКон
| И НазначениеНаОсмотр.Проведен = &Истина
| И НазначениеНаОсмотр.ВыставитьКОплате = &Ист
| И НазначениеНаОсмотр.ОсновнойДоговор.ВидДоговора = &ВидДог";



Если не ПолеВвода1.Пустая() Тогда
Запрос.Текст = Запрос.Текст + "
| И НазначениеНаОсмотр.Организация.Ссылка = &Орг";
КонецЕсли;
Запрос.УстановитьПараметр("Орг", ПолеВвода1);

Если не ПолеВвода2.Пустая() Тогда
Запрос.Текст = Запрос.Текст + "
| И НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Ссылка = &Контрагент";
КонецЕсли;
Запрос.УстановитьПараметр("Контрагент", ПолеВвода2);

Если не ПолеВвода3.Пустая() Тогда
Запрос.Текст = Запрос.Текст + "
| И НазначениеНаОсмотр.ОсновнойДоговор.Владелец.МенеджерПоПродажам = &Мен1";
КонецЕсли;
Запрос.УстановитьПараметр("Мен1", ПолеВвода3);

Если не ПолеВвода4.Пустая() Тогда
Запрос.Текст = Запрос.Текст + "
| И НазначениеНаОсмотр.ОсновнойДоговор.Владелец.МенеджерПоддержки = &Мен2";
КонецЕсли;
Запрос.УстановитьПараметр("Мен2", ПолеВвода4);



Запрос.Текст = Запрос.Текст +
"
|СГРУППИРОВАТЬ ПО
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Код,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Наименование,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Ссылка,
| НазначениеНаОсмотр.Организация.Ссылка,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.МенеджерПоПродажам,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.МенеджерПоддержки";


Запрос.УстановитьПараметр("ДатаНач", НачПериода);
Запрос.УстановитьПараметр("ДатаКон", КонПериода);
Запрос.УстановитьПараметр("Истина", Истина);
Запрос.УстановитьПараметр("Ист", Ложь);
Запрос.УстановитьПараметр("ВидДог", Перечисления.ВидДоговора.Предприятие);


Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() цикл

Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.КонтрагентП = Результат.Владелец;
Область.Параметры.СуммаП = Результат.СуммаДокумента;


ТабДок.Вывести(Область);

КонецЦикла;



// ********************************************************************************
********************






Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НазначениеНаОсмотр.СуммаДокумента КАК СуммаДокумента,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Код КАК Код,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Наименование КАК Владелец,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Ссылка КАК ВладелецСсылка,
| НазначениеНаОсмотр.Организация.Ссылка,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.МенеджерПоПродажам КАК МенПрод,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.МенеджерПоддержки КАК МенПодд,
| НазначениеНаОсмотр.Ссылка КАК СсылкаДок,
| НазначениеНаОсмотр.Пациент.Наименование КАК Пациент
|ИЗ
| Документ.НазначениеНаОсмотр КАК НазначениеНаОсмотр
|ГДЕ
| НазначениеНаОсмотр.Дата >= &ДатаНач
| И НазначениеНаОсмотр.Дата <= &ДатаКон
| И НазначениеНаОсмотр.Проведен = &Истина
| И НазначениеНаОсмотр.ВыставитьКОплате = &Ист
| И НазначениеНаОсмотр.ОсновнойДоговор.ВидДоговора = &ВидДог";

Если не ПолеВвода1.Пустая() Тогда
Запрос.Текст = Запрос.Текст + "
| И НазначениеНаОсмотр.Организация.Ссылка = &Орг";
КонецЕсли;
Запрос.УстановитьПараметр("Орг", ПолеВвода1);

Если не ПолеВвода2.Пустая() Тогда
Запрос.Текст = Запрос.Текст + "
| И НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Ссылка = &Контрагент";
КонецЕсли;
Запрос.УстановитьПараметр("Контрагент", ПолеВвода2);

Если не ПолеВвода3.Пустая() Тогда
Запрос.Текст = Запрос.Текст + "
| И НазначениеНаОсмотр.ОсновнойДоговор.Владелец.МенеджерПоПродажам = &Мен1";
КонецЕсли;
Запрос.УстановитьПараметр("Мен1", ПолеВвода3);

Если не ПолеВвода4.Пустая() Тогда
Запрос.Текст = Запрос.Текст + "
| И НазначениеНаОсмотр.ОсновнойДоговор.Владелец.МенеджерПоддержки = &Мен2";
КонецЕсли;
Запрос.УстановитьПараметр("Мен2", ПолеВвода4);


Запрос.УстановитьПараметр("ДатаНач", НачПериода);
Запрос.УстановитьПараметр("ДатаКон", КонПериода);
Запрос.УстановитьПараметр("Истина", Истина);
Запрос.УстановитьПараметр("Ист", Ложь);
Запрос.УстановитьПараметр("ВидДог", Перечисления.ВидДоговора.Предприятие);


Результат = Запрос.Выполнить().Выбрать();

к = 1;
Пока Результат.Следующий() цикл

Область = Макет.ПолучитьОбласть("Строка2");
Область.Параметры.к1 = к;
Область.Параметры.ДокП = Результат.СсылкаДок;
Область.Параметры.СуммаДокП = Результат.СуммаДокумента;
Область.Параметры.ПациентП = Результат.Пациент;

ТабДок.Вывести(Область);



Если Флажок1 = Истина Тогда

ДокОб = Результат.ССылкаДок.ПолучитьОбъект();
Для Каждого СтрТЧ из ДокОб.Услуги Цикл

Область = Макет.ПолучитьОбласть("Документы");
Область.Параметры.УслугаП = СтрТЧ.Услуга;
Область.Параметры.СотрП = СтрТЧ.Сотрудник;
Область.Параметры.СпециальностьП = СтрТЧ.СпециализацияВрача;
Область.Параметры.ЦенаЗаУслП = СтрТЧ.Цена;

ТабДок.Вывести(Область);

КонецЦикла;


КонецЕсли;




к = к + 1;

КонецЦикла;

Табдок.Показать("Развернутый финансовый отчет");



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

Процедура ВыбПериодНажатие(Элемент)
НастройкаПериода = Новый НастройкаПериода;
НастройкаПериода.УстановитьПериод(НачПериода, ?(КонПериода='0001-01-01', КонПериода, КонецДня(КонПериода)));
НастройкаПериода.РедактироватьКакИнтервал = Истина;
НастройкаПериода.РедактироватьКакПериод = Истина;
НастройкаПериода.ВариантНастройки = ВариантНастройкиПериода.Период;
Если НастройкаПериода.Редактировать() Тогда
НачПериода = НастройкаПериода.ПолучитьДатуНачала();
КонПериода = НастройкаПериода.ПолучитьДатуОкончания();
КонецЕсли;
КонецПроцедуры


НачПериода = НачалоМесяца(ТекущаяДата());
КонПериода = ТекущаяДата();
 

Vladal

Active Member
26.05.2012
26
0
#2
Очень много кода.
Навскидку - подсчет пациентов (как и любых количественных показателей) лучше добавить в секцию запроса ИТОГИ. А там уже указать по каким группировкам считать итоги, а также считать ли общие или нет.
Код:
"ВЫБРАТЬ
| НазначениеНаОсмотр.СуммаДокумента КАК СуммаДокумента,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Код КАК Код,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Наименование КАК Владелец,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.Ссылка КАК ВладелецСсылка,
| НазначениеНаОсмотр.Организация.Ссылка,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.МенеджерПоПродажам КАК МенПрод,
| НазначениеНаОсмотр.ОсновнойДоговор.Владелец.МенеджерПоддержки КАК МенПодд,
| НазначениеНаОсмотр.Ссылка КАК СсылкаДок,
| НазначениеНаОсмотр.Пациент.Наименование КАК Пациент
|ИЗ
| Документ.НазначениеНаОсмотр КАК НазначениеНаОсмотр
|ГДЕ
| НазначениеНаОсмотр.Дата >= &ДатаНач
| И НазначениеНаОсмотр.Дата <= &ДатаКон
| И НазначениеНаОсмотр.Проведен = &Истина
| И НазначениеНаОсмотр.ВыставитьКОплате = &Ист
| И НазначениеНаОсмотр.ОсновнойДоговор.ВидДоговора = &ВидДог
|ИТОГИ ПО // ----------------------------------------------------------------
|	ОБЩИЕ,
|	НазначениеНаОсмотр.Пациент // ---------------------------------------";
Костыль, конечно.
Я бы добавил регистр оборотов для фиксирования обращений пациентов и их взаимодействия с сотрудниками и уже из регистра выбирал необходимые мне сведения.
Для общего развития рекомендую проработать книгу Радченко "Практическое пособие разработчика" по соответствующей версии 1С. Для простых форм - по версии 8.1, для управляемых - по версии 8.2.
Он очень хорошо описывает теорию и примеры. Пример из книги - отчет по мастерам.
 
06.06.2012
14
0
#3
Привел на всякий случай весь модуль.
А вот эта часть:
Результат = Запрос.Выполнить().Выбрать();

к = 1;
Пока Результат.Следующий() цикл

Область = Макет.ПолучитьОбласть("Строка2");
Область.Параметры.к1 = к;
Область.Параметры.ДокП = Результат.СсылкаДок;
Область.Параметры.СуммаДокП = Результат.СуммаДокумента;
Область.Параметры.ПациентП = Результат.Пациент;

ТабДок.Вывести(Область);

Если Флажок1 = Истина Тогда

ДокОб = Результат.ССылкаДок.ПолучитьОбъект();
Для Каждого СтрТЧ из ДокОб.Услуги Цикл

Область = Макет.ПолучитьОбласть("Документы");
Область.Параметры.УслугаП = СтрТЧ.Услуга;
Область.Параметры.СотрП = СтрТЧ.Сотрудник;
Область.Параметры.СпециальностьП = СтрТЧ.СпециализацияВрача;
Область.Параметры.ЦенаЗаУслП = СтрТЧ.Цена;

ТабДок.Вывести(Область);

КонецЦикла;
КонецЕсли;
к = к + 1;

КонецЦикла;
Где в цикле идет итоговый продсчет построчно, и увеличивается переменная k : можно ли использовать ЭТУ часть кода (считающую итоговую сумму по кокретному сотруднику) для счета и контрагентов по этому сотруднику, но на печать не выводить, а продублировать код в другую часть модуля, для искомого отчета, и так уже полученное значение выводить на печать ?
 

Darlock

Well-Known Member
04.01.2008
560
1
#5
Доброго времени суток.
Во-первых: за
ДокОб = Результат.ССылкаДок.ПолучитьОбъект();

убивают неглядя.


Во-вторых: Раз у вас 8.2 то проще использовать механизмы СКД, у них есть свои функции подсчета количества строк внутри группировки. А дальше уже обрабатывать сам результат до вывода на экран.
 

tanat

Well-Known Member
02.03.2007
265
0
#6
Доброго времени суток.
Во-первых: за
ДокОб = Результат.ССылкаДок.ПолучитьОбъект();

убивают неглядя.


- а что тут криминального? Я, видимо, отстал от жизни, раз не знаю...
 

Darlock

Well-Known Member
04.01.2008
560
1
#7
Доброго времени суток.
Во-первых: за
ДокОб = Результат.ССылкаДок.ПолучитьОбъект();

убивают неглядя.


- а что тут криминального? Я, видимо, отстал от жизни, раз не знаю...
А криминально то, что "ПолучитьОбъект()" - норма для 7.7, но для 8.х это запрещено для простого перебора строк табличной части документа. Посмотрите стандарты к разработки для 8.х.
 

tanat

Well-Known Member
02.03.2007
265
0
#8
Ах вонаначё. Я ж грешным образом подумал, что появился какой-то новый метод получения объекта, а я весь в неведении...
 

tanat

Well-Known Member
02.03.2007
265
0
#10
Мы говорим о получении объекта в контексте данной задачи или вообще? Если в данной - то нет, если вообще - то да. Мне,например, очень интересно, каким образом без получения объекта Вы сможете, к примеру, провести документ программно.