Модераторы: stron
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ПриОкончанииРедактированияСтроки, получить созданную новую строку 
V
    Опции темы
sergey_85
Дата 29.7.2009, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



Привет!

Дописываю модуль формы документа. В модуле формы док-та есть нужная мне преодпределення процедура.
Код

Процедура ПриОкончанииРедактированияСтроки(<?>)
КонецПроцедуры
Синтаксис:
ПриОкончанииРедактированияСтроки(<НовСтр>)
Назначение:
Предопределенная процедура при окончании редактирования строки многострочной части документа.
Параметры:
<НовСтр> - флаг новой строки. Число: 1 - если произошло окончание ввода новой строки, 0 - если произошло окончание редактирования существующей строки.


Мне нужно в этой процедуре получить добавленную строку табличной части, но в ответ ... лишь пустота!!! Может это косяк 1С?
Код

Процедура ПриОкончанииРедактированияСтроки(НовСтр)
  Если НовСтр = 1 Тогда
    Сообщить(ТекущийДокумент().ПолучитьАтрибут("Наименование")); //для примера
  КонецЕсли
КонецПроцедуры




--------------------
A good design always pays off.
PM MAIL   Вверх
Itsys
Дата 29.7.2009, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 7
Всего: 34



Зачем так мудрено?
у Вас курсор и так стоит на строке, которая редактировалась, соответственно достаточно
Код

Процедура ПриОкончанииРедактированияСтроки(НовСтр)
  Если НовСтр = 1 Тогда
    Сообщить(Наименование); //для примера
  КонецЕсли
КонецПроцедуры

PM MAIL WWW Skype   Вверх
sergey_85
Дата 29.7.2009, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



да это работает, но странно почему мой вариант не работает?

здесь идет возврат пустой строки
Код

Процедура ПриОкончанииРедактированияСтроки(НовСтр)
  Если НовСтр = 1 Тогда
    Сообщить(ТекущийДокумент().ПолучитьАтрибут("Наименование")); //для примера
  КонецЕсли
КонецПроцедуры


а здесь все ок возвр. то что надо!
Код

Процедура ПриОкончанииРедактированияСтроки(НовСтр)
  Если НовСтр = 1 Тогда
    Сообщить(Наименование); //для примера
  КонецЕсли
КонецПроцедуры




--------------------
A good design always pays off.
PM MAIL   Вверх
Itsys
Дата 29.7.2009, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 7
Всего: 34



Потому-что, ТекущийДокумент() возвращает ссылку на объект в двух вариантах: если документ новый, то будет пустое значение, если записанный, то ссылку на существующий (записанный) объект, у которого вновь ввденная строка мало того, что не записана, ты и ссылка возвращается на объект, у которого для получения значений про строками необходимо выполнить процедуру выборки строк "ВыбратьСтроки(); ПолучитьСтроку()"
PM MAIL WWW Skype   Вверх
sergey_85
Дата 29.7.2009, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



спасибо за пояснения Itsys!

но, тогда  можно ли как-то передать в функцию только что созданную строку, для получения всех  реквизитов табличной части и сравнения?
 


--------------------
A good design always pays off.
PM MAIL   Вверх
Itsys
Дата 29.7.2009, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 7
Всего: 34



через "Контекст"
PM MAIL WWW Skype   Вверх
sergey_85
Дата 30.7.2009, 06:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



Еще мини вопрос

Код

Процедура ПриОкончанииРедактированияСтроки(НовСтр)  

  // так правильно, но я не могу передать ссылку на объект в функцию
  Сообщить("Наименование  " + ПолучитьАтрибут("Наименование")); 

  //так неверно но как передать в функцию ссылку на объект
  Сообщить("Наименование  " + Контекст.ПолучитьАтрибут("Наименование")); 
КонецПроцедуры


т.е. я хочу узнать как обратиться например к ПолучитьАтрибут("Наименование") в полном виде а не сокращенно. использую модуль формы 

Код

Процедура ПриОкончанииРедактированияСтроки(НовСтр)  

  // в отладке скажет что неизвестный объект
  Сообщить("Наименование  " + Форма.ПолучитьАтрибут("Наименование"));

  //просто ошибка   
  Сообщить("Наименование  " + Контекст.ПолучитьАтрибут("Наименование")); 
КонецПроцедуры


Пробовал так, ошибка

Код
   
Процедура ПриОкончанииРедактированияСтроки(НовСтр)  
    тз = СоздатьОбъект("ТаблицаЗначений");
    ВыгрузитьТабличнуюЧасть(тз);  
    
    док = Контекст;
КонецПроцедуры


а вот так идет, но как-то мудренно
Код

Функция  ПолучитьКонтекст(Кон)
Возврат Кон;
КонецФункции
    
Процедура ПриОкончанииРедактированияСтроки(НовСтр)  
    тз = СоздатьОбъект("ТаблицаЗначений");
    ВыгрузитьТабличнуюЧасть(тз);  
    
    док = ПолучитьКонтекст(Контекст);
КонецПроцедуры


Спасибо!

Это сообщение отредактировал(а) sergey_85 - 30.7.2009, 06:58


--------------------
A good design always pays off.
PM MAIL   Вверх
Itsys
Дата 30.7.2009, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 7
Всего: 34



Бр... поподробнее, чего ты хочешь добиться....

Добавлено через 32 секунды
Какова цель всего этого, опиши словами, т.к. не понимаю зачем тебе все это нужно...
PM MAIL WWW Skype   Вверх
sergey_85
Дата 30.7.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



ну мне нужно сравнивать табличную часть документа, я пишу логгер док-тов

в процедуре ПриОкончанииРедактированияСтроки, приудалении ловлю момент когда табличная часть док-та изменяется пишу эти изменения в свою временную таблицу и в конце сравниваю с оригиналом.

Все ничего но столкнулся с проблемой о которой писал в начале (т.е. вместо новой строки получаю пустоту) 

Кажется я вышел из ситуации так:
Код

Функция  ПолучитьТекущийКонтекст(Кон)
    Возврат Кон;
КонецФункции 
   
//возвр. таблицу значений с 1 строкой, в которой хранится текущая строка док-та (нов., ред., удал., перемещ.)
Функция ПолучитьТекущуюСтрокуТЧДокумента(Док)
    Перем тзСтрока;
    тзСтрока = СоздатьОбъект("ТаблицаЗначений");   
    
    //установим кол-во колонок = кол-ву реквизитов док-та 
    тзСтрока.КоличествоКолонок(Метаданные.Документ(док.Вид()).РеквизитТабличнойЧасти());    
    
    //добавим текущую строку
    тзСтрока.НоваяСтрока();
    
    //установим значения текущей строки
    Для к = 1 По  Метаданные.Документ(док.Вид()).РеквизитТабличнойЧасти() Цикл
     ид = Метаданные.Документ(Док.Вид()).РеквизитТабличнойЧасти(к).Идентификатор;
        тзСтрока.УстановитьЗначение(1, к, Док.ПолучитьАтрибут(ид));  
        
        Сообщить("Идентификатор: " + ид); 
        Сообщить("Значение:      " + Док.ПолучитьАтрибут(ид));
        
    КонецЦикла; 
     
    Возврат тзСтрока;     
КонецФункции
  
////////////////////////////////////////////////////////////////////////////////
Процедура ПриУдаленииСтроки()  
       
    док = ПолучитьТекущийКонтекст(Контекст);
    
    Сообщить("Текущий номер " + НомерСтроки);
    ПолучитьТекущуюСтрокуТЧДокумента(док);
КонецПроцедуры
    
////////////////////////////////////////////////////////////////////////////////
Процедура ПриОкончанииРедактированияСтроки(НовСтр)  

   //вот здесь получаю пустую новую строку, а мне надо занести новую строку во временную        т
   //таблицу для сравнения!!! 
   //ТекущийДокумент().ПолучитьСтрокуПоНомеру(НомерСтроки)

   //это новый вариант, котрый работает
    док = ПолучитьТекущийКонтекст(Контекст);
    
    Сообщить("Текущий номер " + НомерСтроки);
    ПолучитьТекущуюСтрокуТЧДокумента(док);
КонецПроцедуры


только один минус - 
Код

//ок
док = ПолучитьТекущийКонтекст(Контекст);
//ошибка!
док = Контекст;


Это сообщение отредактировал(а) sergey_85 - 30.7.2009, 11:52


--------------------
A good design always pays off.
PM MAIL   Вверх
Itsys
Дата 30.7.2009, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 7
Всего: 34



Зачем городить такой огород с временной таблицей и т.д.

Все элементарно:
В процедуру "ПриЗаписи" вызываешь ТекущийДокумент() - это ссылка на объект, сохраненный в БД, и, реквизиты этого объекта сравниваешь текущими реквизитами.
Код

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

PM MAIL WWW Skype   Вверх
sergey_85
Дата 30.7.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



да я такие варианты видел, но главбух требует чтоб было видно какая строка была удалена, что было изменено (конкретно по параметрам), что добавлено
и еще здесь не учтено что будет если я возьму и перемещу одну строку вверх? получится что она новая?

Это сообщение отредактировал(а) sergey_85 - 30.7.2009, 12:25


--------------------
A good design always pays off.
PM MAIL   Вверх
AkelaSQL
Дата 30.7.2009, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 14.9.2007
Где: Москва

Репутация: 6
Всего: 7



Да, это старый больной вопрос...
Главбухи наверное все такие. Вместо того, чтобы набрать на работу адекватных людей - набирают обезьян, а потом дурят голову программистам, что бы те следили за тем, чтобы они не дай бог чего не натворили...
Зоопарк одним словом....


--------------------
user posted image
PM MAIL ICQ   Вверх
sergey_85
Дата 30.7.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



Код

Да, это старый больной вопрос...
Главбухи наверное все такие. Вместо того, чтобы набрать на работу адекватных людей - набирают обезьян, а потом дурят голову программистам, что бы те следили за тем, чтобы они не дай бог чего не натворили...
Зоопарк одним словом....


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

.... ну а нам программерам, как обычно все это делать, делать, делать! 
пс: а потом еще и доделывать и переделывать! smile

Это сообщение отредактировал(а) sergey_85 - 30.7.2009, 13:30


--------------------
A good design always pays off.
PM MAIL   Вверх
Itsys
Дата 30.7.2009, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 7
Всего: 34



Цитата(sergey_85 @  30.7.2009,  12:24 Найти цитируемый пост)
да я такие варианты видел, но главбух требует чтоб было видно какая строка была удалена

Развивай логику... всегда можно при сравнении определить была ли удалена строка или только изменена, а с добавлением строк или удалением еще проще... в этом случае не выполняется условие "Док.КоличествоСтрок()<>КоличествоСтрок()".

ЗЫ для точного определения, чего происходит со строкой, достаточно модифицировать документ и ввести такой реквизит, как идентификатор строки, которые можно получать, напимер с помощью "СоздатьGUID()", тогда любая строка любого документа будет иметь уникальный идентификатор, по которому можно сравнивать значения.
PM MAIL WWW Skype   Вверх
sergey_85
Дата 31.7.2009, 06:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



Цитата

ЗЫ для точного определения, чего происходит со строкой, достаточно модифицировать документ и ввести такой реквизит, как идентификатор строки, которые можно получать, напимер с помощью "СоздатьGUID()", тогда любая строка любого документа будет иметь уникальный идентификатор, по которому можно сравнивать значения.


Мне тоже хотелось бы, guid у каждой строки, но его нет и добавлять не хочу (не охота особо менять метаданные).

Цитата

Развивай логику... всегда можно при сравнении определить была ли удалена строка или только изменена, а с добавлением строк или удалением еще проще... в этом случае не выполняется условие "Док.КоличествоСтрок()<>КоличествоСтрок()".


Над логикой я конечно же думаю и варианты типа  "Док.КоличествоСтрок()<>КоличествоСтрок()" перебирал и в 1 очередь конечно же думал о сравнении док-та при записи, а не о том какое удовольствие в каждой процедурке лепить непонятно что и как.  smile 

Всем спасибо за помощь! 


--------------------
A good design always pays off.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "1C: Предприятие, SAP, ERP и учётные системы"
stron

Запрещается!

1. Обсуждение крэков, кейгенов и других подобных программ

Пробуйте искать сами или обращайтесь в приват к участникам форума.

Темы с подобными вещами будут немедленно удаляться, а нарушители - получать предупреждения.

Также запрещается обсуждение проблем работы этих программ (что куда вписать, куда что скопировать и т.п...)

2. Давать ссылки на взломанные продукты

  • Пожалуйста, пользуйтесь поиском перед тем, как задать вопрос - возможно ответ уже есть на форуме.
  • Название темы должно отражать её суть
  • Действия модераторов можно обсудить здесь

С уважением, stron, Pegas.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | 1C: Предприятие, SAP, ERP и учётные системы | Следующая тема »


 




[ Время генерации скрипта: 0.0694 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.