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

Расходная накладная. Автозаполнение.

Автор Алексей Корольков, 18 мая 2022, 23:21

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

Алексей Корольков

Здравия.
Мой вопрос явно новичка. Просьба отнестись к нему снисходительно. Впрочем это даже тестовое задание ответ на который явно уже где то был, а я не смог найти.

Расходная накладная имеет три реквизита:
- товар/услуга
- количество
- цена

При выборе товара остаток должен переносится в табличную часть документа, но не списываться (понимаю что нужно выбрать максимум по складу, а как вписать не понимаю), цена должна рассчитываться как средняя по всем складам (тут просто группировка по товару и средняя цена из ДокументТовары), а далее очень интересное задание и сходу даже не знаю как решить.
Клиенту нужно как то разрешить вводить свою цену за товар и при этом в документе сразу после ввода (не проведении документа) должна автоматически меняться сумма.
Но это ещё не всё.
В Список.ТоварУслуга должно лежать всё вместе и товары и услуги, а разделить их можно только через булевую колонку. Но это не проблема.
Проблема возникает когда тот же склад решает оказать услугу. То есть по умолчанию это единица, а количество бесконечность. И как теперь вести учёт оказания услуг и продажу товаров, что бы в одной колонке были только товары этого склада, а во второй только услуги (вместе, к сожалению,запрещено)? Оптимальный вариант наверное через объединение двух виртуальных таблиц по одному складу, но объединение это медленно и не продуктивно. Есть ли более простое решение?

Спасибо за любую помощь.


alexandr_ll

Алексей Корольков,
Количество определять по регистру накопления запросом
Цену определять как отношение суммового остатка по регистру к количественному.
В документе не указан реквизит "Сумма". Пересчет суммы при изменении цены или количества - стандартная процедура "ПриИзменении".
По услугам вопрос непонятный. В документе две колонки Товары/услуга или одна? Что значит
ЦитироватьТо есть по умолчанию это единица, а количество бесконечность.
Вероятно, у товара есть реквизит "Услуга", по нему и сравнивайте.

Алексей Корольков

Ещё мучаюсь с автозаполнением.
Написал функцию
Но она ничего не возвращает. Для начала написал только для цены, но после провала, дописал для всего остального. Каждый раз возвращает NULL.
Функция СредняяЦенаПоСкладам(ЭлементНоменклатурыУслуг) Экспорт

//Создаём запрос с отбором по параметрам ЭлементНоменклатурыУслуг

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

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

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

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

Цена = ВыборкаДетальныеЗаписи.Цена; 
Сообщить(Цена);

Возврат Цена;

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

Что не так делаю ?

Алексей Корольков

База на всякий случай, если будет не лень)

Алексей Корольков

Пока ещё такой руко... разработчик из меня просто слов нету. Столько думать!!!!

Забыл всего пару строчек кода

Функция СредняяЦенаПоСкладам(ЭлементНоменклатурыУслуг) Экспорт

Цена = 0;

//Создаём запрос с отбором по параметрам ЭлементНоменклатурыУслуг

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

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

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

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

Если  ВыборкаДетальныеЗаписи.Следующий() Тогда

Цена = ВыборкаДетальныеЗаписи.Цена;

КонецЕсли;


Возврат Цена;

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


Алексей Корольков

Новая ошибка в коде

Процедура ТоварИУслугаТоварИлиУслугаПриИзменении(Элемент)

//Получить следующую строку табличной части

СтрокаТабличнойЧасти=Элементы.ТоварИУслуга.ТекущиеДанные;
Склад = Элементы.Склад.ТекстРедактирования ;
Количество = 1;//Тут ошибка где именно не понимаю:  Количество = ОбщиеФункции.ПроверкаКоличестваНаСкладе(СтрокаТабличнойЧасти.ТоварИлиУслуга, Склад);
Цена = ОбщиеФункции.СредняяЦенаПоСкладам(СтрокаТабличнойЧасти.ТоварИлиУслуга);

//Установить цену если это услуга

Если НЕ ОбщиеФункции.ЭтоТовар(СтрокаТабличнойЧасти.ТоварИлиУслуга) Тогда
СтрокаТабличнойЧасти.Количество = 1;
СтрокаТабличнойЧасти.СуммаНоменклатуры = Цена;
Иначе  //иначе проверка на 0
Если Количество = 0 тогда;
Сообщить("На складе нет товара: ", СтрокаТабличнойЧасти.ТоварИлиУслуга);
СтрокаТабличнойЧасти.СуммаНоменклатуры = 0;
СтрокаТабличнойЧасти.Цена = 0;
СтрокаТабличнойЧасти.Количество = 0;
Иначе // если всё хорошо и прошли исключения
СтрокаТабличнойЧасти.СуммаНоменклатуры = Количество * Цена;
КонецЕсли;
КонецЕсли;



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


Суть задумки чтобы автоматически рассчитать цену и сумму по количеству товаров на складе. Не получилось
При вызове элемента  "Элементы.Склад" получаю текст "Поле ввода". При вызове элемента "Элементы.Склад.ТекстРедактирования" получаю значение вводимого текста, но только этот элемент никак не совпадает с названием Склада , хоть значения и идентичны.

Чё не так то ?

 

nvj84

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

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

Что касается склада
//Склад = Элементы.Склад.ТекстРедактирования;
Склад = Объект.Склад;
И заменить запятую плюсом
//Сообщить("На складе нет товара: ", СтрокаТабличнойЧасти.ТоварИлиУслуга);
Сообщить("На складе нет товара: " + СтрокаТабличнойЧасти.ТоварИлиУслуга);

PS Не старайтесь сразу что то кодить больше времени продумывайте (все равно потом 90 процентов написанного переделывать).

Алексей Корольков

nvj84, Огромное спасибо . Я ещё не проснулся окончательно, что бы осознать всю красоту сегодняшнего утра с этими Вашими поправками. Но, чувствую, с этим новым кодом стал на планку выше.

Задания придумал не сам, для этого есть специально обученные работодатели при приёме на работу.
Задание должен был сдать вчера.

Не справился с автозаполнением. Накосячил в модуле РасходнойНакладной . Проверять времени не было, но, надеюсь, что  с заданием списания копеек и проверкой на наличие именно товара на складе справляется.

Надо было ещё Отчёт нормально написать.

Ну и потом для уровня Бога к этим двум документам дописать ещё три Документища. Два других возврат: возврат от клиента и от склада поставщику с проверкой количества полученного ранее товара + один махенький обмен между складами со списанием услуг по транспортировке услуг на цену товара. И тут большой вопрос как это правильно далать: по количеству или всё же по сумме товаров ? При этом Цену товаров менять нельзя для отчёта по переданной стоимости.
И тут возникает большой вопрос почему в документах не указана цена с НДС. И как только добавляется новый параметр, во все документы, слетает вся база.

Ба-бах.   

nvj84

Надо почитать Чистова новую методику проведения документов.

Теги:

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

Рейтинг@Mail.ru Rambler's Top100

Поиск