- •1. Концепция системы 1с:предприятие
- •1.1 Краткое описание понятий (объектов) системы
- •1.2. Технологические средства конфигурирования и администрирования системы 1с:Предприятие
- •1.3. Понятие «метаданные»
- •1.4. Конфигурация
- •2. Лабораторная работа №1
- •2.1. Постановка задачи
- •2.2. Создание конфигурации и начало работы с метаданными
- •3. Лабораторная работа №2
- •3.1. Константы в системе 1с:Предприятие
- •3.2. Справочники в системе 1с:Предприятие
- •3.3. Перечисления в системе 1с:Предприятие
- •3.4. Создание справочника товаров
- •4. Лабораторная работа №3
- •4.1. Создание справочника складов справочника контрагентов и справочника договоров с контрагентами
- •4.2. Создание справочника контрагентов
- •4.3. Создание справочника договоров с контрагентами
- •5. Лабораторная работа №4
- •5.1. Документы в системе 1с:Предприятие
- •5.2. Журналы в системе 1с:Предприятие
- •5.3. Регистры в системе 1с:Предириятие
- •5.4. Хранение данных по взаиморасчетам с контрагентами
- •6. Лабораторная работа №5
- •6.1. Отчеты в системе 1с:Предприятие
- •6.2. Создание отчета
- •7. Лабораторная работа №6
- •7.1. Создание документа "Изменение цен"
- •7.2. Создание регистров по товарам
- •8. Лабораторная работа №7
- •8.1 Приходная накладная
- •8.2. Отчет по остаткам на складе
- •9. Лабораторная работа №8
- •9.1. Создание перечисления "МетодСписания"
- •9.2. Создание расходной накладной
- •10. Лабораторная работа №9
- •10.1. Создание отчета "ОбороткаПоДолгам"
- •10.2. Создание отчета "ОбороткаПоСкладу"
- •10.3. Создание отчета по прибыли с товара
- •10.4. Создание отчета по обороту товара
- •11. Теоретические вопросы по компоненте «оперативный учет» системы 1с: предприятие
- •12. Примеры практических задании
9.2. Создание расходной накладной
На одном из складов есть некоторое количество товара. Пришло время создать расходную накладную. Во многом она у нас будет повторять приходную. Похожий набор полей шапки, только вместо поля "Поставщик" мы введем поле "Покупатель". Номер документа у нас будет зависеть не от бухгалтерии контрагента, а от нашей.
Расходная накладная будет располагаться в уже существующем журнале "Накладные". Данные по документу расходная накладная можно свести в таблицу:
Идентификатор: РасходнаяНакладная Журнал: Накладные Нумератор: Накладные Периодичность: Длина: Тип: Уникальность: Автонумерация: да Оперативный учет: да Может являться основанием для документа любого вида?: |
|||
Является основанием для |
Вводится на основании |
||
Шапка |
|||
Реквизит |
Описание |
ТипЗначения |
Доп. |
Покупатель |
Кому ушел товар |
С. Контрагенты |
|
Договор |
Основание отгрузки товара |
С. Договора |
|
Склад |
Откуда отгрузили товар |
С.Склады |
|
Таблица |
|||
Реквизит |
Описание |
ТипЗначения |
Доп. |
Товар |
Товар |
С. Номенклатура |
|
Кол |
Количество в произвольной ед. измерения |
Число 8.2 |
+ |
Ед |
Единица измерения |
С. Единицы |
|
КолО |
Количество в основной ед. измерения |
Число 8.2 |
+,И |
Цена |
Цена поставки |
Число 7.2 |
+ |
Сумма |
Сумма документа |
Число 15.2 |
+, И |
-
Создать новый документ.
-
Заполнить свойства и реквизиты согласно таблицы.
-
Создать форму документа.
-
Редактировать форму накладной по аналогии с приходной накладной.
-
Поле реквизита "НомерДок" сделать недоступным для редактирования.
-
Формулы в реквизиты диалога ставить такие же, как и в приходной накладной. За исключением "Поставщик()", ее заменить на "Покупатель()". И убрать процедуру из колонки "Цена", эту колонку сделать недоступной для редактирования.
-
Процедуры в модуль документа занести из модуля формы приходной накладной. Только везде ЦенаП поменять на ЦенаР и поменять название процедуры "Поставщик()" на "ПокупатсльО", убрать процедуру "Цена()".
-
Текстовые поля с итогами по колонкам таблицы можно просто скопировать из формы документа "Приходная накладная".
Цена реализации зависит от даты, поэтому необходимо, чтобы при изменении даты документа цены в строках документа соответственно менялись.
-
Добавить функцию "ДатаДок()" в поле реквизита "ДатаДок".
В модуль формы добавить процедуру:
Процедура ДатаДок()
ВыбратьСтроки();
Пока ПолучитьСтроку()= 1 Цикл
Цена=Окр(Товар.ЦенаР.Получить(ДатаДок),2,1);
Сумма=Окр(КолО*Цена,2,1);
КонецЦикла;
КонецПроцедуры
При заполнении накладной надо помнить, что, сколько и на каком складе лежит. В 1С для такой ситуации есть специальный механизм подбора. Реализовать его необходимо в расходной накладной. Но сперва для подбора нужно создать особую форму списка справочника товаров.
-
Войти в окно редактирования свойств справочника Номенклатура.
-
Нажать [Формы списка >].
-
Выпадает список. Выбрать пункт "Редактировать".
-
Появилось окно редактирования списка форм списка справочника.
-
[Новый].
-
Ввести идентификатор "ДляПодбора". [ОК].
-
Курсор на новой форме списка "ДляПодбора".
-
Нажать [Для выбора].
-
Галочка во второй колонке переместилась, и встала напротив "ДляПодбора".
-
[Открыть].
-
В форме списка оставить только поля "Код" и "Наименование".
-
Через меню "Вставить" командой "Текст" выбрать элемент диалога текст для вставки.
-
Указать ему место для вставки в табличной части. Добавилась новая колонка. В ней будет выводиться остаток товаров на рабочую дату.
-
В свойствах этой колонки типа "Текст" написать заголовок "Ост".
-
В формулу написать функцию Ост().
-
Добавить в экранную форму поле ввода "Склад" типа С.Склады - остатки будут по конкретному складу. Это поле сделать недоступным.
-
В модуль формы списка добавить функцию:
Функция Ост()
ТекТовар=ТекущийЭлемент();
// Получаем текущий товар в строке
КолТов=Регистр.ОстаткиТоваров.СводныйОстаток(Склад,
ТекущийЭлемент()„ "Количество");
// Получаем суммарный остаток по ресурсу "Количество"
// по измерениям "Склад" и "Товар", по остальным измерениям
сум¬мируем
Если КолТов<=0 Тогда
Возврат("");
// если товара на складе нет в поле Ост вернем пустую строку Иначе
Возврат(КолТов);
// иначе вернем количество остатка
КонецЕсли;
КонецФункции
-
Вернуться к форме документа "Расходная накладная".
-
Добавить в экранную форму кнопку.
-
Заголовок будет "Подбор", формула-Подбор().
В модуль формы добавить две процедуры:
Процедура Подбор()
// Эта процедура запускается по нажагию кнопки [Подбор] От
крыть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 Тогда
// Проверяем, не проводится ли документ ранее точки ак
туальности итогов
РегОст.ВремснныйРасчет( I);
РассчитатьРегистрыНа(ТекущийДокумент());
КонецЕсли;
// Проверка на наличие на остатке ВыбратьСтроки(); Фла
гОтказа- 0;
Пока (ПолучитьСтроку()>0) Цикл
Остат-
РегОст.СводныйОстаток(Склад,Товар,,"Количество");
Если Остат<КолО Тогда
Сообщить("Нет товара № "
+СокрЛП(Товар,Код)+7"
ь" в колич. "' КолО ) " (имеется 'Остат+")");
ФлагОтказа=-1;
КонецЕсли;
КонецЦикла;
// аналогичную часть кода см. в отчете ОстаткиНаСкладе
Если ФлагОтказа-1 Тогда
НеПроводитьДокумент();
Возврат;
КонецЕсли;
// Это см. документы Приход/Расход денег
113
// По регистру взаиморасчетов Ре
гистр.Взаиморасчеты.Контрагент = Покупатель; Регистр.
Взаиморасчеты. Договор = Договор; Ре
гистр.Взаиморасчеты.Сумма = Итог("Сумма"); Ре
гистр.Взаиморасчеты.ФлагДвижения = 2; Ре
гистр.Взаиморасчеты. ДвижениеРасходВыполнить(); Ес
ли
Конст-
нта.МетодСписания=Перечисление.МетодСписания.ФИ
ФО Тогда // Здесь будет записана методика списания по
FIFO ИначеЕсли Кон
стан¬та.МетодСиисания=Перечисление.МетодСписания.
ЛИФО Тогда
// Здесь будет записана методика списания по LIFO Инна
чеЕсли Кон
стан¬та.МетодСписания=Перечисление.МетодСписания.
По_среднему Тогда
// Здесь будет записана методика списания по-среднему
КонецЕсли;
КонецПроцедуры
-
Начнем описание методик с FIFO;
-
Вместо строки "// Здесь будет записана методика списания по 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. Удал итьСтроки();
// удаляем строки из временной таблицы.
// Готовим ее под следующую строку документа
КонецЦикла;
-
Теперь опишем методику списания по LIFO..
-
Вместо строки "// Здесь будет записана методика списания по LIFO" напишем:
// Здесь будет записана методика списания по LIFO
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
КолСпис=КолО;
Запрос-"";
ТекстЗапроса—"':
Если ИтогиАктуальны()=0 Тогда
ТекстЗапроса="
|Период с ДатаДок по ДатаДок;"; КонецЕсли;
ТскстЗапроса=ТекстЗапроса+"
|РсгСклад=Регистр.ОстаткиТоваров.Склад;
|РегТовар=Регистр.ОетаткиТоваров.Товар;
|РегПартия=Регистр.ОстаткиТова ров. Партия;
|РегКолич=Регистр.ОстаткиТоваров. Количество;
|РегСумма=Регистр.Остатк-нТоваров.СуммаП;
(Группировка РегПартия Упорядочить по РегПар
тия.ДатаДок;
|Функция КолКопОст=КонОст(РегКолич);
|Функция СумКонОст=КонОст(РегС'умма);
|Условие (РегСклад=Склад);
|Условие (РегТовар=Товар);
Запрос~СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
Сообщить("Документ не проведен");
1 1е11роводнтьДокумент();
Возврат;
КонецЕсли;
Пока Запрос.Группировка("РегПартия",-])=1 Цикл // В мето
де Группировка флаг -I указывает, что сортировка по запросу
// идет в порядке убывания. Более поздние документы идут
первыми
Если КолСпис=0 Тогда
Прервать;
КонецЕсли;
ПартияСписания=Запрос. РегПартия; Если За
прос.КолКонОст>КолСпис Тогда С писывать=КолС п ис;
Стои-
мость~Окр((Запрос.СумКонОст/Запрос.КолКонОст)*Списыв
ать,2,1); Иначе Если Запрос. КолКонОст=КолСпис Тогда
Списы вать= Кол С п ис
Стоимость=Запрос. Су мКонОст;
ИначеЕсли Запрос.КолКонОст<КолСпис Тогда
Списывать=Запрос.КолКонОст;
Стоимость=Запрос.СумКонОст;
КонецЕсли;
Кол С пис—КолСпис-С писывать;
Регистр.ОстаткиТоваров.Склад = Склад;
Регистр.ОстаткиТоваров.Товар » Товар;
Регистр.ОстаткиТоваров.Партия » ПартияСписания;
Регистр.ОстаткиТоваров.Количество = Списывать;
Регистр. ОстаткиТоваров. СуммаП = Стоимость;
Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*Списывать,2Д);
Регистр.ОстаткиТоваров.ФлагДвижения = 1;
Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);
Регистр.ОстаткиТоваров. ДвижениеРасходВыполнить();
Регистр.Обороты Товаров.Склад = Склад;
Регистр.Обороты Товаров.Товар = Товар;
Регистр. ОборотыТоваров.Количество = Списывать;
Регистр.ОборотыТоваров.СуммаУ = Стоимость;
Регистр.ОборотыТоваров.ФлагДвижения = 1;
Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);
Регистр.ОборотыТоваров. ДвижениеВыполнить();
КонецЦикла;
КонецЦнкла;
-
Теперь опишем алгоритм списания по-среднему:
//Здесь будет записана методика списания по-среднему ВыбратьСт
роки(); Пока ПолучитьСтроку() = ] Цикл
КолОст=РегОст.СводныйОстаток(Склад,Товар„"Количество"); // По
лучаем суммарный остаток по указанным измерениям // по данному
ресурсу
СумОст=РегОст.СводныйОстаток(Склад,Товар„"СуммаП"); Це
нОст=Окр(Су мОст/К олОст,2,1);
Парт=ПолучитьПустоеЗначение("Документ.ПриходнаяНакладная");
// А это, что-бы заполнить хоть чем-нибудь измерение "Партия" Ре
гистр.ОстаткиТоваров.Склад = Склад; Ре
гистр.ОстаткиТоваров.Товар = Товар; Ре
гистр.ОстаткиТоваров.Партия = Парт; Ре
гистр.ОстаткиТоваров.Количество
= КолО; Регистр.ОстаткиТоваров.СуммаП = Окр(ЦенОст*КолО,2,1);
Ре
гистр.ОстаткиТоваров.СуммаД = Окр(Цена*КолО,2,1);
Регистр.Остатки Товаров.ФлагДвижения = 1;
Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);
Регистр.ОстаткиТоваров.ДвижениеРасходВыполнить();
Регистр.Обороты Товаров.Склад = Склад;
Регистр.ОборотыТоваров.Товар = Товар;
Регистр.Обороты Товаров.Количество = КолО;
Регистр.Обороты Товаров.СуммаУ = Окр(ЦенОст*КолО,2Л);
Регистр.Обороты Товаров.Флаг Движения = 1;
Регистр.Обороты Товаров. ПривязыватьСтроку(НомерСтроки);
Регистр.ОборотыТоваров. ДвижениеВыполнитьО;
КонецЦикла;
-
Подредактировать журнал "Накладные".
-
Изменить содержимое графы "Кол".
-
Добавить в выбранные значения графы "Доку- мент.РасходнаяНакладная.КолО".
-
Аналогично поступить и с графой "Сумма".
Документ "Расходная накладная" создан! Необходимо его проверить в работе. И посмотреть, как будет списываться товар при разных способах.