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

Списание материалов

Автор Pavel-67, 14 сен 2014, 12:56

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

Pavel-67

Доброго времени суток! Подскажите кто знает, я еще плохо понимаю все взаимосвязи работы 1с Бухгалтерия версия 8.2, как можно списывать материал с учета на складе после проведения выполненных работ. Хочу что бы списывался материал после проведения акта производственных работ автоматически. Насколько я понимаю должен быть создан документ в котором отображается номенклатура и объем списанного товара. Если не сложно скиньте легкий пример. Спасибо все кто откликнется.  И второй вопрос который меня очень мучает это код проверки остатков на складе ? Как его реализовать в программном коде?

Pavel-67

Насколько я понимаю получить остатки можно так:

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

Pavel-67

1С:Предприятие 8.2 (8.2.19.83) Бухгалтерия предприятия, редакция 2.0 (2.0.54.13)
Что никто не знает?
Я перерыл кучу форумов, примеров, но все они ссылаются на Документ.Расходная.Товары которых в документах у меня нет, РегистрНакопления.ОстаткиТоваров которых так же нет. Может кто то сможет за деньги разъяснить или написать? Мне нужно функцией просто проверить остаток номенклатуры на определенный день, в ответ получить количество. Может это очень сложно?
Добавлено: 16 сен 2014, 22:52


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

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


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

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

   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
      // Вставить обработку выборки ВыборкаДетальныеЗаписи
      Если ВыборкаДетальныеЗаписи.Наименование = Номенклатура.Наименование Тогда
         КоличествоНаскладе =  ВыборкаДетальныеЗаписи.Остаток;
      КонецЕсли;
   КонецЦикла;
   
     возврат КоличествоНаскладе;
   
КонецФункции

cska-fanat-kz

Цитата: Pavel-67 от 16 сен 2014, 21:57Спасибо все специалистам!! (

Что вы сразу в истерику.
Молчат - значит либо нечего сказать, либо в данный период нашлись другие дела (семья, работа и пр.) помимо форума :thwrt:

Остатки получаете в корне неправильно.
1. А если у номенклатуры еще нет записи в регистре ЦеныНоменклатуры? Остаток не получите, хотя он будет
2. Остатки по регистру бухгалтерии получаете по всем счетам и по всей номенклатуре, что ооооооочень неоптимально.
3. В запрос передаете параметр "Номенклатура"... Зачем? В самом запросе его так и не используете.
4. Далее в обходе выборки делаете отбор по НАИМЕНОВАНИЮ номенклатуры... А если будет несколько номенклатур с одинаковым наименованием? Получите остаток ПОСЛЕДНЕГО. А если у вас КОНТРАГЕНТ будет называться как одна из НОМЕНКЛАТУР и будет остаток по счету взаиморасчетов?
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

cska-fanat-kz

на основе образной базы...
так что допилите под себя...

Функция ОстаткиНоменклатуры(Номенклатура, Дата)

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

КонецФункции
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Pavel-67

Цитата: cska-fanat-kz от 18 сен 2014, 01:11
на основе образной базы...
так что допилите под себя...

Функция ОстаткиНоменклатуры(Номенклатура, Дата)

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

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


К сожалению у меня данный код не работает.

Поле объекта не обнаружено (ВидыСубконто)
   видысубконто.Добавить(планывидовхарактеристик.ВидыСубконто.Материалы); 

{(6, 4)}: Таблица не найдена "РегистрБухгалтерии.Управленческий.Остатки"
<<?>>РегистрБухгалтерии.Управленческий.Остатки(&дата, , , Субконто1 = &Номенклатура) КАК УправленческийОстатки


Я слегка доработал функцию по недостаткам:


Функция ОстаткиНоменклатуры(Номенклатура, Дата)

   //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
     КоличествоНаскладе = 0;
   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
   |   *,
   |   ХозрасчетныйОстатки.Субконто1.Представление КАК Наименование
   |ИЗ
   |   РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, , , ) КАК ХозрасчетныйОстатки
   |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ) КАК ЦеныНоменклатурыСрезПоследних
   |      ПО ХозрасчетныйОстатки.Субконто1.Код = ЦеныНоменклатурыСрезПоследних.Номенклатура.Код";

   Запрос.Параметры.Вставить("Дата", Дата);

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

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

   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
      
      Если Не ВыборкаДетальныеЗаписи.Наименование = Null Тогда   
         
      Если ВыборкаДетальныеЗаписи.Субконто1.Код = Номенклатура.Код Тогда
         КоличествоНаскладе = КоличествоНаскладе +  ВыборкаДетальныеЗаписи.КоличествоОстаток;
      КонецЕсли;
      
      
      
      
      КонецЕсли;   
      
   КонецЦикла;
   
     возврат КоличествоНаскладе;

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


1. Тут я убрал не используемый параметр
2. Увеличил конкретику номенклатуры (проверка по коду)
3. Исправил не точность счета (т.е. функция теперь считает не последний результат а сумму)

Может функция и написана не профессионально, но она работает, я ее сверял с инвентаризацией склада.

Добавлено: 21 сен 2014, 13:02


Что касаемо таблиц, регистров и параметров, то у меня стандартная версия, без изменений 1С:Предприятие 8.2 (8.2.19.83) Бухгалтерия предприятия, редакция 2.0 (2.0.54.13). Инвентаризация по складам происходит, значит есть стандартный алгоритм для данной функции. К сожалению я ее не знаю написал функцию по наитию. 

cska-fanat-kz

Представьте, что вы - директор школы и вам надо выяснить, сколько денег дала мама Иванову Ване из 1го б на обед.
Вы:
1. Сгоняете ВСЮ школу с 1го по 11ый на площадь перед школой
2. Начинаете опрашивать каждого школьника: "Ты Ваня Иванов?"
3. На N-ый раз Ваня вам попадается и вы наконец-то узнаете, сколько у него денег в кармане

Да, я не спорю, результата вы добились, задача решена... Но МЕТОД!
А у вас все примерно так и происходит!
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Yura063

Pavel-67, зачем создавать велосипед! Посмотрите как это реализовано в инвентаризации и разберите, если вас не устраивает, что вам люди пишут. 
Помогли, отблагодари!

Pavel-67

Цитата: Yura063 от 22 сен 2014, 09:18
Pavel-67, зачем создавать велосипед! Посмотрите как это реализовано в инвентаризации и разберите, если вас не устраивает, что вам люди пишут.

Добрый день. Велосипед никто и не создает. Была поставлена задача написать функцию которая по исходным данным выдает количественный остаток на момент времени. Посмотреть процесс инвентаризации можно, но человеку который только начинает разбираться все этим тяжка, поэтому я обратился к форуму за помощью. В ответ я получил только замечание от модератора по поводу истерики, и вариант функции который у меня не пошел (о чем я и писал). А сейчас Ваша реплика больше походит на поддакивания модератору.

Извините все специалисты которых я обидел тем, что в вопросе помочь с не сложной функцией (как я понимаю из реплик) мене просто указали на то что я это не понимаю. Извините еще раз Многоуважаемые специалисты.

cska-fanat-kz

Внимание, правильный ответ. теперь применительно к Бухгалтерии предприятия (правда 3.0, но надеюсь не суть)

Функция ОстаткиНоменклатуры(Номенклатура, Дата)

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

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

Pavel-67, никто на вас не обижался. просто хотел не просто вывалить на вас портянку с кодом, а чтобы вы хоть немного в нем понимали...
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Теги:

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

Рейтинг@Mail.ru

Поиск