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

Проверка регистров сведений из ТЧ документа

Автор Изо_льда, 15 окт 2021, 09:46

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

Изо_льда

Здравствуйте. Версия 1С: Предприятие 8.3.

Никак не могу разобраться. Есть документ1. В данном документе есть табличная часть (называется "Перечень") с реквизитом Номенклатура (имеет тип СправочникСсылка.Номенклатура). Также есть Регистр сведений НоменклатураДопРеквизиты с измерениями Номенклатура, ДопРеквизит и ресурсом Значение.

Необходимо проверить дополнительный реквизит номенклатуры. То есть, если выбранная в ТЧ номенклатура не имеет ДопРеквизит равный "Код ТНВЭД", то открывать форму с выбором дополнительного реквизита для данной номенклатуры. Список всех дополнительных реквизитов содержится в Планах Видов Характеристик.

Делаю так, но жалуется сначала на переданную строчку, а потом на несоответствие типов (параметр 1).

&НаКлиенте
Процедура ПереченьПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
ТекущаяСтрока = Элементы.Перечень.ТекущиеДанные;
Признак = Проверка(ТекущаяСтрока.Номенклатура);
КонецПроцедуры

&НаСервере
Функция Проверка(ТекущаяСтрока)
Параметр = 10;
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ Номенклатура КАК Номенклатура
|ИЗ
| РегистрСведений.НоменклатураДопРеквизиты.СрезПоследних(, Значение = ""Код ТНВЭД"")";
ЗапросВыполнить = Запрос.Выполнить();

//Возврат Параметр;
КонецФункции

Я примерно представляю, что надо взять значение выбранной номенклатуры, сравнить её с колонкой Номенклатуры в Регистре сведений и посмотреть есть ли у неё дополнительный реквизит "Код ТНВЭД". Но не знаю, как это сделать.

LexaK

Изо_льда, попробуйте такой код, (только проверка и вывод сообщения, без ввода и сохранения)
отпишитесь, работает или нет.
&НаКлиенте
Процедура ПереченьПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
ТекущаяСтрока = Элементы.Перечень.ТекущиеДанные;
Если Не Проверка(ТекущаяСтрока.Номенклатура) Тогда
//нет Кода ТНВЭД, запращиваем
ПоказатьПредупреждение(,"Для товара: " + ТекущаяСтрока.Номенклатура + " не задан Код ТНВЭД!",20);
//здесь добавьте свой код по выбору и сохранению в допах нужного кода ТНВЭД
КонецЕсли;

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

&НаСервере
Функция Проверка(Номенклатура)

//Запрос - шаблон
лкЗапрос = Новый Запрос;
лкЗапрос.Текст = "
    |Выбрать Первые 1
| Рег.Значение
|ИЗ
| РегистрСведений.НоменклатураДопРеквизиты.СрезПоследних(, Номенклатура = &Номенклатура) Рег
|Где
|   Рег.ДопРеквизит.Наименование = ""Код ТНВЭД""
|";
лкЗапрос.УстановитьПараметр("Номенклатура",Номенклатура);

лкВыборка = лкЗапрос.Выполнить().Выбрать();
Если лкВыборка.Следующий() Тогда
Если лкВыборка.Значение <> Неопределено и ЗначениеЗаполнено(лкВыборка.Значение) Тогда
//есть значение ДопРеквизита
ЕстьЗначение = Истина;
Иначе
//ДопРеквизит - есть, а значение - пустое
ЕстьЗначение = Ложь;
КонецЕсли;
Иначе
//вообще нет ДопРеквизита - Код ТНВЭД
ЕстьЗначение = Ложь;
КонецЕсли;
//всю эту проверку выше, можно свернуть до одной команды, так сделано для наглядности

Возврат ЕстьЗначение;

КонецФункции
если помогло нажмите: Спасибо!

Изо_льда

LexaK, работает не совсем корректно. Открывает форму кодов ТНВЭД не зависимо есть у номенклатуры уже код или нет.

Изо_льда

Сейчас код выглядит так:
&НаКлиенте
Процедура ПереченьПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
ТекущаяСтрока = Элементы.Перечень.ТекущиеДанные;
Если ПустаяСтрока(Элементы.Перечень.ТекущиеДанные.Номенклатура) Тогда
ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаВыбора"),,,,,, Новый ОписаниеОповещенеия("ОбработкаСтрок", ЭтотОбъект), РежимОткрытияФормы.БлокироватьВесьИнтерфейс); //Тут проверяем если значение поля Номенклатура в ТЧ пустое, то открывается форма выбора номенклатуры
Иначе
 Если Не Проверка(ТекущаяСтрока.Номенклатура) Тогда
        //ПоказатьПредупреждение(,"Для товара: " + ТекущаяСтрока.Номенклатура + " не задан Код ТНВЭД!",20);
        ОткрытьФорму("ПланВидовХарактеристик.НоменклатураДопРеквизиты.ФормаВыбора"),,,,,, Новый ОписаниеОповещенеия("ОбработкаСтрок", ЭтотОбъект), РежимОткрытияФормы.БлокироватьВесьИнтерфейс);
    КонецЕсли;
КонецЕсли
КонецПроцедуры

&НаСервере
Функция Проверка(Номенклатура)
    //Запрос - шаблон
    лкЗапрос = Новый Запрос;
    лкЗапрос.Текст = "
        |Выбрать Первые 1
        |    Рег.Значение
        |ИЗ
        |    РегистрСведений.НоменклатураДопРеквизиты.СрезПоследних(, Номенклатура = &Номенклатура) Рег
        |Где
        |   Рег.ДопРеквизит.Наименование = ""Код ТНВЭД""
        |";
    лкЗапрос.УстановитьПараметр("Номенклатура",Номенклатура);
   
    лкВыборка = лкЗапрос.Выполнить().Выбрать();
    Если лкВыборка.Следующий() Тогда
        Если лкВыборка.Значение <> Неопределено и ЗначениеЗаполнено(лкВыборка.Значение) Тогда
            ЕстьЗначение = Истина;
        Иначе
            ЕстьЗначение = Ложь;
        КонецЕсли;
    Иначе 
        ЕстьЗначение = Ложь;
    КонецЕсли;     
    Возврат ЕстьЗначение;
КонецФункции


LexaK

Изо_льда, вам надо в консоли запросов проверить это запрос, возможно
    |Выбрать Первые 100
        |    Рег.*
        |ИЗ
        |    РегистрСведений.НоменклатураДопРеквизиты.СрезПоследних(, Номенклатура = &Номенклатура) Рег
        |Где
        |   Рег.ДопРеквизит.Наименование = ""Код ТНВЭД""


возможно вот это наименование задано не правильно - ""Код ТНВЭД""
точно ли в этом регистре лежат коды?
если помогло нажмите: Спасибо!

Изо_льда

LexaK, всё заработало.
Спасибо за ответ!

Изо_льда

Ещё вопрос такой.

После проверки обнаружили, что у номенклатуры нет доп.реквизита. Открывается форма выбора ПВХ для выбора значения. Сделала так:

&НаСервере
Процедура ОбработкаСтрок(Реквизит, Значение)
НаборЗаписей = РегистрыСведений.НоменклатураДопРеквизиты.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(Реквизит);
НаборЗаписей.Отбор.Период.Установить(ТекущаяДата());
НаборЗаписей.Отбор.ДопРеквизит.Установить(Значение);

НаборЗаписей.Записать();
КонецПроцедуры

Делала по примерам. Но оно не записывает доп.реквизит выбранной номенклатуре.

LexaK

Изо_льда,
ЦитироватьДелала по примерам. Но оно не записывает доп.реквизит выбранной номенклатуре.
какие-то плохие примеры у вас,
и всегда внимательно проверяйте наименования реквизитов и их Типы, иначе у вас ни чего ни когда работать не будет!

вот строка установки отбора по Номенклатуре
НаборЗаписей.Отбор.Номенклатура.Установить(Реквизит);
-- ДОЛЖНА устанавливаться ссылка на Номенклатуру!!! а вы что устанавливаете? Реквизит!  - это явно не Номенклатура!!!
наверно должно быть так (если эта обработка в форме с основным объектом Номенклатура)
НаборЗаписей.Отбор.Номенклатура.Установить(Объект.Ссылка); //наверно так, нет возможности проверить


а здесь надо что задать/установить - ?
НаборЗаписей.Отбор.ДополнительныйРеквизит.Установить(Значение);
-- Правильно! именно сам Реквизит! а вы что туда суете? -- Значение
скорее всего надо так
НаборЗаписей.Отбор.ДополнительныйРеквизит.Установить(Реквизит);

и это вы настроили только отборы, если его сразу просто записать, он затрет вам данные с таким-же отбором - если они были
а для того что бы добавить новые данные, так и необходимо добавить новую строчку с этими самыми данными!


в общем, примерно такой должен быть код

&НаСервере
Процедура ОбработкаСтрок(Реквизит, Значение)

лкПериод = ТекущаяДата();
НаборЗаписей = РегистрыСведений.НоменклатураДопРеквизиты.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(Объект.Ссылка);
НаборЗаписей.Отбор.Период.Установить(лкПериод);
НаборЗаписей.Отбор.ДополнительныйРеквизит.Установить(Реквизит);

лкНоваяЗапись = НаборЗаписей.Добавить();
лкНоваяЗапись.Период = лкПериод;
лкНоваяЗапись.Номенклатура = Объект.Ссылка;
лкНоваяЗапись.ДополнительныйРеквизит = Реквизит;
лкНоваяЗапись.Значение = Значение;

НаборЗаписей.Записать();

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



если помогло нажмите: Спасибо!

Изо_льда


Теги:

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

Рейтинг@Mail.ru

Поиск