Как ввести в переменную элемент из табличной части
Осваиваю работу с 1С стоит задача создать проверку на провод документа, чтобы программа проверяла наличие идентичной записи в регистре сведений по товару за сегодняшнюю дату. Но столкнулся с проблемой. Дело в том, что нужные мне реквизиты находятся в табличной части которая относится к документу "Приход_Товара". И если с реквизитом "Фирма_Поставщик" проблем не возникает, то как достать "Название" и "Количество" Относящиеся к табличной части ума не приложу.
Собственно сам псевдокод:
Собственно сам псевдокод:
Функция ТоварУжеПоступил(Наименование,Фирма,Период) // Значение свойств выставляется при испозовании ф-ции
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Перемещения_Товаров.Период КАК Период
|ИЗ
| РегистрСведений.Перемещения_Товаров КАК Перемещения_Товаров
|ГДЕ
| Перемещения_Товаров.Фирма = &Фирма
| И Перемещения_Товаров.Наименование = &Наименование
| И Перемешения_Товаров.Период = &Период
| И Перемещения_Товаров.Состояние = ЗНАЧЕНИЕ(Перечисление.Состояние.Поступление)";
Запрос.УстановитьПараметр("Наименование",Наименование); //значение параметров берется из свойств
Запрос.УстановитьПараметр("Фирма",Фирма);
Запрос.УстановитьПараметр("Период",Период);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Выборка.Следующий() Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
Процедура ОбработкаПроведения(Отказ, Режим)
Если ТоварУжеПоступил(, Фирма_Поставщик, ТекСтрокаПеречень_товаров.Количество) Тогда //Как выставить нужные параметры из документа Приход_Товара?
Сообщить("Документ не проведен! Данный товар уже был проведен сегодня другим документом");
Отказ = Истина;
Возврат;
КонецЕсли;
Движения.Перемещения_Товаров.Записывать = Истина;
Для Каждого ТекСтрокаПеречень_товаров Из Перечень_товаров Цикл
Движение = Движения.Перемещения_Товаров.Добавить();
Движение.Период = Дата;
Движение.Наименование = ТекСтрокаПеречень_товаров.Название;
Движение.Количество = ТекСтрокаПеречень_товаров.Количество;
Движение.Фирма = Фирма_Поставщик;
Движение.Состояние = Перечисления.Состояние.Поступление;
КонецЦикла;
КонецПроцедуры
ПоказатьПо теме из базы знаний
Найденные решения
Обсуждение закрыто я разобрался, что пытался бить всех пистолетом и стрелять из дубины. Мне нужны были немного другие переменные и сделать выгрузку запроса сравнивая по ней с циклом для каждого.
А задача стояла, в предотвращении провода одного и того же товара за 1 день, код делает проверку по наименованию фирме и дате, количество мне было не нужно.
Функция ТоварУжеПоступил(Наименование,Фирма,Период)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Перемещения_Товаров.Период КАК Период,
| Перемещения_Товаров.Фирма КАК Фирма,
| Перемещения_Товаров.Наименование КАК Наименование
|ИЗ
| РегистрСведений.Перемещения_Товаров КАК Перемещения_Товаров
|ГДЕ
| Перемещения_Товаров.Фирма = &Фирма
| И Перемещения_Товаров.Наименование = &Наименование
| И Перемещения_Товаров.Состояние = ЗНАЧЕНИЕ(Перечисление.Состояние.Поступление)";
Запрос.УстановитьПараметр("Наименование",Наименование);
Запрос.УстановитьПараметр("Фирма",Фирма);
Результат = Запрос.Выполнить();
Выгрузка = Результат.Выгрузить();
Для Каждого Строка из Выгрузка цикл
Если Строка.Наименование = Наименование и Строка.Период = Период Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Перемещения_Товаров.Записывать = Истина;
Движения.Перемещения_Товаров.Очистить();
Для Каждого Строка из Перечень_Товаров Цикл
Если ТоварУжеПоступил(Строка.Название,Фирма_Поставщик,Дата) Тогда
Сообщить("Документ не проведен! Товар "+Строка.Название+" в количестве "+Строка.Количество+" шт. Уже был проведен другим документом");
Отказ = Истина;
Возврат;
КонецЕсли;
Движение = Движения.Перемещения_Товаров.Добавить();
Движение.Период = Дата;
Движение.Наименование = Строка.Название;
Движение.Количество = Строка.Количество;
Движение.Фирма = Фирма_Поставщик;
Движение.Состояние = Перечисления.Состояние.Поступление;
КонецЦикла;
КонецПроцедуры
ПоказатьА задача стояла, в предотвращении провода одного и того же товара за 1 день, код делает проверку по наименованию фирме и дате, количество мне было не нужно.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
В переменную всё всегда "вводится" одинаково - присвоением.
как достать "Название" и "Количество" Относящиеся к табличной части
И как это относится к теме "Как ввести в переменную"? То есть заголовок про запись в переменную, а в сообщении вы уже пишете про чтение из каких-то других источников. Вы ЧТЕНИЕ и ЗАПИСЬ не различаете?
В переменную всё всегда "вводится" одинаково - присвоением.
Типо в зопросе:
Ну и если типо есть что в результате, то истина... Ну и в запрос можно табчасть передать в качестве параметра и дату...
ВЫБРАТЬ * ПОМЕСТИТЬ ВТТЧ ИЗ &ТабЧасть;
ВЫБРАТЬ * ИЗ Регистр.Тратата КАК Т1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТТЧ КАК Т2
ПО Т1.Номенклатура = Т2.Номенклатура И Т1.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата, ДЕНЬ)
Ну и если типо есть что в результате, то истина... Ну и в запрос можно табчасть передать в качестве параметра и дату...
Обсуждение закрыто я разобрался, что пытался бить всех пистолетом и стрелять из дубины. Мне нужны были немного другие переменные и сделать выгрузку запроса сравнивая по ней с циклом для каждого.
А задача стояла, в предотвращении провода одного и того же товара за 1 день, код делает проверку по наименованию фирме и дате, количество мне было не нужно.
Функция ТоварУжеПоступил(Наименование,Фирма,Период)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Перемещения_Товаров.Период КАК Период,
| Перемещения_Товаров.Фирма КАК Фирма,
| Перемещения_Товаров.Наименование КАК Наименование
|ИЗ
| РегистрСведений.Перемещения_Товаров КАК Перемещения_Товаров
|ГДЕ
| Перемещения_Товаров.Фирма = &Фирма
| И Перемещения_Товаров.Наименование = &Наименование
| И Перемещения_Товаров.Состояние = ЗНАЧЕНИЕ(Перечисление.Состояние.Поступление)";
Запрос.УстановитьПараметр("Наименование",Наименование);
Запрос.УстановитьПараметр("Фирма",Фирма);
Результат = Запрос.Выполнить();
Выгрузка = Результат.Выгрузить();
Для Каждого Строка из Выгрузка цикл
Если Строка.Наименование = Наименование и Строка.Период = Период Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Перемещения_Товаров.Записывать = Истина;
Движения.Перемещения_Товаров.Очистить();
Для Каждого Строка из Перечень_Товаров Цикл
Если ТоварУжеПоступил(Строка.Название,Фирма_Поставщик,Дата) Тогда
Сообщить("Документ не проведен! Товар "+Строка.Название+" в количестве "+Строка.Количество+" шт. Уже был проведен другим документом");
Отказ = Истина;
Возврат;
КонецЕсли;
Движение = Движения.Перемещения_Товаров.Добавить();
Движение.Период = Дата;
Движение.Наименование = Строка.Название;
Движение.Количество = Строка.Количество;
Движение.Фирма = Фирма_Поставщик;
Движение.Состояние = Перечисления.Состояние.Поступление;
КонецЦикла;
КонецПроцедуры
ПоказатьА задача стояла, в предотвращении провода одного и того же товара за 1 день, код делает проверку по наименованию фирме и дате, количество мне было не нужно.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот