|
1С 8.2 ПриВыводеСтроки и ПриПолученииДанных | ☑ | ||
---|---|---|---|---|
0
MrCrowley1988
01.07.15
✎
14:15
|
Добрый день, уважаемые.
1С 8.2, конфигурация Розница. Документ Заказы поставщикам, ТЧ "Товары". Стоит задача автоматического просчета заказа по товару (количественного). В ТЧ "Товары", помимо "не нужных для данной задачи", есть колонки: - Номенклатура (реквизит ТЧ); - Продажи (не реквизит, ячейка); - КонОст (конечный остаток, не реквизит, ячейка); - Количество (реквизит ТЧ); Добавил в форму документа галочку "Автомат". В процедуре ТоварыПриВыводеСтроки, помимо основного кода, прописал: Процедура ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Если ЭлементыФормы.Автомат.Значение = Истина тогда Если НЕ ОформлениеСтроки.Ячейки.Продажи.Текст = "" тогда Потребность = Число(ОформлениеСтроки.Ячейки.Продажи.Текст - ОформлениеСтроки.Ячейки.КонОстаток.Текст); Если Потребность > 0 тогда Если Число(ОформлениеСтроки.Ячейки.КонОстаток.Текст) > 0 тогда ДанныеСтроки.Количество = Потребность; иначе ДанныеСтроки.Количество = Число(ОформлениеСтроки.Ячейки.Продажи.Текст); КонецЕсли; КонецЕсли иначе ДанныеСтроки.Количество = 0; КонецЕсли; КонецЕсли; КонецПроцедуры // ТоварыПриВыводеСтроки() Все отлично, все считает как нужно, НО: если количество строк больше, чем отображается на экране, нужно проматывать ТЧ, что-юы процедура просчитала колонку "Количество" для всех строч ТЧ. ВОПРОС: Можно ли как-то данный код адаптировать под процудуру ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)? Там нету параметра "ДанныеСтроки". Пробовал в ТоварыПриПолученииДанных: Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл Если ЭлементыФормы.Автомат.Значение = Истина тогда Если НЕ ОформлениеСтроки.Ячейки.Продажи.Текст = "" тогда Потребность = Число(ОформлениеСтроки.Ячейки.Продажи.Текст - ОформлениеСтроки.Ячейки.КонОстаток.Текст); Если Потребность > 0 тогда Если Число(ОформлениеСтроки.Ячейки.КонОстаток.Текст) > 0 тогда ДанныеСтроки.Количество = Потребность; иначе ДанныеСтроки.Количество = Число(ОформлениеСтроки.Ячейки.Продажи.Текст); КонецЕсли; КонецЕсли иначе ДанныеСтроки.Количество = 0; КонецЕсли; КонецЕсли; КонецЦикла; Ругается на ДанныеСтроки.Количество = 0; Может можно как-то "прогнать" все строки ТЧ, что-бы через ТоварыПриВыводеСтроки просчитывались все строки, а не только видимые. В общем, помогите пожалуйста, кто чем может. |
|||
1
DTXqueque
01.07.15
✎
14:19
|
При открытии документа пробежаться по ТЧ и подсчитать. Туда же направить обработчик изменения данных.
|
|||
2
butterbean
01.07.15
✎
14:19
|
ОформлениеСтроки.ДанныеСтроки
|
|||
3
D_E_S_131
01.07.15
✎
14:28
|
ИМХО нужно значение "Автомат" в данных хранить, а не "галочкой в списке" и результат рассчитывать по данным в ТЧ, а не по оформлениям строк.
|
|||
4
MrCrowley1988
01.07.15
✎
14:35
|
(3), попробывал в ТоварыПриПолученииДанных(Элемент, ОформленияСтрок):
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл Если ЭлементыФормы.Автомат.Значение = Истина тогда Если НЕ ОформлениеСтроки.Ячейки.Продажи.Текст = "" тогда Потребность = Число(ОформлениеСтроки.Ячейки.Продажи.Текст - ОформлениеСтроки.Ячейки.КонОстаток.Текст); Если Потребность > 0 тогда Если Число(ОформлениеСтроки.Ячейки.КонОстаток.Текст) > 0 тогда ОформлениеСтроки.ДанныеСтроки.Количество = Потребность; иначе ОформлениеСтроки.ДанныеСтроки.Количество = Число(ОформлениеСтроки.Ячейки.Продажи.Текст); КонецЕсли; КонецЕсли иначе ОформлениеСтроки.ДанныеСтроки.Количество = 0; КонецЕсли; КонецЕсли; КонецЦикла; РЕЗУЛЬТАТ: Строки в колонке с реквизитом "Количество" становятся пустыми. |
|||
5
MrCrowley1988
01.07.15
✎
14:39
|
Извеняюсь, пост (4) был ответом на (2), а не (3)
|
|||
6
butterbean
01.07.15
✎
14:41
|
(5) это потому, что менять данные строки в момент их получения в корне не верно, при выводе строки тоже фигня, меняй концепцию
|
|||
7
MrCrowley1988
01.07.15
✎
14:47
|
(6) , "ПриВыводеСтроки" концепция меня полностью удовлетворяет.
Заполняется ТЧ, ставиться начальная и конечная дата периода, за который расчитываются (запросом) продажи, конечный остаток. Потом ставится галочка Автомат. 1С сам расчитывает поле-реквизит "Количество" (которое рекомендуеся заказать). Галочка "Автомат" снимается, и пользователь уже сам может "подредактировать" автоматический заказ (то-есть, предложенное программой количество заказываемого товара. |
|||
8
D_E_S_131
01.07.15
✎
14:49
|
(7) Что тебе мешает сохранить значение "Автомат" в ТЧ? Или просто народ тут по троллить хочешь?
|
|||
9
butterbean
01.07.15
✎
14:52
|
(7) при твоем способе тч будет перерассчитываться при каждом открытии этой формы документа, а это пп.. мягко говоря не правильно.
1. галочку заменить на кнопочку, которую назвать "Рассчитать количество" 2. при нажатии на эту кнопку перерасчитывать продажи и остатки. Если они должны быть фиксированными, то их нужно хранить в тч документа, хотя это бред в данном случае |
|||
10
MrCrowley1988
01.07.15
✎
14:58
|
(8)(9) , проблема совсем не в том! У меня все считает так, как мне нужно, все правильно. И продажи, и конечный остаток - все я сделал запросами.
Проблема в строке: ДанныеСтроки.Количество В процедуре ПриВыводеСтроки она работает, все считает так, как мне нужно, но при большом количестве строк нужно проматывать ТЧ, удерживая галочку Автомат включеной. Мне же нужно, что-бы пользователь нажал Автомат, колонка "Количество" расчиталась, и пользователь, сняв галочку Автомат, приступил к редактирыванию заказа. |
|||
11
DTXqueque
01.07.15
✎
15:01
|
Уже предлагали работать с ТЧ, а не с элементом формы?
|
|||
12
dmpl
01.07.15
✎
15:03
|
(10) Что мешает использовать просто Товары.* в обработчике нажатия кнопки?
|
|||
13
gornovrom
01.07.15
✎
15:05
|
(10) А если не в данные строки записывать, а в саму ячейку?
ОформлениеСтроки.Ячейки[ИмяЯчейки].Значение = <Значение>. И потом обрабатывать изменение этой ячкейки. |
|||
14
Mirnin
01.07.15
✎
15:19
|
(9) правильно говорит.
> проблема совсем не в том! Очень даже в том. Процедура ПриВыводе вызывается при обновлении формы, неотрисованные строки рассчитываться не будут. К тому же, по твоей концепции, даже если не учитывать необходимость прокрутки ТЧ, пользователю нужно ставить и убирать галочку. Хотя быстрее и проще по нажатию кнопки пробегать все строки таблицы. |
|||
15
D_E_S_131
01.07.15
✎
15:50
|
(10) "проблема совсем не в том!" — да я уже понял, что проблема в том, что месье извращенец.
|
|||
16
MrCrowley1988
01.07.15
✎
15:52
|
(13) в саму ячейку нельзя, т.к. это реквизит, и его пользователь возможно будет изменять, а потом нужно распечатать (а в макете прописан именно реквизит).
(14) С удовольствием, но как? Как мне по нажатию кнопки обратиться (считать значения) к ячейкам Продажи и Конечный остаток? По идее, только через ОформлениеСтроки? |
|||
17
MrCrowley1988
01.07.15
✎
15:52
|
(15) , спасибо за комплимент.
|
|||
18
MrCrowley1988
01.07.15
✎
15:54
|
(16) , Для Каждого стр из ЭлементыФормы.Товары цикл
а дальше? |
|||
19
dmpl
01.07.15
✎
15:55
|
(17) Для Каждого стр Из [Товары]|[ЭлементыФормы.Товары] Цикл в зависимости от извращения.
|
|||
20
MrCrowley1988
01.07.15
✎
15:58
|
(19) , как мне обратиться к колонкам Продажи и Конечный Остаток? Это простые ячейки с текстом.
|
|||
21
mistеr
01.07.15
✎
15:59
|
(16) Все, расчетные данные, которые нужны пользователю, должны храниться в реквизитах ТЧ. При этом их можно не разрешать редактировать пользователю.
В общем, не выделывайтся, а делай заполнение так же, как в типовых, по кнопке "Заполнить...". |
|||
22
mistеr
01.07.15
✎
16:00
|
(20) Добавь реквизиты в ТЧ, либо считай все в запросах, либо во временной ТЗ.
|
|||
23
MrCrowley1988
01.07.15
✎
16:12
|
(21) , смотрите. Данные Продажи и Конечный остаток - не постоянные. Пользователь устанавливает период (есть два поля для выбора начальной и конечной даты), и в них отображаются (ячейка.оформлениестроки.установитьтекст) продажи за этот период, и конечный остаток состоянием на конечную дату. Смысл делать отдельные реквизиты и засорять БД? Я и так все считываю запросами (и продажи, и конечный остаток).
Мне всего лишь нужно загнать разницу Продажи и Конечный остаток (она у меня считается, все в этом плане нормально!) в реквизит "Количество". Неужели это так сложно сделать? Просто через ТоварыПриПолученииДанных для каждой строки установить значение реквизита "Количество"? Просто через ДанныеСтроки у меня не получается, может можно как-то по другому? |
|||
24
DTXqueque
01.07.15
✎
16:13
|
(0) Так поржать.. А как у тебя сейчас КонОст заполняется в строках?
|
|||
25
MrCrowley1988
01.07.15
✎
16:15
|
(24)
Если ЭлементыФормы.Товары.Колонки.КонОстаток.Видимость Тогда ОформлениеСтроки.Ячейки.КонОстаток.УстановитьТекст(Строка(РЕЗЗап.КоличествоКонечныйОстаток)); КонецЕсли; |
|||
26
DTXqueque
01.07.15
✎
16:16
|
(25) Это в какой процедуре?
|
|||
27
MrCrowley1988
01.07.15
✎
16:18
|
(26)
Вот мой действующий вариант, который работает, но нужно проматывать строки. Процедура ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Если Дата2<>'00010101' Тогда Дат1=НачалоДня(Дата1); Дат2=КонецДня(Дата2); Если ДанныеСтроки.Номенклатура<>Справочники.Номенклатура.ПустаяСсылка() Тогда Запрос=Новый Запрос(); Запрос.УстановитьПараметр("Дата1",Дат1); Запрос.УстановитьПараметр("Дата2",Дат2); Запрос.УстановитьПараметр("номен",ДанныеСтроки.Номенклатура); Запрос.Текст= "ВЫБРАТЬ | ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток, | ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход, | ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход, | ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток |ИЗ | РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&Дата1, &Дата2, , , Номенклатура = &номен) КАК ТоварыНаСкладахОстаткиИОбороты"; РЕзЗап=Запрос.Выполнить().Выбрать(); Если РЕзЗап.Следующий() Тогда Если ЭлементыФормы.Товары.Колонки.НачОстаток.Видимость Тогда ОформлениеСтроки.Ячейки.НачОстаток.УстановитьТекст(Строка(РЕЗЗап.КоличествоНачальныйОстаток)); КонецЕсли; Если ЭлементыФормы.Товары.Колонки.ПриходЗаПериод.Видимость Тогда ОформлениеСтроки.Ячейки.ПриходЗаПериод.УстановитьТекст(Строка(РЕЗЗап.КоличествоПриход)); КонецЕсли; Если ЭлементыФормы.Товары.Колонки.РасходЗаПериод.Видимость Тогда ОформлениеСтроки.Ячейки.РасходЗаПериод.УстановитьТекст(Строка(РЕЗЗап.КоличествоРасход)); Конецесли; Если ЭлементыФормы.Товары.Колонки.КонОстаток.Видимость Тогда ОформлениеСтроки.Ячейки.КонОстаток.УстановитьТекст(Строка(РЕЗЗап.КоличествоКонечныйОстаток)); КонецЕсли; КонецЕсли; КонецЕсли; Если ДанныеСтроки.Номенклатура<>Справочники.Номенклатура.ПустаяСсылка() Тогда Запрос=Новый Запрос(); Запрос.УстановитьПараметр("Дата1",Дат1); Запрос.УстановитьПараметр("Дата2",Дат2); Запрос.УстановитьПараметр("номен",ДанныеСтроки.Номенклатура); Запрос.Текст= "ВЫБРАТЬ | СУММА(Продажи.КоличествоОборот) КАК Продажи |ИЗ | РегистрНакопления.Продажи.Обороты(&Дата1, &Дата2, Регистратор , (Номенклатура = &номен)) КАК Продажи"; РЕзЗап2=Запрос.Выполнить().Выбрать(); Если РЕзЗап2.Количество() <> 0 тогда Если РЕзЗап2.Следующий() Тогда Если ЭлементыФормы.Товары.Колонки.Продажи.Видимость Тогда ОформлениеСтроки.Ячейки.Продажи.УстановитьТекст(Строка(РЕЗЗап2.Продажи)); КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; Если ЭлементыФормы.ПоследнийПриход.Значение = Истина тогда ОформлениеСтроки.Ячейки.ПоследнийПриход.УстановитьТекст(УправлениеЗапасами.ПоследнийПриход(ДанныеСтроки.Номенклатура)); иначе ОформлениеСтроки.Ячейки.ПоследнийПриход.УстановитьТекст(""); КонецЕсли; Если ЭлементыФормы.Товары.Колонки.Всего.Видимость Тогда ОформлениеСтроки.Ячейки.Всего.УстановитьТекст(Формат(ДанныеСтроки.Сумма + ?(СуммаВключаетНДС, 0, ДанныеСтроки.СуммаНДС), "ЧЦ=15;ЧДЦ=2")); КонецЕсли; РаботаСДиалогами.ПоказатьКодАртикул(мКолонкиТовары, ОформлениеСтроки.Ячейки, ДанныеСтроки.Номенклатура); Если ДанныеСтроки.Номенклатура.ТОП = Истина тогда ОформлениеСтроки.Ячейки.Топ.Значение = Истина; ОформлениеСтроки.ЦветФона = WebЦвета.Оранжевый; иначе ЭлементыФормы.Товары.ЧередованиеЦветовСтрок = Ложь; ЭлементыФормы.Товары.ЧередованиеЦветовСтрок = Истина; ОформлениеСтроки.Ячейки.Топ.Значение = Ложь; КонецЕсли; РаботаСДиалогами.ПоказатьГрамаж(мКолонкиТовары, ОформлениеСтроки.Ячейки, ДанныеСтроки.Номенклатура); Если ЭлементыФормы.Автомат.Значение = Истина тогда Если НЕ ОформлениеСтроки.Ячейки.Продажи.Текст = "" тогда Потребность = Число(ОформлениеСтроки.Ячейки.Продажи.Текст - ОформлениеСтроки.Ячейки.КонОстаток.Текст); Если Потребность > 0 тогда Если Число(ОформлениеСтроки.Ячейки.КонОстаток.Текст) > 0 тогда ДанныеСтроки.Количество = Потребность; иначе ДанныеСтроки.Количество = Число(ОформлениеСтроки.Ячейки.Продажи.Текст); КонецЕсли; КонецЕсли иначе ДанныеСтроки.Количество = 0; КонецЕсли; КонецЕсли; КонецПроцедуры // ТоварыПриВыводеСтроки() |
|||
28
MrCrowley1988
01.07.15
✎
16:21
|
(27) , нижний кусочек кода:
Если ЭлементыФормы.Автомат.Значение = Истина тогда Если НЕ ОформлениеСтроки.Ячейки.Продажи.Текст = "" тогда Потребность = Число(ОформлениеСтроки.Ячейки.Продажи.Текст - ОформлениеСтроки.Ячейки.КонОстаток.Текст); Если Потребность > 0 тогда Если Число(ОформлениеСтроки.Ячейки.КонОстаток.Текст) > 0 тогда ДанныеСтроки.Количество = Потребность; иначе ДанныеСтроки.Количество = Число(ОформлениеСтроки.Ячейки.Продажи.Текст); КонецЕсли; КонецЕсли иначе ДанныеСтроки.Количество = 0; КонецЕсли; мне нужно адаптировать под процедуру Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок) и все, я от всех отстану :-) |
|||
29
DTXqueque
01.07.15
✎
16:23
|
(27) Оправдания ожидались..
Ты понимаешь, что для каждой отрисовки строки у тебя выполняется запрос? |
|||
30
MrCrowley1988
01.07.15
✎
16:25
|
(29) , да. У меня есть оправдание - это все делал не я! Но теперь нужно исходить из того, что у меня есть.
|
|||
31
D_E_S_131
01.07.15
✎
16:34
|
Тебе, по хорошему, можно было бы сделать обработку. В ней ввести исходные данные, получить расчетные в табличную часть обработки (база не будет засоряться как раз!). После просмотра/изменения данных пользователем пусть жмут на кнопку, которая и сформирует "Заказы поставщикам". Как раз не придется менять текущий горе-функционал и вернешься к нормально-ориентированным людям.
|
|||
32
MrCrowley1988
01.07.15
✎
20:17
|
Всем спасибо за ответы.
Сделал все добавлением необходимых реквизитов к ТЧ, и не через ПриВыводеСтроки, а кнопочкой (запросы выполняются только при нажатии на кнопку, а не при каждом выводе/перевыводе каждой строки). Еще раз, всем спасибо. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |