Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
28 фев 2024, 09:33

Подстановка значений справочник/регистр-документ

Автор federer1235, 14 мая 2023, 03:51

0 Пользователей и 1 гость просматривают эту тему.

federer1235

Добрый день! Возможно глупый, но вопрос от новичка. Вобщем я пишу конфигурацию для курсовой в 1С и столкнулся с проблемой: не могу подставить значения в табличную часть документа при выборе товара. Для лучшего понимания представляю краткую сводку по элементам конфигурации, которые имеют отношение к вопросу:

Есть 3 справочника, 1 регистр накоплений, 3 документа и одинаковые табличные части у этих документов:
1) Справочник "Номенклатура",
ключевые реквизиты:
  • ЕдиницыИзмерения - ссылка на справочник "ЕдиницыИзмерения"
  • СтавкаНДС - ссылка на справочник "СтавкаНДС"
Для товаров из справочника "Номенклатура" в карточке товара хранятся соответсвенно СтавкаНДС и ЕдиницыИзмерения, Цены же устанавливаются при помощи документа "УстановкаЦенНоменклатуры" и хранятся в регистре сведений "РегистрЦен"

2) Справочник "СтавкаНДС",
единственный реквизит (не считая стандартного "Наименование"):
  • Значение
3) Справочник "ЕдиницыИзмерения",
единственный стандартный реквизит:
  • Наименование

Все три справочника уже немного заполнены тестовыми данными: первый примерно 10 товарами, второй единственным элементом 20% (значение 20, наименование "20%"), третий 6 единицами измерений (кг, г, шт, упак, км, м)

Так вот, проблема у меня в том что есть еще 3 документа "ПриходнаяНакладная", "РасходнаяНакладная", "СписаниеОстатков", в каждом из которых присутсвует табличная часть с одинаковым названием "Товары" (полные реквизиты ниже указал) и мне нужно чтобы при добавлении новой строчки и выборе товара автоматически заполнялись стобцы "ЕдиницыИзмерения", "Цена", "СтавкаНДС", первые два уже записаны в карточке товаров, последний есть в "РегистрЦен". Писал и делал по разному, в основном через конструкторы запросов и ручками, но так и не вышло. 1С на код не ругается но при заполнении таблицы просто ничего не выводит (ошибок тоже не выдает).

реквизиты табличной части "Товары":
  • N
  • Наименование - ссылка на справочник "Номенклатура"
  • ЕдиницыИзмерения - ссылка на справочник "ЕдиницыИзмерения"
  • Количество
  • Цена - число (10, 2, неотрицательное)
  • СтавкаНДС - ссылка на справочник "СтавкаНДС"
  • СуммаНДС
  • Сумма

Единсвтенное что 1С часто выдавал, так это "Предупреждение" в конструкторе запросов:
Цитировать{(10,2)}: Неоднозначное поле "Номенклатура.Ссылка"
<<?>> Номенклатура.Ссылка = &Номенклатура

Мой наиболее успешный вариант написания приложен ниже:

&НаСервере
Функция ПолучитьИнформациюПоНоменклатуре(Номенклатура, Дата)

Результат = Новый Структура ("ЕдиницыИзмерения, Цена, СтавкаНДС");

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.СтавкаНДС КАК СтавкаНДС,
| Номенклатура.ЕдиницыИзмерения КАК ЕдиницыИзмерения,
| ЕСТЬNULL(РегистрЦеныСрезПоследних.Цена, 0) КАК Цена
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РегистрЦены.СрезПоследних(&Дата, Номенклатура = &Номенклатура) КАК РегистрЦеныСрезПоследних
| ПО Номенклатура.Ссылка = РегистрЦеныСрезПоследних.Цена
|ГДЕ
| Номенклатура.Ссылка = &Номенклатура";

Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);

РезультатЗапроса = Запрос.Выполнить();

Если НЕ РезультатЗапроса.Пустой() Тогда

Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();

ЗаполнитьЗначенияСвойств(Результат, Выборка);

КонецЕсли;

Возврат Результат;

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

&НаКлиенте
Процедура ЗаполнитьСтрокиТЧТовары(Элемент)

Инфо = ПолучитьИнформациюПоНоменклатуре(Объект.Товары, Объект.Дата);
Объект.Товары.ЕдиницыИзмерения = Инфо.ЕдиницыИзмерения;
Объект.Товары.Цена = Инфо.Цена;
Объект.Товары.СтавкаНДС = Инфо.СтавкаНДС;

Конецпроцедуры

Очень надесь на Ваш совет, заранее благодарю. Если для понимания проблемы нужны скриншоты или еще какие подробности - пожалуйста напишите

Максим75

federer1235, а что такое ЗаполнитьСтрокиТЧТовары?

Необходимо в событии ПриИзменении для Товара этот запрос вызывать. ну и дальше прописывать цены и т.д.

если форма управляемая, то ставкуНДС и единицуИзмерения можно прямо на форму вытащить из Товара и они сами будут заполняться. Не так давно была здесь такая тема, можно посмотреть, там писали как это сделать.

federer1235

Действительно, забыл поменять в свойствах таблицы строку "ПриИзменении". Теперь ругается на параметр? Может я неправильно условие выставил?
[/code]1cv8ct_PvH8iNdHxz.png

Обновленный код (изменил название функции):
&НаСервере
Функция ТоварыПриИзмененииНаСервере(Номенклатура, Дата)

Результат = Новый Структура ("ЕдиницыИзмерения, Цена, СтавкаНДС");

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.СтавкаНДС КАК СтавкаНДС,
| Номенклатура.ЕдиницыИзмерения КАК ЕдиницыИзмерения,
| ЕСТЬNULL(РегистрЦеныСрезПоследних.Цена, 0) КАК Цена
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РегистрЦены.СрезПоследних(&Дата, Номенклатура = &Номенклатура) КАК РегистрЦеныСрезПоследних
| ПО Номенклатура.Ссылка = РегистрЦеныСрезПоследних.Цена
|ГДЕ
| Номенклатура.Ссылка = &Номенклатура";

Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);

РезультатЗапроса = Запрос.Выполнить();

Если НЕ РезультатЗапроса.Пустой() Тогда

Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();

ЗаполнитьЗначенияСвойств(Результат, Выборка);

КонецЕсли;

Возврат Результат;

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

&НаКлиенте
Процедура ТоварыПриИзменении(Элемент)

Инфо = ТоварыПриИзмененииНаСервере(Объект.Товары, Объект.Дата);
Объект.Товары.ЕдиницыИзмерения = Инфо.ЕдиницыИзмерения;
Объект.Товары.Цена = Инфо.Цена;
Объект.Товары.СтавкаНДС = Инфо.СтавкаНДС;

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

Максим75

federer1235, Объект.Товары - это что? Очень похоже на табличную часть документа. А нужен сам товар.

Вот как-то так:
&НаКлиенте
Процедура ТоварыПриИзменении(Элемент)
   
    СтрокаТабличнойЧасти = Элементы.Товары.ТекущиеДанные;
    Инфо = ТоварыПриИзмененииНаСервере(СтрокаТабличнойЧасти.Товар, Элементы.Дата);
    СтрокаТабличнойЧасти .Товары.ЕдиницыИзмерения = Инфо.ЕдиницыИзмерения;
    СтрокаТабличнойЧасти .Товары.Цена = Инфо.Цена;
    СтрокаТабличнойЧасти .Товары.СтавкаНДС = Инфо.СтавкаНДС;
   
КонецПроцедуры

да и Объект зачем? Работаете на клиенте с формой, надо элементы формы изменять.

Максим75

federer1235, да и в запросе две номенклатуры - одна в условии по виртуальной таблице регистра сведений, вторая - Справочник.Номенклатура КАК Номенклатура (ну и дальше по всем выбранным реквизитам из этого справочника). Надо одну переименовать, чтобы не было конфликта.

federer1235

Объект.Товары - это действительно табличная часть документа, а сами товары в в реквезитах заведены как "Наименование", скрин реквизитов ниже приложил:
3.png
 
Вот собственно шапка в клиенте:
1.png

Теперь выдает такую ошибку, после того как я поменял код на тот, что Вы приложили ранее:
2.png

По поводу запроса, я Вас понял, Максим, Вечером как от дантиста вернусь переделаю, кажется понял нужно сделать. Большое Вам спасибо! Позднее сообщу о результатах моих потуг т-т
 

Максим75

federer1235, похоже Элементы.Дата не передается с клиента на сервер. Ошибся я. Надо оставить Объект.Дата

federer1235

Вобщем запрос поправил, действительно, почти все сработало: Ед.Изм. и СтавкаНДС сейчас подставляются автоматически. Я переименовал в регистре накоплений измерение "Номенклатура" на "НоменклатураРС". И вот теперь же получается что возникает еще 1 параметр? И я не совсем понимаю куда его вставить в функцию.

Вобщем кроме цены все подставляется

Код вот:

&НаСервере
Функция ТоварыПриИзмененииНаСервере(Номенклатура, НоменклатураРС, Дата)

Результат = Новый Структура ("ЕдиницыИзмерения, Цена, СтавкаНДС");

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.СтавкаНДС КАК СтавкаНДС,
| Номенклатура.ЕдиницыИзмерения КАК ЕдиницыИзмерения,
| ЕСТЬNULL(РегистрЦеныСрезПоследних.Цена, 0) КАК Цена
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РегистрЦены.СрезПоследних(&Дата, НоменклатураРС = &НоменклатураРС) КАК РегистрЦеныСрезПоследних
| ПО Номенклатура.Ссылка = РегистрЦеныСрезПоследних.Цена
|ГДЕ
| Номенклатура.Ссылка = &Номенклатура";

Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("НоменклатураРС", НоменклатураРС);

РезультатЗапроса = Запрос.Выполнить();
 
Если НЕ РезультатЗапроса.Пустой() Тогда

Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();

ЗаполнитьЗначенияСвойств(Результат, Выборка);

КонецЕсли;

Возврат Результат;

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

&НаКлиенте
Процедура ТоварыПриИзменении(Элемент)

СтрокаТЧ = Элементы.Товары.ТекущиеДанные;
    Инфо = ТоварыПриИзмененииНаСервере(СтрокаТЧ.Наименование, СтрокаТЧ.Цена, Объект.Дата);
    СтрокаТЧ.ЕдиницыИзмерения = Инфо.ЕдиницыИзмерения;
    СтрокаТЧ.Цена = Инфо.Цена;
    СтрокаТЧ.СтавкаНДС = Инфо.СтавкаНДС;

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


В клиенте выглядит вот так:
1cv8ct_Pv9wT85mWf.png

Только цена пустует
 

Максим75

federer1235, да нет, параметр то один. и в регистре и в справочнике - он один и тот же.

и не надо третий параметр при вызове функции.

Максим75

federer1235, да и что это за передача цены и связь товара с ценой?
конечно ничего не свяжет и цену не выведет.
понимание должно быть, что связь по товару, а цена возвращается.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск