Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Почему нельзя получить значение атрибута формы если Ид=Наименование? (число прочтений - 8353 )
CaSH
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 02. Мая 2011
Почему нельзя получить значение атрибута формы если Ид=Наименование?
03. Октября 2011 :: 14:43
Печать  
Организовал проверка разных полей на форме элемента справочника

Проверяю разные поля, в том числе предопределенные Наименование и Код
АтрФормы = СоздатьОбъект("АтрибутФормы");
АтрФормы.УстановитьАтрибут(КонтФормы.Форма, ИмяРеквизита);
Сообщить(АтрФормы.Значение);
И получается чудо:
Пока ИмяРеквизита=люой реквизит справочника или формы все нормально, но предопределенные реквизиты Наименование и Код у него всегда пустые
Может есть выход а? Нерешительный Нерешительный
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #1 - 03. Октября 2011 :: 15:04
Печать  
Есть. Использовать штатные методы.
А так, это баян, который АЛьФ/Артур никак не поправят
Предопределенные атрибуты - НомерДок,Наименование,Код,ДатаДок не возвращаются через атрибуты формы.
ЗЫ: и не устанавливаются
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #2 - 03. Октября 2011 :: 15:07
Печать  
  
Наверх
 
IP записан
 
CaSH
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 02. Мая 2011
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #3 - 03. Октября 2011 :: 15:45
Печать  
очень жаль и спасибо за ответ, а то бы гадал
  
Наверх
 
IP записан
 
mszsuz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 33
Зарегистрирован: 18. Октября 2010
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #4 - 03. Октября 2011 :: 15:51
Печать  
Один из вариантов:
Код
Выбрать все
//_____________________________________________________________________________

Процедура УстановитьПеременнуюКонтекста(Конт, Имя, Значение) Экспорт

	ВМ = СоздатьОбъект("ВыполняемыйМодуль");

	ВМ.УстановитьМодуль("
	|
	|Процедура _УстановитьПеременную(Значение)
	|	Попытка
	|		"+Имя+" = Значение;
	|	Исключение
	|	КонецПопытки;
	|КонецПроцедуры");

	ВМ.НазначитьКонтекст(Конт);
	ВМ.КомпилироватьИВыполнитьМодуль();
	ВМ._УстановитьПеременную(Значение);

КонецПроцедуры
//_____________________________________________________________________________

Функция ПолучитьПеременнуюКонтекста(Конт, Имя) Экспорт

	ВМ = СоздатьОбъект("ВыполняемыйМодуль");

	ВМ.УстановитьМодуль("
	|
	|Функция _ПолучитьПеременную()
	|	Попытка
	|		Возврат "+Имя+";
	|	Исключение
	|	КонецПопытки;
	|КонецФункции");

	ВМ.НазначитьКонтекст(Конт);
	ВМ.КомпилироватьИВыполнитьМодуль();

	Возврат ВМ._ПолучитьПеременную();

КонецФункции
 

  
Наверх
 
IP записан
 
CaSH
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 02. Мая 2011
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #5 - 03. Октября 2011 :: 15:54
Печать  
А не подскажете почему при установке цвета если у Атрибута нет ревизита, то вываливается ошибка? Ведь атрибут то получен
Например:
Цитата:
FormEx_External.УстановитьФорму(Форма);
Для Счетчик=0 По FormEx_External.КоличествоАтрибутов()-1 Цикл
FormEx_External.ПолучитьАтрибут(Счетчик);
Атрибут.ЦветФона = 16777215; // белый


тут вылетает с ошибкой памяти если Атрибут.Идентификатор=""
  
Наверх
 
IP записан
 
mszsuz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 33
Зарегистрирован: 18. Октября 2010
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #6 - 03. Октября 2011 :: 15:57
Печать  
В доке написано, что ЦветФона и ЦветТекста нестабильные.
  
Наверх
 
IP записан
 
CaSH
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 02. Мая 2011
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #7 - 03. Октября 2011 :: 16:01
Печать  
mszsuz, за пример спасибо, я так еще не делал, хотя видел аналогичный способ типовыми средствами
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #8 - 03. Октября 2011 :: 16:06
Печать  
Цвет можно только у текста менять и привет.
  
Наверх
 
IP записан
 
CaSH
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 02. Мая 2011
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #9 - 03. Октября 2011 :: 16:08
Печать  
Eprst писал(а) 03. Октября 2011 :: 16:06:
Цвет можно только у текста менять и привет.

Точно можно еще у Поля ввода, тип=2 [1CEDIT (Поле ввода)]
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #10 - 03. Октября 2011 :: 18:18
Печать  
неа, хоть и в описалове стоит что можно , но будет вылет всегда.
  
Наверх
 
IP записан
 
CaSH
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 02. Мая 2011
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #11 - 04. Октября 2011 :: 07:00
Печать  
Eprst писал(а) 03. Октября 2011 :: 18:18:
неа, хоть и в описалове стоит что можно , но будет вылет всегда.

Я делаю вот так и се работает, наверно из-за того что типовыми средствами:
Цитата:
FormEx_Attributes.УстановитьАтрибут(Форма, ИмяРеквизита);
FormEx_Attribs.ЦветФона = ЦветФона;
Форма.ПолучитьАтрибут("Надпись"+ИмяРеквзита).Цвет(ЦветНадписи);
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #12 - 04. Октября 2011 :: 07:38
Печать  
в описалове стоит, что цвет фона можно поменять у 2-х контролов - текст и едит. На практике - только у одного (какого именно не помню)
У другово будет вылет всегда.
  
Наверх
 
IP записан
 
CaSH
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 02. Мая 2011
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #13 - 04. Октября 2011 :: 08:41
Печать  
Eprst писал(а) 04. Октября 2011 :: 07:38:
в описалове стоит, что цвет фона можно поменять у 2-х контролов - текст и едит. На практике - только у одного (какого именно не помню)
У другово будет вылет всегда.


Наверно так и есть, потому что по своему коду смотрю что сделал через типоую смену цвета у поля Текст (надпись), это достаточно универсально.

А не подскажете почему в разных базах подключил свой модуль Переватчик событий и вывел что они перехватывают, раньше как то не сравнивал а теперь сравнил:
1 база: Цитата:
-> ПерехватСобытий.Событие_ПриИзмененииРазмераОкна()
-> ПерехватСобытий.Событие_ПриЗакрытии()
-> ПерехватСобытий.Событие_ПриИзмененииРазмераОкна()
-> ПерехватСобытий.Событие_ПриИзмененииРазмераОкна()
-> ПерехватСобытий.Событие_ПриИзмененииРазмераОкна()
-> ПерехватСобытий.СобытиеГМ_Событие_ЗаписьСобытияЖурналаРегистрации()
-> Запуск ПерехватСобытий.ert
-> ПерехватСобытий.Инициализация()
-> ПерехватСобытий.СобытиеГМ_ПриОткрытии
-> ПерехватСобытий.Событие_ПриОткрытии()
-> ПерехватСобытий.Событие_ПриИзмененииРазмераОкна()
-> ПерехватСобытий.Событие_ПриИзмененииРазмераОкна()
-> ПерехватСобытий.Событие_ПриИзмененииРазмераОкна()
-> ПерехватСобытий.Событие_ПослеОткрытия()
-> ПерехватСобытий.Событие_ПриИзмененииРазмераОкна()

2-я база:
Цитата:
-> ПерехватСобытий.Событие_ПриИзмененииРазмераОкна()
-> ПерехватСобытий.Событие_ПриЗакрытии()
-> ПерехватСобытий.СобытиеГМ_Событие_ЗаписьСобытияЖурналаРегистрации()
-> ПерехватСобытий.Событие_ПриИзмененииРазмераОкна()
-> ПерехватСобытий.Событие_ПриИзмененииРазмераОкна()
-> ПерехватСобытий.Событие_ПриВыбореСтроки()
-> Запуск ПерехватСобытий.ert
-> ПерехватСобытий.Инициализация()
-> ПерехватСобытий.СобытиеГМ_ПриОткрытии
-> ПерехватСобытий.Событие_ПриОткрытии()
-> ПерехватСобытий.Событие_ПриИзмененииРазмераОкна()
-> ПерехватСобытий.Событие_ПриИзмененииРазмераОкна()
-> ПерехватСобытий.Событие_ПриИзмененииРазмераОкна()
-> ПерехватСобытий.Событие_ПослеОткрытия()
-> ПерехватСобытий.Событие_ПриИзмененииРазмераОкна()
-> ПерехватСобытий.Событие_ПриИзмененииРазмераОкна()
-> ПерехватСобытий.Событие_ПриИзмененииРазмераОкна()


Это все открытие документа из общего журнала, правда разного, но ведь не из-за этого же
Не подскажете в чем дело?
Начал сравнивать т.к. в одной базе не отхватывает событие Событие_ПриВыбореСтроки()
Не подскажете куда копать?
Поставил последний релиз 1С++ 3.2.3.15 на обе базы, ситуация не изменилась - даже при одинаковых документах/журналах разные события
Я уж не говорю что иногда изменяю размер окна а сообщение о событии не выскакивает, но в отладчике если проверяю то событие ловится и сообщение теоретически формируется, просто его не видно на экране, зато если зарыть окно документа то сразу кроме событий закрытия выскакивают и прошлые "выведенные" события, они как-то буфферизируются где-то что-ли?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #14 - 04. Октября 2011 :: 09:10
Печать  
Улыбка
А Форма.ОбработкаВыбораСтроки(1) в коде есть ?
  
Наверх
 
IP записан
 
CaSH
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 02. Мая 2011
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #15 - 04. Октября 2011 :: 09:44
Печать  
Eprst писал(а) 04. Октября 2011 :: 09:10:
Улыбка
А Форма.ОбработкаВыбораСтроки(1) в коде есть ?

Вот спасибо! Совсем забыл, уже больше года не ковырялся в этом 1С++, комментарий об этом не написал, и все позабывал  Смех
Все последнее время на 8-ке, а у вас тут походу хватает работы на 7-ке, что такая практика?
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #16 - 04. Октября 2011 :: 11:33
Печать  
А почему бы и нет?
7.7 SQL + (1С++,FormEx,Yoksel,dialmail,RWidjets,SQLite)
Взрывная весчь получается.
Не хуже 8.х между прочим.
Так что работы и на 7.7 фатает.
  
Наверх
 
IP записан
 
CaSH
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 02. Мая 2011
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #17 - 04. Октября 2011 :: 11:53
Печать  
Насчет не хуже - не соглашусь
По описанию - да
Но по использованию 1С 8 - стабильнее
7.7 несколько лет на ВК извращался, кроме SQLite все компоненты перепахал, со всех сайтов, но везде такие глюки - то там включи, то тут выклюи, то эту компоненту нужно только после той вызывать. А самое обидное когда все подходит, уже все сделал, и тут вылазит интерфейсный глюк - который ну никак не побороть, или какой-то мелочи не хватает.
Хотя по скорости с небольшим объемом объектов (1-2 тыс.) мне очень нравится. Обажаю конфигуратор и ненавижу отладчик -где ничего нельзя увидеть, а в 8-ке можно все выловить там
  
Наверх
 
IP записан
 
CaSH
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 02. Мая 2011
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #18 - 04. Октября 2011 :: 11:59
Печать  
А Перехватчик при программной записи справочника/документа - не отлавливает никак? А то мне нужно все запретить, но не через права
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #19 - 05. Октября 2011 :: 03:18
Печать  
CaSH писал(а) 04. Октября 2011 :: 11:59:
А Перехватчик при программной записи справочника/документа - не отлавливает никак? А то мне нужно все запретить, но не через права


Одну из лучших реализаций в этом направлении, которую я встречал (хоть и весьма и весьма громоздкую):
Есть класс ТДокумент : Документ
Для каждого вида документа есть класс ТДокумент.<Вид> : ТДокумент.

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

или даже в конструкторе сделать замену Сам(Контекст).ЗаменитьБазовыйОбъект("Документ", СоздатьОбъект(...)))

а дальше переопределяются методы Новый(), Записать(), etc - в которых делаешь все проверки, которые нужно.

Дополнительно, можно прикрутить перехватчик и вынести, скажем, проверки заполнения документа в отдельный метод класса, который будет вызываться перехватчиком в форме и переопределенным методом Записать().

Короче, простор для фантизии безграничен.
Хотя кода придется писать немало.
  
Наверх
 
IP записан
 
CaSH
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 02. Мая 2011
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #20 - 05. Октября 2011 :: 08:36
Печать  
А как найти этот класс? Ссылки нема?
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #21 - 05. Октября 2011 :: 10:12
Печать  
А ХЗ - скорее всего, это в публичный доступ не выкладывалось.

Да и что там выложить - только ТДокумент с каким-то базовым функционалом?
всякие ТДокумент.<Вид> - они под конкретную специфику пишутся...
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #22 - 05. Октября 2011 :: 10:18
Печать  
Примерно так выглядит:


Код
Выбрать все
///******************************** Павел  30.11.2010
Функция ПроверкаЗаполнения() Экспорт
	Сам = Сам(Контекст);
	Сам.Ошибка = "";
	Сам.ИмяОшибочногоПоля = "";

	Возврат 1;
КонецФункции	// ПроверкаЗаполнения
///******************************** Павел  30.11.2010

///******************************** Павел  30.11.2010
Функция ПриЗаписи() Экспорт
	Сам = Сам(Контекст);
	Если Сам.ПроверкаЗаполнения() <> 1 Тогда
		Возврат 0;
	КонецЕсли;

	Если фЭтоКонтекстФормы = 1 Тогда
		ПриИзмененииОбъектаМОД(Сам.ПолучитьБазовыйКласс("ГрупповойКонтекст"), Сам.ТекущийДокумент(), Сам.ДатаДок);
	КонецЕсли;
	Возврат 1;
КонецФункции
///******************************** Павел  30.11.2010

///******************************** Павел  30.11.2010
Функция ПослеЗаписи() Экспорт
	Сам = Сам(Контекст);
	Если (Строка(идДок9) = "     0   ") Или (Строка(идДок13) = "   0     0   ") Тогда
		//Если пытались получать идДок9 или идДок13 до записи объекта - нужно обновить значения
		ТекДок = Сам.ТекущийДокумент();
		идДок9 = РадугаСервис.ЗначениеВСтрокуБД(ТекДок);
		идДок13 = РадугаСервис.ЗначениеВДлиннуюСтрокуБД(ТекДок);
	КонецЕсли;

	глМенеджерСобытийДокументов.ПослатьСобытие(Контекст, "Запись");

	Если фЭтоКонтекстФормы = 1 Тогда
		Сам.УправлениеФормой();
	КонецЕсли;

	Возврат 1;
КонецФункции
///******************************** Павел  30.11.2010

///******************************** Павел  28.04.2011
Функция Записать() Экспорт
	Сам = Сам(Контекст);
	Сам.Ошибка = "";

	Если Сам.ПриЗаписи() = 0 Тогда
		Возврат 0;
	КонецЕсли;

	докБаза = Сам.ПолучитьБазовыйКласс("Документ");
	Выбран = докБаза.Выбран();


	глУстановитьВремяДокумента(докБаза);

	Попытка
		//докБаза.Записать();
		ОбъектЗаписать(докБаза);
	Исключение
		Сам.Ошибка = ОписаниеОшибки();
		Сообщить(Лев(Сам.Ошибка, 250), "!");
		//#curmeth
		//#exinfo

		Если Выбран = 1 Тогда
			ЗаписьЖурналаРегистрации("", "Docs", "DocNotWrite", докБаза.ТекущийДокумент(), 2);
		КонецЕсли;
		Возврат 0;
	КонецПопытки;

	Если Выбран = 0 Тогда
		ЗаписьЖурналаРегистрации("", "Docs", "DocWriteNew", докБаза.ТекущийДокумент(), 2);
	Иначе
		ЗаписьЖурналаРегистрации("", "Docs", "DocWrite", докБаза.ТекущийДокумент(), 2);
	КонецЕсли;

	Если Сам.ПослеЗаписи() = 0 Тогда
		Возврат 0;
	КонецЕсли;

	Возврат 1;
КонецФункции	// Записать
///******************************** Павел  28.04.2011
 



ну и во всяких ТДокумент.<Вид> ПроверкаЗаполнения() выглядит примерно так:

Код
Выбрать все
///******************************** Павел  05.08.2011
Функция ПроверкаЗаполнения() Экспорт
	Сам = Сам(Контекст);

	Если Сам.ПолучитьБазовыйКласс().ПроверкаЗаполнения() <> 1 Тогда
		Возврат 0;
	КонецЕсли;

	//пошли проверки класса наследника

	Возврат 1;
КонецФункции	// ПроверкаЗаполнения
///******************************** Павел  05.08.2011
 

  
Наверх
 
IP записан
 
CaSH
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 02. Мая 2011
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #23 - 05. Октября 2011 :: 22:07
Печать  
Да без каког-то рабочего примера я такое сам не осилю  Смущённый Я со своим перехватчиком сколько намучился то, в каждом скачанном примере он по своему реализован и нигде не написано почему так а не этак.
  
Наверх
 
IP записан
 
maljaev
Senior Member
****
Отсутствует


Классический секс с 1С
надоел. Хочется изврата...

Сообщений: 405
Местоположение: Нижний Новгород
Зарегистрирован: 19. Октября 2006
Пол: Мужской
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #24 - 06. Октября 2011 :: 01:01
Печать  
А наследование системных классов документов и справочников не лучше будет, ну например как здесь описано: http://www.vsionaidu.ru/index.php?option=com_fireboard&Itemid=34&func=view&id=23...

CaSH, по ссылке рабочего примера нет, но фактически на пальцах человек объяснил, всё должно быть понятно - Метаданные.prm (описание классов) генерится при начале работы системы до загрузки 1CPP, а Документ.txt и Справочник.txt (реализация классов) ты сам создаешь по указанному пути, и пишешь в них ну хотя бы то что в примере указано.

P.S. Только я бы конечно Метаданные.prm не каждый раз генерил, а сначала проверял есть ли изменения в метаданных по сравнению с последним записанным описанием классов. А то так можно нарваться на коллизию совместного использования. И еще где-то здесь на форуме есть примеры по динамическому созданию классов "на лету" - оно пожалуй лучше и правильнее будет.
  
Наверх
 
IP записан
 
CaSH
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 02. Мая 2011
Re: Почему нельзя получить значение атрибута формы если Ид=Наименование?
Ответ #25 - 06. Октября 2011 :: 08:14
Печать  
Это уже лучше! Спасибки. А prm я так всегда и делал на лету, и только если есть изменения.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать