Имя: Пароль:
1C
1С v8
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
Всем спасибо за ответы.

Сделал все добавлением необходимых реквизитов к ТЧ, и не через ПриВыводеСтроки, а кнопочкой (запросы выполняются только при нажатии на кнопку, а не при каждом выводе/перевыводе каждой строки).

Еще раз, всем спасибо.