Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИСиТ. Методичка.doc
Скачиваний:
25
Добавлен:
04.11.2018
Размер:
745.47 Кб
Скачать

9.2. Создание расходной накладной

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

Расходная накладная будет располагаться в уже существующем журнале "Накладные". Данные по документу расходная накладная можно свести в таблицу:

Идентификатор: РасходнаяНакладная

Журнал: Накладные

Нумератор: Накладные Периодичность:

Длина: Тип:

Уникальность: Автонумерация: да

Оперативный учет: да

Может являться основанием для документа любого вида?:

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

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

Шапка

Реквизит

Описание

ТипЗначения

Доп.

Покупатель

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

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

Договор

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

С. Договора

Склад

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

С.Склады

Таблица

Реквизит

Описание

ТипЗначения

Доп.

Товар

Товар

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

Кол

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

Число 8.2

+

Ед

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

С. Единицы

КолО

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

Число 8.2

+,И

Цена

Цена поставки

Число 7.2

+

Сумма

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

Число 15.2

+, И

  1. Создать новый документ.

  2. Заполнить свойства и реквизиты согласно таблицы.

  3. Создать форму документа.

  4. Редактировать форму накладной по аналогии с приходной накладной.

  5. Поле реквизита "НомерДок" сделать недоступным для редактирования.

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

  7. Процедуры в модуль документа занести из модуля формы приходной накладной. Только везде ЦенаП поменять на ЦенаР и поменять название процедуры "Поставщик()" на "ПокупатсльО", убрать процедуру "Цена()".

  8. Текстовые поля с итогами по колонкам таблицы можно просто скопировать из формы документа "Приходная накладная".

Цена реализации зависит от даты, поэтому необходимо, чтобы при изменении даты документа цены в строках документа соответственно менялись.

  1. Добавить функцию "ДатаДок()" в поле реквизита "ДатаДок".

В модуль формы добавить процедуру:

Процедура ДатаДок()

ВыбратьСтроки();

Пока ПолучитьСтроку()= 1 Цикл

Цена=Окр(Товар.ЦенаР.Получить(ДатаДок),2,1);

Сумма=Окр(КолО*Цена,2,1);

КонецЦикла;

КонецПроцедуры

При заполнении накладной надо помнить, что, сколько и на каком складе лежит. В 1С для такой ситуации есть специальный механизм подбора. Реализовать его необходимо в расходной накладной. Но сперва для подбора нужно создать особую форму списка справочника товаров.

  1. Войти в окно редактирования свойств справочника Номенклатура.

  2. Нажать [Формы списка >].

  3. Выпадает список. Выбрать пункт "Редактировать".

  4. Появилось окно редактирования списка форм списка справочника.

  5. [Новый].

  6. Ввести идентификатор "ДляПодбора". [ОК].

  7. Курсор на новой форме списка "ДляПодбора".

  8. Нажать [Для выбора].

  9. Галочка во второй колонке переместилась, и встала напротив "ДляПодбора".

  10. [Открыть].

  11. В форме списка оставить только поля "Код" и "Наименование".

  12. Через меню "Вставить" командой "Текст" выбрать элемент диалога текст для вставки.

  13. Указать ему место для вставки в табличной части. Добавилась новая колонка. В ней будет выводиться остаток товаров на рабочую дату.

  14. В свойствах этой колонки типа "Текст" написать заголовок "Ост".

  15. В формулу написать функцию Ост().

  16. Добавить в экранную форму поле ввода "Склад" типа С.Склады - остатки будут по конкретному складу. Это поле сделать недоступным.

  17. В модуль формы списка добавить функцию:

Функция Ост()

ТекТовар=ТекущийЭлемент();

// Получаем текущий товар в строке

КолТов=Регистр.ОстаткиТоваров.СводныйОстаток(Склад,

ТекущийЭлемент()„ "Количество");

// Получаем суммарный остаток по ресурсу "Количество"

// по измерениям "Склад" и "Товар", по остальным измерениям

сум¬мируем

Если КолТов<=0 Тогда

Возврат("");

// если товара на складе нет в поле Ост вернем пустую строку Иначе

Возврат(КолТов);

// иначе вернем количество остатка

КонецЕсли;

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

  1. Вернуться к форме документа "Расходная накладная".

  2. Добавить в экранную форму кнопку.

  3. Заголовок будет "Подбор", формула-Подбор().

В модуль формы добавить две процедуры:

Процедура Подбор()

// Эта процедура запускается по нажагию кнопки [Подбор] От

крыть11одбор(,,Номенклатура","ДляПодбора"); // Инициализируем

механизм подбора и указываем, что подбирать // будем из

справочника Номенклатура, используя форму списка //"ДляПодбора"

УстановитьЗначениеВПодборе("Склад", Склад);

// В форму подбора в поле "Склад" передаем значение склада из

// текущего документа

КонецПроцедуры //

Процедура ОбработкаПодбора(ВыбТов)

// Предопределенная процедура, срабатывающая по событию - выбор

// элемента ВыбТов из справочника Ко-

лОст-

Ргистр.ОстаткиТоваров.СводныйОстаток(Склад,ВыбТов„"Количеств

о

"); // Проверим остаток . Если Кол0ст<~0 Тогда Возврат;

// если остаток на складе отсутствует, завершаем процедуру Коне

цЕсли;

ТабЗн 1 =СоздатьОбъект(мТаблицаЗначений"); // временная динами

ческая таблица

ТабЗн2=СоздатьОбъект("ТаблицаЗначений"); // еще одна временная

динамическая таблица

ТабЗн2.НоваяКолонка("Остаток,,.иЧисло",17,2,"Остаток", 17); // ко

лонки д. таблицы РегО=СоздатьОбъект("Регистр.ОстаткиТоваров");

РегО.УстановитьФильтр(Склад.ВыбТов); // в копии регистра остат

ков нас будут интересовать // итоги по конкретному складу и

конкретному товару

РегО.ВыгрузитьИтоги(ТабЗн 1,1,1); 7/ перегрузим итоги в д. таблицу

РегО="";

ТабЗн 1 .ВыбратьСтроки(); Пока ТабЗн 1 .ПолучитьСтроку()=Ч Цикл

Ост=ТабЗн 1 .Количество; Если 0ст>0 Тогда // есть что проверять //

если есть остаток, мы его перенесем во вторую д. таблицу ТабЗн2. Н

оваяСтрока(); ТабЗн2-Остаток=Ост; КонецЕсли; КонецЦикла;

ТабЗн2.Свернуть(" 1 ","2"); ВыбСтрока=1;

Если ТабЗн2.ВыбратьСтроку(ВыбСтрока, СокрЛП(ВыбТов.Код)+" ("

+СокрЛП(ВыбТов.Наименование)+")")=1 Тогда НоваяСтрока(); //

создаем в документе новую строку

Товар=ВыбТов; // заполняем поле "Товар"

КолОст=ТабЗн2.ПолучитьЗначение(ВыбСтрока,"Остаток" // по вы

бранной строке получить остаток

СпрЕд=СоздатьОбъект("Справочник.Единицы");

СпрЕд.ИспользоватьВладельца(Товар); СпрЕд.ВыбратьЭлементы();

Пока СпрЕд.Г1олучитьЭлемент()=1 Цикл Если

СпрЕд.Ед='Говар.ЕдИзм Тогда Ед=СпрЕд.ТекущийЭлемент();

Прервать; КонецЕсли; КонецЦикла;

Цена=Окр(Товар.ЦенаР.Получить(ДатаДок),2,1); КолВыб=0;

Если ВвестиЧисло(КолВыб,СокрЛГ1(ВыбТов.Код)+"

кол:"+Строка(КолОст),8,2,0)= 1 Тогда // Введем нужное нам количе

ство Если КолВыб>КолОст Тогда

// сравним введенное нами количество с остатком Кол В ыб=КолОст;

КонецЕсли; Кол=КолВыб;

КолО=Окр(Кол*(Ед.Коэффициент),2,1); Сум

ма=Окр(КолО*Цена,2,1); КонецЕсли;

АктивизироватьСтроку(); // установим курсор в документе на строку,

которую мы ввели

КонецЕсли; КонецПроце дурры

  1. Перейти к написанию модуля проведения документа.

  2. Написать в модуль документа следующее:

Процедура Обработка! !роведения() РегОст-

СоздатьОбъект("Регистр.ОстаткиТоваров"); Если Срав

нитьТА()~-1 Тогда

// Проверяем, не проводится ли документ ранее точки ак

туальности итогов

РегОст.ВремснныйРасчет( I);

РассчитатьРегистрыНа(ТекущийДокумент());

КонецЕсли;

// Проверка на наличие на остатке ВыбратьСтроки(); Фла

гОтказа- 0;

Пока (ПолучитьСтроку()>0) Цикл

Остат-

РегОст.СводныйОстаток(Склад,Товар,,"Количество");

Если Остат<КолО Тогда

Сообщить("Нет товара № "

+СокрЛП(Товар,Код)+7"

ь" в колич. "' КолО ) " (имеется 'Остат+")");

ФлагОтказа=-1;

КонецЕсли;

КонецЦикла;

// аналогичную часть кода см. в отчете ОстаткиНаСкладе

Если ФлагОтказа-1 Тогда

НеПроводитьДокумент();

Возврат;

КонецЕсли;

// Это см. документы Приход/Расход денег

113

// По регистру взаиморасчетов Ре

гистр.Взаиморасчеты.Контрагент = Покупатель; Регистр.

Взаиморасчеты. Договор = Договор; Ре

гистр.Взаиморасчеты.Сумма = Итог("Сумма"); Ре

гистр.Взаиморасчеты.ФлагДвижения = 2; Ре

гистр.Взаиморасчеты. ДвижениеРасходВыполнить(); Ес

ли

Конст-

нта.МетодСписания=Перечисление.МетодСписания.ФИ

ФО Тогда // Здесь будет записана методика списания по

FIFO ИначеЕсли Кон

стан¬та.МетодСиисания=Перечисление.МетодСписания.

ЛИФО Тогда

// Здесь будет записана методика списания по LIFO Инна

чеЕсли Кон

стан¬та.МетодСписания=Перечисление.МетодСписания.

По_среднему Тогда

// Здесь будет записана методика списания по-среднему

КонецЕсли;

КонецПроцедуры

  1. Начнем описание методик с FIFO;

  2. Вместо строки "// Здесь будет записана методика списания по FIFO" написать:

// Здесь будет записана методика списания по FIFO ТабЗн 1

=СоздатьОбъект("ТаблицаЗначений"); // временная таблица

ТабЗн2~СоздатьОбъект(" Табл ицаЗ начений"); // еще одна

временная таблица

ТабЗ н2. НоваяКолонка("Партия","Документ.Приходная

Накладная");

ТабЗн2.НоваяКолонка("КоличествоП","Число", 14,2);

ТабЗн2.НоваяКолонка("СуммаП","Числоп,19,2);

ВыбратьСтроки();

Пока ПолучитьСтроку()= ^ Цикл

КолВыб=КолО;

РегОст.УстановитьФильтр(Скл ад. Товар); РегОст.Вы груз итьИтоги(

ТабЗ нК 1); // см. операцию подбора ТабЗн 1 .Свернуть("3","4,5");

// а здесь интересно: Структура ТабЗн! после выгрузки будет

анало¬гична

// структуре регистра. Реквизит "Партия" в регистре стоит на 3-ой

// позиции, значит и колонка "Партия" - 3-ая, Колонки "Количество"

// и "СуммаП" - соответственно 4-ая и 5-ая

ТабЗн 1 .ВыбратьСтроки();

Пока ТабЗн 1.ПолучитьСтроку()=1 Цикл

Г1рт=ТабЗн1 .Партия;

Ост-ТабЗн 1 .Количество;

Сум-ТабЗн 1 .СуммаП;

Если 0ст>0 Тогда // есть что проверять

ТабЗн2.НоваяСтрока();

ТабЗ н2. Партия=Прт;

' ГабЗ 112. Кол ичествоП=Ост;

ТабЗ н2. Сум маП=Су м;

КонецЕсли;

КонецЦикла;

// Заполняем промежуточную таблицу ТабЗн] .Очистить();

// Удаляем все записи и колонки из ТабЗн 1 ТабЗн2. Сортировать^" 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. Удал итьСтроки();

// удаляем строки из временной таблицы.

// Готовим ее под следующую строку документа

КонецЦикла;

  1. Теперь опишем методику списания по LIFO..

  2. Вместо строки "// Здесь будет записана методика списания по LIFO" напишем:

// Здесь будет записана методика списания по LIFO

ВыбратьСтроки();

Пока ПолучитьСтроку()=1 Цикл

КолСпис=КолО;

Запрос-"";

ТекстЗапроса—"':

Если ИтогиАктуальны()=0 Тогда

ТекстЗапроса="

|Период с ДатаДок по ДатаДок;"; КонецЕсли;

ТскстЗапроса=ТекстЗапроса+"

|РсгСклад=Регистр.ОстаткиТоваров.Склад;

|РегТовар=Регистр.ОетаткиТоваров.Товар;

|РегПартия=Регистр.ОстаткиТова ров. Партия;

|РегКолич=Регистр.ОстаткиТоваров. Количество;

|РегСумма=Регистр.Остатк-нТоваров.СуммаП;

(Группировка РегПартия Упорядочить по РегПар

тия.ДатаДок;

|Функция КолКопОст=КонОст(РегКолич);

|Функция СумКонОст=КонОст(РегС'умма);

|Условие (РегСклад=Склад);

|Условие (РегТовар=Товар);

Запрос~СоздатьОбъект("Запрос");

Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда

Сообщить("Документ не проведен");

1 1е11роводнтьДокумент();

Возврат;

КонецЕсли;

Пока Запрос.Группировка("РегПартия",-])=1 Цикл // В мето

де Группировка флаг -I указывает, что сортировка по за­просу

// идет в порядке убывания. Более поздние документы идут

первыми

Если КолСпис=0 Тогда

Прервать;

КонецЕсли;

ПартияСписания=Запрос. РегПартия; Если За

прос.КолКонОст>КолСпис Тогда С писывать=КолС п ис;

Стои-

мость~Окр((Запрос.СумКонОст/Запрос.КолКонОст)*Списыв

ать,2,1); Иначе Если Запрос. КолКонОст=КолСпис Тогда

Списы вать= Кол С п ис

Стоимость=Запрос. Су мКонОст;

ИначеЕсли Запрос.КолКонОст<КолСпис Тогда

Списывать=Запрос.КолКонОст;

Стоимость=Запрос.СумКонОст;

КонецЕсли;

Кол С пис—КолСпис-С писывать;

Регистр.ОстаткиТоваров.Склад = Склад;

Регистр.ОстаткиТоваров.Товар » Товар;

Регистр.ОстаткиТоваров.Партия » ПартияСписания;

Регистр.ОстаткиТоваров.Количество = Списывать;

Регистр. ОстаткиТоваров. СуммаП = Стоимость;

Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*Списывать,2Д);

Регистр.ОстаткиТоваров.ФлагДвижения = 1;

Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);

Регистр.ОстаткиТоваров. ДвижениеРасходВыполнить();

Регистр.Обороты Товаров.Склад = Склад;

Регистр.Обороты Товаров.Товар = Товар;

Регистр. ОборотыТоваров.Количество = Списывать;

Регистр.ОборотыТоваров.СуммаУ = Стоимость;

Регистр.ОборотыТоваров.ФлагДвижения = 1;

Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);

Регистр.ОборотыТоваров. ДвижениеВыполнить();

КонецЦикла;

КонецЦнкла;

  1. Теперь опишем алгоритм списания по-среднему:

//Здесь будет записана методика списания по-среднему ВыбратьСт

роки(); Пока ПолучитьСтроку() = ] Цикл

КолОст=РегОст.СводныйОстаток(Склад,Товар„"Количество"); // По

лучаем суммарный остаток по указанным измерениям // по данному

ресурсу

СумОст=РегОст.СводныйОстаток(Склад,Товар„"СуммаП"); Це

нОст=Окр(Су мОст/К олОст,2,1);

Парт=ПолучитьПустоеЗначение("Документ.ПриходнаяНакладная");

// А это, что-бы заполнить хоть чем-нибудь измерение "Партия" Ре

гистр.ОстаткиТоваров.Склад = Склад; Ре

гистр.ОстаткиТоваров.Товар = Товар; Ре

гистр.ОстаткиТоваров.Партия = Парт; Ре

гистр.ОстаткиТоваров.Количество

= КолО; Регистр.ОстаткиТоваров.СуммаП = Окр(ЦенОст*КолО,2,1);

Ре

гистр.ОстаткиТоваров.СуммаД = Окр(Цена*КолО,2,1);

Регистр.Остатки Товаров.ФлагДвижения = 1;

Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);

Регистр.ОстаткиТоваров.ДвижениеРасходВыполнить();

Регистр.Обороты Товаров.Склад = Склад;

Регистр.ОборотыТоваров.Товар = Товар;

Регистр.Обороты Товаров.Количество = КолО;

Регистр.Обороты Товаров.СуммаУ = Окр(ЦенОст*КолО,2Л);

Регистр.Обороты Товаров.Флаг Движения = 1;

Регистр.Обороты Товаров. ПривязыватьСтроку(НомерСтроки);

Регистр.ОборотыТоваров. ДвижениеВыполнитьО;

КонецЦикла;

  1. Подредактировать журнал "Накладные".

  2. Изменить содержимое графы "Кол".

  3. Добавить в выбранные значения графы "Доку- мент.РасходнаяНакладная.КолО".

  4. Аналогично поступить и с графой "Сумма".

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