Простая бухгалтерия. Глава 7

2.37 Документ НарядНаСборку

Этим документом мы будем запускать в производство очередную партию комплектующих. В наряде будет указано с какого склада брать заготовки, кто из работников будет заниматься сборкой и, главное, какие изделия и в каком количестве должны быть сделаны. Количество и ассортимент комплектующих мы будем определять по справочнику Комплектация.
Проводка документа (Д 20 – К 10.2). Документ должен будет списать со склада некоторое количество комплектующих, при этом списание должно идти по методу FIFO, в первую очередь из более ранних накладных.
Документ будет помещен в специальный журнал.
Идентификатор: НарядНаСборку
Журнал: НарядыНаСборку
Нумератор: Нет       Периодичность: Год
Длина: 5         Тип: число
Уникальность: да       Автонумерация: да
Может являться основанием для документа любого вида?: нет
Проводить: да
Автоматическое удаление движений: да
Автоматическая нумерация строк: да
Бухгалтерский учет: да
Расчет: нет
Оперативный учет: нет
Создавать операцию: Всегда     Редактировать операцию: нет

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

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

Шапка

Реквизит Описание ТипЗначения

Доп.

Склад   С.Склады  
Сборщик   С.Сотрудники  

Таблица

Реквизит Описание ТипЗначения

Доп.

Изделие   С.Изделия  
Кол   Число 5.0 +

В журнал добавим графу "Сборщик". Создаем форму документа.
Поля Валюта, ДатаКурса, Курс удаляем. Поле АвторДокумента делаем недоступным. Добавляем кнопку [Заявка] с формулой Заявка(), по этой кнопке мы будем распечатывать перечень входящих в изделия комплектующих, с указанием общего количества.
В табличную часть добавим поле текст с функцией Ост(Склад,Изделие), эта колонка будет показывать, для какого количества изделий хватит комплектующих (но, эта функция будет показывать только возможное количество, она, разумеется, не учитывает возможность участия комплектующего в разных изделиях). В поле табличной части Кол добавляем процедуру Кол(), эта процедура будет проверять, не превышает ли указанное количество изделий возможное, исходя из запасов на складе. Еще раз подобную проверку мы будем делать в модуле проведения.

В модуле формы документа пишем:
Процедура ВводНового()
  АвторДокумента=СокрЛП(ИмяПользователя());
  ФирмаДокумента=Константа.ОснФирма;
  Валюта=Константа.ОснВалюта;
  ДатаКурса=ДатаДок;
  Курс=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 Тогда
      КолСп=СпЗн.ПолучитьЗначение(ЧЦ,ТТТ);
      ИОст=КолСп;
    Иначе
      КолСп=СпЗн.ПолучитьЗначение(ЧЦ,ТТТ);
      Если ИОст>КолСп Тогда
        ИОст=КолСп;
      КонецЕсли;
    КонецЕсли;
  КонецЦикла;
  Возврат(ИОст);
// Выдаем это минимальное значение
КонецФункции
//==========================================================
Процедура Кол()
  ОстКомпл=Ост(Склад,Изделие);
// Выясняем остаток на складе
  Если Кол>ОстКомпл Тогда
// Если запросили больше
    Кол=ОстКомпл;
// Даем сколько есть
  КонецЕсли;
КонецПроцедуры
Теперь пропишем процедуру проведения. Здесь у нас будет формирование движения партий, но не по строкам документа, а по комплектующим, определяемым через эти строки. Проводки будут только одного типа (Д 20 – К 10.2). Здесь же будет проверка, не запрашиваем ли мы комплектующих больше, чем есть на складе.
Процедура ОбработкаПроведения()
  Если Склад.Выбран()=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";
          Операция.Сумма = СумО;
          Операция.Количество = Колич;
          СуммаОпер=СуммаОпер+СумО;
          ТабКом.УстановитьЗначение(СтрП,"Кол",КолП-Колич);
          ТабКом.УстановитьЗначение(СтрП,"Сум",СумП-СумО);
// Опустошаем партию частично и переходим к следующей комплектующей
          Прервать;
        КонецЕсли;
      КонецЦикла; // По Партии
    КонецЦикла; // По Комплектующей
  КонецЦикла; // По Изделию
  Операция.Содержание = "Запуск производства";
  Операция.СуммаОперации = СуммаОпер;
  Операция.Автор = АвторДокумента;
  Операция.Записать();
КонецПроцедуры
Новый вариант хотя и сложнее, но работает правильно. И даже быстрее, так как обращений к Бухгалтерским итогам будет меньше или столько же, ведь они вынесены за цикл по изделиям.
Проверим работу нашего документа с разными наборами данных.

2.38 Документ НакладнаяНаВыпуск.

Предыдущим документом мы запустили производство некоторого количества изделий. И вот, наши работнички все сделали. Нам надо зафиксировать факт сдачи готовой продукции на склад и, разумеется, начислить работникам зарплату за труд, вложенный в изготовление материальных ценностей. Для этой сложной задачи мы создадим очередной документ – Накладная на выпуск из производства.
Проводки по документу (Д 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;
      СумО=СумО+СумС;
    КонецЦикла;
  КонецЦикла;
  Операция.Содержание = "Выпуск из производства";
  Операция.СуммаОперации = СумО;
  Операция.Автор = АвторДокумента;
  Операция.Записать();
КонецПроцедуры
Проверяем работу документа.

2.39 Документ РасходнаяНакладная.

Товар поступил на склад, и это хорошо. Теперь мы можем продать что-нибудь ненужное. А чтобы продать что-нибудь ненужное нам нужно иметь расходную накладную. Проводок в расходной накладной будет богато:
(Д 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) – начисление долга на покупателя.
Проведем анализ счетов на предмет субконто, по ним мы сможем определить требуемые реквизиты:

  1. Счет 40 – МестоХранения, Изделие, НакладнаяНаВыпуск;
  2. Счет 62 – Комтрагент, РасходнаяНакладная;
  3. Счет 68 – нет;
  4. Счет 90 – Изделие;
  5. Счет 99 – нет.
Итого: МестоХранения – Склад, Изделие – Товар, НакладнаяНаВыпуск – при формировании проводок, Контрагент – Покупатель, РасходнаяНакладная – она сама и есть. Раз мы будем играться с НДС, то нам нужны будут цена без НДС и цена с НДС, ну и соответствующие суммы, а также сумма НДС. Сводим все в таблицу:
Идентификатор: РасходнаяНакладная
Журнал: РасходныеНакладные
Нумератор: Нет       Периодичность: Год
Длина: 5         Тип: число
Уникальность: да       Автонумерация: да
Может являться основанием для документа любого вида?: нет
Проводить: да
Автоматическое удаление движений: да
Автоматическая нумерация строк: да
Бухгалтерский учет: да
Расчет: нет
Оперативный учет: нет
Создавать операцию: Всегда     Редактировать операцию: нет

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

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

Шапка

Реквизит Описание ТипЗначения

Доп.

Склад   С.Склады  
Покупатель   С.Контрагенты  

Таблица

Реквизит Описание ТипЗначения

Доп.

Товар   С.Изделия  
Кол   Число 5.0 +, И
ЦенаБНДС цена без НДС Число 7.2 +
ЦенаСНДС цена с НДС Число 7.2 +
СуммаБНДС сумма без НДС Число 13.2 +, И
СуммаНДС сумма НДС Число 13.2 +, И
СуммаСНДС сумма с НДС Число 13.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);
  СуммаНДС=СуммаСНДС-СуммаБНДС;
КонецПроцедуры
// В общем, ничего нового...
При проведении этого документа у нас, во-первых, будет задействована многострочная часть, во-вторых, списание по методу FIFO (мы воспользуемся алгоритмом №2 из документа НарядНаСборку), в-третьих большое количество проводок. Все это несколько усложнит код, но не намного. Пишем процедуру проведения.
Процедура ОбработкаПроведения()
  Если Склад.Выбран()=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);
  Операция.Автор = АвторДокумента;
  Операция.Записать();
КонецПроцедуры
Ну, вот, с расходной накладной разобрались. Главное не запутаться в проводках и не забыть, что если оба счета не имеют количественного учета в проводке не должно быть ссылки на количество. Иначе программа будет ругаться при проведении документа. Проверьте, как работает этот документ.

2.40 Документ ПриходныйОрдер.

Товар отгружен, пора получить за него денежки. Деньги мы будем получать с покупателя наличными в кассу по Приходному ордеру. Проводка в документе будет всего одна (Д 50.1 – К 62). Списывать долг с конкретного покупателя мы будем в разрезе конкретной накладной на отгруз. Причем, если сумма в ордере больше непогашенного остатка по указанной накладной, то мы раскидаем остаток прихода денег по остальным непогашенным накладным клиента, а если накладная не указана, то спишем долг по самой ранней накладной. Этот документ будет очень похож на Расходный ордер, поэтому просто скопируем его и внесем небольшие изменения.
Сведем данные по документу в таблицу:
Идентификатор: ПриходныйОрдер
Журнал: Кассовые
Нумератор: Нет       Периодичность: Год
Длина: 5         Тип: число
Уникальность: да       Автонумерация: да
Может являться основанием для документа любого вида?: нет
Проводить: да
Автоматическое удаление движений: да
Автоматическая нумерация строк: да
Бухгалтерский учет: да
Расчет: нет
Оперативный учет: нет
Создавать операцию: Всегда     Редактировать операцию: нет

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

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

Шапка

Реквизит Описание ТипЗначения

Доп.

Плательщик от кого С.Контрагенты  
Основание за что платит Д.РасходнаяНакладная  
Сумма сколько Число 12.2 3, +

Таблица

Реквизит Описание ТипЗначения

Доп.

В журнале "Кассовые" добавим в графу таблицы – Сумма из реквизита документа "ПриходныйОрдер" Сумма.
Перейдем к редактированию формы документа. Сделаем все аналогично с Расходным ордером. Модуль формы напишите сами, он тоже аналогичен.
Модуль проведения тоже аналогичен... Пишите сами для тренировки. Только учтите, что 62-ой счет пассивный и сальдо у него есть только по кредиту!

2.41 Документ Ведомость.

Ну вот, наконец, мы перешли к самому главному документу нашей конфигурации – Ведомости на зарплату. По сему наиважнейшему документу мы должны выплатить работникам трудовую копейку. Этот документ будет содержать список сотрудников и суммы к выплате, кроме того, в документе будет особая кнопка для занесения в ведомость всех сотрудников, по которым есть что платить. Сделаем в этом документе возможность редактировать операции.
Сведем все в таблицу:
Идентификатор: Ведомость
Журнал: Ведомости
Нумератор: Нет       Периодичность: Год
Длина: 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С:Предприятии. И попробуйте поредактировать операцию, создаваемую документом.

<< Предыдущая глава | Содержание | Следующая глава >>


НОВОСТИ ФОРУМА

Форум Рыцари теории эфира


Рыцари теории эфира
 10.11.2021 - 12:37: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
10.11.2021 - 12:36: СОВЕСТЬ - Conscience -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
10.11.2021 - 12:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от д.м.н. Александра Алексеевича Редько - Карим_Хайдаров.
10.11.2021 - 12:35: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ПРАВОСУДИЯ.НЕТ - Карим_Хайдаров.
10.11.2021 - 12:34: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вадима Глогера, США - Карим_Хайдаров.
10.11.2021 - 09:18: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> Волновая генетика Петра Гаряева, 5G-контроль и управление - Карим_Хайдаров.
10.11.2021 - 09:18: ЭКОЛОГИЯ - Ecology -> ЭКОЛОГИЯ ДЛЯ ВСЕХ - Карим_Хайдаров.
10.11.2021 - 09:16: ЭКОЛОГИЯ - Ecology -> ПРОБЛЕМЫ МЕДИЦИНЫ - Карим_Хайдаров.
10.11.2021 - 09:15: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Екатерины Коваленко - Карим_Хайдаров.
10.11.2021 - 09:13: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вильгельма Варкентина - Карим_Хайдаров.
Bourabai Research - Технологии XXI века Bourabai Research Institution