Имя: Пароль:
1C
1С v8
Зацикливание ПриПолученииДанных
0 FiftyStars
 
26.12.11
18:34
Вобщем вот такой код...как избежать зацикливания?
Как я понимаю происходит следующее...ПриПолученииДанных я беру данные, изменяю их и это вызывает событие ПриПолученииДанных

Процедура ТаблицаЗаказыПокупателейПриПолученииДанных(Элемент, ОформленияСтрок)
   Массив = новый Массив;
//Записываю те строки что на экране у пользователя в массив
   Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
       Массив.Добавить(ОформлениеСтроки.ДанныеСтроки);
   КонецЦикла;
//Передаю массив на обработку
    ОбновитьСтроки(Массив);
КонецПроцедуры
//*********************************************************
//Здесь по значениям в массиве проиходит запрос и вызов процедуры обработки результатов запроса
//**********************************************************
Процедура ОбновитьСтроки(Строки)
   ЗаказыСсылки = Новый Массив;
   Для каждого Строка Из Строки Цикл
       ЗаказыСсылки.Добавить(Строка.ЗаказСсылка);
   КонецЦикла;
   ЗапросТМП = новый Запрос;
   ЗапросТМП.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
   ЗапросТМП.Текст="ВЫБРАТЬ Заказы.Ссылка
|Поместить Заказы
|из Документ.заказпокупателя как заказы
|где заказы.ссылка в (&ПараметрЗаказ)";
   ЗапросТМП.УстановитьПараметр("ПараметрЗаказ",ЗаказыСсылки);
   ЗапросТМП.Выполнить();
   Запрос = Новый Запрос;
   Запрос.МенеджерВременныхТаблиц=ЗапросТМП.МенеджерВременныхТаблиц;
   Запрос.Текст = "
|ВЫБРАТЬ
|    ЗаказыСп.ссылка Как ЗаказСсылка,
|    Резервирование.Ссылка как РезервированиеСсылка,
|    Резервирование.Дата как РезервированиеДата,
|    Корректировки.Ссылка как КорректировкаСсылка,
|    Корректировки.Дата как КорректировкаДата,
|    Счета.СчетСсылка КАК СчетСсылка,
|    Счета.СчетДата    КАК СчетДата,
|    Реализации.РеализацияСсылка КАК РеализацияСсылка,
|    Реализации.РеализацияДата КАК РеализацияДата,
|    Закрытия.ЗакрытиеСсылка КАК ЗакрытиеСсылка,
|    Закрытия.ЗакрытиеДата как ЗакрытиеДата,
|    ППВ.Ссылка как ППВСсылка,
|    ПКО.Ссылка как ПКОСсылка
|ИЗ    (ВЫБРАТЬ *
|    ИЗ
|    Заказы) Как ЗаказыСп
|Левое соединение
|    (Выбрать
|        СчетаТ.Ссылка КАК СчетСсылка,
|        Счета.Дата как СчетДата,
|        Счетат.ЗаказПокупателя
|    из
|        документ.СчетНаОплатуПокупателю.товары как СчетаТ
|        ЛЕВОЕ СОЕДИНЕНИЕ
|            документ.СчетНаОплатуПокупателю как Счета
|        по
|            счетат.Ссылка = Счета.Ссылка
|        //Где
|        //    Счетат.ЗаказПокупателя в (ЗаказыСп)
|        СГРУППИРОВАТЬ ПО
|            СчетаТ.Ссылка,    
|            Счета.Дата,    
|            Счетат.ЗаказПокупателя) Как Счета
|
|по Счета.ЗаказПокупателя  = ЗаказыСп.Ссылка
|
|ЛЕВОЕ СОЕДИНЕНИЕ
|    (Выбрать
|        Закрытия.Ссылка КАК ЗакрытиеСсылка,
|        ЗакрытияЗ.ЗаказПокупателя как ЗаказПокупателя,
|        Закрытия.Дата как ЗакрытиеДата
|    ИЗ
|        Документ.ЗакрытиеЗаказовПокупателей.Заказы как ЗакрытияЗ
|        Левое соединение
|            документ.ЗакрытиеЗаказовПокупателей как Закрытия
|        по
|            ЗакрытияЗ.Ссылка=Закрытия.Ссылка
|        //Где
|        //    ЗакрытияЗ.ЗаказПокупателя в &ПараметрЗаказ
|        Сгруппировать по
|            Закрытия.Ссылка,
|            ЗакрытияЗ.ЗаказПокупателя,
|            Закрытия.Дата) как Закрытия
|ПО
|    Закрытия.ЗаказПокупателя =ЗаказыСп.Ссылка
|
|Левое соединение
|    (Выбрать
|        Реализации.Ссылка КАК РеализацияСсылка,
|        Реализации.Дата КАК РеализацияДата,
|        РеализацииТ.ЗаказПокупателя КАК ЗаказПокупателя
|    Из
|        документ.РеализацияТоваровУслуг Как Реализации
|        Левое Соединение
|            Документ.РеализацияТоваровУслуг.Товары КАК РеализацииТ
|        По
|            Реализации.Ссылка=РеализацииТ.Ссылка
|        //Где
|        //    РеализацииТ.ЗаказПокупателя в &ПараметрЗаказ
|        Сгруппировать по    
|        Реализации.Ссылка,
|        Реализации.Дата,
|        РеализацииТ.ЗаказПокупателя) Как Реализации
|ПО
|    Реализации.ЗаказПокупателя = ЗаказыСп.Ссылка
|Левое соединение    
|    Документ.КорректировкаЗаказаПокупателя как Корректировки
|ПО Корректировки.ЗаказПокупателя  = ЗаказыСп.Ссылка
|
|ЛЕВОЕ СОЕДИНЕНИЕ
|    Документ.РезервированиеТоваров Как Резервирование
|ПО Резервирование.Заказ  = ЗаказыСп.Ссылка
|левое соединение
|    Документ.ПлатежноеПоручениеВходящее Как ППВ
|По
|    ППВ.ДокументОснование = ЗаказыСп.Ссылка
|Левое соединение
|    Документ.ПриходныйКассовыйОрдер как ПКО
|ПО
|    ПКО.ДокументОснование = ЗаказыСп.Ссылка
|
|";



   
   Результат = Запрос.Выполнить().Выгрузить();
   Если результат.Количество()>0 Тогда
       Для каждого Строка Из Строки  Цикл
           
       
           ЗаполнитьСтроку(Строка,"Счет",Результат);
           ЗаполнитьСтроку(Строка,"Резервирование",Результат);
           ЗаполнитьСтроку(Строка,"Корректировка",Результат);
           ЗаполнитьСтроку(Строка,"Реализация",Результат);
           ЗаполнитьСтроку(Строка,"Закрытие",Результат);
           //Если результат[результат.Количество()-1]["ППВСсылка"]<>Null Тогда
           //    ЗаполнитьСтроку(Строка,"ППВ",Результат);
           //ИначеЕсли Строка["ПКОСсылка"]<>Null Тогда
           //    ЗаполнитьСтроку(Строка,"ПКО",Результат);
           //КонецЕсли;
       КонецЦикла;
   КонецЕсли;    
   
КонецПроцедуры

//*********************************************************
//Здесь все обрабатывается и записывается обратно в ТП
//********************************************************

Процедура ЗаполнитьСтроку(Строка,Колонка,Результат)
   НайденнаяСтрока=результат.Найти(Строка.ЗаказСсылка,"ЗаказСсылка");
   КолонкаСсылка=Колонка+"Ссылка";
   КолонкаДата=Колонка+"Дата";
       
   Если НайденнаяСтрока[КолонкаСсылка]<>Null Тогда
       Строка[КолонкаСсылка]=НайденнаяСтрока[КолонкаСсылка];
       Строка[КолонкаДата]=НайденнаяСтрока[КолонкаДата];
       Строка[Колонка] = Истина;
   Иначе
       Строка[КолонкаСсылка]=Неопределено;
       Строка[КолонкаДата]=Неопределено;
       Строка[Колонка] = Ложь;
   КонецЕсли;
КонецПроцедуры
1 Fragster
 
гуру
26.12.11
18:36
не надо менять данные ПриПолученииДанных, даже на такие же значения. т.е. сначала сравинвай и меняй только если отличаются.
2 vmv
 
26.12.11
18:37
напиши еще запросов и МВТ в этот обработчик и не убивай временные, я пока организую тотализатор как скоро кроякнеться ваш сервер - дерзай

я уже собираю ставки
3 asady
 
26.12.11
18:39
(0) ты бы хоть в типовых посмотрел как там сделано - зачем же изобретать лисапед
4 URAL
 
26.12.11
18:42
(0) удивляюсь и только, согласен с (3)
5 FiftyStars
 
26.12.11
19:02
(2) потому это тестовая база...я только начал делать обработку
(1) это понятно, но я думал что можно как то по-другому организовать так чтобы событие дохло еще в зародыше=))
(3)ну что то я ничего подобного моей задачке не видел в типовом...
http://imglink.ru/show-image.php?id=74f76108d3173b99559e5fdd6cf1d472
вобщем полная(пока еще нет) таблица заказов...можно сразу увидеть какой заказ в какой стадии, и оформить все что нужно с одного окна, не залезая в 10 менюшек и не тыкая в автосоздание документов когда бывало пишется не совсем то что надо а менеджер узнает об этом хз когда...ничего подобного не видел в типовом
6 vmv
 
26.12.11
19:06
посмотри в типовой обработки рабочий стол менеджера, конечно круто - когда все в одном флаконе, но, как правило, нужно чтобы было просто понятно и более-менее быстро.

даже можно забить на производительность, если только для демострации возможностей, но граввное простта все же, менеждеры тупые, увы
7 Живой Ископаемый
 
26.12.11
19:09
2(0) ваш пример описан у габца.. При получении - получаем данные, как бы в кэш, дополняем его как бог черепаху , а при выводе  например строки - ищем в кэше по ключу и уже выводим, но не делаем Обновить
8 QLgKR
 
26.12.11
19:29
(0) Ну нельзя же данные менять!
Добавить колонки на форму (просто колонки, не связывая с данным).
И выводить в эти колонки текст, используя метод оформления строки УстановитьТекст

ОформлениеСтроки.Ячейки.ИмяКолонки.УстановитьТекст(<Текст>)
9 FiftyStars
 
26.12.11
20:35
(8) я так пробовал - не катит так...это больший гемор чем проверять данные перед изменением.
+Не все созданные поля должны иметь тип текст(флажок,картинку), но также и ссылки на документы, т.е. ссылку на счет и т.д.
При изменении получаемого в процедуре параметра - коллекции ОформленияСтрок хоть ты шрифт поменяй или цвет фона, все равно вызов будет снова=(((
КСТАТИ НАСЧЕТ ЭТОГО ПРИМЕРА
событие ПриПолученииДанных вызывается при изменении любых данных ТЗ или только при изменении тех данных что видны в ТП?
(7)то есть типа

Процедура ПриПолученииДанных(ОформленияСтрок)
ОформленияСтрок=ПеределанныеОформленияСтрок;
КонецПроцедуры

?или я чего то не понял?

Жаль что нет ничего типа "ПередПолучениемДанных"...так бы по пути перехватить их, изменить, и пусть идут туда куда шли

(6) эта вещь как раз на тупых и расчитана будет...убрана излишняя свобода действий менеджеров...тыкнул по порядку в поле "счет" где нет галки - создался новый счет, тыкнул в поле где есть счет - открыл его...и т.д. Часто менеджеры путаются какой заказ на какой стадии...оставляют заказы без ПКО или наоборот выписывают 2-3 двойника и приход оказывается не 20000 а 40-60 =)А так все данные(вплоть до адреса и т.д.) будут получаться из справочников(адреса)...у менеджера даже клавиатуры не будет, будет сенсорный экран и все...у админа будет доступ к вводу новой инфы...обычные менеджеры будут работать только с постоянной клиентской базой...вобщем спецификация организации позволяет так замутить=))
10 FiftyStars
 
26.12.11
20:36
поправка*(Адреса, например)*
А то как то несерьезно)))
11 Живой Ископаемый
 
27.12.11
11:37
2(9) давай ты словами расскажешь что хочешь сделать со строками и в зависимости от чего.
12 kosts
 
27.12.11
11:47
(9) > оставляют заказы без ПКО или наоборот выписывают 2-3 двойника и приход оказывается не 20000 а 40-60
Это не проблема программиста, это проблема директора, раз два премии лишат - больше не ошибутся.

Я бы делал как в (7) или еще одну табличку с нужной информацией, в которой информация меняется при перемещении по основной таблице.