Есть список сотрудников с датами рождений, отсортированный по подразделениям (сделано в запросе). нужно еще в каждом подразделении отсортировать по месяцам.
Кто знает как, помогите?
Процедура Сформировать()
Перем Запрос, ТекстЗапроса, Таб;
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с ВыбНачПериода по ВыбНачПериода;
НомерКод = Справочник.Сотрудники.Код;
|Наименование = Справочник.Сотрудники.Наименование;
|Подразделение = Справочник.Сотрудники.Подразделение;
|СостояниеФизлица = Справочник.Сотрудники.СостояниеФизлица;
|Должность = Справочник.Сотрудники.Должность;
|ДатаРожд = Справочник.Сотрудники.ДатаРождения;
|Адрес = Справочник.Сотрудники.АдресФакт;
|Телефон = Справочник.Сотрудники.Телефон;
|Условие(ПустоеЗначение(СостояниеФизлица) <>1);
|Группировка Подразделение;
|Группировка Наименование;
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
//
// Подготовка к заполнению выходных форм данными запроса
Таб = СоздатьОбъект("Таблица");
Таб.НоваяКолонка("Подразделение");
Таб.ИсходнаяТаблица("Сформировать");
Таб.ВывестиСекцию("Заголовок");
Состояние("Заполнение выходной таблицы...");
Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
Пока Запрос.Группировка(1) = 1 Цикл
Таб.ВывестиСекцию("НаимПодразделения");
// КонецЕсли;
Пока Запрос.Группировка(2) = 1 Цикл
Таб.ВывестиСекцию("НомерКод");
КонецЦикла;
КонецЦикла;
Таб.ТолькоПросмотр(1);
Таб.Показать("Сформировать", "");
КонецПроцедуры
Процедура ПриОткрытии()
ВыбНачПериода = НачМесяца(РабочаяДата());
ВыбКонПериода = КонМесяца(РабочаяДата());
КонецПроцедуры
Кто знает как, помогите?
Процедура Сформировать()
Перем Запрос, ТекстЗапроса, Таб;
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с ВыбНачПериода по ВыбНачПериода;
НомерКод = Справочник.Сотрудники.Код;
|Наименование = Справочник.Сотрудники.Наименование;
|Подразделение = Справочник.Сотрудники.Подразделение;
|СостояниеФизлица = Справочник.Сотрудники.СостояниеФизлица;
|Должность = Справочник.Сотрудники.Должность;
|ДатаРожд = Справочник.Сотрудники.ДатаРождения;
|Адрес = Справочник.Сотрудники.АдресФакт;
|Телефон = Справочник.Сотрудники.Телефон;
|Условие(ПустоеЗначение(СостояниеФизлица) <>1);
|Группировка Подразделение;
|Группировка Наименование;
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
//
// Подготовка к заполнению выходных форм данными запроса
Таб = СоздатьОбъект("Таблица");
Таб.НоваяКолонка("Подразделение");
Таб.ИсходнаяТаблица("Сформировать");
Таб.ВывестиСекцию("Заголовок");
Состояние("Заполнение выходной таблицы...");
Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
Пока Запрос.Группировка(1) = 1 Цикл
Таб.ВывестиСекцию("НаимПодразделения");
// КонецЕсли;
Пока Запрос.Группировка(2) = 1 Цикл
Таб.ВывестиСекцию("НомерКод");
КонецЦикла;
КонецЦикла;
Таб.ТолькоПросмотр(1);
Таб.Показать("Сформировать", "");
КонецПроцедуры
Процедура ПриОткрытии()
ВыбНачПериода = НачМесяца(РабочаяДата());
ВыбКонПериода = КонМесяца(РабочаяДата());
КонецПроцедуры
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Сделай так:
Код |
---|
|Группировка Подразделение;
|Группировка ДатаРожд;
|Группировка Наименование;
Пока Запрос.Группировка(1) = 1 Цикл
Таб.ВывестиСекцию("НаимПодразделения");
Пока Запрос.Группировка(2) = 1 Цикл
Пока Запрос.Группировка(3) = 1 Цикл
Таб.ВывестиСекцию("НомерКод");
КонецЦикла;
КонецЦикла;
КонецЦикла;
Показать полностью |
А тут не поможешь с кодом? Вроде бы все выводит, но не совсем верно. Что-то с циклом, только не пойму где.
Выводиться ошибка:"Значение не представляет агрегатный объект (выбран)".
В каждое последующее подразделение добавляются предыдущие сотрудники + новые (которые должны быть) и так дальше (как снежный ком). Посмотри пожалуйста.
Процедура Флаг()
Д=?(Все=1,0,1);
А=?(ВсеПодразделения=1,0,1);
Форма.ПР.Доступность(А);
Форма.МР.Доступность(Д);
КонецПроцедуры
//__________________________________________________________ __//
Процедура ПриОткрытии()
//МР = СоздатьОбъект("СписокЗначений");
МР.ДобавитьЗначение(1, "Январь");
МР.ДобавитьЗначение(2, "Февраль");
МР.ДобавитьЗначение(3, "Март");
МР.ДобавитьЗначение(4, "Апрель");
МР.ДобавитьЗначение(5, "Май");
МР.ДобавитьЗначение(6, "Июнь");
МР.ДобавитьЗначение(7, "Июль");
МР.ДобавитьЗначение(8, "Август");
МР.ДобавитьЗначение(9, "Сентябрь");
МР.ДобавитьЗначение(10, "Октябрь");
МР.ДобавитьЗначение(11, "Ноябрь");
МР.ДобавитьЗначение(12, "Декабрь");
Все=1;
Флаг();
КонецПроцедуры
//__________________________________________________________ __//
Процедура Сформировать()
База=СоздатьОбъект("ТаблицаЗначений");
База.НоваяКолонка("Ном","Число",4,,"№ п/п",4,,2);
База.НоваяКолонка("Имя",,,,"Сотрудник",15,,1);
База.НоваяКолонка("Должность",,,,"Должность",15,,1);
База.НоваяКолонка("День","Дата",,,"Дата рожд.",10,,);
База.НоваяКолонка("Мес","Число",3,,"Месяц",4,,2);
База.НоваяКолонка("Знак");
База.НоваяКолонка("Адрес",,,,"Адрес",15,,1);
База.НоваяКолонка("Подразделение",,,,"Подразделение",15,,1);
//База.НоваяКолонка("Подраздел");
База.НоваяКолонка("Телефон",,,,"Телефон",15,,1);
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");
Таб.ВывестиСекцию("Шапка");
Таб.Опции(0,0,Таб.ВысотаТаблицы(),0);
//
СпрСотрудники=СоздатьОбъект("Справочник.Сотрудники");
СпрПодр = СоздатьОбъект("Справочник.Подразделения");
СпрСотрудники.ИспользоватьДату(ТекущаяДата());
СпрПодр.ВыбратьЭлементы();
Пока СпрПодр.ПолучитьЭлемент()=1 Цикл
Если СпрПодр.ТекущийЭлемент().ЭтоГруппа()=1 Тогда
Продолжить;
КонецЕсли;
Если ПустоеЗначение(ВыбПодразделения)=1 Тогда
Подр=СпрПодр.ТекущийЭлемент();
Иначе
Подр=ВыбПодразделения;
КонецЕсли;
Таб.ВывестиСекцию("НаимПодразделения");
СпрСотрудники.ВыбратьЭлементы();
Пока СпрСотрудники.ПолучитьЭлемент()=1 Цикл
Если НЕ (СпрСотрудники.ТекущийЭлемент().СостояниеФизЛица.Получить(ВыбДата)= Перечисление.СостояниеФизЛица.СотрудникОсновной) тогда
продолжить;
КонецЕсли;
Если СпрСотрудники.ТекущийЭлемент().ЭтоГруппа()=1 Тогда
Продолжить;
КонецЕсли;
Если СпрСотрудники.ТекущийЭлемент().Подразделение.Получить(РабочаяДата())<>Подр Тогда
Продолжить;
КонецЕсли;
Стр="";
База.НоваяСтрока();
База.Ном=База.НомерСтроки;
База.Имя=СпрСотрудники.ТекущийЭлемент();
База.Должность=СпрСотрудники.Должность;
База.Адрес=СпрСотрудники.АдресФакт;
База.День=СпрСотрудники.ДатаРождения;
База.Мес=ДатаМесяц(СпрСотрудники.ДатаРождения);
База.Подразделение=СпрСотрудники.Подразделение;
База.Телефон=СпрСотрудники.Телефон;
КонецЦикла;
База.Сортировать("5+,2+,3+");
База.ВыбратьСтроки();
Н=0;
СчетМесяца=0;
Пока База.ПолучитьСтроку()=1 Цикл
Н=Н+1;
Если НЕ(СчетМесяца=База.Мес) тогда
Знак="";
МР.ПолучитьЗначение(База.ПолучитьЗначение(Н,5),Знак);
Таб.ВывестиСекцию("Месяц");
КонецЕсли;
Имя=База.Имя;
День=База.День;
Должность=База.Должность;
Адрес=База.Адрес;
Подразделение=База.Подразделение;
Телефон=База.Телефон;
Возраст=Строка(ДатаГод(ТекущаяДата())-ДатаГод(День))+" г. ";
Мес="";
Попытка
МР.ПолучитьЗначение(База.ПолучитьЗначение(Н,5),Мес);
Исключение
Мес="Не задан";
КонецПопытки;
Если Форма.МР.Доступность()=1 Тогда
МойМесяц="";
МР.ПолучитьЗначение(МР.ТекущаяСтрока(),МойМесяц);
Если Мес=МойМесяц Тогда
Таб.ВывестиСекцию("Строка_1");
КонецЕсли;
Иначе
Таб.ВывестиСекцию("Строка_1");
КонецЕсли;
СчетМесяца=База.Мес;
КонецЦикла;
Если ПустоеЗначение(ВыбПодразделения)=0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Таб.ВывестиСекцию("Подвал");
Таб.ТолькоПросмотр(1);
Таб.ПараметрыСтраницы(1,100,);
Таб.Показать("Таблица","");
КонецПроцедуры
Выводиться ошибка:"Значение не представляет агрегатный объект (выбран)".
В каждое последующее подразделение добавляются предыдущие сотрудники + новые (которые должны быть) и так дальше (как снежный ком). Посмотри пожалуйста.
Процедура Флаг()
Д=?(Все=1,0,1);
А=?(ВсеПодразделения=1,0,1);
Форма.ПР.Доступность(А);
Форма.МР.Доступность(Д);
КонецПроцедуры
//__________________________________________________________
Процедура ПриОткрытии()
//МР = СоздатьОбъект("СписокЗначений");
МР.ДобавитьЗначение(1, "Январь");
МР.ДобавитьЗначение(2, "Февраль");
МР.ДобавитьЗначение(3, "Март");
МР.ДобавитьЗначение(4, "Апрель");
МР.ДобавитьЗначение(5, "Май");
МР.ДобавитьЗначение(6, "Июнь");
МР.ДобавитьЗначение(7, "Июль");
МР.ДобавитьЗначение(8, "Август");
МР.ДобавитьЗначение(9, "Сентябрь");
МР.ДобавитьЗначение(10, "Октябрь");
МР.ДобавитьЗначение(11, "Ноябрь");
МР.ДобавитьЗначение(12, "Декабрь");
Все=1;
Флаг();
КонецПроцедуры
//__________________________________________________________
Процедура Сформировать()
База=СоздатьОбъект("ТаблицаЗначений");
База.НоваяКолонка("Ном","Число",4,,"№ п/п",4,,2);
База.НоваяКолонка("Имя",,,,"Сотрудник",15,,1);
База.НоваяКолонка("Должность",,,,"Должность",15,,1);
База.НоваяКолонка("День","Дата",,,"Дата рожд.",10,,);
База.НоваяКолонка("Мес","Число",3,,"Месяц",4,,2);
База.НоваяКолонка("Знак");
База.НоваяКолонка("Адрес",,,,"Адрес",15,,1);
База.НоваяКолонка("Подразделение",,,,"Подразделение",15,,1);
//База.НоваяКолонка("Подраздел");
База.НоваяКолонка("Телефон",,,,"Телефон",15,,1);
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");
Таб.ВывестиСекцию("Шапка");
Таб.Опции(0,0,Таб.ВысотаТаблицы(),0);
//
СпрСотрудники=СоздатьОбъект("Справочник.Сотрудники");
СпрПодр = СоздатьОбъект("Справочник.Подразделения");
СпрСотрудники.ИспользоватьДату(ТекущаяДата());
СпрПодр.ВыбратьЭлементы();
Пока СпрПодр.ПолучитьЭлемент()=1 Цикл
Если СпрПодр.ТекущийЭлемент().ЭтоГруппа()=1 Тогда
Продолжить;
КонецЕсли;
Если ПустоеЗначение(ВыбПодразделения)=1 Тогда
Подр=СпрПодр.ТекущийЭлемент();
Иначе
Подр=ВыбПодразделения;
КонецЕсли;
Таб.ВывестиСекцию("НаимПодразделения");
СпрСотрудники.ВыбратьЭлементы();
Пока СпрСотрудники.ПолучитьЭлемент()=1 Цикл
Если НЕ (СпрСотрудники.ТекущийЭлемент().СостояниеФизЛица.Получить(ВыбДата)= Перечисление.СостояниеФизЛица.СотрудникОсновной) тогда
продолжить;
КонецЕсли;
Если СпрСотрудники.ТекущийЭлемент().ЭтоГруппа()=1 Тогда
Продолжить;
КонецЕсли;
Если СпрСотрудники.ТекущийЭлемент().Подразделение.Получить(РабочаяДата())<>Подр Тогда
Продолжить;
КонецЕсли;
Стр="";
База.НоваяСтрока();
База.Ном=База.НомерСтроки;
База.Имя=СпрСотрудники.ТекущийЭлемент();
База.Должность=СпрСотрудники.Должность;
База.Адрес=СпрСотрудники.АдресФакт;
База.День=СпрСотрудники.ДатаРождения;
База.Мес=ДатаМесяц(СпрСотрудники.ДатаРождения);
База.Подразделение=СпрСотрудники.Подразделение;
База.Телефон=СпрСотрудники.Телефон;
КонецЦикла;
База.Сортировать("5+,2+,3+");
База.ВыбратьСтроки();
Н=0;
СчетМесяца=0;
Пока База.ПолучитьСтроку()=1 Цикл
Н=Н+1;
Если НЕ(СчетМесяца=База.Мес) тогда
Знак="";
МР.ПолучитьЗначение(База.ПолучитьЗначение(Н,5),Знак);
Таб.ВывестиСекцию("Месяц");
КонецЕсли;
Имя=База.Имя;
День=База.День;
Должность=База.Должность;
Адрес=База.Адрес;
Подразделение=База.Подразделение;
Телефон=База.Телефон;
Возраст=Строка(ДатаГод(ТекущаяДата())-ДатаГод(День))+" г. ";
Мес="";
Попытка
МР.ПолучитьЗначение(База.ПолучитьЗначение(Н,5),Мес);
Исключение
Мес="Не задан";
КонецПопытки;
Если Форма.МР.Доступность()=1 Тогда
МойМесяц="";
МР.ПолучитьЗначение(МР.ТекущаяСтрока(),МойМесяц);
Если Мес=МойМесяц Тогда
Таб.ВывестиСекцию("Строка_1");
КонецЕсли;
Иначе
Таб.ВывестиСекцию("Строка_1");
КонецЕсли;
СчетМесяца=База.Мес;
КонецЦикла;
Если ПустоеЗначение(ВыбПодразделения)=0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Таб.ВывестиСекцию("Подвал");
Таб.ТолькоПросмотр(1);
Таб.ПараметрыСтраницы(1,100,);
Таб.Показать("Таблица","");
КонецПроцедуры
если в двух словах:
это на вскидку, даже без проверки
п.с. подожди мож кто предложит другой вариант
Код |
---|
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.Загрузить(Запрос);
ТЗ.НоваяКолонка("Месяц");
ТЗ.ВЫбратьСтроки();
Пока ТЗ.ПолучитьСТроку() цикл
ТЗ.Месяц = ДатаМесяц(ТЗ.ДатаРожд);
КонецЦикла;
ТЗ.Сортировать("Подразделение, месяц,Наимненование");
ТЗ.ВыбратьСТроки();
Пока ТЗ.ПолучитьСТроку()=1 ЦИКЛ
//тут чуть сложнее, надо отследить что это уже другое подразделение, другой месяц вывести заголок
Таб.ВывестиСекцию("НомерКод_новый");
конецЦикла;
Показать полностью |
это на вскидку, даже без проверки
п.с. подожди мож кто предложит другой вариант
Привет! Это опять я. Помоги пожалуйста с циклом разобраться.
Когда делаешь отчет по всем подразделениям, то сотрудники из предыдущего подразделения поподают в следующее и так далее. В конце получается, что в последнем подразделении оказываются все сотрудники. А когда делаешь по одному подразделению, то все впорядке. Посмотри пожалуйста, что можно сделать.
Когда делаешь отчет по всем подразделениям, то сотрудники из предыдущего подразделения поподают в следующее и так далее. В конце получается, что в последнем подразделении оказываются все сотрудники. А когда делаешь по одному подразделению, то все впорядке. Посмотри пожалуйста, что можно сделать.
У тебя повтор из-за цикла перебора подразделения, (вообще довольно неправильно сделано, но для начала пойдет), Ты когда перебор подразд делаешь, тутже делаешь перебор сотрудников, записываешь в таблицу, потом опять перебор сотрудников и добавляешь в туже таблицу (не очистив её) и получается, постоянно выводишь таблицу целиком, при каждом цикле добавляя новые строки. Сделай форматирование кода (выдели всё)
- Текст - Блок - Форматировать, тогда сам увидишь какая каша получилась,
Удачи
- Текст - Блок - Форматировать, тогда сам увидишь какая каша получилась,
Удачи
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот