Люди добрые, подскажите пожалуйста как заполнить табличную часть документа из справочника. У меня есть справочник Блюда с табличной частью Ингредиенты. И есть документ Заказ с табличной частью Перечень блюд. Хочу чтобы в документе в табличной части при выборе какого-либо блюда из справочника Блюда заполнялась табличная часть в документ.
Вот уже что-то начала, но оно не работает.
&НаСервере
Процедура ЗаполнитьПоляНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| БлюдаИнгредиенты.Ссылка.Наименование КАК Блюдо,
| БлюдаИнгредиенты.Игредиент.Наименование КАК Ингредиенты,
| БлюдаИнгредиенты.Количество КАК КоличествоИнгредиентов,
| БлюдаИнгредиенты.ЕдиницаИзмерения
|ИЗ
| Справочник.Блюда.Ингредиенты КАК БлюдаИнгредиенты
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Заказ.ПереченьБлюд КАК ЗаказПереченьБлюд
| ПО БлюдаИнгредиенты.Ссылка.Наименование = ЗаказПереченьБлюд.Блюдо
|ГДЕ
| БлюдаИнгредиенты.Ссылка.Наименование = ЗаказПереченьБлюд.Блюдо.Наименование";
Объект.ПереченьБлюд.Загрузить( Запрос.Выполнить().Выгрузить());
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПоля(Команда)
ЗаполнитьПоляНаСервере();
КонецПроцедуры
Светлана0000 @ Вчера, 19:31
,
Основная ваша ошибка в том, что вы выбираете наименования в запросах, а не ссылки. Я почти уверен что типы ваших реквизитов это ссылки на справочники, а не строковые выражения - как минимум из-за этого поля могут не заполняться. Во-вторых, тут в запросе не нужно внутреннее соединение с таб. частью заказов - тут опять же нет указания с каким именно документом вы связываетесь, оно возьмет абсолютно все заказы, достаточно как в моем примере просто параметром указать ссылку на Блюдо. Надеюсь разницу между ссылкой и строкой вы понимаете, если нет - то сначала прочитайте хоть какую-то книгу по 1С, даже того же Радченко: Пособие разработчика.
&НаСервере
Процедура ЗаполнитьПоляНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| БлюдаИнгредиенты.Ссылка КАК Блюдо,
| БлюдаИнгредиенты.Игредиент КАК Ингредиент,
| БлюдаИнгредиенты.Количество КАК КоличествоИнгредиентов,
| БлюдаИнгредиенты.ЕдиницаИзмерения
|ИЗ
| Справочник.Блюда.Ингредиенты КАК БлюдаИнгредиенты
|ГДЕ
| БлюдаИнгредиенты.Ссылка = &Блюдо";
Запрос.УстановитьПараметр("Блюдо", Объект.Блюдо); // Объект.Блюдо - это ваш реквизит Блюдо из Заказа
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.ПереченьБлюд.Добавить();
// если у вас в табличной части Заказа типы ингридиентов не строки, и имена реквизитов совпадают с тем, что у вас в запросе тогда так:
ЗаполнитьЗначенияСвойство(НоваяСтрока, Выборка);
// или если имена реквизитов не совпадают тогда так:
НоваяСтрока.ИмяВашегоИнгридиента = Выборка.Ингридиент;
НоваяСтрока.КоличествоВашегоИнгридиента = Выборка.КоличествоИнгредиентов;
// и т.д.
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПоля(Команда)
ЗаполнитьПоляНаСервере();
КонецПроцедуры
Bernet @ Сегодня, 8:20
,
Спасибо большое, все заработало, а вот как сделать теперь кнопку, чтобы при нажатии можно было добавить еще одно блюдо и также заполнить табличную часть ингредиенты?
Немного не понял что вы хотите. Если нужна возможность указывать несколько блюд, то сделайте просто таб. часть "Блюда"
logist @ Сегодня, 15:57
,
ну у меня ещё был вариант, что это самописная конфигурация...) то что человек совсем не программировал это я понял, потому и посоветовал начать хотябы с Радченко
Да вы правы, я первый раз создаю конфигурацию, и многое не получается. Сначала я думала сделать ТЧ где будет написано Блюдо и из каких ингредиентов оно состоит, но у меня не получилось обратиться к Блюду как к объекту. И поэтому я сделала отдельно выбор блюда и ТЧ ингредиенты. Но необходимо, чтобы был выбор нескольких блюд. И я думала может сделать кнопку, которая будет добавлять реквизиты Блюда и ТЧ Ингредиенты. Но я не уверена что так вообще можно. Я буду вам очень благодарна если вы мне подскажите как лучше сделать.
Начнем с того, что динамически реквизиты добавить не получится. Точнее элементы на форму можно а именно "реквизиты объекта" не получится - они определяются в конфигураторе в дереве метаданных. То что вы хотите сделать усложнит вам жизнь. Можно конечно где-то хранить эти реквизиты, и каждый раз динамически создавать их на форме, но я считаю в рамках данной задачи это излишнее.
Вам достаточно просто сделать таб. часть с блюдами и все. Обращаться к таб части можно через Объект.ИмяВашейТабЧасти
Строки можно получать и обходить в цикле. или обращаться по индексу при необходимости
Bernet @ Вчера, 23:40
,
Скажите, а как мне тогда в том первом запросе установить параметр и условие, ссылаясь не на
объект.Блюдо
, а на табличную часть с полем Блюдо?Объект.ТЧ
, а дальше нельзя выбрать мое поле, только через Элементы.ТЧ.Поле
. Но через элементы не работает,а как получить объект я не могу понять.
logist @ Вчера, 23:36
,
Да, наверно я на умняк упал. Сори. Попробую проще объяснить.
Светлана0000 @ Вчера, 23:56
,
Допустим у вас есть:
1) Таб. часть "Блюда" с колонкой "Блюдо" (Тип Справочник "Блюда")
2) Таб. часть "Перечень блюд" с колонками: "Блюдо" (Справочник "Блюда"), "Ингридиент" (Справочник "Ингридиенты"), "КоличествоИнгридиентов" (Число)
3) Добавьте в командную панель таб. части "Ингридиенты" кнопку "Заполнить по блюдам". В Обработчике этой кнопки пишем следущее:
&НаКлиенте
Процедура ЗаполнитьПереченьБлюд(Команда)
ЗаполнитьИнгридиентыПоБлюдамНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьИнгридиентыПоБлюдамНаСервере()
Запрос = Новый Запрос;
Запрос.Текст = ""ВЫБРАТЬ РАЗРЕШЕННЫЕ
| БлюдаИнгредиенты.Ссылка КАК Блюдо,
| БлюдаИнгредиенты.Игредиент КАК Ингредиент,
| БлюдаИнгредиенты.Количество КАК КоличествоИнгредиентов,
| БлюдаИнгредиенты.ЕдиницаИзмерения
|ИЗ
| Справочник.Блюда.Ингредиенты КАК БлюдаИнгредиенты
|ГДЕ
| БлюдаИнгредиенты.Ссылка В (&МассивБлюд)";
Запрос.УстановитьПараметр("МассивБлюд", Объект.Блюда.ВыгрузитьКолонку("Блюдо"));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.ПереченьБлюд.Добавить();
ЗаполнитьЗначенияСвойство(НоваяСтрока, Выборка);
КонецЦикла;
КонецПроцедуры
Bernet @ Сегодня, 1:26
,
Не получается. Выдает вот такую ошибку.
{Документ.Заказ.Форма.ФормаДокумента.Форма(18)}: Ошибка при вызове метода контекста (Выполнить)
Выборка = Запрос.Выполнить().Выбрать();
по причине:
{(8, 26)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.
БлюдаИнгредиенты.Ссылка <<?>>= &МассивБлюд
logist @ Сегодня, 17:51
,
Спасибо огромное все заработало,но у меня возник другой вопрос. Когда я заполняю ингредиенты,мне нужно чтобы поле количество ингредиентов умножалось на количество порций,я не знаю как правильно обратиться. Вот я пишу
НоваяСтрока.КоличествоИнгредиентов = Выборка.КоличествоИнгредиентов * Объект.ПереченьБлюд.Выгрузить(,"КоличествоПорций");
У колонки "КоличествоПорций" и "КоличествоИнгредиентов " добавьте событие "ПриИзменении", в нем напишите такой код:
ТекущиеДанные = Элементы.ПереченьБлюд.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущиеДанные.КоличествоИнгредиентов = ТекущиеДанные.КоличествоИнгредиентов * ТекущиеДанные.КоличествоПорций;
Bernet @ Сегодня, 21:58
,
А если у меня в разных они таблицах? Я сделала вкладки и в одной таблица ПереченьБлюд, а в другой ПереченьИнгредиентов
logist @ Сегодня, 1:32
,
Просто у меня с реквизитами всё работает, а вот с ТЧ не получается.
Выложите конфигурацию http://pro1c.org.ua/redirect.php?http://dropmefiles.com/
И скажите как вы хотите чтобы работало, тогда перестанем тыкать пальцем в небо
Я вам в личные сообщения отправила
Скинул ссылку на конфу в личку
Не могу понять почему не работает, хочу сделать чтобы при создании блюда в ТЧ Ингредиенты в поле ЕдиницаИзмерения заполнялось из справочника Ингредиенты реквизита ЕдиницаИзмерения, то значение которое выбрала для определенного ингредиента (т.е если мука, то чтобы везде при выборе муки были кг)
&НаСервере
Процедура ИнгредиентыИгредиентПриИзмененииНаСервере()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Ингредиенты.Наименование,
| Ингредиенты.ЕдиницаИзмерения,
| БлюдаИнгредиенты.Ингредиент КАК Ингредиент
|ИЗ
| Справочник.Блюда.Ингредиенты КАК БлюдаИнгредиенты
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Ингредиенты КАК Ингредиенты
| ПО БлюдаИнгредиенты.Ингредиент = Ингредиенты.Ссылка
|ГДЕ
| БлюдаИнгредиенты.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.Ингредиенты.Добавить();
НоваяСтрока.ЕдиницаИзмерения = Выборка.ЕдиницаИзмерения;
КонецЦикла;
КонецПроцедуры
logist @ Сегодня, 13:57
,
Я создаю ингредиент Мука и ставлю единицу измерения килограммы, затем при создании блюда я выбираю в ТЧ ингредиент мука и хочу чтобы единица измерения заполнялась автоматически кг.
Это вроде тоже самое что мне нужно было и до этого с заполнением Ингредиентов, но мне кажется я не установила какой-то параметр.
logist @ Сегодня, 20:07
,
Да,я пока плохо умею объяснять, но я ведь только учусь. А Bernet мне действительно очень сильно помог,не знаю чтобы я бы делала если не Bernet. Попробую еще раз объяснить.
У меня есть справочник Ингредиенты (в нем реквизит ЕдиницаИзмерения с типом ПеречислениеСсылка). Также у меня есть справочник Блюда с ТЧ Ингредиенты (с полями Ингредиент,Количество и ЕдиницаИзмерения с типом ПеречислениеСсылка). Вот и я хочу чтобы когда я заполняю Блюда в ТЧ в поле ЕдиницаИзмерения заполнялись данные из справочника Ингредиенты (реквизит ЕдиницаИзмерения). Для этого пишу в обработчик ИнгредиентыИгредиентПриИзменении вот такой код
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Ингредиенты.Наименование,
| Ингредиенты.ЕдиницаИзмерения,
| БлюдаИнгредиенты.Ингредиент КАК Ингредиент
|ИЗ
| Справочник.Блюда.Ингредиенты КАК БлюдаИнгредиенты
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Ингредиенты КАК Ингредиенты
| ПО БлюдаИнгредиенты.Ингредиент = Ингредиенты.Ссылка
|ГДЕ
| БлюдаИнгредиенты.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.Ингредиенты.Добавить();
НоваяСтрока.ЕдиницаИзмерения = Выборка.ЕдиницаИзмерения;
КонецЦикла;
НоваяСтрока.ЕдиницаИзмерения
тип ПеречислениеСсылка
Светлана0000 @ Вчера, 21:01
,
Добавьте событие "ПриИзменении" для колонки "Ингредиент" справочника "Блюда" и пропишите такой код:
&НаКлиенте
Процедура ИнгредиентыИгредиентПриИзменении(Элемент)
ТекущиеДанные = Элементы.Ингредиенты.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущиеДанные.ЕдиницаИзмерения = ПолучитьЕдиницуИзмеренияИнгридиентаНаСервере(ТекущиеДанные.Ингредиент);
КонецПроцедуры
&НаСервере
функция ПолучитьЕдиницуИзмеренияИнгридиентаНаСервере(Ингредиент)
Если НЕ ЗначениеЗаполнено(Ингредиент) Тогда
Возврат Перечисления.ЕдиницаИзмерения.ПустаяСсылка();
Иначе
Возврат Ингредиент.ЕдиницаИзмерения;
КонецЕсли;
КонецФункции
Bernet @ Сегодня, 10:23
,
Спасибо большое, я вот только не пойму почему когда я запустила первый раз все работало, а сейчас перестало, я только хотела поменять как вы сказали на справочник, но потом передумала и поставила все обратно, но почему-то теперь не работает. И где кнопка заполнение ингредиентов Единица измерения тоже не заполняется. Когда тип меняешь, а потом ставишь обратно, оно не должно разве работать опять?
Светлана0000 @ Сегодня, 15:44
,
Проверьте типы реквизитов и их привязку с элементами на форме, при изменении типа реквизита путь к данным может очищаться. Откройте форму, откройте свойства поля на форме и посмотрите есть ли привязка к вашему реквизиту (поле "ПутьКДанным") - если нету - проставьте
Bernet @ Сегодня, 16:51
,
ПутьКДанным везде проставлен и типы реквизитов везде ПеречислениеСсылка стоит, всё равно не работает
Везде проставлии одинаковый тип? И в Блюдах и в Ингредиентах?
P.S. Если изменили на Справочник, тогда в коде
&НаСервере
функция ПолучитьЕдиницуИзмеренияИнгридиентаНаСервере(Ингредиент)
Если НЕ ЗначениеЗаполнено(Ингредиент) Тогда
Возврат Справочники.ЕдиницаИзмерения.ПустаяСсылка();
Иначе
Возврат Ингредиент.ЕдиницаИзмерения;
КонецЕсли;
КонецФункции
Bernet @ Сегодня, 17:01
,
Ну да, а что не надо было?
Bernet @ Сегодня, 17:01
,
Нет я перечисления оставила.Поэтому и не пойму почему не работает.
Должно работать, хз.
При смене типа реквизиты очищаются ещё... т.е. надо заново проставить единицы измерения у ингредиентов...
Bernet @ Сегодня, 17:08
,
Да все заработало,спасибо вам огромное))))
logist @ Сегодня, 0:13
,
Согласен, в данном контексте нулевая, можно было обойтись без этих трех строчек. Просто привычка ставить проверки чтобы не наткнуться на "Поле объекта не обнаружено"....
тут можно было их не писать, я просто спешил ответить
Светлана0000 @ Сегодня, 13:53
,
У меня есть документ Заказ, в нем две вкладки ТЧ Блюда и ТЧ Ингредиенты, сначала я заполняю блюда( наименование, кол-во порций и т.д), далее нажимаю на кнопку заполнить ингредиенты и во вкладке Ингредиенты с учетом порций заполняются ингредиенты, далее перед проведением проходит проверка на наличие этих ингредиентов на складе, и если не хватает то выводится сообщение что такого-то ингредиента не хватает. А как мне сделать чтобы выводилось еще и блюдо в какое входит этот ингредиент???? Скорее всего это нужно что-то в запросе изменить, но у меня не получается. Помогите пожалуйста.
i | Не надо увеличивать размер шрифта без надобности |
Процедура ОбработкаПроведения(Отказ, Режим)
// проверяем остатки
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Ингредиенты.Ингредиент КАК Ингредиент,
| СУММА(Ингредиенты.КоличествоИнгредиентов) КАК КоличествоИнгредиентов
|ПОМЕСТИТЬ ВтИнгридиенты
|ИЗ
| Документ.Заказ.ПереченьИнгредиентов КАК Ингредиенты
|ГДЕ
| Ингредиенты.Ссылка = &ТекущийДокумент
|СГРУППИРОВАТЬ ПО
| Ингредиенты.Ингредиент
|;
|///////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ВтИнгридиенты.Ингредиент КАК Товар,
| ВтИнгридиенты.КоличествоИнгредиентов КАК Количество,
| ЕСТЬNULL(ОстаткиТоваров.КоличествоОстаток, 0) КАК КоличествоОстаток
|ИЗ
| ВтИнгридиенты КАК ВтИнгридиенты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(&Период, Товар В (ВЫБРАТЬ ВтИнгридиенты.Ингредиент ИЗ ВтИнгридиенты КАК ВтИнгридиенты )) КАК ОстаткиТоваров
| ПО ВтИнгридиенты.Ингредиент = ОстаткиТоваров.Товар
|";
Запрос.УстановитьПараметр("Период", Дата);
Запрос.УстановитьПараметр("ТекущийДокумент", Ссылка);
Движения.ОстаткиТоваров.Записывать = Истина;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Количество > Выборка.КоличествоОстаток Тогда
Сообщить("Недостаточно товара - "+Выборка.Товар+", необходимо - "+Выборка.Количество+", в наличии - "+Выборка.КоличествоОстаток );
Отказ = Истина;
Продолжить;
КонецЕсли;
Движение = Движения.ОстаткиТоваров.ДобавитьРасход();
ЗаполнитьЗначенияСвойств(Движение, Выборка);
Движение.Период = Дата;
Движение.Регистратор = Ссылка;
КонецЦикла;
КонецПроцедуры
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua