Содержание

2.35 Документ РасходныйОрдер.

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

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

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

Шапка

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

Доп.

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

Таблица

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

Доп.

В журнале "Кассовые" заведем графу таблицы – Сумма из реквизита документа "РасходныйОрдер" Сумма. Создадим форму журнала.

Создаем форму документа. Поля АвторДокумента, Курс, Основание делаем недоступными. В поля реквизитов Валюта и ДатаКурса вставляем формулу Валюта(), в поле Получатель формула Получатель(), добавляем две кнопки, первая [...] с формулой Основание(), вторая [Х] с формулой Основание="".
В модуле формы пишем:
Перем СтВалюта;
Перем СтДатаКурса;
Перем СтКурс;
Перем СтПолучатель;
//==========================================================
Процедура ВводНового()
  АвторДокумента=СокрЛП(ИмяПользователя());
  ФирмаДокумента=Константа.ОснФирма;
  Валюта=Константа.ОснВалюта;
  ДатаКурса=ДатаДок;
  Курс=1;
  Получатель=Константа.ОснПоставщик;
  СтВалюта=Валюта;
  СтДатаКурса=ДатаКурса;
  СтКурс=Курс;
  СтПолучатель=Получатель;
КонецПроцедуры
// Здесь ничего интересного
//==========================================================
Процедура ПриОткрытии()
  СтВалюта=Валюта;
  СтДатаКурса=ДатаКурса;
  СтКурс=Курс;
  СтПолучатель=Получатель;
  ПриЗаписиПерепроводить(1);
КонецПроцедуры
// И здесь ничего интересного
//==========================================================
Процедура Валюта()
  КурсС=СтКурс;
  КратС=СтВалюта.Кратность;
  КурсН=Валюта.Курс.Получить(ДатаКурса);
  КратН=Валюта.Кратность;
  Коэфф=Окр((КурсС*КратН)/(КурсН*КратС),6,1); // переводим в валюту документа
  Курс=КурсН;
  Сумма=Окр(Сумма*Коэфф,2,1);
  СтВалюта=Валюта;
  СтДатаКурса=ДатаКурса;
  СтКурс=Курс;
КонецПроцедуры
// Это уже было
//==========================================================
Процедура Получатель()
  Если СтПолучатель<>Получатель Тогда
// Если мы изменили Получателя
    Основание="";
// поле с Основанием очищаем, документ-то к другому пока относится
    СтПолучатель=Получатель;
  КонецЕсли;
КонецПроцедуры
//==========================================================
Процедура Основание()
  ТабЗн=СоздатьОбъект("ТаблицаЗначений");
// Создаем динамическую 2-х мерную таблицу
  ТабЗн.НоваяКолонка("Док","Документ.ПриходнаяНакладная",,,"ПрихНакл",18);
  ТабЗн.НоваяКолонка("Нум","Число",6,0,"Номер",6);
  ТабЗн.НоваяКолонка("Дат","Дата",10,0,"Дата",10);
  ТабЗн.НоваяКолонка("Сум","Число",14,2,"Сумма",14);
// Определяем набор колонок
  ТабЗн.ВидимостьКолонки("1",0);
// Колонка №1 невидима
  БухИтоги=СоздатьОбъект("БухгалтерскиеИтоги");
// Создаем динамическую выборку по содержимому счетов
  БухИтоги.ИспользоватьПланСчетов(ПланыСчетов.Наш);
// Указываем конкретный план счетов
  БухИтоги.ИспользоватьРазделительУчета(Константа.ОснФирма);
// Указываем конкретную фирму
  БухИтоги.ИспользоватьСубконто(ВидыСубконто.Контрагент,Получатель,2);
// Нам нужны итоги по конкретному контрагенту
  БухИтоги.ИспользоватьСубконто(ВидыСубконто.ПриходнаяНакладная,,1);
// По всем его Приходным накладным
  БухИтоги.ВыполнитьЗапрос(,ДатаДок,"60");
// Сальдо нужно на конкретную дату по 60-му счету
  БухИтоги.ВыбратьСубконто(1);
// Выбираем контрагентов
  Пока БухИтоги.ПолучитьСубконто(1)=1 Цикл
// Получаем очередного контрагента, в нашем случае единственного
    БухИтоги.ВыбратьСубконто(2);
// Выбираем документы (недооплаченные)
// Субконто в перечне ИспользоватьСубконто() стоит вторым
// значит ВыбратьСубконто(2)
    Пока БухИтоги.ПолучитьСубконто(2)=1 Цикл
// Получаем очередной документ
      ТДок=БухИтоги.Субконто(2);
// Нас интересует второе по упоминанию в перечне Субконто
// указанных командой ИспользоватьСубконто() - документ
      КреС=БухИтоги.СКК(1);
// Нам нужно сальдо кредитовое (счет пассивный)
// на конец периода запроса по сумме (1)
      ТабЗн.НоваяСтрока();
// Создаем в динамической таблице пустую строку
      ТабЗн.Док=ТДок;
      ТабЗн.Нум=ТДок.НомерДок;
      ТабЗн.Дат=ТДок.ДатаДок;
      ТабЗн.Сум=КреС;
// Заполняем ее
    КонецЦикла;
  КонецЦикла;
  ТабЗн.Сортировать("1+");
// Сортируем строки в динамической таблице по дате документа
  Стр=0;
// Инициализируем переменную
  Рез=ТабЗн.ВыбратьСтроку(Стр,"Выберите приходную накладную");
// Предлагаем выбрать документ из списка
  Если Рез=1 Тогда
// Если документ выбран
    Основание=ТабЗн.ПолучитьЗначение(Стр,"Док");
// Определяем, что выбрано и ставим его как Основание
  КонецЕсли;
КонецПроцедуры
// Все

Здесь, в последней процедуре мы воспользовались новым для нас объектом – Бухгалтерскими итогами. Это тот самый механизм, на котором по счетам хранятся результаты всех проводок по всем фирмам и всем счетам. Он аналогичен, во многом, регистрам Оперативного учета. Или они ему аналогичны...
Займемся теперь процедурой проведения. Алгоритм действия, был описан нами в начале главы. Здесь мы впервые в этой конфигурации в процедуре проведения задействуем механизм партионного учета. Наша задача несколько упрощается тем, что в документе нет многострочной части. Попробуем реализовать алгоритм списания:
Процедура ОбработкаПроведения()
  Если Получатель.Выбран()=0 Тогда
    Сообщить("Документ Расходный ордер №"+НомерДок+" от "+ДатаДок+"
    |не проведен.
    |Не выбран получатель");
    НеПроводитьДокумент();
    Возврат;
  КонецЕсли;
  КурсД=Курс;
  КратД=Валюта.Кратность;
  КурсУ=Константа.ОснВалюта.Курс.Получить(ДатаДок);
  КратУ=Константа.ОснВалюта.Кратность;
  Коэфф=Окр((КурсД*КратУ)/(КурсУ*КратД),6,1);
// переводим в валюту документа
  СуммаОст=Окр(Сумма*Коэфф,2,1);
  БухИтоги=СоздатьОбъект("БухгалтерскиеИтоги");
  БухИтоги.ИспользоватьПланСчетов(ПланыСчетов.Наш);
  БухИтоги.ИспользоватьРазделительУчета(ФирмаДокумента);
  Если Основание.Выбран()=1 Тогда
// Указано за какую поставку платить
    БухИтоги.ИспользоватьСубконто(ВидыСубконто.Контрагент,Получатель,2);
    БухИтоги.ИспользоватьСубконто(ВидыСубконто.ПриходнаяНакладная,
    Основание,2);
// Нас интересует конкретная накладная
    БухИтоги.ВыполнитьЗапрос(,ДатаДок,"60");
    БухИтоги.ВыбратьСубконто(1);
    Пока БухИтоги.ПолучитьСубконто(1)=1 Цикл
      БухИтоги.ВыбратьСубконто(2);
      Пока БухИтоги.ПолучитьСубконто(2)=1 Цикл
        КреС=БухИтоги.СКК(1);
// Смотрим, сколько недоплачено по этому документу
        Если КреС>0 Тогда
// Недоплачено
          ПривязыватьСтроку(0);
          Операция.НоваяПроводка();
// Создаем проводку
          Операция.Дебет.Счет = СчетПоКоду("60",ПланыСчетов.Наш);
          Операция.Кредит.Счет = СчетПоКоду("50.1",ПланыСчетов.Наш);
          Операция.Дебет.Контрагент = Получатель;
          Операция.Дебет.ПриходнаяНакладная = Основание;
          Операция.Фирма = ФирмаДокумента;
          Операция.Комментарий = "Погашение долга перед поставщиком";
          Операция.НомерЖурнала = "1";
          Если СуммаОст>=КреС Тогда
// Если оплачено больше чем недоплачено
            Операция.Сумма = КреС;
          Иначе
// недоплачено больше чем оплачено этим документом
            Операция.Сумма = СуммаОст;
          КонецЕсли;
          СуммаОст=СуммаОст-КреС;
// Сколько осталось нераспределенной оплаты
        КонецЕсли;
      КонецЦикла;
    КонецЦикла;
  КонецЕсли;
  Если СуммаОст>0 Тогда
// Есть что распределять
    ТабЗн=СоздатьОбъект("ТаблицаЗначений");
    ТабЗн.НоваяКолонка("Док","Документ.ПриходнаяНакладная");
    ТабЗн.НоваяКолонка("Сум","Число",14,2);
    БухИтоги.ИспользоватьСубконто(ВидыСубконто.Контрагент,Получатель,2);
    БухИтоги.ИспользоватьСубконто(ВидыСубконто.ПриходнаяНакладная,,1);
// Нас интересуют все накладные
    БухИтоги.ВыполнитьЗапрос(,ДатаДок,"60");
    БухИтоги.ВыбратьСубконто(1);
    Пока БухИтоги.ПолучитьСубконто(1)=1 Цикл
      БухИтоги.ВыбратьСубконто(2);
      Пока БухИтоги.ПолучитьСубконто(2)=1 Цикл
        ТДок=БухИтоги.Субконто(2);
        Если ТДок<>Основание Тогда
// Документ Основание мы уже оплатили один раз
          КреС=БухИтоги.СКК(1);
          ТабЗн.НоваяСтрока();
          ТабЗн.Док=ТДок;
          ТабЗн.Сум=КреС;
        КонецЕсли;
      КонецЦикла;
    КонецЦикла;
    ТабЗн.Сортировать("1+");
    ТабЗн.ВыбратьСтроки();
    Пока ТабЗн.ПолучитьСтроку()=1 Цикл
      СумД=ТабЗн.Сум;
      ТДок=ТабЗн.Док;
      Если СуммаОст>СумД Тогда
// Нераспределенная оплата пока больше недоплаченной суммы
// текущего документа
        ПривязыватьСтроку(0);
        Операция.НоваяПроводка();
        Операция.Дебет.Счет = СчетПоКоду("60",ПланыСчетов.Наш);
        Операция.Кредит.Счет = СчетПоКоду("50.1",ПланыСчетов.Наш);
        Операция.Дебет.Контрагент = Получатель;
        Операция.Дебет.ПриходнаяНакладная = ТДок;
        Операция.Фирма = ФирмаДокумента;
        Операция.Комментарий = "Погашение долга перед поставщиком";
        Операция.НомерЖурнала = "1";
        Операция.Сумма = СумД;
        СуммаОст=СуммаОст-СумД;
// Уменьшаем остаток на сумму документа
      Иначе
// Недоплаченная сумма текущего документа меньше нераспределенной оплаты
        ПривязыватьСтроку(0);
        Операция.НоваяПроводка();
        Операция.Дебет.Счет = СчетПоКоду("60",ПланыСчетов.Наш);
        Операция.Кредит.Счет = СчетПоКоду("50.1",ПланыСчетов.Наш);
        Операция.Дебет.Контрагент = Получатель;
        Операция.Дебет.ПриходнаяНакладная = ТДок;
        Операция.Фирма = ФирмаДокумента;
        Операция.Комментарий = "Погашение долга перед поставщиком";
        Операция.НомерЖурнала = "1";
        Операция.Сумма = СуммаОст;
        Прервать;
// Больше денег нет!
      КонецЕсли;
    КонецЦикла;
  КонецЕсли;
  Операция.Содержание = "Оплата комплектующих";
  Операция.СуммаОперации = Окр(Сумма*Коэфф,2,1);
  Операция.Автор = АвторДокумента;
  Операция.Записать();
КонецПроцедуры

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

2.36 Отчет "Счет60".

А теперь давайте состряпаем простенький отчетик по 60-ому счету. Нас будет интересовать начальное сальдо по этому счету, конечное сальдо за период, по контрагентам и по накладным. Можно воспользоваться конструктором, но создание отчета вручную несколько проще (меньше придется переделывать).

  1. Создаем новый отчет "Счет60";
  2. Добавляем поле ввода ВыбНачПериода типа Дата;
  3. Добавляем поле ввода ВыбКонПериода типа Дата;
  4. Добавляем кнопку [...] с Формулой: ВвестиПериод(ВыбНачПериода,ВыбКонПериода);
  5. Добавляем текст с формулой: ПериодСтр(ВыбНачПериода,ВыбКонПериода);

  6. В модуле формы пишем:
Процедура ПриОткрытии()
// Установим начальные значения диапазона дат
  ВыбНачПериода = НачалоПериодаБИ();
  ВыбКонПериода = КонецПериодаБИ();
КонецПроцедуры
//==========================================================
Процедура Сформировать()
  Таб = СоздатьОбъект("Таблица");
  Таб.ИсходнаяТаблица("Таблица");
  Ит = СоздатьОбъект("БухгалтерскиеИтоги");
  Ит.ИспользоватьПланСчетов(ПланыСчетов.Наш);
  Ит.ИспользоватьРазделительУчета(Константа.ОснФирма);
  Ит.ИспользоватьСубконто(ВидыСубконто.Контрагент,,1);
  Ит.ИспользоватьСубконто(ВидыСубконто.ПриходнаяНакладная,,1);
  Ит.ВыполнитьЗапрос(ВыбНачПериода,ВыбКонПериода,"60",,, 1,"Операция","С");
  Таб.ВывестиСекцию("Шапка");
  ИтНачКред=0;
  ИтКонКред=0;
  ИтОбоКред=0;
  Ит.ВыбратьСубконто(1);
  Пока Ит.ПолучитьСубконто(1)=1 Цикл
    Контра=Ит.Субконто(1);
    НачКред=Ит.СНК(1);
    КонКред=Ит.СКК(1);
    ОбоКред=КонКред-НачКред;
    Таб.ВывестиСекцию("Контра");
    ИтНачКред=ИтНачКред+НачКред;
    ИтКонКред=ИтКонКред+КонКред;
    ИтОбоКред=ИтОбоКред+ОбоКред;
    Ит.ВыбратьСубконто(2);
    Пока Ит.ПолучитьСубконто(2)=1 Цикл
      Дока=Ит.Субконто(2);
      НачКред=Ит.СНК(1);
      КонКред=Ит.СКК(1);
      ОбоКред=КонКред-НачКред;
      Таб.ВывестиСекцию("Дока");
    КонецЦикла;
  КонецЦикла;
// Здесь ничего нового
  Таб.ВывестиСекцию("Подвал");
  Таб.ТолькоПросмотр(1);
  Таб.ПараметрыСтраницы(2);
// Ориентация Ландшафт
  Таб.Показать("Сформировать","");
КонецПроцедуры
  1. Соорудим шаблон таблицы
Попробуем в 1С:Предприятии наш новый отчет.


Предыдущая Содержание Следующая