7.7 Инвентаризация Комиссионера

Тема в разделе "Типовые решения "1С:Предприятие 7.7"", создана пользователем БулГахтер, 1 дек 2008.

  1. TopicStarter Overlay
    БулГахтер
    Offline

    БулГахтер

    Регистрация:
    8 июл 2007
    Сообщения:
    32
    Симпатии:
    0
    Баллы:
    1
    Вобщем у меня такая ситуация. В комплексной есть документ - инвентаризация комиссионера. Но в отлиции обычной инвентаризации там нет кнопки обновить ( т.е. перезаполнить актуальными остатками) и вдобавок ко всему при заполнении он сразуже прописывает в колонку количества - количество по учету.
    Со второй проблемой трудностей не было особо :) А вот с обновлением не получается нормально сделать :( Может кто-то уже сталкивалсяс этой проблемой??? Ну не получается у меня написать, что бы он и остатки обновлял и введенное фактически количество не трогал :(((((

    ХЕЕЕЕЛП люди :)
  2. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Хм, а проблема в чем?
    если ты делаешь через метод "Показать", то обновляется вся таблица и надо опять вносить данные (можно написать алгоритм запоминания а потом вставки)
    Если выполняется только расчет, то потом нужно пройтись по нужным ячейкам и проставить в них данные.
  3. TopicStarter Overlay
    БулГахтер
    Offline

    БулГахтер

    Регистрация:
    8 июл 2007
    Сообщения:
    32
    Симпатии:
    0
    Баллы:
    1
    Код:
    Процедура ПоКнопкеОбновить()
    
    
    
    Сообщение = "Обновить документ по остаткам ТМЦ на реализации у комиссионера?"; 
    
    ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
    КоличествоУчет = ""
    КонецЦикла;
    
    Результат = ОбновитьОстатки();
    
    Если КоличествоУчет <> 0 Тогда
    Цена = СуммаУчет / КоличествоУчет;
    Сумма = Цена * Количество;
    Иначе
    Цена = СуммаУчет; 
    Сумма = Цена;
    КонецЕсли; 
    
    //	Если ПустоеЗначение(Результат) = 0 Тогда
    //		Предупреждение(Результат, 60);
    //	КонецЕсли;	
    
    КонецПроцедуры //ПоКнопкеОбновить()
    
    
    
    //*****************************************************************************
    
    Функция ОбновитьОстатки() 
    
    Перем ТаблСуммы, ТаблОстатков;
    Перем СписТоваров;
    
    СписТоваров = СоздатьОбъект("СписокЗначений");
    ВыгрузитьТабличнуюЧасть(СписТоваров, "Номенклатура");
    
    ПолучитьОстатки(СписТоваров, ТаблОстатков);
    
    ТаблОстатков.Свернуть("Номенклатура", "Количество");
    
    
    ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
    Поз = 0;
    Если ТаблОстатков.НайтиЗначение(Номенклатура, Поз, "Номенклатура") = 0 Тогда
    КоличествоУчет = 0;
    
    Иначе
    ВремКоличествоУчет = ТаблОстатков.ПолучитьЗначение(Поз, "Количество");
    Поз = 0;
    // пересчитаем КоличествоУчет из базовых в текущие единицы
    Если Коэффициент <> 0 Тогда
    ВремКоличествоУчет = ВремКоличествоУчет / Коэффициент;
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/иначе')">				Иначе	</span>
    ВремКоличествоУчет = 0;
    
    КонецЕсли;
    
    КоличествоУчет = ВремКоличествоУчет;
    
    
    КонецЕсли;
    КонецЦикла;	  
    
    КонецФункции //ОбновитьОстатки() 
    

    Вот тело вокумента
  4. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    По моему предыдущему посту: я не так понял, поэтому давал ответ относительно вывода печатных форм.

    Из приведенного здесь кода, у меня вопрос: "А оно вообще работает?". В частности, если не изменяет память, для функции обязательно выполнение оператора "Возврат".
    Что по решению проблемы
    определи какой реквизт отвечает за значения "введенное фактически количество". Потом в коде все строки "<ВведенноеФактическиКоличество> = ..." просто закомментируй.
  5. TopicStarter Overlay
    БулГахтер
    Offline

    БулГахтер

    Регистрация:
    8 июл 2007
    Сообщения:
    32
    Симпатии:
    0
    Баллы:
    1
    Ну я просто с 1с очень плохо знаком :)
    А что изменяется если не прописать вовзрат вконце?

    Ну я несовсем правильно сказал видимо.

    Он правильно заполняет и учетное значение и не трогает фактическое проблема в другом - при первоначальном заполнении часто появляются строчки с одинаковой номенклатурой, даже ценой (видимо партии разные) А после обновления он не видит этого разделения на партии.
    Получается что в начале в учетном количестве было :
    товар 1 = 15
    товар 1 = 20
    По отчету на комиссионере 35 - все верно.
    Потом покаким-то причинам изменились документы. В результате:
    По отчету 50
    товар 1 = 50
    товар 2 = 50,

    Вот как с этим бороться.
    p.s. Сам сбособ обновления учетного количества взят из аналогичного документа инвентаризации по складу, в котором почему-то это уже заранее предусмотренно

    забыл вставить еще одну часть
    После функции Обновить остатки описывается процедура ПолучитьОстатки.
    Вот ее код:

    Код:
    Процедура ПолучитьОстатки(СписТоваров, ОстаткиТМЦ)
    
    ВремРегистры	= СоздатьОбъект("Регистры");
    РегОстатки		= ВремРегистры.ПартииОтданные;
    
    
    РегОстатки.УстановитьЗначениеФильтра("Фирма",		Фирма,		1);
    РегОстатки.УстановитьЗначениеФильтра("Договор",	Договор,	1);	
    
    
    Если ПустоеЗначение(СписТоваров) = 0 Тогда
    РегОстатки.УстановитьЗначениеФильтра("Номенклатура", СписТоваров, 2);
    КонецЕсли;
    //Если ТолькоОстатки = 0 Тогда
    //	РегПартии = ВремРегистры.ПартииНаличие;
    //КонецЕсли;
    
    // в этом случае надо сделать временный расчет итогов
    Если Выбран() = 0 Тогда
    // Новый документ
    Если ДатаДок < ПолучитьДатуТА() Тогда
    // выписываемый задним числом
    //Если ТолькоОстатки = 0 Тогда
    //	РегПартии.ВременныйРасчет();
    //КонецЕсли;
    РегОстатки.ВременныйРасчет();
    ВремРегистры.РассчитатьРегистрыПо(ДатаДок);
    КонецЕсли;
    ИначеЕсли ДатаДок < ТекущийДокумент().ДатаДок Тогда
    // Поменяли дату документа. 
    Если ДатаДок < ПолучитьДатуТА() Тогда
    // выписываемый задним числом
    //Если ТолькоОстатки = 0 Тогда
    //	РегПартии.ВременныйРасчет();
    //КонецЕсли;
    РегОстатки.ВременныйРасчет();
    ВремРегистры.РассчитатьРегистрыПо(ДатаДок);
    КонецЕсли;
    ИначеЕсли СравнитьТА() < 1 Тогда
    //Позиция не больше ТА.
    //Если ТолькоОстатки = 0 Тогда
    //	РегПартии.ВременныйРасчет();
    //КонецЕсли;
    РегОстатки.ВременныйРасчет();
    ВремРегистры.РассчитатьРегистрыНа(ТекущийДокумент());
    КонецЕсли;
    
    ОстаткиТМЦ	= СоздатьОбъект("ТаблицаЗначений");
    РегОстатки.ВыгрузитьИтоги(ОстаткиТМЦ, 1, 1);
    
    //Если ТолькоОстатки = 0 Тогда
    //	ОстаткиПартий	= СоздатьОбъект("ТаблицаЗначений");
    //	РегПартии.ВыгрузитьИтоги(ОстаткиПартий, 1, 1);
    //КонецЕсли;
    
    КонецПроцедуры // ПолучитьОстатки()
    
  6. TopicStarter Overlay
    БулГахтер
    Offline

    БулГахтер

    Регистрация:
    8 июл 2007
    Сообщения:
    32
    Симпатии:
    0
    Баллы:
    1
    Весь модуль документа в прикрепленном файле, если что еще забы указать

    Вложения:

  7. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    :unsure: Как ни странно -- ничего. Для меня раньше было святое правило: функция должна возвращать значение (и раньше вроде сама 1С ругалась). Сейчас перепроверил, если нет оператора возврат, то функция работает как процедура.


    Видимо.... я два раза не понял о чем речь. Может заглянет кто-нить, кто отлично знает предметную область.
  8. TopicStarter Overlay
    БулГахтер
    Offline

    БулГахтер

    Регистрация:
    8 июл 2007
    Сообщения:
    32
    Симпатии:
    0
    Баллы:
    1

    Попробую еще раз. :)
    При первоначальном заполении документа ( кнопка заполнить) Он выводит остатки не в разрезе товаров, а более детально, в разрезе партий по каждому из товаров.

    Я взял функцию обновления из другого документа инвентаризации. Но там видимо идет детализация не до партий а только до номенклатуры.

    Я тут уже все передумал, задача вырисовывается следующая -

    Перед обновлением количества, надо пробежать по всей таблице найти все дубликаты, ссумировать их количество, записать в колонку, и удалить все остальные дубликаты.....
    Но как это сделать.... я хз :(

Поделиться этой страницей