- •Лабораторная работа № (продолжение) Построение простейшей конфигурации по учету складских операций
- •2.7 Справочник складов
- •2.8 Справочник контрагентов
- •2.9 Справочник договоров с контрагентами
- •2.10 Работа со справочниками контрагентов и договоров
- •2.11 Справочник сортов
- •2.12 Хранение данных по взаиморасчетам с контрагентами
- •2.13 Первый документ. Приход денег
- •2.14 Работа с документом.
- •2.15 Отчет по долгам.
- •2.16 Документ "Выплата денег".
- •2.17 Документ "Изменение цен".
- •2.18 Регистры по товарам.
- •2.19 Приходная накладная.
- •2.20 Отчет по остаткам на складе.
- •2.21 Fifo/lifo/По-среднему.
- •2.22 Расходная накладная.
- •2.23 Расходная накладная. Продолжение.
- •2.24 Накладная на перемещение
- •2.25 Оборотные ведомости
- •2.26 Отчет по прибыли с товара
- •2.27 Отчет по обороту товара
- •2.28 Новые наборы прав
- •2.29 Новые интерфейсы
2.23 Расходная накладная. Продолжение.
Документ "Расходная накладная" создан! Давайте проверим его в работе. И посмотрим, как у нас будет списываться товар при разных способах.
Загружаем 1С:Предприятие;
Способ списания – FIFO;
Создаем Расходную накладную №1 от 08.10.2000;
Укажем какого-нибудь покупателя и его договор;
Укажем склад №3;
[Подбор] (Надо-же проверить);
Выберем кефир, всего его 40;
Он есть только в 1-ом сорте в количестве 40;
Пусть будет 1-ый сорт 22 штуки;
Выберем яблоки – их 200 кг;
Они есть в 1-ом сорте – 100 кг. и во 2-ом – 100 кг;
Сперва выберем 1-ый сорт – 55 кг.;
А затем снова яблоки, но уже 2-ой сорт – 55 кг.;
Закроем окно подбора;
[ОК]. Сохраним и проведем документ;
Смотрим движения документа;
Регистр "Взаиморасчеты" – ничего необычного;
Регистр "ОстаткиТоваров" – как и требовалось, в первую очередь товар списывался с более ранней накладной по ее цене прихода;
Регистр "ОборотыТоваров" – в соответствии со списываемыми партиями;
Метод FIFO – все в порядке;
Распроведем приходную накладную №1;
Установим в константе способ списания – LIFO;
Вернемся к накладной и проведем ее;
Смотрим движения;
И здесь все правильно;
Распроведем приходную накладную №1;
Установим в константе способ списания – По-среднему;
Вернемся к накладной и проведем ее;
Смотрим движения;
Никаких партий и суммы взяты с учетом средней цены остатка;
Все три основных способа списания реализованы правильно. (Есть еще способ учета "по-среднему с переоценками", он хорош тем, что при нем не накапливаются потерянные копейки как при обычном методе "по-среднему", но он сложен для реализации и встречается реже. Мы его не рассматриваем);
Попробуйте еще, для эксперимента, списать товара больше, чем есть на складе;
2.24 Накладная на перемещение
Документ "Накладная на перемещение между складами" совместит в себе часть черт приходной и расходной накладных. Для простоты, в накладной на перемещение будет указана в качестве цены – цена поступления товара из справочника. Контрагента в ней не будет, следовательно не будет движений по регистру "Взаиморасчеты". Зато по каждому из оставшихся регистров движения будут двойные: по одному складу и по другому. Нумерация накладной будет совместная с расходными. И еще введем такой механизм, как ввод на основании. Он будет заключаться в возможности взяв приходную накладную, ее содержимым автоматически заполнить накладную на перемещение. Накладная будет располагаться в журнале накладных. Сведем все данные по документу а таблицу:
Идентификатор: НакладнаяНаПеремещение Журнал: Накладные Нумератор: Накладные Периодичность: Длина: Тип: Уникальность: Автонумерация: да Оперативный учет: да Может являться основанием для документа любого вида?: нет | |||
Является основанием для |
Вводится на основании | ||
|
ПриходнаяНакладная | ||
Шапка | |||
Реквизит |
Описание |
ТипЗначения |
Доп. |
СкладО |
Склад отправитель |
С.Склады |
|
СкладП |
Склад получатель |
С.Склады |
|
Таблица | |||
Реквизит |
Описание |
ТипЗначения |
Доп. |
Товар |
Товар |
С.Номенклатура |
|
Сорт |
Сорт товара |
С.Сорт |
|
Кол |
Количество в произвольной ед. измерения |
Число 8.2 |
+ |
Ед |
Единица измерения |
С.Единицы |
|
КолО |
Количество в основной ед. измерения |
Число 8.2 |
+,И |
Цена |
Цена учета |
Число 7.2 |
+ |
Сумма |
Сумма документа |
Число 15.2 |
+,И |
Создаем новый документ;
В окне свойств документа указываем его настройки и вводим реквизиты;
Нажимаем [Ввод на основании...];
Ставим галочку в колонке "Вводить на основании" напротив "ПриходнаяНакладная";
[ОК];
Форму документа сделаем аналогичной расходной накладной. Колонка "Цена" и поле ввода "НомерДок" недоступны;
Процедуры на элементы формы документа напишем по аналогии с приходной и расходной накладной. Учтем что мы будем использовать цену ЦенаП;
Добавим кнопку [Подбор] и пропишем для нее процедуры. Только Склад заменим в них на СкладО;
Теперь пропишем процедуру ввода на основании: Процедура ВводНаОсновании(ДокОсн) // предопределенная процедура. ДокОсн – ссылка на документ, // на основании которого мы хотим ввести текущий // если мы хотим, чтобы и в дальнейшем эти документы // были между собой связаны, надо в документе, вводимом на // основании завести реквизит типа документа основания // и сохранять там эту ссылку Если ДокОсн.Проведен()<>1 Тогда // Если документ основание не проведен // мы не можем ввести на его основании никакой документ Предупреждение("Приходная накладная № "+Строка(ДокОсн.НомерДок) +" | от "+Строка(ДокОсн.ДатаДок)+" | не проведена!"); СтатусВозврата(0); КонецЕсли; ДатаДок=РабочаяДата(); // копируем реквизиты шапки СкладО=ДокОсн.Склад; СкладП=""; Пока ДокОсн.ПолучитьСтроку()=1 Цикл // копируем содержимое строк НоваяСтрока(); Товар=ДокОсн.Товар; Сорт=ДокОсн.Сорт; Кол=ДокОсн.Кол; Ед=ДокОсн.Ед; КолО=ДокОсн.КолО; Цена=Товар.ЦенаП.Получить(ДатаДок); Сумма=Окр(КолО*Цена,2,1); КонецЦикла; КонецПроцедуры
Процедуру проведения пишем по аналогии с расходной накладной: Процедура ОбработкаПроведения() РегОст=СоздатьОбъект("Регистр.ОстаткиТоваров"); Если СравнитьТА()=-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 – запрос, то теперь наоборот, с соответствующими изменениями.
Внесем дополнения по аналогии с другими накладными в журнал "Накладные";
Войдем в окно редактирования документа "ПриходнаяНакладная";
[Ввод на основании...];
Может являться основанием для документа любого вида – Нет;
Сохраним конфигурацию;
Войдем в 1С:Предприятие;
Сделаем нашу расходную накладную не проведенной;
Установим способ списания – FIFO;
На основании приходной накладной №7 введем накладную на перемещение. Для этого установим в журнале курсор на нужном документе. Меню Действия команда "Ввести на основании";
Создалась уже почти заполненная накладная на перемещение №2 от 08.10.2000;
Укажем склад получатель – Склад №2;
Проведем накладную;
Посмотрим на движения. Хоть мы и указали как основание накладную №7, у нас списалось с более ранней накладной №6. Как написали алгоритм списания – так и получилось. Отсюда мораль: "Программа делает не то, что хочешь, а то, что напишешь!";