• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Таблица значений (в реализация 7.7)

  • Автор темы lira89
  • Дата начала
L

lira89

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

vbs

колонки для ТЗ не определены
ТЗ.НоваяКолонка() и т.д.

Добавлено: для редактирования ТЗ надо в ее свойствах описать процедуру, которая будет анализировать колонку и обеспечивать ввод нового значения в нужную колонку и нужную строку
Вот тебе пример процедуры, описанной в закладке "дополнительно", которая заполняет данными нужную колонку ТЗ (Load)
Procedure WhenClick(Load)
CurLine = Load.CurrentLine();
if Load.CurrentLine() = 0 then
Return;
endif;

CurrentColumn = Load.CurrentColumn();
if CurrentColumn = "City" then
Prompt = "Введите город ";
Type = "Reference.Регион";

GD = Load.GetValue(CurLine,CurrentColumn);
if InputValue(GD,Prompt,Type) = 1 then
Load.SetValue(CurLine,CurrentColumn,GD);
endif;

Goto ~Exit;
elsif CurrentColumn = "Адрес" then
Prompt = "Введите Адрес "
elsif CurrentColumn = "КЛицо" then
Prompt = "Введите контактное лицо "
elsif CurrentColumn = "T" then
Prompt = "Введите телефон "
elsif CurrentColumn = "Time" then
Prompt = "Введите Время работы "
elsif CurrentColumn = "Cond" then
Prompt = "Введите Особые условия "
elsif CurrentColumn = "Custom" then
Prompt = "Введите Признак таможни ";
Type = "Enum.Boolean";
GD = Load.GetValue(CurLine,CurrentColumn);
if InputValue(GD,Prompt,Type) = 1 then
Load.SetValue(CurLine,CurrentColumn,GD);
endif;
Goto ~Exit;
elsif CurrentColumn = "GP" then
Prompt = "Введите грузополучателя ";
Type = "Reference.Грузополучатели";

GD = Load.GetValue(CurLine,CurrentColumn);
if InputValue(GD,Prompt,Type) = 1 then
Load.SetValue(CurLine,CurrentColumn,GD);
if EmptyValue(GD.Город) = 0 then
Load.City = GD.Город;
endif;
if EmptyValue(GD.Адрес) = 0 then
Load.Адрес = GD.Адрес;
endif;
endif;
Goto ~Exit;
endif;


GD = Load.GetValue(CurLine,CurrentColumn);
if InputString(GD,Prompt,60,,) = 1 then
Load.SetValue(CurLine,CurrentColumn,GD);
endif;
~Exit :
Load.CurrentLine(CurLine);
EndProcedure
//********************************************************************************
*******
 
L

lira89

Я колонки опеределила:
Код:
Процедура ПриОткрытии()
ТЗ.НоваяКолонка("УчебЗав","Справочник.УчебныеЗаведения",,,"Учебное заведение",30); 
ТЗ.НоваяКолонка("ТипУчебЗав","Справочник.ТипУчебЗаведения",,,"Тип учебного заведения",10); 
ТЗ.НоваяКолонка("ГодОкон","Число",4,0,"Год окончания",5); 
ТЗ.НоваяКолонка("Город","Справочник.ГородаРайоны",,,"Город",15); 
Заполнить();
КонецПроцедуры

Только при такой записис у меня вообще не открывается элемент справочника и пишет ошибку:
ТЗ = СоздатьОбъект("ТаблицаЗначений");
{Справочник.ФизическиеЛица.Форма.Модуль(13)}: Попытка присвоить значение недоступной для записи переменной (ТЗ)

А если убрать Заполнить() из процедуры ПриОткрытии(), то ТЗ на форме справочника С1 пустая (только на колонки разбитая) и не выводит данные из подчиненного справочника С2.
 
S

SeverBap

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

lira89

PS - в структуре ТЗ нужно добавить колонку "Элемент"
Извини, я не поняла что надо как сделать с структуре тЗ, это что просто прописать так?:
Код:
Процедура ПриОткрытии() 
ОчиститьОкноСообщений(); 
ТЗ.НоваяКолонка("УчебЗав","Справочник.УчебныеЗаведения",,,"Учебное заведение",30); 
ТЗ.НоваяКолонка("ТипУчебЗав","Справочник.ТипУчебЗаведения",,,"Тип учебного заведения",10); 
ТЗ.НоваяКолонка("ГодОкон","Число",4,0,"Год окончания",5); 
ТЗ.НоваяКолонка("Город","Справочник.ГородаРайоны",,,"Город",15);
ТЗ.НоваяКолонка("Элемент");
ТЗ.УдалитьСтроки();
ЗаполнитьТЗ();
КонецПроцедуры

Добавлено: И у меня все время выскакиват ошибка:

ТЗ = СоздатьОбъект("ТаблицаЗначений");
{Справочник.ФизическиеЛица.Форма.Модуль(12)}: Попытка присвоить значение недоступной для записи переменной (ТЗ)

при двойном счелчке на ТЗ в Предприятии выскакивает ошибка:

ОткрытьФормуМодально(ТЗ.ПолучитьЗначение(ТекСтрока,"Элемент"));
{Справочник.ФизическиеЛица.Форма.Модуль(28)}: Номер за пределами значения!

Я не могу ни открыть форму элемента справочника, а если убрать ЗаполнитьТЗ(); из процедуры ПриОткрытии(), то ТЗ пустая и при нажатии на кнопку Добавить тоже эта же ошибка.
 
A

Andruha

смотри в стандартных конфах - там это реализовано (справ. Номенклатура)
 
L

lira89

Делал я такое, в структуру ТаблицыЗначений добавить колонку (не видимую) Элемент (в ней будет хранится ссылка на элемент подчиненного справочника):
Еще вопросик, а где ты определил строку ТЗ = СоздатьОбъект("ТаблицаЗначений"); ???
 
T

TimeDontWait

Когда добавляеш таблицу значений на форму, прописываеш ее уникальный идентификатор, в данном случае - ТЗ
 
S

SeverBap

:) ;) может покажешь весь листинг???? Мы тебе и исправим ошибку!!! (выложи отдельным файлом ТХТ)
 
L

lira89

Ой, спасибо всем. Я уже все сделала) Вы мне очень помогли. :rolleyes:
 
L

lira89

Может если не трудно подскажите еще, как можно сделать так, чтобы пользователь не мог добавлять записи и редактировать уже существующие записи в справочнике, т.е. справочник служит только для просмотра?
Еще вопросик :blush: : есть Спр1 и Спр2, ни один из них не подчинен другому. В Спр2 есть реквизит "Рек" с типом Справочник.Спр1. Как можно вызвать форму элемента Спр1, соответсвующую выбранному реквизиту Рек , при нажатии на кнопку на форме Спр2. Как вывести саму форму я догадываюсь, а вот как правильно сослаться на Спр1 по реквизиту Рек и открыть именно нужную форму элемента не совсем представляю. Подскажите пожалуйста.

P.S.: извините за столько вопросов, но как же еще можно научиться практическим навыкам и применению языка, как если не спросить у знающих и имеющих опыт людей :rolleyes:
 
T

TimeDontWait

1) - см.приложение, а для запрета добавления используй процедуру
Код:
Процедура ВводНового()
Сообщить("Ввод нового элемента проводится документом");
СтатусВозврата(0);
КонецПроцедуры
;
2)
Код:
ОткрытьФорму(Рек)
 

Вложения

  • __.jpg
    427 КБ · Просмотры: 493
V

vbs

И можно еще наложить запрет на редактирование отдельных реквизитов справочника (с использованием ПолномочияПользователей, например)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!