Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
15 апр 2025, 10:29

Как отобрать "Следующие" записи?

Автор jobsdata, 04 мар 2020, 11:14

0 Пользователей и 1 гость просматривают эту тему.

jobsdata

Добрый день.
Сильно не ругайтесь, я из "стажеров".

Есть Справочник.Сотрудники, в нем 70 записей (фамилий).

Есть запрос:

&НаКлиенте Процедура Печать(Команда) Печ(); КонецПроцедуры &НаСервере Функция Печ() ТабДок = Новый ТабличныйДокумент; ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт; Макет = Справочники.Сотрудники.ПолучитьМакет("Макет"); Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 40 ФИО, Телефон ИЗ Справочник.Сотрудники УПОРЯДОЧИТЬ ПО ФИО АВТОУПОРЯДОЧИВАНИЕ"); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); ОблСтрока = Макет.ПолучитьОбласть("Строка"); Пока Выборка.Следующий() Цикл ОблСтрока.Параметры.Фамилия = Выборка.ФИО; ОблСтрока.Параметры.Телефон = Выборка.Телефон; ТабДок.Вывести(ОблСтрока); КонецЦикла; ТабДок.Показать("Телефонный справочник"); Возврат ТабДок; КонецФункции;




   
   
   
   
   
Сюда попадаютпервые 40 записей---------------------Как сюда впихать оставшиеся записи?
Петров А.С.111-11-11               ????????????????????
Сидоров А.С.111-11-11               ????????????????????
Иванов А.С.111-11-11               ????????????????????
...............................и так далее               ................................

Грубо говоря на листе А4 в альбомном варианте, есть 2 таблички. В левую табличку я вставляю 40 записей (по высоте листа), оставшиеся 30 записей хочу вставить в правую таблицу.

Не могу найти/сообразить как в запросе или в цикле правильно написать что то типо
Если Выборка = 40 Тогда     Область1.Вставить 40 записей Иначе     Оставшиеся 30 Область2.Вставить

Или в запросе как то получить выборку с 41 позиции...

Подскажите, уважаемые программисты, куда копать?

ef0din

Цитата: jobsdata от 04 мар 2020, 11:14
Добрый день.
Сильно не ругайтесь, я из "стажеров".

Есть Справочник.Сотрудники, в нем 70 записей (фамилий).

Есть запрос:

&НаКлиенте Процедура Печать(Команда) Печ(); КонецПроцедуры &НаСервере Функция Печ() ТабДок = Новый ТабличныйДокумент; ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт; Макет = Справочники.Сотрудники.ПолучитьМакет("Макет"); Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 40 ФИО, Телефон ИЗ Справочник.Сотрудники УПОРЯДОЧИТЬ ПО ФИО АВТОУПОРЯДОЧИВАНИЕ"); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); ОблСтрока = Макет.ПолучитьОбласть("Строка"); Пока Выборка.Следующий() Цикл ОблСтрока.Параметры.Фамилия = Выборка.ФИО; ОблСтрока.Параметры.Телефон = Выборка.Телефон; ТабДок.Вывести(ОблСтрока); КонецЦикла; ТабДок.Показать("Телефонный справочник"); Возврат ТабДок; КонецФункции;




   
   
   
   
   
Сюда попадаютпервые 40 записей---------------------Как сюда впихать оставшиеся записи?
Петров А.С.111-11-11               ????????????????????
Сидоров А.С.111-11-11               ????????????????????
Иванов А.С.111-11-11               ????????????????????
...............................и так далее               ................................

Грубо говоря на листе А4 в альбомном варианте, есть 2 таблички. В левую табличку я вставляю 40 записей (по высоте листа), оставшиеся 30 записей хочу вставить в правую таблицу.

Не могу найти/сообразить как в запросе или в цикле правильно написать что то типо
Если Выборка = 40 Тогда     Область1.Вставить 40 записей Иначе     Оставшиеся 30 Область2.Вставить

Или в запросе как то получить выборку с 41 позиции...

Подскажите, уважаемые программисты, куда копать?
[/b]



Может стоит получить сразу все, которые нужны. А в цикле считать количество, и , когда больше, чем 40, использовать метод "Присоединить". Про "присоединить" почитайте сами лучше, уже не помню точно, как я делал. Кажется, присоединял к полученной области, а потом уже выводил ее. Если в этом не ошибаюсь - получаете области, нумеруете их разными значениями переменных, поочередно присоединяете к ним в случае итератора цикла больше сорока ,а, когда уже все добавите - выводите их в табличный документ.

jobsdata

Цитата: ef0din от 04 мар 2020, 11:29
Может стоит получить сразу все, которые нужны. А в цикле считать количество, и , когда больше, чем 40, использовать метод "Присоединить". Про "присоединить" почитайте сами лучше, уже не помню точно, как я делал. Кажется, присоединял к полученной области, а потом уже выводил ее. Если в этом не ошибаюсь - получаете области, нумеруете их разными значениями переменных, поочередно присоединяете к ним в случае итератора цикла больше сорока ,а, когда уже все добавите - выводите их в табличный документ.

Имеете ввиду в цикле Выборка.Количество() ?

ef0din

Цитата: jobsdata от 04 мар 2020, 11:33
Цитата: ef0din от 04 мар 2020, 11:29
Может стоит получить сразу все, которые нужны. А в цикле считать количество, и , когда больше, чем 40, использовать метод "Присоединить". Про "присоединить" почитайте сами лучше, уже не помню точно, как я делал. Кажется, присоединял к полученной области, а потом уже выводил ее. Если в этом не ошибаюсь - получаете области, нумеруете их разными значениями переменных, поочередно присоединяете к ним в случае итератора цикла больше сорока ,а, когда уже все добавите - выводите их в табличный документ.

Имеете ввиду в цикле Выборка.Количество() ?

Наверно даже любопытнее будет через массив попробовать.
Допустим:

МассВыводимыхСтрок = Новый Массив; Пока Выборка.Следующий() Цикл ВыводимаяСтрока = Макет.ПолучитьОбласть(Строка); //Заполняем строку МассВыводимыхСтрок.Добавить(ВыводимаяСтрока); КонецЦикла ТекНомер = 0; Пока НЕ (ТекНомер + 1) > 40 Цикл ТабДок.Вывести(МассВыводимыхСтрок.Получить(ТекНомер)); ТекСч = 1; Пока НЕ ТекСч > (Цел(МассВыводимыхСтрок.Количество() / 40) + 1) Цикл Если (ТекСч*40 + (ТекНомер - Цел(ТекНомер/40) + 1)) > МассВыводимыхСтрок Тогда Прервать; Иначе ТабДок.Присоединить(МассВыводимыхСтрок.Получить(ТекСч*40 + (ТекНомер - Цел(ТекНомер/40) + 1))) КонецЕсли; КонецЦикла; КонецЦикла;



Примерно что-то такое попробовать можно.

И вот что еще: когда шапку тч выводите так же нужно будет рассчитать сколько раз по горизонтали ее вывести нужно. Это будет целое от деления количества строк в массиве + 1, если результат этого деления не равен его целому. Если равен - тогда просто целое от деления.
Добавлено: 04 мар 2020, 12:37


Можно, кстате, попробовать подобным же образом, но через таблицу значений. При этом, в случае каждого нового "40го цикла" добавлять колонку, обзывать ее по шаблону, что-то типа: ""ДопКолонка" + Индекс." А при выводе проходить по строкам таблицы значений, значение основной колонки выводить, а далее проверять по шаблону наличие каждой следующей колонки и, в случае ее наличия и не пустого значения, - присоединять.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск