Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание табличной части. 1с v8  (Прочитано 20541 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
ZxKill
Гость
« : 20-11-2009 08:08 » 

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


При ее выполнении в табличную часть добавляются несколько строк, но в каждую одно и то же значение последнего документа.
Подскажите как сделать чтобы в строках были все документы, а не один и тот же.

ЗЫ: и сразу вдогонку  Отлично программированием 1с занимаюсь третий день только, по этому почти ничего не знаю. Подскажите, пожалуйста, как-то можно оптимизировать эту процедуру? Больше чем уверен, что в данном виде при большом количестве контрагентов, все будет жутко тормозить Улыбаюсь
Записан
ZxKill
Гость
« Ответ #1 : 20-11-2009 08:34 » 

прошу прощения. Вместо табличная часть надо было написать табличное поле Улыбаюсь
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 20-11-2009 14:05 » 

У тебя отсутствует связь между таблицами в запросе (точнее неправильно задана).
Попробуй построить запрос конструктором запроса и обрати внимание на страницу Группировка (появляется когда в запросе 2 и более таблиц)

Ошибочка вышла. Страница не Группировка, а Связи
« Последнее редактирование: 20-11-2009 14:30 от Kivals » Записан
ZxKill
Гость
« Ответ #3 : 20-11-2009 14:10 » 

запрос итак построен конструктором.... это все дело отлично работает, если выводить в текстовое поле.
Код:
	Запрос=Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РасчетПенсии.Контрагент,
| РасчетПенсии.Пенсия,
| НакопленияКонтрагентовОстатки.Контрагенты,
| НакопленияКонтрагентовОстатки.СуммаОстаток
|ИЗ
| Документ.РасчетПенсии КАК РасчетПенсии,
| РегистрНакопления.НакопленияКонтрагентов.Остатки КАК НакопленияКонтрагентовОстатки ГДЕ Контрагенты=РасчетПенсии.Контрагент";
Результат = Запрос.Выполнить().Выбрать();
ПолеСписка1.Очистить();
Пока Результат.Следующий() > 0  Цикл
ЕСЛИ Результат.СуммаОстаток<Результат.Пенсия ТОГДА
ПолеСписка1.Добавить(Строка(Результат.Контрагент) + Символы.Таб + " - недостаточно средств");
Иначе
ПолеСписка1.Добавить(Строка(Результат.Контрагент) +Символы.Таб+Строка(Результат.Пенсия) +Символы.Таб+ Строка(Результат.СуммаОстаток));
КонецЕсли;
КонецЦикла;


а вот если в табличку то криво получается
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 20-11-2009 14:26 » 

А, ты в этом смысле Улыбаюсь
на самом деле запрос будет правильным когда у тебя контрагент присутствует и в регистре сведений, и в отобранных документах. Если он присутсвует только в каком-то одном месте - то такие строки тебе не вернуться твоим запросом.

А ошибка у тебя в том, что Выплаты.Добавить(); возвращает ссылку на новую строку (а ты ее игнорируешь) и метод ЗаполнитьЗначения действительно заполняет все строки одним значением (читай внимательно помощь)
Записан
ZxKill
Гость
« Ответ #5 : 21-11-2009 04:17 » 

ничего так и не получается....  Здесь была моя ладья...
Я не прошу за меня код писать, если можно напишите простой пример программного заполнения табличного поля  Жаль
Записан
ZxKill
Гость
« Ответ #6 : 21-11-2009 04:21 » 

все разобрался, спасибо за правильное направление:)

Код:
Пока Результат.Следующий() > 0  Цикл
НовСтрока = Выплаты.Добавить();
//Выплаты.ВыбратьСтроку(НовСтрока);
ЕСЛИ Результат.СуммаОстаток<Результат.Пенсия ТОГДА
НовСтрока.Контрагент=Результат.Контрагент;
//Выплаты.ЗаполнитьЗначения(Результат.Контрагент,"Контрагент");
//Выплаты.ЗаполнитьЗначения(Результат.Пенсия,"КВыплате");
//Выплаты.ЗаполнитьЗначения(Результат.СуммаОстаток,"ОстатокСчета");
Иначе
НовСтрока.Контрагент=Результат.Контрагент;
//Выплаты.ЗаполнитьЗначения(Результат.Контрагент,"Контрагент");
//Выплаты.ЗаполнитьЗначения(Результат.Пенсия,"КВыплате");
//Выплаты.ЗаполнитьЗначения(Результат.СуммаОстаток,"ОстатокСчета");
КонецЕсли;


Если что-нибудь подскажете по методам оптимизации, буду очень благодарен. Или хотябы ссылку где можно почитать Улыбаюсь
« Последнее редактирование: 21-11-2009 05:07 от ZxKill » Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 21-11-2009 16:17 » 

1. А чем у тебя ветки условия отличаются? Улыбаюсь ЕСЛИ Результат.СуммаОстаток<Результат.Пенсия ТОГДА ...
2. Можно также использовать ТЗ=Результат.Выгрузить();
3. Все-таки по запросу посмотри информацию про СОЕДИНЕНИЕ (JOIN)
Записан
ZxKill
Гость
« Ответ #8 : 21-11-2009 18:16 » 

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

ЗЫ спасибо за наставления, пойду поищу инфу про соединения Да-да
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 23-11-2009 23:10 » new

Я бы твое Если ... иначе переписал бы так:
Код:
		НовСтрока.Контрагент=Результат.Контрагент;
НовСтрока.КВыплате=Результат.Пенсия;
НовСтрока.ОстатокСчета=Результат.СуммаОстаток;
ЕСЛИ Результат.СуммаОстаток<Результат.Пенсия ТОГДА
НовСтрока.Отметки="Нет средств";
КонецЕсли;
ИМХО - так легче читать и править в будующем
Записан
ZxKill
Гость
« Ответ #10 : 24-11-2009 06:17 » 

есть еще небольшой вопросик  Улыбаюсь сделал с помощью Результат.Выгрузить()
Код:
	Запрос=Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РасчетПенсии.Контрагент,
| РасчетПенсии.Пенсия,
| НакопленияКонтрагентовОстатки.Контрагенты,
| НакопленияКонтрагентовОстатки.СуммаОстаток
|ИЗ
| Документ.РасчетПенсии КАК РасчетПенсии,
| РегистрНакопления.НакопленияКонтрагентов.Остатки КАК НакопленияКонтрагентовОстатки ГДЕ Контрагенты=РасчетПенсии.Контрагент";
Результат = Запрос.Выполнить();
ТабРез=Результат.Выгрузить();
ТабличнаяЧасть1.Загрузить(ТабРез);
Думаю так будет быстрее работать, но появилась проблемка... как заполнить поле "Отметки" по условию, как было до этого
Код:
	ЕСЛИ Результат.СуммаОстаток<Результат.Пенсия ТОГДА
НовСтрока.Отметки="Нет средств";
КонецЕсли;


ЗЫ: два часа гугла ничего не дали  Жаль подскажите как это реализовать и реально ли вообще это?
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 24-11-2009 10:07 » 

Код:
	ТабРез=Результат.Выгрузить();
ТабРез.Колонки.Добавить("Отметки");
Для каждого Стр из ТабРез Цикл
ЕСЛИ Стр.СуммаОстаток<Стр.Пенсия ТОГДА
Стр.Отметки="Нет средств";
КонецЕсли;
КонецЦикла;
ТабличнаяЧасть1.Загрузить(ТабРез);
Записан
ZxKill
Гость
« Ответ #12 : 24-11-2009 10:18 » 

спасибо огромное за помощь! правда уже реализовал немного другим способом:)
сделал выделение строки цветом, если денег не хватает
Код:
Процедура ТабличнаяЧасть1ПриПолученииДанных(Элемент, ОформленияСтрок)
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
ЗначениеЯчейкиОстаток = ОформлениеСтроки.Ячейки.СуммаОстаток.Значение - ОформлениеСтроки.Ячейки.Пенсия.Значение;
Если ЗначениеЯчейкиОстаток < 0 Тогда
ОформлениеСтроки.ЦветФона = WebЦвета.Красный; 
КонецЕсли;
КонецЦикла;
КонецПроцедуры

ЗЫ: сохраню на компе Вашу реализацию, пригодится  Да-да
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 24-11-2009 10:21 » 

Так нагляднее - однозначно Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines