1С:Предприятие / Простой склад / Глава 8

2.21 FIFO/LIFO/По-среднему.

Любителей футбола просим не беспокоится. Речь у нас пойдет не о FIFA, а о способах списания товара при разных системах учета. Бухгалтерам объяснять, что это такое, не нужно. Для остальных кратенько поясним.
FIFO (First Input First Output) – это такая система, при которой ранее пришедшие партии товара списываются первыми. Цена списания – цена партии товара из которой списывают товар.
LIFO (Last Input First Output) – а это такая система, при которой последняя пришедшая партия товара списывается в первую очередь. Цена списания – цена партии товара из которой списывают товар.
По-среднему – здесь вообще партии не нужны. Цена списания – средняя цена остатка партий товара на складе.
Мы должны при начале работы указать, какой системой списания мы будем в дальнейшем пользоваться. Перечень возможных систем учета мы будем держать в перечислении.

  1. Создаем новый виз перечисления – "МетодСписания";
  2. Добавим значения ФИФО, ЛИФО, По_Среднему. В представлении можно и латинскими буквами, а в идентификаторах – русскими, чтобы при наборе кода лишний раз язык не переключать;

  3. Для хранения выбранного нами типа списания заведем константу;
  4. Создаем константу "МетодСписания" тип П.МетодСписания;

  5. При начале работы с программой учета надо обязательно выставлять способ списания. И в последующем не менять его. Пусть программа при начале работы проверит, выбран ли способ списания, если не выбран, то предложить выбрать, а если выбран – ничего не делать. Запрещать редактирование мы не будем, нам охота поэкспериментировать.
  6. Входим в окно с деревом метаданных;
  7. Меню Действия команда "Глобальный модуль";
  8. Появилось окно глобального модуля. Подробнее в "Описание встроенного языка" т. 1;
  9. Пишем процедуру:

  10. Процедура ПриНачалеРаботыСистемы()
    // предопределенная процедура, запускается при начале работы
    // в 1С:Предприятии
      Перем Значение;
    // Объявляем переменную
      Если Константа.МетодСписания.Выбран()=0 Тогда
    // если константа не заполнена
        Рез=ВвестиЗначение(Значение,"Выберите способ списания","Перечисление.МетодСписания");
    // просим выбрать способ списания. Рез=1, если выбор произведен,
    // 0 – если нет
        Если Рез=1 Тогда
          Константа.МетодСписания=Значение;
    // установим константе выбранное значение
        Иначе
          СтатусВозврата(0);
    // Мы просили выбрать значение, а Вы этого не сделали.
    // С 1С работать не будете!
    // СтатусВозврата определяет, как должно завершиться событие вызвавшее
    // предопределенную процедуру. В данном случае открытие системы должно
    // завершиться неудачей. Т.е. 1С:Предприятие закроется.
        КонецЕсли;
      КонецЕсли;
    КонецПроцедуры
  11. Загрузим 1С:Предприятие и попробуем сперва отказаться от выбора, а потом выбрать FIFO. Посмотрим значения констант;
  12. Создадим две приходные накладные на Склад №3 с одинаковым товаром и сортом и количеством, но с разной ценой прихода. Пусть это будет кефир первого сорта по 20 штук в накладной №6 по цене 6.00 а в накладной №7 по 7.00, яблоки первого сорта по 50 штук в накладной №6 по цене 17.00 а в накладной №7 по 19.00 и яблоки второго сорта по 50 штук в накладной №6 по цене 16.00 а в накладной №7 по 16.40. Накладная №6 должна быть от 06.10.2000, а №7 от 07.10.2000;
  13. Проведем накладные;
  14. Все остальные накладные надо распровести. Они нам будут только мешать и излишне усложнять картину. Для этого;
  15. Откроем журнал "Накладные";
  16. Установим курсор на ненужную нам накладную;
  17. Меню Действия команда "Сделать документ не проведенным";
  18. Подтвердим отмену проведения документа;
  19. Галочка с пиктограммы документа исчезла – документ не проведен;
  20. Проверим по отчету остатки на складе №3;


2.22 Расходная накладная.

У нас на одном из складов есть некоторое количество товара. Пришло время создать расходную накладную. Во многом она у нас будет повторять приходную. Похожий набор полей шапки, только вместо поля "Поставщик" мы введем поле "Покупатель". Номер документа у нас будет зависеть не от бухгалтерии контрагента, а от нашей. Нам еще надо учесть, что будет позднее создана накладная на перемещение, и у расходных накладных и у накладных на перемещение должна быть общая нумерация. Это решается введением Нумератора.

  1. В дереве метаданных в разделе Документы найдем подраздел Нумераторы;
  2. Создадим новый нумератор "Накладные";
  3. Периодичность – в пределах года, длина – 5, цифровой, контроль уникальности – да;
  4. Расходная накладная будет располагаться в уже существующем журнале "Накладные". Данные по документу расходная накладная сведем в таблицу:
    Идентификатор: РасходнаяНакладная
    Журнал: Накладные
    Нумератор: Накладные     Периодичность:
    Длина:        Тип:
    Уникальность:       Автонумерация: да
    Оперативный учет: да
    Может являться основанием для документа любого вида?:

    Является основанием для

    Вводится на основании

    Шапка

    Реквизит

    Описание

    ТипЗначения

    Доп.

    Покупатель

    Кому ушел товар

    С.Контрагенты

     

    Договор

    Основание отгрузки товара

    С.Договора

     

    Склад

    Откуда отгрузили товар

    С.Склады

     

    Таблица

    Реквизит

    Описание

    ТипЗначения

    Доп.

    Товар

    Товар

    С.Номенклатура

     

    Сорт

    Сорт товара

    С.Сорт

     

    Кол

    Количество в произвольной ед. измерения

    Число 8.2

    +

    Ед

    Единица измерения

    С.Единицы

     

    КолО

    Количество в основной ед. измерения

    Число 8.2

    +,И

    Цена

    Цена реализации

    Число 7.2

    +

    Сумма

    Сумма документа

    Число 15.2

    +,И


  5. Создадим новый документ;
  6. Заполняем свойства и реквизиты согласно таблицы;
  7. Создаем форму документа;
  8. Редактируем форму накладной по аналогии с приходной накладной;
  9. Поле реквизита "НомерДок" делаем недоступным для редактирования;
  10. Формулы в реквизиты диалога ставим такие же как и в приходной накладной. За исключением Поставщик(), ее заменяем на Покупатель(). И убираем процедуру из колонки "Цена", эту колонку делаем недоступной для редактирования;
  11. Процедуры в модуль документа заносим из модуля формы приходной накладной. Только везде ЦенаП меняем на ЦенаР, и меняем название процедуры Поставщик() на Покупатель(), и убираем процедуру Цена();
  12. Текстовые поля с итогами по колонкам таблицы можно просто скопировать из формы документа приходная накладная;
  13. У нас цена реализации зависит от даты. Мы хотим, чтобы при изменении даты документа цены в строках документа соответственно менялись;

  14. Добавим функцию ДатаДок() в поле реквизита "ДатаДок";
  15. В модуль формы добавим процедуру:

  16. Процедура ДатаДок()
      ВыбратьСтроки();
      Пока ПолучитьСтроку()=1 Цикл
        Если Сорт.Выбран()=1 Тогда
          Цена=Окр(Товар.ЦенаР.Получить(ДатаДок)*(Сорт.Процент/100),2,1);
          Сумма=Окр(КолО*Цена,2,1);
        Иначе
          Цена=0;
          Сумма=0;
        КонецЕсли;
      КонецЦикла;
    КонецПроцедуры
    // Процедура простая и в комментариях не нуждается
    При заполнении накладной нам надо помнить, чего сколько на каком складе у нас лежит. В 1С для такой ситуации есть специальный механизм подбора. Реализуем его в нашей расходной накладной. Но сперва, для подбора, создадим особую форму списка справочника товаров.
  17. Войдем в окно редактирования свойств справочника Номенклатура;
  18. Нажимаем [Формы списка >];
  19. Выпал список. Выберем пункт "Редактировать";
  20. Появилось окно редактирования списка форм списка справочника;
  21. [Новый];
  22. Введем идентификатор "ДляПодбора". [ОК];
  23. Курсор на новой форме списка "ДляПодбора";
  24. Нажмем [Для выбора];
  25. Галочка во второй колонке переместилась, и встала напротив "ДляПодбора";
  26. [Открыть];

  27. В форме списка оставим только поля "Код" и "Наименование";
  28. Через меню Вставить командой "Текст" выберем элемент диалога текст для вставки;
  29. Укажем ему место для вставки в табличной части. Добавилась новая колонка. В ней мы будем выводить остаток товаров на рабочую дату;
  30. В свойствах этой колонки типа Текст пишем заголовок "Ост";
  31. В формулу пишем функцию Ост();
  32. Добавим в экранную форму поле ввода "Склад" типа С.Склады – остатки у нас будут по конкретному складу. Это поле сделаем недоступным;
  33. В модуль формы списка добавим функцию:

  34. Функция Ост()
      ТекТовар=ТекущийЭлемент();
    // Получаем текущий товар в строке
    КолТов=Регистр.ОстаткиТоваров.СводныйОстаток(Склад,
    ТекущийЭлемент(),,,"Количество");
    // Получаем суммарный остаток по ресурсу "Количество"
    // по измерениям "Склад" и "Товар", по остальным измерениям суммируем
    Если КолТов<=0 Тогда
        Возврат("");
    // если товара на складе нет в поле Ост вернем пустую строку
    Иначе
        Возврат(КолТов);
    // иначе вернем количество остатка
    КонецЕсли;
    КонецФункции
  35. Вернемся к форме документа расходная накладная;
  36. Добавим в экранную форму кнопку;
  37. Заголовок у нее будет "Подбор", формула – Подбор();
  38. В модуль формы добавим две процедуры:

  39. Процедура Подбор()
    // Эта процедура запускается по нажатию кнопки [Подбор]
      ОткрытьПодбор("Номенклатура","ДляПодбора");
    // Инициализируем механизм подбора и указываем, что подбирать мы
    // будем из справочника Номенклатура, используя форму списка "ДляПодбора"
      УстановитьЗначениеВПодборе("Склад",Склад);
    // В форму подбора в поле "Склад" передаем значение склада из
    // текущего документа
    КонецПроцедуры
    //-----------------------------------------------
    Процедура ОбработкаПодбора(ВыбТов)
    // Предопределенная процедура, срабатывающая по событию – выбор
    // элемента ВыбТов из справочника
      КолОст=Регистр.ОстаткиТоваров.СводныйОстаток(Склад,
      ВыбТов,,,"Количество");
    // Проверим остаток
      Если КолОст<=0 Тогда
        Возврат;
    // если остаток на складе отсутствует, завершаем процедуру
      КонецЕсли;
      ТабЗн1=СоздатьОбъект("ТаблицаЗначений");
    // временная динамическая таблица
      ТабЗн2=СоздатьОбъект("ТаблицаЗначений");
    // еще одна временная динамическая таблица
      ТабЗн2.НоваяКолонка("Сорт","Справочник.Сорт",,,"Сорт",5);
      ТабЗн2.НоваяКолонка("Остаток","Число",17,2,"Остаток",17);
    // колонки д. таблицы
      РегО=СоздатьОбъект("Регистр.ОстаткиТоваров");
      РегО.УстановитьФильтр(Склад,ВыбТов);
    // в копии регистра остатков нас будут интересовать
    // итоги по конкретному складу и конкретному товару
      РегО.ВыгрузитьИтоги(ТабЗн1,1,1);
    // перегрузим итоги в д. таблицу
      РегО="";
      ТабЗн1.ВыбратьСтроки();
      Пока ТабЗн1.ПолучитьСтроку()=1 Цикл
        Ост=ТабЗн1.Количество;
        Если Ост>0 Тогда // есть что проверять
    // если есть остаток, мы его перенесем во вторую д. таблицу
          Срт=ТабЗн1.Сорт;
          ТабЗн2.НоваяСтрока();
          ТабЗн2.Сорт=Срт;
          ТабЗн2.Остаток=Ост;
        КонецЕсли;
      КонецЦикла;
      ТабЗн2.Свернуть("1","2");
    // просуммируем по сортам и получим количество товара по каждому сорту
      ВыбСтрока=1;
      Если ТабЗн2.ВыбратьСтроку(ВыбСтрока,
          СокрЛП(ВыбТов.Код)+" ("
          +СокрЛП(ВыбТов.Наименование)+")")=1 Тогда
    // Выберем строку с нужным сортом
        НоваяСтрока();
    // создаем в документе новую строку
        Товар=ВыбТов;
    // заполняем поле "Товар"
        СортВыб=ТабЗн2.ПолучитьЗначение(ВыбСтрока,"Сорт");
    // по выбранной строке получаем сорт
        КолОст=ТабЗн2.ПолучитьЗначение(ВыбСтрока,"Остаток");
    // и остаток
        Сорт=СортВыб;
        СпрЕд=СоздатьОбъект("Справочник.Единицы");
        СпрЕд.ИспользоватьВладельца(Товар);
        СпрЕд.ВыбратьЭлементы();
        Пока СпрЕд.ПолучитьЭлемент()=1 Цикл
          Если СпрЕд.Ед=Товар.ЕдИзм Тогда
            Ед=СпрЕд.ТекущийЭлемент();
            Прервать;
          КонецЕсли;
        КонецЦикла;
    // это уже было...
        Цена=Окр(Товар.ЦенаР.Получить(ДатаДок)*(Сорт.Процент/100),2,1);
        КолВыб=0;
        Если ВвестиЧисло(КолВыб,СокрЛП(ВыбТов.Код)
            +"/"+СокрЛП(Строка(СортВыб)+" кол:"
            +Строка(КолОст)),8,2,0)=1 Тогда
    // Введем нужное нам количество
          Если КолВыб>КолОст Тогда
    // сравним введенное нами количество с остатком
            КолВыб=КолОст;
          КонецЕсли;
          Кол=КолВыб;
          КолО=Окр(Кол*(Ед.Коэффициент),2,1);
          Сумма=Окр(КолО*Цена,2,1);
        КонецЕсли;
        АктивизироватьСтроку();
    // установим курсор в документе на строку, которую мы ввели
      КонецЕсли;
    КонецПроцедуры
  40. Перейдем теперь к написанию модуля проведения документа;
  41. Напишем в модуль документа следующее:

  42. Процедура ОбработкаПроведения()
      РегОст=СоздатьОбъект("Регистр.ОстаткиТоваров");
      Если СравнитьТА()=-1 Тогда
    // Проверяем, не проводится ли документ ранее точки актуальности итогов
        РегОст.ВременныйРасчет(1);
        РассчитатьРегистрыНа(ТекущийДокумент());
      КонецЕсли;
    // Проверка на наличие на остатке
      ВыбратьСтроки();
      ФлагОтказа=0;
      Пока (ПолучитьСтроку()>0) Цикл
        Остат=РегОст.СводныйОстаток(Склад,Товар,Сорт,,"Количество");
        Если Остат
          Сообщить("Нет товара № "
    +СокрЛП(Товар.Код)+"/"
    +СокрЛП(Сорт.Наименование)+" в колич. "
    +КолО+" (имеется "+Остат+")");
          ФлагОтказа=1;
        КонецЕсли;
      КонецЦикла;
    // аналогичную часть кода см. в отчете ОстаткиНаСкладе
      Если ФлагОтказа=1 Тогда
        НеПроводитьДокумент();
        Возврат;
      КонецЕсли;
    // Это см. документы Приход/Расход денег
    // По регистру взаиморасчетов
      Регистр.Взаиморасчеты.Контрагент = Покупатель;
      Регистр.Взаиморасчеты.Договор = Договор;
      Регистр.Взаиморасчеты.Сумма = Итог("Сумма");
      Регистр.Взаиморасчеты.ФлагДвижения = 2;
      Регистр.Взаиморасчеты.ДвижениеРасходВыполнить();
      Если Константа.МетодСписания=Перечисление.МетодСписания.ФИФО Тогда
    // Здесь будет записана методика списания по FIFO
      ИначеЕсли Константа.МетодСписания=Перечисление.МетодСписания.ЛИФО
                                                            Тогда
    // Здесь будет записана методика списания по LIFO
      ИначеЕсли
        Константа.МетодСписания=Перечисление.МетодСписания.По_среднему
                                                            Тогда
    // Здесь будет записана методика списания по-среднему
      КонецЕсли;
    КонецПроцедуры
  43. Начнем описание методик с FIFO;
  44. Заместо строки "// Здесь будет записана методика списания по FIFO" напишем:

  45. // Здесь будет записана методика списания по FIFO
    ТабЗн1=СоздатьОбъект("ТаблицаЗначений");
    // временная таблица
    ТабЗн2=СоздатьОбъект("ТаблицаЗначений");
    // еще одна временная таблица
    ТабЗн2.НоваяКолонка("Партия","Документ.ПриходнаяНакладная");
    ТабЗн2.НоваяКолонка("КоличествоП","Число",14,2);
    ТабЗн2.НоваяКолонка("СуммаП","Число",19,2);
    ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
      КолВыб=КолО;
      РегОст.УстановитьФильтр(Склад,Товар,Сорт);
      РегОст.ВыгрузитьИтоги(ТабЗн1,1,1);
    // см. операцию подбора
      ТабЗн1.Свернуть("4","5,6");
    // а здесь интересно: Структура ТабЗн1 после выгрузки будет аналогична
    // структуре регистра. Реквизит "Партия" в регистре стоит на 4-ой
    // позиции, значит и колонка "Партия" – 4-ая, Колонки "Количество"
    // и "СуммаП" – соответственно 5-ая и 6-ая
      ТабЗн1.ВыбратьСтроки();
      Пока ТабЗн1.ПолучитьСтроку()=1 Цикл
        Прт=ТабЗн1.Партия;
        Ост=ТабЗн1.Количество;
        Сум=ТабЗн1.СуммаП;
        Если Ост>0 Тогда // есть что проверять
          ТабЗн2.НоваяСтрока();
          ТабЗн2.Партия=Прт;
          ТабЗн2.КоличествоП=Ост;
          ТабЗн2.СуммаП=Сум;
        КонецЕсли;
      КонецЦикла;
    // Заполняем промежуточную таблицу
      ТабЗн1.Очистить();
    // Удаляем все записи и колонки из ТабЗн1
      ТабЗн2.Сортировать("1+",1);
    // Сортируем по документам в порядке возрастания даты (FIFO)
    // Более ранние партии вверху
      ТабЗн2.ВыбратьСтроки();
      Пока ТабЗн2.ПолучитьСтроку()=1 Цикл
        Ост=ТабЗн2.КоличествоП;
        Сум=ТабЗн2.СуммаП;
        ЦенаПП=Окр(Сум/Ост,2,1);
    // определяем цену текущей партии
        Парт=ТабЗн2.Партия;
    // а вот и сама партия
        Если КолВыб>Ост Тогда // Ост
    // требуемое количество больше, чем остатки в текущей партии,
    // здесь спишем сколько есть, а что осталось, из более поздней
    // партии
          Регистр.ОстаткиТоваров.Склад = Склад;
          Регистр.ОстаткиТоваров.Товар = Товар;
          Регистр.ОстаткиТоваров.Сорт = Сорт;
          Регистр.ОстаткиТоваров.Партия = Парт;
          Регистр.ОстаткиТоваров.Количество = Ост;
          Регистр.ОстаткиТоваров.СуммаП = Окр(ЦенаПП*Ост,2,1);
          Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*Ост,2,1);
          Регистр.ОстаткиТоваров.ФлагДвижения = 1;
          Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);
          Регистр.ОстаткиТоваров.ДвижениеРасходВыполнить();
    // Про обороты не забыть!
          Регистр.ОборотыТоваров.Склад = Склад;
          Регистр.ОборотыТоваров.Товар = Товар;
          Регистр.ОборотыТоваров.Сорт = Сорт;
          Регистр.ОборотыТоваров.Количество = Ост;
          Регистр.ОборотыТоваров.СуммаУ = Окр(ЦенаПП*Ост,2,1);
          Регистр.ОборотыТоваров.ФлагДвижения = 1;
          Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);
          Регистр.ОборотыТоваров.ДвижениеВыполнить();
          КолВыб=КолВыб-Ост;
    // это сколько остатков нам не хватает до полного счастья
        Иначе
    // В партии товара больше, чем мы запрашиваем.
    // Списываем сколько запрашиваем
          Если КолВыб>0 Тогда // КолВыб
            Регистр.ОстаткиТоваров.Склад = Склад;
            Регистр.ОстаткиТоваров.Товар = Товар;
            Регистр.ОстаткиТоваров.Сорт = Сорт;
            Регистр.ОстаткиТоваров.Партия = Парт;
            Регистр.ОстаткиТоваров.Количество = КолВыб;
            Регистр.ОстаткиТоваров.СуммаП = Окр(ЦенаПП*КолВыб,2,1);
            Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*КолВыб,2,1);
            Регистр.ОстаткиТоваров.ФлагДвижения = 1;
            Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);
            Регистр.ОстаткиТоваров.ДвижениеРасходВыполнить();
            Регистр.ОборотыТоваров.Склад = Склад;
            Регистр.ОборотыТоваров.Товар = Товар;
            Регистр.ОборотыТоваров.Сорт = Сорт;
            Регистр.ОборотыТоваров.Количество = КолВыб;
            Регистр.ОборотыТоваров.СуммаУ = Окр(ЦенаПП*КолВыб,2,1);
            Регистр.ОборотыТоваров.ФлагДвижения = 1;
            Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);
            Регистр.ОборотыТоваров.ДвижениеВыполнить();
            КолВыб=КолВыб-Ост;
          КонецЕсли;
        КонецЕсли;
      КонецЦикла;
      ТабЗн2.УдалитьСтроки();
    // удаляем строки из временной таблицы.
    // Готовим ее под следующую строку документа
    КонецЦикла;
    Здесь мы воспользовались для определения партий механизмом прямой выгрузки данных из регистра в таблицу значений.
  46. Теперь опишем методику списания по LIFO. Мы, конечно можем, воспользоваться предыдущим примером, заменив строку

  47.       ТабЗн2.Сортировать("1+",1);
    На  ТабЗн2.Сортировать("1-",1);
          // Сортировка документов по убывающей. Последний – сверху
    Но мы легких путей не ищем! Воспользуемся механизмом запроса.
  48. Заместо строки "// Здесь будет записана методика списания по LIFO" напишем:

  49. // Здесь будет записана методика списания по LIFO
    ВыбратьСтроки();
    Пока ПолучитьСтроку()=1 Цикл
      КолСпис=КолО;
      Запрос="";
      ТекстЗапроса="";
      Если ИтогиАктуальны()=0 Тогда
        ТекстЗапроса="
        |Период с ДатаДок по ДатаДок;";
      КонецЕсли;
      ТекстЗапроса=ТекстЗапроса+"
      |РегСклад=Регистр.ОстаткиТоваров.Склад;
      |РегТовар=Регистр.ОстаткиТоваров.Товар;
      |РегСорт=Регистр.ОстаткиТоваров.Сорт;
      |РегПартия=Регистр.ОстаткиТоваров.Партия;
      |РегКолич=Регистр.ОстаткиТоваров.Количество;
      |РегСумма=Регистр.ОстаткиТоваров.СуммаП;
      |Группировка РегПартия Упорядочить по РегПартия.ДатаДок;
      |Функция КолКонОст=КонОст(РегКолич);
      |Функция СумКонОст=КонОст(РегСумма);
      |Условие (РегСклад=Склад);
      |Условие (РегТовар=Товар);
      |Условие (РегСорт=Сорт);";
      Запрос=СоздатьОбъект("Запрос");
      Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
        Сообщить("Документ не проведен");
        НеПроводитьДокумент();
        Возврат;
      КонецЕсли;
      Пока Запрос.Группировка("РегПартия",-1)=1 Цикл
    // В методе Группировка флаг –1 указывает, что сортировка по запросу
    // идет в порядке убывания. Более поздние документы идут первыми
        Если КолСпис=0 Тогда
          Прервать;
        КонецЕсли;
        ПартияСписания=Запрос.РегПартия;
        Если  Запрос.КолКонОст>КолСпис Тогда
          Списывать=КолСпис;
          Стоимость=Окр((Запрос.СумКонОст/Запрос.КолКонОст)*Списывать,2,1);
        ИначеЕсли Запрос.КолКонОст=КолСпис Тогда
          Списывать=КолСпис;
          Стоимость=Запрос.СумКонОст;
        ИначеЕсли Запрос.КолКонОст
          Списывать=Запрос.КолКонОст;
          Стоимость=Запрос.СумКонОст;
        КонецЕсли;
        КолСпис=КолСпис-Списывать;
        Регистр.ОстаткиТоваров.Склад = Склад;
        Регистр.ОстаткиТоваров.Товар = Товар;
        Регистр.ОстаткиТоваров.Сорт = Сорт;
        Регистр.ОстаткиТоваров.Партия = ПартияСписания;
        Регистр.ОстаткиТоваров.Количество = Списывать;
        Регистр.ОстаткиТоваров.СуммаП = Стоимость;
        Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*Списывать,2,1);
        Регистр.ОстаткиТоваров.ФлагДвижения = 1;
        Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);
        Регистр.ОстаткиТоваров.ДвижениеРасходВыполнить();
        Регистр.ОборотыТоваров.Склад = Склад;
        Регистр.ОборотыТоваров.Товар = Товар;
        Регистр.ОборотыТоваров.Сорт = Сорт;
        Регистр.ОборотыТоваров.Количество = Списывать;
        Регистр.ОборотыТоваров.СуммаУ = Стоимость;
        Регистр.ОборотыТоваров.ФлагДвижения = 1;
        Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);
        Регистр.ОборотыТоваров.ДвижениеВыполнить();
      КонецЦикла;
    КонецЦикла;
  50. Теперь опишем алгоритм списания по-среднему:

  51. // Здесь будет записана методика списания по-среднему
    ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
      КолОст=РегОст.СводныйОстаток(Склад,Товар,Сорт,,"Количество");
    // Получаем суммарный остаток по указанным измерениям
    // по данному ресурсу
      СумОст=РегОст.СводныйОстаток(Склад,Товар,Сорт,,"СуммаП");
      ЦенОст=Окр(СумОст/КолОст,2,1);
      Парт=ПолучитьПустоеЗначение("Документ.ПриходнаяНакладная");
    // А это, что-бы заполнить хоть чем-нибудь измерение "Партия"
      Регистр.ОстаткиТоваров.Склад = Склад;
      Регистр.ОстаткиТоваров.Товар = Товар;
      Регистр.ОстаткиТоваров.Сорт = Сорт;
      Регистр.ОстаткиТоваров.Партия = Парт;
      Регистр.ОстаткиТоваров.Количество = КолО;
      Регистр.ОстаткиТоваров.СуммаП = Окр(ЦенОст*КолО,2,1);
      Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*КолО,2,1);
      Регистр.ОстаткиТоваров.ФлагДвижения = 1;
      Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);
      Регистр.ОстаткиТоваров.ДвижениеРасходВыполнить();
      Регистр.ОборотыТоваров.Склад = Склад;
      Регистр.ОборотыТоваров.Товар = Товар;
      Регистр.ОборотыТоваров.Сорт = Сорт;
      Регистр.ОборотыТоваров.Количество = КолО;
      Регистр.ОборотыТоваров.СуммаУ = Окр(ЦенОст*КолО,2,1);
      Регистр.ОборотыТоваров.ФлагДвижения = 1;
      Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);
      Регистр.ОборотыТоваров.ДвижениеВыполнить();
    КонецЦикла;
  52. Подредактируем журнал "Накладные";
  53. Изменим содержимое графы "Кол";
  54. Добавим в выбранные значения графы Документ.РасходнаяНакладная.КолО;
  55. Аналогично поступим и с графой "Сумма";


2.23 Расходная накладная. Продолжение.

Документ "Расходная накладная" создан! Давайте проверим его в работе. И посмотрим, как у нас будет списываться товар при разных способах.

  1. Загружаем 1С:Предприятие;
  2. Способ списания – FIFO;
  3. Создаем Расходную накладную №1 от 08.10.2000;
  4. Укажем какого-нибудь покупателя и его договор;
  5. Укажем склад №3;
  6. [Подбор] (Надо-же проверить);
  7. Выберем кефир, всего его 40;
  8. Он есть только в 1-ом сорте в количестве 40;
  9. Пусть будет 1-ый сорт 22 штуки;
  10. Выберем яблоки – их 200 кг;
  11. Они есть в 1-ом сорте – 100 кг. и во 2-ом – 100 кг;
  12. Сперва выберем 1-ый сорт – 55 кг.;
  13. А затем снова яблоки, но уже 2-ой сорт – 55 кг.;
  14. Закроем окно подбора;
  15. [ОК]. Сохраним и проведем документ;
  16. Смотрим движения документа;
  17. Регистр "Взаиморасчеты" – ничего необычного;
  18. Регистр "ОстаткиТоваров" – как и требовалось, в первую очередь товар списывался с более ранней накладной по ее цене прихода;
  19. Регистр "ОборотыТоваров" – в соответствии со списываемыми партиями;
  20. Метод FIFO – все в порядке;
  21. Распроведем приходную накладную №1;
  22. Установим в константе способ списания – LIFO;
  23. Вернемся к накладной и проведем ее;
  24. Смотрим движения;
  25. И здесь все правильно;
  26. Распроведем приходную накладную №1;
  27. Установим в константе способ списания – По-среднему;
  28. Вернемся к накладной и проведем ее;
  29. Смотрим движения;
  30. Никаких партий и суммы взяты с учетом средней цены остатка;
  31. Все три основных способа списания реализованы правильно. (Есть еще способ учета "по-среднему с переоценками", он хорош тем, что при нем не накапливаются потерянные копейки как при обычном методе "по-среднему", но он сложен для реализации и встречается реже. Мы его не рассматриваем);
  32. Попробуйте еще, для эксперимента, списать товара больше, чем есть на складе;


2.24 Накладная на перемещение.

Документ "Накладная на перемещение между складами" совместит в себе часть черт приходной и расходной накладных. Для простоты, в накладной на перемещение будет указана в качестве цены – цена поступления товара из справочника. Контрагента в ней не будет, следовательно не будет движений по регистру "Взаиморасчеты". Зато по каждому из оставшихся регистров движения будут двойные: по одному складу и по другому. Нумерация накладной будет совместная с расходными. И еще введем такой механизм, как ввод на основании. Он будет заключаться в возможности взяв приходную накладную, ее содержимым автоматически заполнить накладную на перемещение. Накладная будет располагаться в журнале накладных. Сведем все данные по документу а таблицу:
Идентификатор: НакладнаяНаПеремещение
Журнал: Накладные
Нумератор: Накладные     Периодичность:
Длина:         Тип:
Уникальность:       Автонумерация: да
Оперативный учет: да
Может являться основанием для документа любого вида?: нет

Является основанием для

Вводится на основании

 

ПриходнаяНакладная

Шапка

Реквизит

Описание

ТипЗначения

Доп.

СкладО

Склад отправитель

С.Склады

 

СкладП

Склад получатель

С.Склады

 

Таблица

Реквизит

Описание

ТипЗначения

Доп.

Товар

Товар

С.Номенклатура

 

Сорт

Сорт товара

С.Сорт

 

Кол

Количество в произвольной ед. измерения

Число 8.2

+

Ед

Единица измерения

С.Единицы

 

КолО

Количество в основной ед. измерения

Число 8.2

+,И

Цена

Цена учета

Число 7.2

+

Сумма

Сумма документа

Число 15.2

+,И


  1. Создаем новый документ;
  2. В окне свойств документа указываем его настройки и вводим реквизиты;
  3. Нажимаем [Ввод на основании...];
  4. Ставим галочку в колонке "Вводить на основании" напротив "ПриходнаяНакладная";
  5. [ОК];
  6. Форму документа сделаем аналогичной расходной накладной. Колонка "Цена" и поле ввода "НомерДок" недоступны;
  7. Процедуры на элементы формы документа напишем по аналогии с приходной и расходной накладной. Учтем что мы будем использовать цену ЦенаП;
  8. Добавим кнопку [Подбор] и пропишем для нее процедуры. Только Склад заменим в них на СкладО;
  9. Теперь пропишем процедуру ввода на основании:

  10. Процедура ВводНаОсновании(ДокОсн)
    // предопределенная процедура. ДокОсн – ссылка на документ,
    // на основании которого мы хотим ввести текущий
    // если мы хотим, чтобы и в дальнейшем эти документы
    // были между собой связаны, надо в документе, вводимом на
    // основании завести реквизит типа документа основания
    // и сохранять там эту ссылку
      Если ДокОсн.Проведен()<>1 Тогда
    // Если документ основание не проведен
    // мы не можем ввести на его основании никакой документ
        Предупреждение("Приходная накладная № "+Строка(ДокОсн.НомерДок) +"
                    |    от "+Строка(ДокОсн.ДатаДок)+"
                    |    не проведена!");
        СтатусВозврата(0);
      КонецЕсли;
      ДатаДок=РабочаяДата();
    // копируем реквизиты шапки
      СкладО=ДокОсн.Склад;
      СкладП="";
      Пока ДокОсн.ПолучитьСтроку()=1 Цикл
    // копируем содержимое строк
        НоваяСтрока();
        Товар=ДокОсн.Товар;
        Сорт=ДокОсн.Сорт;
        Кол=ДокОсн.Кол;
        Ед=ДокОсн.Ед;
        КолО=ДокОсн.КолО;
        Цена=Товар.ЦенаП.Получить(ДатаДок);
        Сумма=Окр(КолО*Цена,2,1);
      КонецЦикла;
    КонецПроцедуры
  11. Процедуру проведения пишем по аналогии с расходной накладной:

  12. Процедура ОбработкаПроведения()
      РегОст=СоздатьОбъект("Регистр.ОстаткиТоваров");
      Если СравнитьТА()=-1 Тогда
        РегОст.ВременныйРасчет(1);
        РассчитатьРегистрыНа(ТекущийДокумент());
      КонецЕсли;
    // Проверка на наличие на остатке
      ВыбратьСтроки();
      ФлагОтказа=0;
      Пока (ПолучитьСтроку()>0) Цикл
        Остат=РегОст.СводныйОстаток(СкладО,Товар,Сорт,,"Количество");
        Если Остат<КолО Тогдаbr>       Сообщить("Нет товара № "+СокрЛП(Товар.Код)+"/"
                  +СокрЛП(Сорт.Наименование)+" в колич. "
                  +КолО+" (имеется "+Остат+")");
          ФлагОтказа=1;
        КонецЕсли;
      КонецЦикла;
      Если ФлагОтказа=1 Тогда
        НеПроводитьДокумент();
        Возврат;
      КонецЕсли;
      Если Константа.МетодСписания=Перечисление.МетодСписания.ФИФО Тогда
    // Здесь будет записана методика списания по FIFO
        ВыбратьСтроки();
        Пока ПолучитьСтроку()=1 Цикл
          КолСпис=КолО;
          Запрос="";
          ТекстЗапроса="";
          Если ИтогиАктуальны()=0 Тогда
            ТекстЗапроса="
            |Период с ДатаДок по ДатаДок;";
          КонецЕсли;
          ТекстЗапроса=ТекстЗапроса+"
          |РегСклад=Регистр.ОстаткиТоваров.Склад;
          |РегТовар=Регистр.ОстаткиТоваров.Товар;
          |РегСорт=Регистр.ОстаткиТоваров.Сорт;
          |РегПартия=Регистр.ОстаткиТоваров.Партия;
          |РегКолич=Регистр.ОстаткиТоваров.Количество;
          |РегСумма=Регистр.ОстаткиТоваров.СуммаП;
          |Группировка РегПартия Упорядочить по РегПартия.ДатаДок;
          |Функция КолКонОст=КонОст(РегКолич);
          |Функция СумКонОст=КонОст(РегСумма);
          |Условие (РегСклад=СкладО);
          |Условие (РегТовар=Товар);
          |Условие (РегСорт=Сорт);";
          Запрос=СоздатьОбъект("Запрос");
          Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
            Сообщить("Документ не проведен");
            НеПроводитьДокумент();
            Возврат;
          КонецЕсли;
          Пока Запрос.Группировка("РегПартия",1)=1 Цикл
    // Сортируем группировку по возрастанию
            Если КолСпис=0 Тогда
              Прервать;
            КонецЕсли;
            ПартияСписания=Запрос.РегПартия;
            Если  Запрос.КолКонОст>КолСпис Тогда
              Списывать=КолСпис;
              Стоимость=Окр((Запрос.СумКонОст/Запрос.КолКонОст)
              *Списывать,2,1);
            ИначеЕсли Запрос.КолКонОст=КолСпис Тогда
              Списывать=КолСпис;
              Стоимость=Запрос.СумКонОст;
            ИначеЕсли Запрос.КолКонОст<КолСпис Тогдаbr>           Списывать=Запрос.КолКонОст;
              Стоимость=Запрос.СумКонОст;
            КонецЕсли;
            КолСпис=КолСпис-Списывать;
            Регистр.ОстаткиТоваров.Склад = СкладО;
    // по одному складу
            Регистр.ОстаткиТоваров.Товар = Товар;
            Регистр.ОстаткиТоваров.Сорт = Сорт;
            Регистр.ОстаткиТоваров.Партия = ПартияСписания;
            Регистр.ОстаткиТоваров.Количество = Списывать;
            Регистр.ОстаткиТоваров.СуммаП = Стоимость;
            Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*Списывать,2,1);
            Регистр.ОстаткиТоваров.ФлагДвижения = 2;
    // у нас движение внутреннее
            Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);
            Регистр.ОстаткиТоваров.ДвижениеРасходВыполнить();
            Регистр.ОстаткиТоваров.Склад = СкладП;
    // по другому складу
            Регистр.ОстаткиТоваров.Товар = Товар;
            Регистр.ОстаткиТоваров.Сорт = Сорт;
            Регистр.ОстаткиТоваров.Партия = ПартияСписания;
            Регистр.ОстаткиТоваров.Количество = Списывать;
            Регистр.ОстаткиТоваров.СуммаП = Стоимость;
            Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*Списывать,2,1);
            Регистр.ОстаткиТоваров.ФлагДвижения = 2;
            Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);
            Регистр.ОстаткиТоваров.ДвижениеПриходВыполнить();
            Регистр.ОборотыТоваров.Склад = СкладО;
            Регистр.ОборотыТоваров.Товар = Товар;
            Регистр.ОборотыТоваров.Сорт = Сорт;
            Регистр.ОборотыТоваров.Количество = Списывать;
            Регистр.ОборотыТоваров.СуммаУ = Стоимость;
            Регистр.ОборотыТоваров.ФлагДвижения = 2;
            Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);
            Регистр.ОборотыТоваров.ДвижениеВыполнить();
            Регистр.ОборотыТоваров.Склад = СкладП;
            Регистр.ОборотыТоваров.Товар = Товар;
            Регистр.ОборотыТоваров.Сорт = Сорт;
            Регистр.ОборотыТоваров.Количество = Списывать;
            Регистр.ОборотыТоваров.СуммаУ = Стоимость;
            Регистр.ОборотыТоваров.ФлагДвижения = 2;
            Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);
            Регистр.ОборотыТоваров.ДвижениеВыполнить();
          КонецЦикла;
        КонецЦикла;
      ИначеЕсли Константа.МетодСписания=Перечисление.МетодСписания.ЛИФО Тогда
    // Здесь будет записана методика списания по LIFO
        ТабЗн1=СоздатьОбъект("ТаблицаЗначений");
        ТабЗн2=СоздатьОбъект("ТаблицаЗначений");
        ТабЗн2.НоваяКолонка("Партия","Документ.ПриходнаяНакладная");
        ТабЗн2.НоваяКолонка("КоличествоП","Число",14,2);
        ТабЗн2.НоваяКолонка("СуммаП","Число",19,2);
        ВыбратьСтроки();
        Пока ПолучитьСтроку() = 1 Цикл
          КолВыб=КолО;
          РегОст.УстановитьФильтр(СкладО,Товар,Сорт);
          РегОст.ВыгрузитьИтоги(ТабЗн1,1,1);
          ТабЗн1.Свернуть("4","5,6");
          ТабЗн1.ВыбратьСтроки();
          Пока ТабЗн1.ПолучитьСтроку()=1 Цикл
            Прт=ТабЗн1.Партия;
            Ост=ТабЗн1.Количество;
            Сум=ТабЗн1.СуммаП;
            Если Ост>0 Тогда // есть что проверять
              ТабЗн2.НоваяСтрока();
              ТабЗн2.Партия=Прт;
              ТабЗн2.КоличествоП=Ост;
              ТабЗн2.СуммаП=Сум;
            КонецЕсли;
          КонецЦикла;
          ТабЗн1.Очистить();
          ТабЗн2.Сортировать("1-",1);
    // Способ сортировки по убывающей (-)
          ТабЗн2.ВыбратьСтроки();
          Пока ТабЗн2.ПолучитьСтроку()=1 Цикл
            Ост=ТабЗн2.КоличествоП;
            Сум=ТабЗн2.СуммаП;
            ЦенаПП=Окр(Сум/Ост,2,1);
            Парт=ТабЗн2.Партия;
            Если КолВыб>Ост Тогда // Ост
              Регистр.ОстаткиТоваров.Склад = СкладО;
              Регистр.ОстаткиТоваров.Товар = Товар;
              Регистр.ОстаткиТоваров.Сорт = Сорт;
              Регистр.ОстаткиТоваров.Партия = Парт;
              Регистр.ОстаткиТоваров.Количество = Ост;
              Регистр.ОстаткиТоваров.СуммаП = Окр(ЦенаПП*Ост,2,1);
              Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*Ост,2,1);
              Регистр.ОстаткиТоваров.ФлагДвижения = 2;
              Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);
              Регистр.ОстаткиТоваров.ДвижениеРасходВыполнить();
              Регистр.ОстаткиТоваров.Склад = СкладП;
              Регистр.ОстаткиТоваров.Товар = Товар;
              Регистр.ОстаткиТоваров.Сорт = Сорт;
              Регистр.ОстаткиТоваров.Партия = Парт;
              Регистр.ОстаткиТоваров.Количество = Ост;
              Регистр.ОстаткиТоваров.СуммаП = Окр(ЦенаПП*Ост,2,1);
              Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*Ост,2,1);
              Регистр.ОстаткиТоваров.ФлагДвижения = 2;
              Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);
              Регистр.ОстаткиТоваров.ДвижениеПриходВыполнить();
              Регистр.ОборотыТоваров.Склад = СкладО;
              Регистр.ОборотыТоваров.Товар = Товар;
              Регистр.ОборотыТоваров.Сорт = Сорт;
              Регистр.ОборотыТоваров.Количество = Ост;
              Регистр.ОборотыТоваров.СуммаУ = Окр(ЦенаПП*Ост,2,1);
              Регистр.ОборотыТоваров.ФлагДвижения = 2;
              Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);
              Регистр.ОборотыТоваров.ДвижениеВыполнить();
              Регистр.ОборотыТоваров.Склад = СкладП;
              Регистр.ОборотыТоваров.Товар = Товар;
              Регистр.ОборотыТоваров.Сорт = Сорт;
              Регистр.ОборотыТоваров.Количество = Ост;
              Регистр.ОборотыТоваров.СуммаУ = Окр(ЦенаПП*Ост,2,1);
              Регистр.ОборотыТоваров.ФлагДвижения = 2;
              Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);
              Регистр.ОборотыТоваров.ДвижениеВыполнить();
              КолВыб=КолВыб-Ост;
            Иначе
              Если КолВыб>0 Тогда // КолВыб
                Регистр.ОстаткиТоваров.Склад = СкладО;
                Регистр.ОстаткиТоваров.Товар = Товар;
                Регистр.ОстаткиТоваров.Сорт = Сорт;
                Регистр.ОстаткиТоваров.Партия = Парт;
                Регистр.ОстаткиТоваров.Количество = КолВыб;
                Регистр.ОстаткиТоваров.СуммаП = Окр(ЦенаПП*КолВыб,2,1);
                Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*КолВыб,2,1);
                Регистр.ОстаткиТоваров.ФлагДвижения = 2;
                Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);
                Регистр.ОстаткиТоваров.ДвижениеРасходВыполнить();
                Регистр.ОстаткиТоваров.Склад = СкладП;
                Регистр.ОстаткиТоваров.Товар = Товар;
                Регистр.ОстаткиТоваров.Сорт = Сорт;
                Регистр.ОстаткиТоваров.Партия = Парт;
                Регистр.ОстаткиТоваров.Количество = КолВыб;
                Регистр.ОстаткиТоваров.СуммаП = Окр(ЦенаПП*КолВыб,2,1);
                Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*КолВыб,2,1);
                Регистр.ОстаткиТоваров.ФлагДвижения = 2;
                Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);
                Регистр.ОстаткиТоваров.ДвижениеПриходВыполнить();
                Регистр.ОборотыТоваров.Склад = СкладО;
                Регистр.ОборотыТоваров.Товар = Товар;
                Регистр.ОборотыТоваров.Сорт = Сорт;
                Регистр.ОборотыТоваров.Количество = КолВыб;
                Регистр.ОборотыТоваров.СуммаУ = Окр(ЦенаПП*КолВыб,2,1);
                Регистр.ОборотыТоваров.ФлагДвижения = 2;
                Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);
                Регистр.ОборотыТоваров.ДвижениеВыполнить();
                Регистр.ОборотыТоваров.Склад = СкладП;
                Регистр.ОборотыТоваров.Товар = Товар;
                Регистр.ОборотыТоваров.Сорт = Сорт;
                Регистр.ОборотыТоваров.Количество = КолВыб;
                Регистр.ОборотыТоваров.СуммаУ = Окр(ЦенаПП*КолВыб,2,1);
                Регистр.ОборотыТоваров.ФлагДвижения = 2;
                Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);
                Регистр.ОборотыТоваров.ДвижениеВыполнить();
                КолВыб=КолВыб-Ост;
              КонецЕсли;
            КонецЕсли;
          КонецЦикла;
          ТабЗн2.УдалитьСтроки();
        КонецЦикла;
      ИначеЕсли
        Константа.МетодСписания=Перечисление.МетодСписания.По_среднему Тогда
    // Здесь будет записана методика списания по-среднему
        ВыбратьСтроки();
        Пока ПолучитьСтроку() = 1 Цикл
          КолОст=РегОст.СводныйОстаток(СкладО,Товар,Сорт,,"Количество");
          СумОст=РегОст.СводныйОстаток(СкладО,Товар,Сорт,,"СуммаП");
          ЦенОст=Окр(СумОст/КолОст,2,1);
          Парт=ПолучитьПустоеЗначение("Документ.ПриходнаяНакладная");
          Регистр.ОстаткиТоваров.Склад = СкладО;
          Регистр.ОстаткиТоваров.Товар = Товар;
          Регистр.ОстаткиТоваров.Сорт = Сорт;
          Регистр.ОстаткиТоваров.Партия = Парт;
          Регистр.ОстаткиТоваров.Количество = КолО;
          Регистр.ОстаткиТоваров.СуммаП = Окр(ЦенОст*КолО,2,1);
          Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*КолО,2,1);
          Регистр.ОстаткиТоваров.ФлагДвижения = 2;
          Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);
          Регистр.ОстаткиТоваров.ДвижениеРасходВыполнить();
          Регистр.ОстаткиТоваров.Склад = СкладП;
          Регистр.ОстаткиТоваров.Товар = Товар;
          Регистр.ОстаткиТоваров.Сорт = Сорт;
          Регистр.ОстаткиТоваров.Партия = Парт;
          Регистр.ОстаткиТоваров.Количество = КолО;
          Регистр.ОстаткиТоваров.СуммаП = Окр(ЦенОст*КолО,2,1);
          Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*КолО,2,1);
          Регистр.ОстаткиТоваров.ФлагДвижения = 2;
          Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);
          Регистр.ОстаткиТоваров.ДвижениеПриходВыполнить();
          Регистр.ОборотыТоваров.Склад = СкладО;
          Регистр.ОборотыТоваров.Товар = Товар;
          Регистр.ОборотыТоваров.Сорт = Сорт;
          Регистр.ОборотыТоваров.Количество = КолО;
          Регистр.ОборотыТоваров.СуммаУ = Окр(ЦенОст*КолО,2,1);
          Регистр.ОборотыТоваров.ФлагДвижения = 2;
          Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);
          Регистр.ОборотыТоваров.ДвижениеВыполнить();
          Регистр.ОборотыТоваров.Склад = СкладП;
          Регистр.ОборотыТоваров.Товар = Товар;
          Регистр.ОборотыТоваров.Сорт = Сорт;
          Регистр.ОборотыТоваров.Количество = КолО;
          Регистр.ОборотыТоваров.СуммаУ = Окр(ЦенОст*КолО,2,1);
          Регистр.ОборотыТоваров.ФлагДвижения = 2;
          Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);
          Регистр.ОборотыТоваров.ДвижениеВыполнить();
        КонецЦикла;
      КонецЕсли;
    КонецПроцедуры
    Здесь мы переставили алгоритмы списания местами, в расходной накладной при списании по методу FIFO мы использовали алгоритм выгрузки регистра, а LIFO – запрос, то теперь наоборот, с соответствующими изменениями.
  13. Внесем дополнения по аналогии с другими накладными в журнал "Накладные";
  14. Войдем в окно редактирования документа "ПриходнаяНакладная";
  15. [Ввод на основании...];
  16. Может являться основанием для документа любого вида – Нет;
  17. Сохраним конфигурацию;
  18. Войдем в 1С:Предприятие;
  19. Сделаем нашу расходную накладную не проведенной;
  20. Установим способ списания – FIFO;
  21. На основании приходной накладной №7 введем накладную на перемещение. Для этого установим в журнале курсор на нужном документе. Меню Действия команда "Ввести на основании";
  22. Создалась уже почти заполненная накладная на перемещение №2 от 08.10.2000;
  23. Укажем склад получатель – Склад №2;
  24. Проведем накладную;
  25. Посмотрим на движения. Хоть мы и указали как основание накладную №7, у нас списалось с более ранней накладной №6. Как написали алгоритм списания – так и получилось. Отсюда мораль: "Программа делает не то, что хочешь, а то, что напишешь!";

<< Предыдущая глава | Содержание | Следующая глава >>