Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа_1C__2_1.doc
Скачиваний:
19
Добавлен:
10.05.2015
Размер:
543.23 Кб
Скачать

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

  10. Процедуру проведения пишем по аналогии с расходной накладной: Процедура ОбработкаПроведения()   РегОст=СоздатьОбъект("Регистр.ОстаткиТоваров");   Если СравнитьТА()=-1 Тогда     РегОст.ВременныйРасчет(1);     РассчитатьРегистрыНа(ТекущийДокумент());   КонецЕсли; // Проверка на наличие на остатке   ВыбратьСтроки();   ФлагОтказа=0;   Пока (ПолучитьСтроку()>0) Цикл     Остат=РегОст.СводныйОстаток(СкладО,Товар,Сорт,,"Количество");     Если Остат<КолО Тогда       Сообщить("Нет товара № "+СокрЛП(Товар.Код)+"/"               +СокрЛП(Сорт.Наименование)+" в колич. "               +КолО+" (имеется "+Остат+")");       ФлагОтказа=1;     КонецЕсли;   КонецЦикла;   Если ФлагОтказа=1 Тогда     НеПроводитьДокумент();     Возврат;   КонецЕсли;   Если Константа.МетодСписания=Перечисление.МетодСписания.ФИФО Тогда // Здесь будет записана методика списания по FIFO     ВыбратьСтроки();     Пока ПолучитьСтроку()=1 Цикл       КолСпис=КолО;       Запрос="";       ТекстЗапроса="";       Если ИтогиАктуальны()=0 Тогда         ТекстЗапроса="         |Период с ДатаДок по ДатаДок;";       КонецЕсли;       ТекстЗапроса=ТекстЗапроса+"       |РегСклад=Регистр.ОстаткиТоваров.Склад;       |РегТовар=Регистр.ОстаткиТоваров.Товар;       |РегСорт=Регистр.ОстаткиТоваров.Сорт;       |РегПартия=Регистр.ОстаткиТоваров.Партия;       |РегКолич=Регистр.ОстаткиТоваров.Количество;       |РегСумма=Регистр.ОстаткиТоваров.СуммаП;       |Группировка РегПартия Упорядочить по РегПартия.ДатаДок;       |Функция КолКонОст=КонОст(РегКолич);       |Функция СумКонОст=КонОст(РегСумма);       |Условие (РегСклад=СкладО);       |Условие (РегТовар=Товар);       |Условие (РегСорт=Сорт);";       Запрос=СоздатьОбъект("Запрос");       Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда         Сообщить("Документ не проведен");         НеПроводитьДокумент();         Возврат;       КонецЕсли;       Пока Запрос.Группировка("РегПартия",1)=1 Цикл // Сортируем группировку по возрастанию         Если КолСпис=0 Тогда           Прервать;         КонецЕсли;         ПартияСписания=Запрос.РегПартия;         Если  Запрос.КолКонОст>КолСпис Тогда           Списывать=КолСпис;           Стоимость=Окр((Запрос.СумКонОст/Запрос.КолКонОст)           *Списывать,2,1);         ИначеЕсли Запрос.КолКонОст=КолСпис Тогда           Списывать=КолСпис;           Стоимость=Запрос.СумКонОст;         ИначеЕсли Запрос.КолКонОст<КолСпис Тогда           Списывать=Запрос.КолКонОст;           Стоимость=Запрос.СумКонОст;         КонецЕсли;         КолСпис=КолСпис-Списывать;         Регистр.ОстаткиТоваров.Склад = СкладО; // по одному складу         Регистр.ОстаткиТоваров.Товар = Товар;         Регистр.ОстаткиТоваров.Сорт = Сорт;         Регистр.ОстаткиТоваров.Партия = ПартияСписания;         Регистр.ОстаткиТоваров.Количество = Списывать;         Регистр.ОстаткиТоваров.СуммаП = Стоимость;         Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*Списывать,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 – запрос, то теперь наоборот, с соответствующими изменениями.

  11. Внесем дополнения по аналогии с другими накладными в журнал "Накладные";

  12. Войдем в окно редактирования документа "ПриходнаяНакладная";

  13. [Ввод на основании...];

  14. Может являться основанием для документа любого вида – Нет;

  15. Сохраним конфигурацию;

  16. Войдем в 1С:Предприятие;

  17. Сделаем нашу расходную накладную не проведенной;

  18. Установим способ списания – FIFO;

  19. На основании приходной накладной №7 введем накладную на перемещение. Для этого установим в журнале курсор на нужном документе. Меню Действия команда "Ввести на основании";

  20. Создалась уже почти заполненная накладная на перемещение №2 от 08.10.2000;

  21. Укажем склад получатель – Склад №2;

  22. Проведем накладную;

  23. Посмотрим на движения. Хоть мы и указали как основание накладную №7, у нас списалось с более ранней накладной №6. Как написали алгоритм списания – так и получилось. Отсюда мораль: "Программа делает не то, что хочешь, а то, что напишешь!";