Есть документ ЗаданиеВодителя. У этого документа есть табличная часть в которой хранятся ссылки на документ ЗаказКлиента. Мне надо в форме сделать программное создание кнопок того же количества, что и строк в табличной части.
П.С. заголовки кнопок тоже должны программно меняться и соответсвовать заказку клиента
Пока что я написал запрос к табличной части документа:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка, Водитель)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаданиеВодителя.Документы.(
| НомерСтроки КАК НомерСтроки
| ) КАК Документы
|ИЗ
| Документ.ЗаданиеВодителя КАК ЗаданиеВодителя
|ГДЕ
| НАЧАЛОПЕРИОДА(ЗаданиеВодителя .Дата, ДЕНЬ) = НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ)
| И ЗаданиеВодителя .Проведен = ИСТИНА
| И ЗаданиеВодителя .Водитель= &Водитель";
Запрос.УстановитьПараметр("Водитель", Водитель);
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
/////////////////////////////////////////
КонецЕсли;
КонецПроцедуры
Показать
Объясню всю ситуацию с самого начала. Есть обработка ОформлениеДвижения. На этой обработке при выборе водителя происходит проверка "Есть ли у водителя документ ЗаданиеВодителю", у которого есть табличная часть с заказами клиентов. Если такого документа нет, то просто выходит предупреждение. Если же документ есть, то должна открыться форма с кнопками. Кнопок должно быть столько же, сколько и документов в табличной части. При нажатии на определенную кнопку. Форма обработки ОформлениеДвижения заполняется данными из этого Заказа Клиента.
Но как мне поступать дальше идей нет. Может создать массив с этими ссылками или ещё как-то. Есть идеи как это можно сделать?
(3) Смотрите. Объясню всю ситуацию с самого начала. Есть обработка ОформлениеДвижения. На этой обработке при выборе водителя происходит проверка "Есть ли у водителя документ ЗаданиеВодителю", у которого есть табличная часть с заказами клиентов. Если такого документа нет, то просто выходит предупреждение. Если же документ есть, то должна открыться форма с кнопками. Кнопок должно быть столько же, сколько и документов в табличной части. При нажатии на определенную кнопку. Форма обработки ОформлениеДвижения заполняется данными из этого Заказа Клиента.
П.С. заголовки кнопок тоже должны программно меняться и соответсвовать заказку клиента
(5) А почему просто не вывести таблицу с заказами? Или это для мобильного приложения?
А так можете ознакомиться с моей публикацией https://infostart.ru/1c/articles/925455/ Там, в принципе, будет достаточно информации для реализации)
Вопросник показывает как в таблице хранить данные. Заполни таблицу запросов и начни тест
Кнопки выбора - как подгружать данные. тут вся номенклатура отрисовывается на форме в виде кнопок. тебе интересен 1 вариант, потому что 2 без общих модулей не работает
Подключаемый_Номенклатура_ВыбратьЭлемент - тут реализуй логику загрузки из заказа
Вам нужно будет создать команды (или команду) и кнопки.
Команда создаётся примерно так:
Команда = Команды.Добавить(
"ИмяМоейКоманды"); //Имя команды
Команда.Заголовок = "Заголовок моей команды";
Команда.Действие = "ИмяПроцедурыОбработчикаКоманды"; //Имя связанной процедуры
Кнопка создаётся так:
КнопкаФормы = Элементы.Добавить(
"ИмяМоейКнопки", //Имя кнопки
Тип("КнопкаФормы"), //Тип, всегда КнопкаФормы
Элементы.МатериалыКоманднаяПанель); // Место расположения кнопки, командная панель или группа
КнопкаФормы.ИмяКоманды = "ИмяМоейКоманды"; //Связь с командой по имени
КнопкаФормы.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
Вопрос: а как вы будете определять, какую строку нужно обрабатывать при нажатии на какую-либо кнопку? Если анализировать текущую строку в ТЧ, то и нужды в N кнопках нет, достаточно одной.
(4) Думал как-то это связать с именем кнопки. То есть понятное дело, что заголовок будет меняться. А имя кнопки задать просто числом, то есть допустим от 1 до 10. При этом у самих документов в табличной части есть уникальные номера. Их мне надо будет как-то связать друг с другом
(6) В имя кнопки добавляем порядковый номер (номер строки документа). Команду делать одну, указывать её во всех кнопках. В обработчике команды анализировать ЭтаФорма.ТекущийЭлемент().Заголовок. Из него определять имя кнопки - номер строки. Профит!
(8)
1) В запросе надо выбрать ссылки на заказы, поместить их в ТЗ.
2) ТЗ передать в параметре в открываемую форму.
3) В форме, ПриСозданииНаСервере пересчитать строки в этой ТЗ, создать кнопки. В имя кнопки добавить номер строки ТЗ.
4) При нажатии на кнопку определили её имя, получили номер строки. По номеру строки вытащили из ТЗ ссылку на документ.
5) По ссылке вытащили необходимые данные из документа, вывели их куда надо.
(9) Спасибо! А можно будет хоть чуток кода хотя бы в виде макета получить, чтобы полностью разобраться в этом. То есть макет кода из моего кейса? Я буду Вам очень и очень благодарен за это!
ТаблицаЗаказов = Запрос.Выполнить().Выгрузить(); // В результате запроса д.б. ссылки на заказы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ТаблицаЗаказов", ТаблицаЗаказов);
ОткрытьФорму("МояФормаСКнопочками",ПараметрыФормы_);
В форме МояФормаСКнопочками
Процедура ПриСозданииНаСервере()
Для н = 0 По Параметры.ТаблицаЗаказов.Количество() - 1 Цикл
КнопкаФормы = Элементы.Добавить(
"ИмяМоейКнопки" + н, //Имя кнопки
Тип("КнопкаФормы"), //Тип, всегда КнопкаФормы
Элементы.МатериалыКоманднаяПанель); // Место расположения кнопки, командная панель или группа
КнопкаФормы.ИмяКоманды = "ИмяМоейКоманды"; //Связь с командой по имени
КнопкаФормы.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
КонецЦикла;
Показать
Команду можно создать в дизайнере форм.
В обработчике команды
(15) Ну, если запрос в форме с кнопками, то и с передачей параметров огород городить не надо.
Что касается запроса: не вижу смысла выбирать номера строк табличной части. Надо выбирать ссылки на заказы.
(15) Запрос фигня, если честно. Получайте не номер строки, а ссылку на документы из этих строки. Запрос пишите к ТЧ, а не к документу. Затем храните уид на эти документы, допустим, в подсказке элемента и получайте ваши документы в команде по этой подсказке.
Работы на 5 минут, если навыки программирования есть. Если навыков нет - пишите задание на разработку, определяйте бюджет. Здесь всё за вас вряд ли напишут. А если напишут, то для вас пользы никакой) А если нет пользы, то можно и заплатить тогда, чтобы не засорять память лишней информацией
Учел ваши замечания. У меня в вызывающей форме есть процедура в которую из функции и возвращается ссылка на документ ЗаданиеВодителя, если оно есть. Там в этой процедуре следующий код:
Процедура ВодительПриИзменении(Элемент)
Если ЗначениеЗаполнено(Объект.Водитель) Тогда
Объект.ЗаданиеВодителя = ВодительПриИзмененииНаСервере(Объект.Водитель);
Если НЕ Объект.ЗаданиеВодителя.Пустая() Тогда
СтруктураПараметров = Новый Структура("СсылкаНаДокумент", Объект.ЗаданиеВодителя);
ОткрытьФормуМодально("Обработка.ОформлениеДвижения.Форма.ВыборДокументаЗаказКлиента", СтруктураПараметров, ЭтаФорма, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
Иначе
Предупреждение(НСтр("ru='Документов не обнаружено'"));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Показать
Эта процедура и перекидывает меня в процедуру в новой форме, в которой я написал следующий запрос:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ТипЗнч(Параметры) = Тип("Структура") Тогда
Если Параметры.Свойство("СсылкаНаДокумент") Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаданиеВодителяДокументы.Документ КАК Документ,
| ЗаданиеВодителяДокументы.Документ.Номер КАК Номер,
| ЗаданиеВодителяДокументы.Документ.Контрагент КАК Контрагент
|ИЗ
| Документ.ЗаданиеВодителя.Документы КАК ЗаданиеВодителяДокументы
|ГДЕ
| ЗаданиеВодителяДокументы.Ссылка = &ЗаданиеВодиеля";
Запрос.УстановитьПараметр("ЗаданиеВодителя", Параметры.СсылкаНаДокумент);
РезультатЗапроса = Запрос.Выполнить();
ТаблицаЗначений = РезультатЗапроса.Выгрузить();
Для каждого Строка Из ТаблицаЗначений Цикл
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Показать
П.С. ТаблицаЗначений это реквизит формы с колонками как в запросе. И контрагент в запросе есть, потому что в название кнопки будет использоваться. Теперь я собираюсь в
Для каждого Строка Из ТаблицаЗначений Цикл
КонецЦикла;
(18) Уже лучше) Теперь запомните, что лучше не делать в запросе получение полей через 2 точки - это всегда дополнительное время обработки запроса. Здесь ладно ещё не сложный запрос, но если будет составное поле, у вас запрос может надолго повиснуть) Это я про
| ЗаданиеВодителяДокументы.Документ.Номер КАК Номер,
| ЗаданиеВодителяДокументы.Документ.Контрагент КАК Контрагент
Дальше в цикле создавайте элементы, как описано выше. Но маленькое уточнение. Элемент.Имя - это имя в конфигураторе, Элемент.Заголовок - как отображается для пользователя. Можете поэкспериментировать)
Соответственно, если вы при создании как-нибудь запихнете уид документа в Элемент.Имя, то сможете потом его получить обратно))
Помещение в имя:
Элемент.Имя = Строка(Строка.Документ.УникальныйИдентификатор()); //Стоит учесть, что в таком виде может не дать поместить и, возможно, придётся добавить ещё какие-нибудь символы в начале
Получение документа по имени:
ДокументСсылка = Документы.ЗаказКлиента.ПолучитьСсылку(Новый УникальныйИдентификатор(//Здесь получаете ссылку из имени вашего элемента));
А теперь самое весёлое - как получить нажатый элемент. Скорее всего, вам придётся приходить группу ваших элементов и смотреть пометку. Но, скорее всего, пометка не будет стоять. Потому предлагаю вам создавать не только разные элементы, но и разные команды программно, а действие у них у всех будет одинаковое. Потому что команду можно отловить в процедуре нажатия, а элемент - нет
(19) Нажатый элемент я думал получать через имя кнопки. То есть как Вы уточнили выше имя кнопки - это имя в конфигураторе. Я задам кнопкам имена просто цифрами. Допустим 01, 02, 03, 04, 05, и тд.. А у самих строк есть номера. Их я как-то постараюсь связать друг с другом.
(24) Щас тоже попробую. Но я пока грамотно хочу создать кнопки. То есть команду я ещё не трогал. Щас с кнопками разбираюсь, с расположением, длиной, шириной и самое главное именем
(28)
В ячейке таблицы с видом гиперссылка вписывать некий текст, далее при нажатии по этому тексту определять что делать, с данными строки в которой выполнили нажатие.
На данный момент. Я сделал следующее:
1. Создал на форме вертикальную группу (ГруппаДокументов), в ней и будут храниться кнопки.
2. Создал на форме реквизит ТаблицаЗначений. С колонками, как в запросе. И типы им задал как в самом документе ЗаданиеВодителя.
3. Прописал запрос к табличной части ЗаданиеВодителя. Полученные данные загрузил в ТЗ. И через процедуру Для каждого решил перебрать данные и для каждой строки создать кнопку, но это все почему-то не работает. И отладчик не дает никакой инфы. Код :
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ТипЗнч(Параметры) = Тип("Структура") Тогда
Если Параметры.Свойство("СсылкаНаДокумент") Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаданиеВодителяДокументы.Документ КАК Документ,
| ЗаданиеВодителяДокументы.Документ.Номер КАК Номер,
| ЗаданиеВодителяДокументы.Документ.Контрагент КАК Контрагент
|ИЗ
| Документ.ЗаданиеВодителя.Документы КАК ЗаданиеВодителяДокументы
|ГДЕ
| ЗаданиеВодителяДокументы.Ссылка = &ЗаданиеВодителя";
Запрос.УстановитьПараметр("ЗаданиеВодителя", Параметры.СсылкаНаДокумент);
РезультатЗапроса = Запрос.Выполнить();
ТаблицаЗначений = РезультатЗапроса.Выгрузить();
Для каждого Строка Из ТаблицаЗначений Цикл
ЭлементГруппы = Элементы.ГруппаДокументов;
НоваяКнопка = Элементы.Добавить("Кн", Тип("КнопкаФормы"),ЭлементГруппы);
НоваяКнопка.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
НоваяКнопка.Высота = 3;
НоваяКнопка.РастягиватьПоГоризонтали = Истина;
НоваяКнопка.ИмяКоманды = "НажатиеКнопки";
//НоваяКнопка.Заголовок = Строка(Номер);
НоваяКнопка.Шрифт = ШрифтыСтиля.ОченьКрупныйШрифтТекста;
НоваяКнопка.Доступность = Истина;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Но все равно все это не работает. Думаю, что ошибка в само цикле создания кнопки, но так как через отладчик не могу проверить, что не так, не знаю, что сделать. И ошибку не выдает...