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

Тема в разделе "1C и всё что с ней связано", создана пользователем alturgrey, 15 май 2014.

  1. alturgrey

    alturgrey Member

    Регистрация:
    6 июн 2012
    Сообщения:
    14
    Симпатии:
    0
    Помогите добавить в код:
    Процедура Кнопка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', КонПериода, КонецДня(КонПериода)));
    НастройкаПериода.РедактироватьКакИнтервал = Истина;
    НастройкаПериода.РедактироватьКакПериод = Истина;
    НастройкаПериода.ВариантНастройки = ВариантНастройкиПериода.Период;
    Если НастройкаПериода.Редактировать() Тогда
    НачПериода = НастройкаПериода.ПолучитьДатуНачала();
    КонПериода = НастройкаПериода.ПолучитьДатуОкончания();
    КонецЕсли;
    КонецПроцедуры


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

    Vladal Member

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

    alturgrey Member

    Регистрация:
    6 июн 2012
    Сообщения:
    14
    Симпатии:
    0
    Привел на всякий случай весь модуль.
    А вот эта часть:
    Где в цикле идет итоговый продсчет построчно, и увеличивается переменная k : можно ли использовать ЭТУ часть кода (считающую итоговую сумму по кокретному сотруднику) для счета и контрагентов по этому сотруднику, но на печать не выводить, а продублировать код в другую часть модуля, для искомого отчета, и так уже полученное значение выводить на печать ?
     
  4. Дайнеко

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Хотел ответить, но т.к. за 3 мин. ничего не понял. Передумал.
     
  5. Darlock

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    Доброго времени суток.
    Во-первых: за
    ДокОб = Результат.ССылкаДок.ПолучитьОбъект();

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


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

    tanat Well-Known Member

    Регистрация:
    2 мар 2007
    Сообщения:
    265
    Симпатии:
    0
    Доброго времени суток.
    Во-первых: за
    ДокОб = Результат.ССылкаДок.ПолучитьОбъект();

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


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

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    А криминально то, что "ПолучитьОбъект()" - норма для 7.7, но для 8.х это запрещено для простого перебора строк табличной части документа. Посмотрите стандарты к разработки для 8.х.
     
  8. tanat

    tanat Well-Known Member

    Регистрация:
    2 мар 2007
    Сообщения:
    265
    Симпатии:
    0
    Ах вонаначё. Я ж грешным образом подумал, что появился какой-то новый метод получения объекта, а я весь в неведении...
     
  9. Darlock

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    А его надо получать? )))))
     
  10. tanat

    tanat Well-Known Member

    Регистрация:
    2 мар 2007
    Сообщения:
    265
    Симпатии:
    0
    Мы говорим о получении объекта в контексте данной задачи или вообще? Если в данной - то нет, если вообще - то да. Мне,например, очень интересно, каким образом без получения объекта Вы сможете, к примеру, провести документ программно.
     
  11. Darlock

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    Ну вроде как 1 задача - 1 тема. А вообще никак, вроде.
     
Загрузка...

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