Этим документом
мы будем запускать в производство очередную партию комплектующих.
В наряде будет указано с какого склада брать заготовки, кто из работников
будет заниматься сборкой и, главное, какие изделия и в каком количестве
должны быть сделаны. Количество и ассортимент комплектующих мы будем
определять по справочнику Комплектация.
Проводка документа (Д 20 – К 10.2). Документ должен будет списать
со склада некоторое количество комплектующих, при этом списание
должно идти по методу FIFO, в первую очередь из более ранних накладных.
Документ будет помещен в специальный журнал.
Идентификатор: НарядНаСборку Журнал: НарядыНаСборку Нумератор: Нет Периодичность: Год Длина: 5 Тип: число Уникальность: да Автонумерация: да Может являться основанием для документа любого вида?: нет |
|||||
Проводить:
да Автоматическое удаление движений: да Автоматическая нумерация строк: да |
Бухгалтерский
учет: да Расчет: нет Оперативный учет: нет |
||||
Создавать операцию: Всегда Редактировать операцию: нет | |||||
Является основанием для |
Вводится на основании |
||||
Шапка |
|||||
Реквизит | Описание | ТипЗначения | Доп. |
||
Склад | С.Склады | ||||
Сборщик | С.Сотрудники | ||||
Таблица |
|||||
Реквизит | Описание | ТипЗначения | Доп. |
||
Изделие | С.Изделия | ||||
Кол | Число 5.0 | + |
В журнал добавим графу "Сборщик". Создаем форму документа.
Поля Валюта, ДатаКурса, Курс удаляем. Поле АвторДокумента делаем
недоступным. Добавляем кнопку [Заявка] с формулой Заявка(),
по этой кнопке мы будем распечатывать перечень входящих в изделия
комплектующих, с указанием общего количества.
В табличную часть добавим поле текст с функцией Ост(Склад,Изделие), эта колонка будет показывать, для какого количества
изделий хватит комплектующих (но, эта функция будет показывать только
возможное количество, она, разумеется, не учитывает возможность
участия комплектующего в разных изделиях). В поле табличной части
Кол добавляем процедуру Кол(), эта процедура
будет проверять, не превышает ли указанное количество изделий возможное,
исходя из запасов на складе. Еще раз подобную проверку мы будем
делать в модуле проведения.
В модуле формы документа пишем:
Процедура ВводНового()
Теперь пропишем процедуру проведения. Здесь у нас
будет формирование движения партий, но не по строкам документа,
а по комплектующим, определяемым через эти строки. Проводки будут
только одного типа (Д 20 – К 10.2). Здесь же будет проверка, не
запрашиваем ли мы комплектующих больше, чем есть на складе.
АвторДокумента=СокрЛП(ИмяПользователя());
ФирмаДокумента=Константа.ОснФирма;
Валюта=Константа.ОснВалюта;
ДатаКурса=ДатаДок;
Курс=1;
КонецПроцедуры
//==========================================================
Процедура ПриОткрытии()
ПриЗаписиПерепроводить(1);
КонецПроцедуры
//==========================================================
Процедура Заявка()
// Печать спецификации
ТабЗн=СоздатьОбъект("ТаблицаЗначений");
ТабЗн.НоваяКолонка("Ком","Справочник.Комплектующие");
ТабЗн.НоваяКолонка("Кол","Число",12,0);
СпрКом=СоздатьОбъект("Справочник.Комплектация");
// Подчиненный справочнику Изделия справочник
Комплектация
ВыбратьСтроки();
// Обходим строки документа
Пока ПолучитьСтроку()=1 Цикл
СпрКом.ИспользоватьВладельца(Изделие);
// Выбираем комплектующие по изделию
СпрКом.ВыбратьЭлементы();
// Обходим справочник с составом комплектов
Пока СпрКом.ПолучитьЭлемент()=1
Цикл
ТабЗн.НоваяСтрока();
ТабЗн.Ком=СпрКом.ТекущийЭлемент().Комплектующее;
// Это мы определили, что входит в комплект
ТабЗн.Кол=Кол;
// И сколько
КонецЦикла;
СпрКом.ИспользоватьВладельца("");
КонецЦикла;
СпрКом="";
Таб=СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("");
Таб.ВывестиСекцию("Шапка");
ТабЗн.Свернуть("1","2");
// Суммируем строки с одинаковыми комплектующими
ТабЗн.Сортировать("1");
ТабЗн.ВыбратьСтроки();
Стр=1;
Пока ТабЗн.ПолучитьСтроку()=1 Цикл
Комп=ТабЗн.Ком;
НазвРодителя=СокрЛП(Комп.Родитель.Наименование);
Поз1=Найти(НазвРодителя,"(");
Поз2=Найти(НазвРодителя,")");
ГОСТ=Сред(НазвРодителя,Поз1+1,Поз2-Поз1-1);
Ком=СокрЛП(Комп.Наименование)+" "+ГОСТ;
Колич=ТабЗн.Кол;
Таб.ВывестиСекцию("Строка");
Стр=Стр+1;
КонецЦикла;
Таб.ТолькоПросмотр(1);
Таб.ПараметрыСтраницы(1,100,1);
Таб.Показать("");
КонецПроцедуры
//==========================================================
Функция Ост(Скл,Изд)
// Функция с двумя параметрами на входе:
Склад и Изделие
СпЗн=СоздатьОбъект("СписокЗначений");
СпрКом=СоздатьОбъект("Справочник.Комплектация");
БухИтоги=СоздатьОбъект("БухгалтерскиеИтоги");
БухИтоги.ИспользоватьПланСчетов(ПланыСчетов.Наш);
БухИтоги.ИспользоватьРазделительУчета(ФирмаДокумента);
СпрКом.ИспользоватьВладельца(Изд);
СпрКом.ВыбратьЭлементы();
// Обходим все комплектующие, входящие в
изделие
Пока СпрКом.ПолучитьЭлемент()=1 Цикл
СКом=СпрКом.ТекущийЭлемент();
Ком=СКом.Комплектующее;
БухИтоги.ИспользоватьСубконто(ВидыСубконто.МестоХранения,Скл,2);
БухИтоги.ИспользоватьСубконто(ВидыСубконто.Комплектующее,Ком,2);
// Отбираем по указанному складу и текущей комплектующей
БухИтоги.ВыполнитьЗапрос(,ДатаДок,"10.2");
КолКом=БухИтоги.СКД(3);
// Выясняем, сколько штук этих комплектующих
еще есть на складе
СпЗн.ДобавитьЗначение(КолКом);
// Добавляем в список
КонецЦикла;
СпрКом="";
ИОст=0;
// Ищем минимальное значение в списке
Для ЧЦ=1 По СпЗн.РазмерСписка() Цикл
ТТТ="";
Если ЧЦ=1 Тогда
КолСп=СпЗн.ПолучитьЗначение(ЧЦ,ТТТ);
ИОст=КолСп;
Иначе
КолСп=СпЗн.ПолучитьЗначение(ЧЦ,ТТТ);
Если ИОст>КолСп Тогда
ИОст=КолСп;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат(ИОст);
// Выдаем это минимальное значение
КонецФункции
//==========================================================
Процедура Кол()
ОстКомпл=Ост(Склад,Изделие);
// Выясняем остаток на складе
Если Кол>ОстКомпл Тогда
// Если запросили больше
Кол=ОстКомпл;
// Даем сколько есть
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроведения()
Вроде бы все. Но этот механизм не будет правильно
списывать партии в том случае, если в документе будут разные изделия,
содержащие одинаковые комплектующие. Это показывает разницу в алгоритмическом
подходе при использовании компонент Оперативный учет и Бухгалтерский
учет. В Оперативном учете можно проводя строки документа все время
отслеживать меняющиеся остатки, а в Бухгалтерском учете операция
формируется в самом конце.
Если Склад.Выбран()=0 Тогда
Сообщить("Документ Наряд на сборку №"+НомерДок+"
|от "+ДатаДок+" не проведен.
|Не выбран склад заготовок");
НеПроводитьДокумент();
Возврат;
КонецЕсли;
Если Сборщик.Выбран()=0 Тогда
Сообщить("Документ Наряд на сборку №"+НомерДок+"
|от "+ДатаДок+" не проведен.
|Не указан сборщик");
НеПроводитьДокумент();
Возврат;
КонецЕсли;
// Это были обычные проверки
ТабЗн=СоздатьОбъект("ТаблицаЗначений");
ТабЗн.НоваяКолонка("Ком","Справочник.Комплектующие");
ТабЗн.НоваяКолонка("Кол","Число",12,0);
СпрКом=СоздатьОбъект("Справочник.Комплектация");
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
СпрКом.ИспользоватьВладельца(Изделие);
СпрКом.ВыбратьЭлементы();
Пока СпрКом.ПолучитьЭлемент()=1 Цикл
ТабЗн.НоваяСтрока();
ТабЗн.Ком=СпрКом.ТекущийЭлемент().Комплектующее;
ТабЗн.Кол=Кол;
КонецЦикла;
СпрКом.ИспользоватьВладельца("");
КонецЦикла;
БухИтоги=СоздатьОбъект("БухгалтерскиеИтоги");
БухИтоги.ИспользоватьПланСчетов(ПланыСчетов.Наш);
БухИтоги.ИспользоватьРазделительУчета(ФирмаДокумента);
ФлагОтказа=0;
ТабЗн.Свернуть("1","2");
ТабЗн.ВыбратьСтроки();
Пока ТабЗн.ПолучитьСтроку()=1 Цикл
Ком=ТабЗн.Ком;
Колич=ТабЗн.Кол;
БухИтоги.ИспользоватьСубконто(ВидыСубконто.МестоХранения,Склад,2);
БухИтоги.ИспользоватьСубконто(ВидыСубконто.Комплектующее,Ком,2);
БухИтоги.ВыполнитьЗапрос(,ДатаДок,"10.2");
КолКом=БухИтоги.СКД(3);
Если Колич>КолКом Тогда
ФлагОтказа=1;
Сообщить(Строка(Ком));
КонецЕсли;
КонецЦикла;
// Если посмотреть модуль документа, это
похоже на процедуру Заявка()
Если ФлагОтказа=1 Тогда
Сообщить("Документ Наряд на сборку №"+НомерДок+"
|от "+ДатаДок+" не проведен.
|Заказ по вышеперечисленным позициям
|превышает остаток на складе");
НеПроводитьДокумент();
Возврат;
КонецЕсли;
// Отказ от проведения по причине нехватки
комплектующих
ТабЗн.УдалитьСтроки();
ТабЗн="";
ТабПар=СоздатьОбъект("ТаблицаЗначений");
ТабПар.НоваяКолонка("Док","Документ.ПриходнаяНакладная");
ТабПар.НоваяКолонка("Кол","Число",10,0);
ТабПар.НоваяКолонка("Сум","Число",14,2);
СуммаОпер=0;
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл // По Изделию
// Обходим строки
НС=НомерСтроки;
Изд=Изделие;
СпрКом.ИспользоватьВладельца(Изделие);
СпрКом.ВыбратьЭлементы();
Пока СпрКом.ПолучитьЭлемент()=1 Цикл // По Комплектующей
// Обходим комплектующие
Колич=Кол;
Ком=СпрКом.ТекущийЭлемент().Комплектующее;
БухИтоги.ИспользоватьСубконто(ВидыСубконто.МестоХранения,Склад,2);
БухИтоги.ИспользоватьСубконто(ВидыСубконто.Комплектующее,Ком,2);
БухИтоги.ИспользоватьСубконто(ВидыСубконто.ПриходнаяНакладная,,1);
БухИтоги.ВыполнитьЗапрос(,ДатаДок,"10.2");
ТабПар.УдалитьСтроки();
БухИтоги.ВыбратьСубконто(3);
// Выбираем только третье!!! субконто
Пока БухИтоги.ПолучитьСубконто(3)=1
Цикл
// Определяем партии
ДокП=БухИтоги.Субконто(3);
КолП=БухИтоги.СКД(3);
СумП=БухИтоги.СКД(1);
ТабПар.НоваяСтрока();
ТабПар.Док=ДокП;
ТабПар.Кол=КолП;
ТабПар.Сум=СумП;
КонецЦикла;
ТабПар.Сортировать("1+");
ТабПар.ВыбратьСтроки();
Пока ТабПар.ПолучитьСтроку()=1 Цикл // По Партии
// Обходим партии
ДокП=ТабПар.Док;
КолП=ТабПар.Кол;
СумП=ТабПар.Сум;
Если Колич>КолП Тогда
ПривязыватьСтроку(НС);
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("20",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("10.2",ПланыСчетов.Наш);
Операция.Дебет.ВидЗатрат = Перечисление.ВидыЗатрат.НаКомплектующие;
Операция.Дебет.Изделие = Изделие;
Операция.Дебет.НарядНаКомплектацию
= ТекущийДокумент();
Операция.Кредит.МестоХранения
= Склад;
Операция.Кредит.Комплектующее
= Ком;
Операция.Кредит.ПриходнаяНакладная
= ДокП;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "Передача
комплектующих на сборку";
Операция.НомерЖурнала = "10";
Операция.Сумма = СумП;
Операция.Количество = КолП;
Колич=Колич-КолП;
СуммаОпер=СуммаОпер+СумП;
// Накапливаем сумму операции по каждой
проводке
Иначе
СумО=Окр(Колич*(СумП/КолП),2,1);
// Определяем сумму остатка через цену партии
ПривязыватьСтроку(НС);
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("20",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("10.2",ПланыСчетов.Наш);
Операция.Дебет.ВидЗатрат = Перечисление.ВидыЗатрат.НаКомплектующие;
Операция.Дебет.Изделие = Изделие;
Операция.Дебет.НарядНаКомплектацию
= ТекущийДокумент();
Операция.Кредит.МестоХранения
= Склад;
Операция.Кредит.Комплектующее
= Ком;
Операция.Кредит.ПриходнаяНакладная
= ДокП;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "Передача
комплектующих на сборку";
Операция.НомерЖурнала = "10";
Операция.Сумма = СумО;
Операция.Количество = Колич;
СуммаОпер=СуммаОпер+СумО;
// Накапливаем сумму операции по каждой
проводке
Прервать;
// Все кончилось, больше партии по этому
комплектующему обходить незачем
КонецЕсли;
КонецЦикла; // По Партии
КонецЦикла; // По Комплектующей
КонецЦикла; // По Изделию
Операция.Содержание = "Запуск производства";
Операция.СуммаОперации = СуммаОпер;
Операция.Автор = АвторДокумента;
Операция.Записать();
КонецПроцедуры
Например, в изделии А (10 шт.) есть комплектующая К, и в изделии
Б (10 шт.) есть комплектующая К. Суммарно изделие К должно быть
списано из партии 1 и из партии 2 по 10 штук, но этот механизм дважды
спишет К из партии 1. А это неправильно. Перепишем эту процедуру
заново:
Процедура ОбработкаПроведения()
Новый вариант хотя и сложнее, но работает правильно.
И даже быстрее, так как обращений к Бухгалтерским итогам будет меньше
или столько же, ведь они вынесены за цикл по изделиям.
Если Склад.Выбран()=0 Тогда
Сообщить("Документ Наряд на сборку №"+НомерДок+" от
"+ДатаДок+"
|не проведен.
|Не выбран склад заготовок");
НеПроводитьДокумент();
Возврат;
КонецЕсли;
Если Сборщик.Выбран()=0 Тогда
Сообщить("Документ Наряд на сборку №"+НомерДок+" от
"+ДатаДок+"
|не проведен.
|Не указан сборщик");
НеПроводитьДокумент();
Возврат;
КонецЕсли;
ТабЗн=СоздатьОбъект("ТаблицаЗначений");
ТабЗн.НоваяКолонка("Ком","Справочник.Комплектующие");
ТабЗн.НоваяКолонка("Кол","Число",12,0);
СпрКом=СоздатьОбъект("Справочник.Комплектация");
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
СпрКом.ИспользоватьВладельца(Изделие);
СпрКом.ВыбратьЭлементы();
Пока СпрКом.ПолучитьЭлемент()=1 Цикл
ТабЗн.НоваяСтрока();
ТабЗн.Ком=СпрКом.ТекущийЭлемент().Комплектующее;
ТабЗн.Кол=Кол;
КонецЦикла;
СпрКом.ИспользоватьВладельца("");
КонецЦикла;
БухИтоги=СоздатьОбъект("БухгалтерскиеИтоги");
БухИтоги.ИспользоватьПланСчетов(ПланыСчетов.Наш);
БухИтоги.ИспользоватьРазделительУчета(ФирмаДокумента);
ФлагОтказа=0;
ТабЗн.Свернуть("1","2");
ТабЗн.ВыбратьСтроки();
Пока ТабЗн.ПолучитьСтроку()=1 Цикл
Ком=ТабЗн.Ком;
Колич=ТабЗн.Кол;
БухИтоги.ИспользоватьСубконто(ВидыСубконто.МестоХранения,Склад,2);
БухИтоги.ИспользоватьСубконто(ВидыСубконто.Комплектующее,Ком,2);
БухИтоги.ВыполнитьЗапрос(,ДатаДок,"10.2");
КолКом=БухИтоги.СКД(3);
Если Колич>КолКом Тогда
ФлагОтказа=1;
Сообщить(Строка(Ком));
КонецЕсли;
КонецЦикла;
Если ФлагОтказа=1 Тогда
Сообщить("Документ Наряд на сборку №"+НомерДок+" от
"+ДатаДок+"
|не проведен.
|Заказ по вышеперечисленным позициям
|превышает остаток на складе");
НеПроводитьДокумент();
Возврат;
КонецЕсли;
// Без изменений
ТабКом=СоздатьОбъект("ТаблицаЗначений");
ТабКом.НоваяКолонка("Ком","Справочник.Комплектующие");
ТабКом.НоваяКолонка("Док","Документ.ПриходнаяНакладная");
ТабКом.НоваяКолонка("Кол","Число",10,0);
ТабКом.НоваяКолонка("Сум","Число",14,2);
// В этой таблице мы будем хранить список
комплектующих в разрезе партий
// в количестве, достаточном для списания
ТабЗн.Сортировать("1+");
ТабЗн.ВыбратьСтроки();
Пока ТабЗн.ПолучитьСтроку()=1 Цикл
КомП=ТабЗн.Ком;
КолКом=ТабЗн.Кол;
БухИтоги.ИспользоватьСубконто(ВидыСубконто.МестоХранения,Склад,2);
БухИтоги.ИспользоватьСубконто(ВидыСубконто.Комплектующее,КомП,2);
БухИтоги.ИспользоватьСубконто(ВидыСубконто.ПриходнаяНакладная,,1);
БухИтоги.ВыполнитьЗапрос(,ДатаДок,"10.2");
БухИтоги.ВыбратьСубконто(3);
Пока БухИтоги.ПолучитьСубконто(3)=1 Цикл
ДокП=БухИтоги.Субконто(3);
КолП=БухИтоги.СКД(3);
СумП=БухИтоги.СКД(1);
Если КолКом>0 Тогда
// Заполняем таблицу по комплектующим-партиям
ТабКом.НоваяСтрока();
ТабКом.Ком=КомП;
ТабКом.Док=ДокП;
ТабКом.Кол=КолП;
ТабКом.Сум=СумП;
КолКом=КолКом-КолП;
Иначе
Прервать;
// Чтобы не выбирать лишних партий
КонецЕсли;
КонецЦикла;
КонецЦикла;
ТабЗн.УдалитьСтроки();
ТабЗн="";
ТабКом.Сортировать("1+,2+");
СуммаОпер=0;
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл // По Изделию
НС=НомерСтроки;
Изд=Изделие;
СпрКом.ИспользоватьВладельца(Изделие);
СпрКом.ВыбратьЭлементы();
Пока СпрКом.ПолучитьЭлемент()=1 Цикл // По Комплектующей
Колич=Кол;
КомТ=СпрКом.ТекущийЭлемент().Комплектующее;
ТабКом.ВыбратьСтроки();
Пока ТабКом.ПолучитьСтроку()=1 Цикл // По Партии
// Выбираем партии из динамической таблицы!
КомП=ТабКом.Ком;
Если КомП<>КомТ Тогда
Продолжить;
// Запрашиваемая комплектующая не соответствует строке в таблицу, идем
дальше
КонецЕсли;
ДокП=ТабКом.Док;
КолП=ТабКом.Кол;
Если КолП=0 Тогда
// Партия уже опустошена, пропускаем
Продолжить;
КонецЕсли;
СумП=ТабКом.Сум;
СтрП=ТабКом.НомерСтроки;
Если Колич>КолП Тогда
ПривязыватьСтроку(НС);
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("20",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("10.2",ПланыСчетов.Наш);
Операция.Дебет.ВидЗатрат = Перечисление.ВидыЗатрат.НаКомплектующие;
Операция.Дебет.Изделие = Изделие;
Операция.Дебет.НарядНаКомплектацию
= ТекущийДокумент();
Операция.Кредит.МестоХранения
= Склад;
Операция.Кредит.Комплектующее
= КомП;
Операция.Кредит.ПриходнаяНакладная
= ДокП;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "Передача
комплектующих на сборку";
Операция.НомерЖурнала = "10";
Операция.Сумма = СумП;
Операция.Количество = КолП;
Колич=Колич-КолП;
СуммаОпер=СуммаОпер+СумП;
ТабКом.УстановитьЗначение(СтрП,"Кол",0);
ТабКом.УстановитьЗначение(СтрП,"Сум",0);
// Опустошаем партию полностью
Иначе
СумО=Окр(Колич*(СумП/КолП),2,1);
ПривязыватьСтроку(НС);
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("20",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("10.2",ПланыСчетов.Наш);
Операция.Дебет.ВидЗатрат = Перечисление.ВидыЗатрат.НаКомплектующие;
Операция.Дебет.Изделие = Изделие;
Операция.Дебет.НарядНаКомплектацию
= ТекущийДокумент();
Операция.Кредит.МестоХранения
= Склад;
Операция.Кредит.Комплектующее
= КомП;
Операция.Кредит.ПриходнаяНакладная
= ДокП;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "Передача
комплектующих на сборку";
Операция.НомерЖурнала = "10";
Операция.Сумма = СумО;
Операция.Количество = Колич;
СуммаОпер=СуммаОпер+СумО;
ТабКом.УстановитьЗначение(СтрП,"Кол",КолП-Колич);
ТабКом.УстановитьЗначение(СтрП,"Сум",СумП-СумО);
// Опустошаем партию частично и переходим к следующей комплектующей
Прервать;
КонецЕсли;
КонецЦикла; // По Партии
КонецЦикла; // По Комплектующей
КонецЦикла; // По Изделию
Операция.Содержание = "Запуск производства";
Операция.СуммаОперации = СуммаОпер;
Операция.Автор = АвторДокумента;
Операция.Записать();
КонецПроцедуры
Проверим работу нашего документа с разными наборами данных.
Предыдущим документом
мы запустили производство некоторого количества изделий. И вот,
наши работнички все сделали. Нам надо зафиксировать факт сдачи готовой
продукции на склад и, разумеется, начислить работникам зарплату
за труд, вложенный в изготовление материальных ценностей. Для этой
сложной задачи мы создадим очередной документ – Накладная на выпуск
из производства.
Проводки по документу (Д 20 – К 70) – начисление зарплаты по факту
выпуска продукции, (Д 40 – К 20) – сам выпуск продукции на склад.
Документ будет закрывать производственные партии, сформированные
нарядами на сборку. Соответственно работников мы будем брать из
этих нарядов, оттуда же мы возьмем и перечень выпускаемых изделий.
Выпуск продукции будет осуществляться на конкретный склад.
Сведем все сведения по документу в таблицу:
Идентификатор: НакладнаяНаВыпуск Журнал: ВыпускИзПроизводства Нумератор: Нет Периодичность: Год Длина: 5 Тип: число Уникальность: да Автонумерация: да Может являться основанием для документа любого вида?: нет |
|||||
Проводить: да Автоматическое удаление движений: да Автоматическая нумерация строк: да |
Бухгалтерский
учет: да Расчет: нет Оперативный учет: нет |
||||
Создавать операцию: Всегда Редактировать операцию: нет | |||||
Является основанием для |
Вводится на основании |
||||
Шапка |
|||||
Реквизит | Описание | ТипЗначения | Доп. |
||
Склад | С.Склады | ||||
Таблица |
|||||
Реквизит | Описание | ТипЗначения | Доп. |
||
Наряд | Д.НарядНаСборку |
Процедура ПоИзделиям() Далее
Процедура ПоСборщикам() Далее
// Это мы объявили две процедуры, они будут
описаны ниже
//==========================================================
Процедура ВводНового()
АвторДокумента=СокрЛП(ИмяПользователя());
ФирмаДокумента=Константа.ОснФирма;
Валюта=Константа.ОснВалюта;
ДатаКурса=ДатаДок;
Курс=1;
КонецПроцедуры
//==========================================================
Процедура ПриОткрытии()
ПриЗаписиПерепроводить(1);
КонецПроцедуры
//==========================================================
Процедура Печать()
СпЗн=СоздатьОбъект("СписокЗначений");
СпЗн.ДобавитьЗначение(1,"ПоИзделиям");
СпЗн.ДобавитьЗначение(2,"ПоСборщикам");
// Создали список значений и заполнили его
Значение=0;
Рез=СпЗн.ВыбратьЗначение(Значение,"",1,,1);
// Предлагаем выбрать из списка значение
// Список значения появится в виде выпадающей менюшки
Если Рез=1 Тогда
Если Значение=1 Тогда
ПоИзделиям();
Иначе
ПоСборщикам();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//==========================================================
Процедура ПоИзделиям()
// Распечатаем список выпускаемых изделий
ТабИзд=СоздатьОбъект("ТаблицаЗначений");
ТабИзд.НоваяКолонка("Изд","Справочник.Изделия");
ТабИзд.НоваяКолонка("Кол","Число",12,0);
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
ДокН=Наряд;
// По каждому наряду
ДокН.ВыбратьСтроки();
Пока ДокН.ПолучитьСтроку()=1 Цикл
// По каждой строке наряда
ТабИзд.НоваяСтрока();
ТабИзд.Изд=ДокН.Изделие;
ТабИзд.Кол=ДокН.Кол;
КонецЦикла;
КонецЦикла;
ТабИзд.Свернуть("1","2");
ТабИзд.Сортировать("1+");
Таб=СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("ПоИзделиям");
Таб.ВывестиСекцию("Шапка");
ТабИзд.ВыбратьСтроки();
Пока ТабИзд.ПолучитьСтроку()=1 Цикл
Стр=ТабИзд.НомерСтроки;
Изд=ТабИзд.Изд;
Кол=ТабИзд.Кол;
Таб.ВывестиСекцию("Строка");
КонецЦикла;
Таб.ТолькоПросмотр(1);
Таб.ПараметрыСтраницы(1,100,1);
Таб.Показать("");
КонецПроцедуры
//==========================================================
Процедура ПоСборщикам()
ТабСбр=СоздатьОбъект("ТаблицаЗначений");
ТабСбр.НоваяКолонка("Сбор","Справочник.Сотрудники");
ТабСбр.НоваяКолонка("Сум","Число",14,2);
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
ДокН=Наряд;
ДокН.ВыбратьСтроки();
Пока ДокН.ПолучитьСтроку()=1 Цикл
ТабСбр.НоваяСтрока();
ТабСбр.Сбор=ДокН.Сборщик;
Рас=ДокН.Изделие.Расценка;
Кол=ДокН.Кол;
ТабСбр.Сум=Окр(Рас*Кол,2,1);
КонецЦикла;
КонецЦикла;
ТабСбр.Свернуть("1","2");
ТабСбр.Сортировать("1+");
Таб=СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("ПоСборщикам");
Таб.ВывестиСекцию("Шапка");
ТабСбр.ВыбратьСтроки();
Пока ТабСбр.ПолучитьСтроку()=1 Цикл
Стр=ТабСбр.НомерСтроки;
Сбор=ТабСбр.Сбор;
Сум=ТабСбр.Сум;
Таб.ВывестиСекцию("Строка");
КонецЦикла;
Таб.ТолькоПросмотр(1);
Таб.ПараметрыСтраницы(1,100,1);
Таб.Показать("");
КонецПроцедуры
Создадим две таблицы, одна будет называться "ПоИзделиям",
вторая "ПоСборщикам":Процедура ОбработкаПроведения()
Если Склад.Выбран()=0 Тогда
Сообщить("Документ Наряд на сборку №"+НомерДок+" от
"+ДатаДок+"
|не проведен.
|Не выбран склад заготовок");
НеПроводитьДокумент();
Возврат;
КонецЕсли;
БухИтоги=СоздатьОбъект("БухгалтерскиеИтоги");
БухИтоги.ИспользоватьПланСчетов(ПланыСчетов.Наш);
БухИтоги.ИспользоватьРазделительУчета(ФирмаДокумента);
СумО=0;
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
ДокН=Наряд;
ДокН.ВыбратьСтроки();
Пока ДокН.ПолучитьСтроку()=1 Цикл
// По каждой строке наряда
Изд=ДокН.Изделие;
Кол=ДокН.Кол;
Сбр=ДокН.Сборщик;
Рас=ДокН.Изделие.Расценка;
СумС=Окр(Рас*Кол,2,1);
БухИтоги.ИспользоватьСубконто(ВидыСубконто.ВидЗатрат,Перечисление.
ВидыЗатрат.НаКомплектующие,2);
БухИтоги.ИспользоватьСубконто(ВидыСубконто.Изделие,Изд,2);
БухИтоги.ИспользоватьСубконто(ВидыСубконто.НарядНаКомплектацию,
ДокН,2);
БухИтоги.ВыполнитьЗапрос(,ДатаДок,"20");
СумК=БухИтоги.СКД(1);
// Определяем сумму на комплектующие по конкретному
изделию
// из конкретного наряда
ПривязыватьСтроку(НомерСтроки);
// Этой преводкой начислим зарплату
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("20",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("70",ПланыСчетов.Наш);
Операция.Дебет.ВидЗатрат = Перечисление.ВидыЗатрат.НаЗарплату;
Операция.Дебет.Изделие = Изд;
Операция.Дебет.НарядНаКомплектацию = ДокН;
Операция.Кредит.Сотрудник = Сбр;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "Начислена оплата труда";
Операция.НомерЖурнала = "10";
Операция.Сумма = СумС;
Операция.Количество = Кол;
ПривязыватьСтроку(НомерСтроки);
// Этой проводкой спишем на 40ой счет затраты на комплектующие
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("40",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("20",ПланыСчетов.Наш);
Операция.Дебет.МестоХранения = Склад;
Операция.Дебет.Изделие = Изд;
Операция.Дебет.НакладнаяНаВыпуск = ТекущийДокумент();
Операция.Кредит.ВидЗатрат = Перечисление.ВидыЗатрат.НаКомплектующие;
Операция.Кредит.Изделие = Изд;
Операция.Кредит.НарядНаКомплектацию = ДокН;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "Передача на склад готовой
продукции";
Операция.НомерЖурнала = "10";
Операция.Сумма = СумК;
Операция.Количество = Кол;
СумО=СумО+СумК;
ПривязыватьСтроку(НомерСтроки);
// Этой проводкой спишем на 40ой счет затраты
на зарплату
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("40",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("20",ПланыСчетов.Наш);
Операция.Дебет.МестоХранения = Склад;
Операция.Дебет.Изделие = Изд;
Операция.Дебет.НакладнаяНаВыпуск = ТекущийДокумент();
Операция.Кредит.ВидЗатрат = Перечисление.ВидыЗатрат.НаЗарплату;
Операция.Кредит.Изделие = Изд;
Операция.Кредит.НарядНаКомплектацию = ДокН;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "Передача на склад готовой
продукции";
Операция.НомерЖурнала = "10";
Операция.Сумма = СумС;
Операция.Количество = 0;
СумО=СумО+СумС;
КонецЦикла;
КонецЦикла;
Операция.Содержание = "Выпуск из производства";
Операция.СуммаОперации = СумО;
Операция.Автор = АвторДокумента;
Операция.Записать();
КонецПроцедуры
Проверяем работу документа.
Товар поступил
на склад, и это хорошо. Теперь мы можем продать что-нибудь ненужное.
А чтобы продать что-нибудь ненужное нам нужно иметь расходную накладную.
Проводок в расходной накладной будет богато:
(Д 90.2 – К 40) – списание товара со склада по себестоимости,
(Д 90.3 – К 68.1) – учет НДС,
(Д 90.9 – К 99) – учет прибыли(убытка),
(Д 90.1 – К 90.2) – определение выручки,
(Д 90.1 – К 90.3) – определение выручки,
(Д 90.1 – К 90.9) – определение выручки,
(Д 62 – К 90.1) – начисление долга на покупателя.
Проведем анализ счетов на предмет субконто, по ним мы сможем определить
требуемые реквизиты:
Идентификатор: РасходнаяНакладная Журнал: РасходныеНакладные Нумератор: Нет Периодичность: Год Длина: 5 Тип: число Уникальность: да Автонумерация: да Может являться основанием для документа любого вида?: нет |
|||||
Проводить: да Автоматическое удаление движений: да Автоматическая нумерация строк: да |
Бухгалтерский
учет: да Расчет: нет Оперативный учет: нет |
||||
Создавать операцию: Всегда Редактировать операцию: нет | |||||
Является основанием для |
Вводится на основании |
||||
Шапка |
|||||
Реквизит | Описание | ТипЗначения | Доп. |
||
Склад | С.Склады | ||||
Покупатель | С.Контрагенты | ||||
Таблица |
|||||
Реквизит | Описание | ТипЗначения | Доп. |
||
Товар | С.Изделия | ||||
Кол | Число 5.0 | +, И | |||
ЦенаБНДС | цена без НДС | Число 7.2 | + | ||
ЦенаСНДС | цена с НДС | Число 7.2 | + | ||
СуммаБНДС | сумма без НДС | Число 13.2 | +, И | ||
СуммаНДС | сумма НДС | Число 13.2 | +, И | ||
СуммаСНДС | сумма с НДС | Число 13.2 | +, И |
Укажем этот
документ как тип Субконто РасходнаяНакладная.
Создадим и журнал с двумя графами – Кол и Сум.
Перейдем к редактированию формы документа.
Поля АвторДокумента, Курс делаем недоступными. В полях Валюта и
ДатаКурса пишем формулу Валюта(). В таблице
поля ЦенаБНДС, ЦенаСНДС, СуммаБНДС, СуммаНДС, СуммаСНДС делаем недоступными.
В поле таблицы Товар добавляем формулу Товар(). В поле таблицы Кол добавляем формулу Кол(). Под табличной частью вставляем элементы диалога текст с формулами
для показа итогов по Кол, СуммаБНДС, СуммаСНДС. В табличную часть
вставляем текст с формулой Ост(Склад,Товар).
В модуль формы документа пишем:
Перем СтВалюта;
При проведении этого документа у нас, во-первых, будет
задействована многострочная часть, во-вторых, списание по методу
FIFO (мы воспользуемся алгоритмом №2 из документа НарядНаСборку),
в-третьих большое количество проводок. Все это несколько усложнит
код, но не намного. Пишем процедуру проведения.
Перем СтДатаКурса;
Перем СтКурс;
//==========================================================
Процедура ВводНового()
АвторДокумента=СокрЛП(ИмяПользователя());
ФирмаДокумента=Константа.ОснФирма;
Валюта=Константа.ОснВалюта;
ДатаКурса=ДатаДок;
Курс=1;
СтВалюта=Валюта;
СтДатаКурса=ДатаКурса;
СтКурс=Курс;
Покупатель = Константа.ОснПокупатель;
КонецПроцедуры
//==========================================================
Процедура ПриОткрытии()
СтВалюта=Валюта;
СтДатаКурса=ДатаКурса;
СтКурс=Курс;
ПриЗаписиПерепроводить(1);
КонецПроцедуры
//==========================================================
Процедура Валюта()
КурсС=СтКурс;
КратС=СтВалюта.Кратность;
КурсН=Валюта.Курс.Получить(ДатаКурса);
КратН=Валюта.Кратность;
Коэфф=Окр((КурсС*КратН)/(КурсН*КратС),6,1);
// переводим в валюту документа
Курс=КурсН;
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
ЦенаБНДС=Окр(ЦенаБНДС*Коэфф,2,1);
ЦенаСНДС=Окр(ЦенаСНДС*Коэфф,2,1);
СуммаБНДС=Окр(ЦенаБНДС*Кол,2,1);
СуммаСНДС=Окр(ЦенаСНДС*Кол,2,1);
СуммаНДС=СуммаСНДС-СуммаБНДС;
КонецЦикла;
СтВалюта=Валюта;
СтДатаКурса=ДатаКурса;
СтКурс=Курс;
КонецПроцедуры
//==========================================================
Процедура Товар()
ЦенаБНДС=Товар.Цена.Получить(ДатаДок);
ЦенаСНДС=Окр(ЦенаБНДС*(1+(Товар.НДС.Значение/100)),2,1);
СуммаБНДС=Окр(ЦенаБНДС*Кол,2,1);
СуммаСНДС=Окр(ЦенаСНДС*Кол,2,1);
СуммаНДС=СуммаСНДС-СуммаБНДС;
КонецПроцедуры
//==========================================================
Функция Ост(Скл,Тов)
БухИтоги=СоздатьОбъект("БухгалтерскиеИтоги");
БухИтоги.ИспользоватьПланСчетов(ПланыСчетов.Наш);
БухИтоги.ИспользоватьРазделительУчета(ФирмаДокумента);
БухИтоги.ИспользоватьСубконто(ВидыСубконто.МестоХранения,Скл,2);
БухИтоги.ИспользоватьСубконто(ВидыСубконто.Изделие,Тов,2);
БухИтоги.ВыполнитьЗапрос(,ДатаДок,"40");
ИОст=БухИтоги.СКД(3);
Возврат(ИОст);
КонецФункции
//==========================================================
Процедура Кол()
ОстИзд=Ост(Склад,Товар);
Если Кол>ОстИзд Тогда
Кол=ОстИзд;
КонецЕсли;
СуммаБНДС=Окр(ЦенаБНДС*Кол,2,1);
СуммаСНДС=Окр(ЦенаСНДС*Кол,2,1);
СуммаНДС=СуммаСНДС-СуммаБНДС;
КонецПроцедуры
// В общем, ничего нового...
Процедура ОбработкаПроведения()
Ну, вот, с расходной накладной разобрались. Главное
не запутаться в проводках и не забыть, что если оба счета не имеют
количественного учета в проводке не должно быть ссылки на количество.
Иначе программа будет ругаться при проведении документа. Проверьте,
как работает этот документ.
Если Склад.Выбран()=0 Тогда
Сообщить("Документ Расходная накладная №"+НомерДок+"
от "+ДатаДок+"
|не проведен.
|Не выбран склад ");
НеПроводитьДокумент();
Возврат;
КонецЕсли;
Если Покупатель.Выбран()=0 Тогда
Сообщить("Документ Расходная накладная №"+НомерДок+"
от "+ДатаДок+"
|не проведен.
|Не указан покупатель");
НеПроводитьДокумент();
Возврат;
КонецЕсли;
ТабЗн=СоздатьОбъект("ТаблицаЗначений");
ВыгрузитьТабличнуюЧасть(ТабЗн);
// Скинем в таблицу значений всю табличную
часть документа разом
ТабЗн.Сортировать("Товар");
ФлагОтказа=0;
ТабЗн.ВыбратьСтроки();
ТТов="@#$";
// Ну уж такого товара точно не будет!
Пока ТабЗн.ПолучитьСтроку()=1 Цикл
Если ТТов=ТабЗн.Товар Тогда
ФлагОтказа=1;
КонецЕсли;
ТТов=ТабЗн.Товар;
КонецЦикла;
// Проверили дубли строк
Если ФлагОтказа=1 Тогда
Сообщить("Документ Расходная накладная №"+НомерДок+"
от "+ДатаДок+"
|не проведен.
|Есть двойные строки товара");
НеПроводитьДокумент();
Возврат;
КонецЕсли;
БухИтоги=СоздатьОбъект("БухгалтерскиеИтоги");
БухИтоги.ИспользоватьПланСчетов(ПланыСчетов.Наш);
БухИтоги.ИспользоватьРазделительУчета(ФирмаДокумента);
ФлагОтказа=0;
ТабЗн.ВыбратьСтроки();
Пока ТабЗн.ПолучитьСтроку()=1 Цикл
Изд=ТабЗн.Товар;
Колич=ТабЗн.Кол;
БухИтоги.ИспользоватьСубконто(ВидыСубконто.МестоХранения,Склад,2);
БухИтоги.ИспользоватьСубконто(ВидыСубконто.Изделие,Изд,2);
БухИтоги.ВыполнитьЗапрос(,ДатаДок,"40");
КолОст=БухИтоги.СКД(3);
Если Колич>КолОст Тогда
// Проверяем наличие товара на складе
ФлагОтказа=1;
Сообщить(Строка(Изд));
КонецЕсли;
КонецЦикла;
Если ФлагОтказа=1 Тогда
Сообщить("Документ Расходная накладная №"+НомерДок+"
от "+ДатаДок+"
|не проведен.
|Заявка по вышеперечисленным позициям
|превышает остаток на складе");
НеПроводитьДокумент();
Возврат;
КонецЕсли;
КурсД=Курс;
КратД=Валюта.Кратность;
КурсУ=Константа.ОснВалюта.Курс.Получить(ДатаДок);
КратУ=Константа.ОснВалюта.Кратность;
Коэфф=Окр((КурсД*КратУ)/(КурсУ*КратД),6,1);
// переводим в валюту документа
ТабИзд=СоздатьОбъект("ТаблицаЗначений");
ТабИзд.НоваяКолонка("Изд","Справочник.Изделия");
ТабИзд.НоваяКолонка("Док","Документ.НакладнаяНаВыпуск");
ТабИзд.НоваяКолонка("Кол","Число",10,0);
ТабИзд.НоваяКолонка("Сум","Число",14,2);
// Динамическая таблица для партий
ТабЗн.Сортировать("Товар");
ТабЗн.ВыбратьСтроки();
Пока ТабЗн.ПолучитьСтроку()=1 Цикл
ИздП=ТабЗн.Товар;
КолИ=ТабЗн.Кол;
БухИтоги.ИспользоватьСубконто(ВидыСубконто.МестоХранения,Склад,2);
БухИтоги.ИспользоватьСубконто(ВидыСубконто.Изделие,ИздП,2);
БухИтоги.ИспользоватьСубконто(ВидыСубконто.НакладнаяНаВыпуск,,1);
БухИтоги.ВыполнитьЗапрос(,ДатаДок,"40");
БухИтоги.ВыбратьСубконто(3);
Пока БухИтоги.ПолучитьСубконто(3)=1 Цикл
ДокП=БухИтоги.Субконто(3);
КолП=БухИтоги.СКД(3);
СумП=БухИтоги.СКД(1);
Если КолИ>0 Тогда
// Заполняем таблицу партий
ТабИзд.НоваяСтрока();
ТабИзд.Изд=ИздП;
ТабИзд.Док=ДокП;
ТабИзд.Кол=КолП;
ТабИзд.Сум=СумП;
КолИ=КолИ-КолП;
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
ТабЗн.УдалитьСтроки();
ТабЗн="";
ТабИзд.Сортировать("1+,2+");
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл // По Товару
НС=НомерСтроки;
Тов=Товар;
Колич=Кол;
ТабИзд.ВыбратьСтроки();
Пока ТабИзд.ПолучитьСтроку()=1 Цикл // По Партии
ТовП=ТабИзд.Изд;
Если ТовП<>Тов Тогда
Продолжить;
КонецЕсли;
ДокП=ТабИзд.Док;
КолП=ТабИзд.Кол;
Если КолП=0 Тогда
Продолжить;
КонецЕсли;
СумП=ТабИзд.Сум;
СтрП=ТабИзд.НомерСтроки;
Если Колич>КолП Тогда
// Себестоимость
ПривязыватьСтроку(НС);
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("90.2",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("40",ПланыСчетов.Наш);
Операция.Дебет.Изделие = Тов;
Операция.Кредит.МестоХранения = Склад;
Операция.Кредит.Изделие = Тов;
Операция.Кредит.НакладнаяНаВыпуск =
ДокП;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "Учет по себестоимости";
Операция.НомерЖурнала = "11";
Операция.Сумма = СумП;
Операция.Количество = КолП;
// НДС
ПривязыватьСтроку(НС);
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("90.3",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("68.1",ПланыСчетов.Наш);
Операция.Дебет.Изделие = Тов;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "Учет НДС";
Операция.НомерЖурнала = "8";
Операция.Сумма = Окр((КолП*(ЦенаСНДС-ЦенаБНДС))*Коэфф,2,1);
// Прибыли/Убытки
Результат=Окр((КолП*ЦенаБНДС)*Коэфф,2,1)-СумП;
ПривязыватьСтроку(НС);
Операция.НоваяПроводка();
Если Результат>0 Тогда
Операция.Дебет.Счет = СчетПоКоду("90.9",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("99",ПланыСчетов.Наш);
Операция.Дебет.Изделие = Тов;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "Учет
прибыли";
Операция.НомерЖурнала = "15";
Операция.Сумма = Результат;
Иначе
Операция.Дебет.Счет = СчетПоКоду("99",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("90.9",ПланыСчетов.Наш);
Операция.Кредит.Изделие = Тов;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "Учет
убытка";
Операция.НомерЖурнала = "11";
Операция.Сумма = -Результат;
КонецЕсли;
// Себестоимость - выручка
ПривязыватьСтроку(НС);
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("90.1",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("90.2",ПланыСчетов.Наш);
Операция.Дебет.Изделие = Тов;
Операция.Кредит.Изделие = Тов;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "выручка на себестоимость";
Операция.НомерЖурнала = "11";
Операция.Сумма = СумП;
// НДС - выручка
ПривязыватьСтроку(НС);
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("90.1",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("90.3",ПланыСчетов.Наш);
Операция.Дебет.Изделие = Тов;
Операция.Кредит.Изделие = Тов;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "выручка на НДС";
Операция.НомерЖурнала = "11";
Операция.Сумма = Окр((КолП*(ЦенаСНДС-ЦенаБНДС))*Коэфф,2,1);
// Прибыль(убыток) - выручка
ПривязыватьСтроку(НС);
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("90.1",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("90.9",ПланыСчетов.Наш);
Операция.Дебет.Изделие = Тов;
Операция.Кредит.Изделие = Тов;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "выручка на прибыль(убыток)";
Операция.НомерЖурнала = "11";
Операция.Сумма = Окр((КолП*ЦенаБНДС)*Коэфф,2,1)-СумП;
// Покупатель
ПривязыватьСтроку(НС);
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("62",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("90.1",ПланыСчетов.Наш);
Операция.Дебет.Контрагент = Покупатель;
Операция.Дебет.РасходнаяНакладная =
ТекущийДокумент();
Операция.Кредит.Изделие = Тов;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "долг на покупателя";
Операция.НомерЖурнала = "11";
Операция.Сумма = Окр((КолП*ЦенаСНДС)*Коэфф,2,1);
// Уменьшение партии
Колич=Колич-КолП;
ТабИзд.УстановитьЗначение(СтрП,"Кол",0);
ТабИзд.УстановитьЗначение(СтрП,"Сум",0);
Иначе
СумО=Окр(Колич*(СумП/КолП),2,1);
// Себестоимость
ПривязыватьСтроку(НС);
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("90.2",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("40",ПланыСчетов.Наш);
Операция.Дебет.Изделие = Тов;
Операция.Кредит.МестоХранения = Склад;
Операция.Кредит.Изделие = Тов;
Операция.Кредит.НакладнаяНаВыпуск =
ДокП;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "Учет по себестоимости";
Операция.НомерЖурнала = "11";
Операция.Сумма = СумО;
Операция.Количество = Колич;
// НДС
ПривязыватьСтроку(НС);
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("90.3",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("68.1",ПланыСчетов.Наш);
Операция.Дебет.Изделие = Тов;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "Учет НДС";
Операция.НомерЖурнала = "8";
Операция.Сумма = Окр((Колич*(ЦенаСНДС-ЦенаБНДС))*Коэфф,2,1);
// Прибыли/Убытки
Результат=Окр((Колич*ЦенаБНДС)*Коэфф,2,1)-СумО;
ПривязыватьСтроку(НС);
Операция.НоваяПроводка();
Если Результат>0 Тогда
Операция.Дебет.Счет = СчетПоКоду("90.9",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("99",ПланыСчетов.Наш);
Операция.Дебет.Изделие = Тов;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "Учет
прибыли";
Операция.НомерЖурнала = "15";
Операция.Сумма = Результат;
Иначе
Операция.Дебет.Счет = СчетПоКоду("99",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("90.9",ПланыСчетов.Наш);
Операция.Кредит.Изделие = Тов;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "Учет
убытка";
Операция.НомерЖурнала = "11";
Операция.Сумма = -Результат;
КонецЕсли;
// Себестоимость - выручка
ПривязыватьСтроку(НС);
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("90.1",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("90.2",ПланыСчетов.Наш);
Операция.Дебет.Изделие = Тов;
Операция.Кредит.Изделие = Тов;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "выручка на себестоимость";
Операция.НомерЖурнала = "11";
Операция.Сумма = СумО;
// НДС - выручка
ПривязыватьСтроку(НС);
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("90.1",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("90.3",ПланыСчетов.Наш);
Операция.Дебет.Изделие = Тов;
Операция.Кредит.Изделие = Тов;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "выручка на НДС";
Операция.НомерЖурнала = "11";
Операция.Сумма = Окр((Колич*(ЦенаСНДС-ЦенаБНДС))*Коэфф,2,1);
// Прибыль(убыток) - выручка
ПривязыватьСтроку(НС);
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("90.1",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("90.9",ПланыСчетов.Наш);
Операция.Дебет.Изделие = Тов;
Операция.Кредит.Изделие = Тов;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "выручка на прибыль(убыток)";
Операция.НомерЖурнала = "11";
Операция.Сумма = Окр((Колич*ЦенаБНДС)*Коэфф,2,1)-СумО;
// Покупатель
ПривязыватьСтроку(НС);
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("62",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("90.1",ПланыСчетов.Наш);
Операция.Дебет.Контрагент = Покупатель;
Операция.Дебет.РасходнаяНакладная =
ТекущийДокумент();
Операция.Кредит.Изделие = Тов;
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "долг на покупателя";
Операция.НомерЖурнала = "11";
Операция.Сумма = Окр((Колич*ЦенаСНДС)*Коэфф,2,1);
// Уменьшение партии
ТабИзд.УстановитьЗначение(СтрП,"Кол",КолП-Колич);
ТабИзд.УстановитьЗначение(СтрП,"Сум",СумП-СумО);
Прервать;
КонецЕсли;
КонецЦикла; // По Партии
КонецЦикла; // По Товару
Операция.Содержание = "Реализация продукции";
Операция.СуммаОперации = Окр(Итог("СуммаСНДС")*Коэфф,2,1);
Операция.Автор = АвторДокумента;
Операция.Записать();
КонецПроцедуры
Товар отгружен,
пора получить за него денежки. Деньги мы будем получать с покупателя
наличными в кассу по Приходному ордеру. Проводка в документе будет
всего одна (Д 50.1 – К 62). Списывать долг с конкретного покупателя
мы будем в разрезе конкретной накладной на отгруз. Причем, если
сумма в ордере больше непогашенного остатка по указанной накладной,
то мы раскидаем остаток прихода денег по остальным непогашенным
накладным клиента, а если накладная не указана, то спишем долг по
самой ранней накладной. Этот документ будет очень похож на Расходный
ордер, поэтому просто скопируем его и внесем небольшие изменения.
Сведем данные по документу в таблицу:
Идентификатор: ПриходныйОрдер Журнал: Кассовые Нумератор: Нет Периодичность: Год Длина: 5 Тип: число Уникальность: да Автонумерация: да Может являться основанием для документа любого вида?: нет |
|||||
Проводить: да Автоматическое удаление движений: да Автоматическая нумерация строк: да |
Бухгалтерский
учет: да Расчет: нет Оперативный учет: нет |
||||
Создавать операцию: Всегда Редактировать операцию: нет | |||||
Является основанием для |
Вводится на основании |
||||
Шапка |
|||||
Реквизит | Описание | ТипЗначения | Доп. |
||
Плательщик | от кого | С.Контрагенты | |||
Основание | за что платит | Д.РасходнаяНакладная | |||
Сумма | сколько | Число 12.2 | 3, + | ||
Таблица |
|||||
Реквизит | Описание | ТипЗначения | Доп. |
Ну вот, наконец,
мы перешли к самому главному документу нашей конфигурации – Ведомости
на зарплату. По сему наиважнейшему документу мы должны выплатить
работникам трудовую копейку. Этот документ будет содержать список
сотрудников и суммы к выплате, кроме того, в документе будет особая
кнопка для занесения в ведомость всех сотрудников, по которым есть
что платить. Сделаем в этом документе возможность редактировать
операции.
Сведем все в таблицу:
Идентификатор: Ведомость Журнал: Ведомости Нумератор: Нет Периодичность: Год Длина: 5 Тип: число Уникальность: да Автонумерация: да Может являться основанием для документа любого вида?: нет |
|||||
Проводить: да Автоматическое удаление движений: да Автоматическая нумерация строк: да |
Бухгалтерский
учет: да Расчет: нет Оперативный учет: нет |
||||
Создавать операцию: Всегда Редактировать операцию: да | |||||
Является основанием для |
Вводится на основании |
||||
Шапка |
|||||
Реквизит | Описание | ТипЗначения | Доп. |
||
Таблица |
|||||
Реквизит | Описание | ТипЗначения | Доп. |
||
Сотрудник | С.Сотрудники | ||||
Сумма | Число 10.2 | +, И |
Перем СтВалюта;
Перем СтДатаКурса;
Перем СтКурс;
//==========================================================
Процедура ВводНового()
АвторДокумента=СокрЛП(ИмяПользователя());
ФирмаДокумента=Константа.ОснФирма;
Валюта=Константа.ОснВалюта;
ДатаКурса=ДатаДок;
Курс=1;
СтВалюта=Валюта;
СтДатаКурса=ДатаКурса;
СтКурс=Курс;
КонецПроцедуры
//==========================================================
Процедура ПриОткрытии()
СтВалюта=Валюта;
СтДатаКурса=ДатаКурса;
СтКурс=Курс;
ПриЗаписиПерепроводить(1);
КонецПроцедуры
//==========================================================
Процедура Валюта()
КурсС=СтКурс;
КратС=СтВалюта.Кратность;
КурсН=Валюта.Курс.Получить(ДатаКурса);
КратН=Валюта.Кратность;
Коэфф=Окр((КурсС*КратН)/(КурсН*КратС),6,1);
// переводим в валюту документа
Курс=КурсН;
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
Сумма=Окр(Сумма*Коэфф,2,1);
КонецЦикла;
СтВалюта=Валюта;
СтДатаКурса=ДатаКурса;
СтКурс=Курс;
КонецПроцедуры
//==========================================================
Процедура Заполнить()
КурсД=Курс;
КратД=Валюта.Кратность;
КурсУ=Константа.ОснВалюта.Курс.Получить(ДатаДок);
КратУ=Константа.ОснВалюта.Кратность;
Коэфф=Окр((КурсД*КратУ)/(КурсУ*КратД),6,1); // переводим в
валюту документа
УдалитьСтроки();
// Очищаем табличную часть документа
БухИтоги=СоздатьОбъект("БухгалтерскиеИтоги");
БухИтоги.ИспользоватьПланСчетов(ПланыСчетов.Наш);
БухИтоги.ИспользоватьРазделительУчета(ФирмаДокумента);
БухИтоги.ИспользоватьСубконто(ВидыСубконто.Сотрудник,,1);
БухИтоги.ВыполнитьЗапрос(,ТекущаяДата(),"70");
БухИтоги.ВыбратьСубконто(1);
Пока БухИтоги.ПолучитьСубконто(1)=1 Цикл
Сотр=БухИтоги.Субконто(1);
ИОст=БухИтоги.СКК(1);
НоваяСтрока();
// Заполняем новыми строками
Сотрудник=Сотр;
Сумма=Окр(ИОст*Коэфф,2,1);
КонецЦикла;
КонецПроцедуры
Напишем модуль проведения документа. Он очень простой.Процедура ОбработкаПроведения()
КурсД=Курс;
КратД=Валюта.Кратность;
КурсУ=Константа.ОснВалюта.Курс.Получить(ДатаДок);
КратУ=Константа.ОснВалюта.Кратность;
Коэфф=Окр((КурсД*КратУ)/(КурсУ*КратД),6,1);
// переводим в валюту документа
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("70",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("50.1",ПланыСчетов.Наш);
Операция.Дебет.Сотрудник = Сотрудник;
Операция.Сумма = Окр(Сумма*Коэфф,2,1);
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "Выплата зарплаты из кассы";
Операция.НомерЖурнала = "1";
КонецЦикла;
Операция.Содержание = "Выплата зарплаты";
Операция.СуммаОперации = Окр(Итог("Сумма")*Коэфф,2,1);
Операция.Автор = АвторДокумента;
Операция.Записать();
КонецПроцедуры
Как видите, все просто и коротко. Проверьте работоспособность
документа в 1С:Предприятии. И попробуйте поредактировать операцию,
создаваемую документом.
<< Предыдущая глава | Содержание | Следующая глава >>