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

1С 8.3: Контроль остатков без регистра накопления

Автор ivangrant, 15 фев 2019, 08:55

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

ivangrant

Цитата: LexaK от 19 фев 2019, 10:08
ЦитироватьПонимаю, что для человека с опытом - эта задачка нетривиальная.
ну насмешили, не смог удержаться, отвечаю: - Как раз для программиста с опытом это самая тривиальная задача, один запрос, даже без временных таблиц, всего строчек 20, ну это как 2 + 2
Добавлено: 19 фев 2019, 10:27


вот пример, (не проверял, возможны синтаксические ошибки)

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

Добавлено: 19 фев 2019, 10:39


блин копи паст подвел

  |//включить если нужно считать остатки в разрезе Склада
    |//    по ДокПриход.Склад = ДокРасход.Склад

правильно
  |//включить если нужно считать остатки в разрезе Склада
    |//    и ДокПриход.Ссылка.Склад = ДокРасход.Ссылка.Склад
Прошу прощения. Это я имел ввиду - для разработчика - это самая простая задачка. Я пока только разбираюсь, даже тот код, который вы написали для меня сложен пока.
Я попробовал решить это т.о.
Создал ещё один Документ Товародвижение. И прикрутил к нему ввод на основании от Документов ПриходнаяНакалдная и РасходнаяНакладная. И в нём планирую дописать контроль остатков.

LexaK

ЦитироватьСоздал ещё один Документ Товародвижение. И прикрутил к нему ввод на основании от Документов ПриходнаяНакалдная и РасходнаяНакладная. И в нём планирую дописать контроль остатков.
хм, лучше бы вы попытались использовать стандартный механизм, проведение документов, запись в РегистрНакопления!
а не изобретали велосипед (тем более с квадратными колесами) :befhbt:
если помогло нажмите: Спасибо!

DmitriyF

Цитата: LexaK от 19 фев 2019, 12:11
ЦитироватьСоздал ещё один Документ Товародвижение. И прикрутил к нему ввод на основании от Документов ПриходнаяНакалдная и РасходнаяНакладная. И в нём планирую дописать контроль остатков.
хм, лучше бы вы попытались использовать стандартный механизм, проведение документов, запись в РегистрНакопления!
а не изобретали велосипед (тем более с квадратными колесами) :befhbt:
Он стажер его всякой не нужной херней озадачивают которая в жизни ни когда не пригодится.
Добавлено: 19 фев 2019, 16:02


Цитата: ivangrant от 19 фев 2019, 09:06
Цитата: DmitriyF от 15 фев 2019, 18:53
Цитата: ivangrant от 15 фев 2019, 13:54
Цитата: DmitriyF от 15 фев 2019, 12:47
Цитата: ivangrant от 15 фев 2019, 08:55
Есть Документы ПриходнаяНакладная и РасходнаяНакладная.
Задача: настроить контроль остатков без регистра напопления.
Я так пониманию, что нужно через Запрос делать.
Но не могу сообразить схему. С чего начать?
___
Заранее благодарю.
Не скромный вопрос, а для чего такой финт ушами делать?

Я стажер. Соответственно для моего тестирования моделируют разные "нестандартные" ситуации. Мне важно разбираться в подобных "частных" случаях.
Это не "нестандартная" ситуация, а нестандартный дебилизм. Как вы проконтролируете остатки если одновременно будут списывать 2 пользователя?
Не будет никаких списаний с двух пользователей. Нужно разработать код в рамках простой конфигурации. Понимаю, что для человека с опытом - эта задачка нетривиальная. Но для меня пока сложно понять. Поэтому и спросил, какие варинты решения могут быть.
Спасибо, что откликнулись.
Дело не в том, что будет или нет 2 и более пользователей. Вы когда дорабатываете или разрабатываете ориентируетесь на одного пользователя? Надо правильно учиться сразу, а опыт приходит только со временем.

ivangrant

Решение по контролю остатков нашёл.
В целом получилось проверять остатки по документам ПриходнаяНакладная.
________


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
   

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


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

________________
Остался вопрос, как проверить остатки с учетом уже реализованного товара.
Поделитесь мыслями пжслт.

bsn-chita


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РасходнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
| СУММА(РасходнаяСписокНоменклатуры.Количество) КАК Количество
|ПОМЕСТИТЬ ДокТЧ
|ИЗ
| Документ.Расходная.СписокНоменклатуры КАК РасходнаяСписокНоменклатуры
|ГДЕ
| РасходнаяСписокНоменклатуры.Ссылка.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РасходнаяСписокНоменклатуры.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПриходнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
| СУММА(ПриходнаяСписокНоменклатуры.Количество) КАК Количество
|ПОМЕСТИТЬ ПриходныеНакладные
|ИЗ
| Документ.Приходная.СписокНоменклатуры КАК ПриходнаяСписокНоменклатуры
|ГДЕ
| ПриходнаяСписокНоменклатуры.Ссылка.МоментВремени < &МоментВремени
| И ПриходнаяСписокНоменклатуры.Ссылка.Проведен
|
|СГРУППИРОВАТЬ ПО
| ПриходнаяСписокНоменклатуры.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| РасходнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
| СУММА(РасходнаяСписокНоменклатуры.Количество) КАК Количество
|ПОМЕСТИТЬ РасходныеНакладные
|ИЗ
| Документ.Расходная.СписокНоменклатуры КАК РасходнаяСписокНоменклатуры
|ГДЕ
| РасходнаяСписокНоменклатуры.Ссылка.Проведен
| И РасходнаяСписокНоменклатуры.Ссылка.МоментВремени < &МоментВремени
|
|СГРУППИРОВАТЬ ПО
| РасходнаяСписокНоменклатуры.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДокТЧ.Номенклатура КАК Номенклатура,
| ДокТЧ.Количество КАК КоличествоВДокументе,
| ЕСТЬNULL(ПриходныеНакладные.Количество, 0) КАК КоличествоПриходные,
| ЕСТЬNULL(РасходныеНакладные.Количество, 0) КАК КоличествоРасходные
|ПОМЕСТИТЬ Промежуточная
|ИЗ
| ДокТЧ КАК ДокТЧ
| ЛЕВОЕ СОЕДИНЕНИЕ ПриходныеНакладные КАК ПриходныеНакладные
| ПО ДокТЧ.Номенклатура = ПриходныеНакладные.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РасходныеНакладные КАК РасходныеНакладные
| ПО ДокТЧ.Номенклатура = РасходныеНакладные.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Промежуточная.Номенклатура КАК Номенклатура,
| Промежуточная.КоличествоПриходные - (Промежуточная.КоличествоРасходные + Промежуточная.КоличествоВДокументе) КАК КоличествоОстаток
|ПОМЕСТИТЬ Остатки
|ИЗ
| Промежуточная КАК Промежуточная
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| -Остатки.КоличествоОстаток КАК КоличествоОстаток
|ИЗ
| Остатки КАК Остатки
|ГДЕ
| Остатки.КоличествоОстаток < 0";
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.ВыполнитьПакетСПромежуточнымиДанными();
//А0 = РезультатЗапроса[0].Выгрузить(); //Данные текущего документа Расходная.
//А1 = РезультатЗапроса[1].Выгрузить(); //Данные по всем Приходным до нашего документа.
//А2 = РезультатЗапроса[2].Выгрузить(); //Данные по всем Расходным до нашего документа.
//А3 = РезультатЗапроса[3].Выгрузить(); //Промежуточная таблица в которой объединяются данные из трех таблиц(документа, расходных и приходных).
//А4 = РезультатЗапроса[4].Выгрузить(); //Вычисление остатков с учетом данных текущего документа.
//А5 = РезультатЗапроса[5].Выгрузить(); //Отбор только отрицательных остатков.
Если НЕ РезультатЗапроса[5].Пустой() Тогда
Отказ = Истина;
Выборка = РезультатЗапроса[5].Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить("Не хватает " + Выборка.Номенклатура + " в количестве " + Выборка.КоличествоОстаток + " шт.");
КонецЦикла;
КонецЕсли;
КонецПроцедуры

DmitriyF

Цитата: ivangrant от 27 фев 2019, 09:27
   
   Если Запрос.Выполнить().Пустой() = Истина
      Тогда
      Сообщить("Необходимо добавить товар");
      Отказ = Истина;
      Иначе
   РезультатЗапроса = Запрос.Выполнить();

А вот этот изврат зачем?

ivangrant

Цитата: DmitriyF от 28 фев 2019, 12:31
Цитата: ivangrant от 27 фев 2019, 09:27
   
   Если Запрос.Выполнить().Пустой() = Истина
      Тогда
      Сообщить("Необходимо добавить товар");
      Отказ = Истина;
      Иначе
   РезультатЗапроса = Запрос.Выполнить();

А вот этот изврат зачем?

Это в процессе доработки появилось. Пока не стал убирать, чтобы ничего не сломать)
Добавлено: 01 мар 2019, 08:13


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

Запрос.УстановитьПараметр("Ссылка", Ссылка);
ТЗОстатки = Запрос.Выполнить().Выгрузить();

СписываемыеТовары = Номенклатура.Выгрузить();
СписываемыеТовары.Свернуть("Товар, СвойствоТовара", "Количество, Сумма");

Для Каждого СтрокаТовара Из  СписываемыеТовары  Цикл
МассивТоваров = ТЗОстатки.НайтиСтроки(Новый Структура("ТоварПриход, СвойствоТовараПриход", СтрокаТовара.Товар, СтрокаТовара.СвойствоТовара));

Если МассивТоваров.Количество() > 0 Тогда
Если МассивТоваров[0].Остаток < СтрокаТовара.Количество Тогда
Сообщить("Номенклатура "+ СтрокаТовара.Товар+" отсутствует в количестве "+Строка(СтрокаТовара.Количество - МассивТоваров[0].Остаток));
Отказ = Истина;
Возврат;
ИначеЕсли СтрокаТовара.Количество = 0
Тогда
Сообщить("Необходимо указать количество");
Отказ = Истина;
Возврат;
Иначе Отказ = Ложь;
КонецЕсли;
Иначе
Сообщить("Необходимого товара нет на складе");
Отказ = Истина;
Прервать;
КонецЕсли;
КонецЦикла;


ivangrant

UPD2: продолжаю постигать азы 1с ))
Теперь к этому коду нужно добавить проверку и запрет создания расхода раньше прихода.
Например. Есть документ Расходная Накладная, без проведения, с товаром, которого нет. Сейчас настроен запрет проведения, т.к. остатки будут нулевые.
Далее (на следующий день) создаётся Приходная Накладная с с этим же товаром и проводится. затем, возвращаемся к уже созданной ранне, но не проведённой Расходной Накладной, и проводим её.
Т.о. в отчёте получается, что расход был раньше прихода.
Вопрос: как реализовать дополнительную проверку остатков по дате (напоминаю, без регистра)?
Я вижу здесь два варианта:
1. Прописать дополнительное условие в запросе Документ РасходнаяНакладная при проверке остатков на дату.
Но не могу сообразить с чего начать, т.к. проверка остатков реализована пока только по всем сразу товарам. Без учета момента времени.
2. Создать полный запрет на создание документа расходная накладная при отсутсвующем товаре + запрет на изменение дат документов.
Т.о. не получится создать Расходную Накладную, а также изменять её дату после проведения (но уже по факту поступления товара).
Второй вариант возможен? Или его не реализовать в 1 коде 1С?

DmitriyF

Цитата: ivangrant от 04 мар 2019, 07:46
2. Создать полный запрет на создание документа расходная накладная при отсутсвующем товаре + запрет на изменение дат документов.

Каким же все таки бредом вы занимаетесь. "при отсутсвующем товаре" - это как? Как система узнает что товар отсутствует? Может хотели сказать что система не должна записать документ при отсутствующем товаре?

ivangrant

Цитата: DmitriyF от 04 мар 2019, 08:06
Цитата: ivangrant от 04 мар 2019, 07:46
2. Создать полный запрет на создание документа расходная накладная при отсутсвующем товаре + запрет на изменение дат документов.

Каким же все таки бредом вы занимаетесь. "при отсутсвующем товаре" - это как? Как система узнает что товар отсутствует? Может хотели сказать что система не должна записать документ при отсутствующем товаре?
Когда нечего сказать - лучше промолчать. Развелось тут "знатоков". Не умеешь делиться знаниями - мимо проходи.

Теги:

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

Рейтинг@Mail.ru

Поиск