План счетов
создан, операции и проводки готовы, теперь можно и заняться документами.
Давайте определим общие реквизиты документов и нумераторы.
Каждый документ относится к какой-либо фирме – это первый общий
реквизит. Мы хотим к каждому документу приписать пояснение – это
будет вторым общим реквизитом. Все документы у нас будут связаны
с деньгами, а деньги обычно относятся к какой-нибудь валюте – третий
общий реквизит – валюта. Валюта имеет по отношению к базовой валюте
на каждую дату свой курс – еще два общих реквизита: дата курса и
курс. Еще нас будет интересовать кто создал этот документ – и еще
один общий реквизит автор.
Идентификатор |
Тип значения |
Дополнительно |
ФирмаДокумента |
С.Фирмы |
О |
Пояснение |
Строка 100 |
|
Валюта |
С.Валюты |
|
ДатаКурса |
Дата |
|
Курс |
Число 6.2 |
|
АвторДокумента |
Строка 50 |
О |
"О" - отбор
Нумераторов у нас не будет. Каждый документ будет иметь свою независимую
нумерацию.
Первый и самый
простой документ будет Учет НДС. Проводка по нему самая простая
(Д 68.1 – К 19.3). Этим документом мы будем переводить сумму НДС
за приобретенные комплектующие в зачет налогов. Документ будет относиться
к специальному журналу "УчетНДС". Журнал обычный. В журнале заведем
графу "Сумма", значение для нее будем брать Документ.УчетНДС.Сумма.
Идентификатор: УчетНДС
Журнал: УчетНДС
Нумератор: Нет Периодичность: Год
Длина: 5 Тип: число
Уникальность: да Автонумерация: да
Может являться основанием для документа любого вида?: нет |
Проводить: да
Автоматическое удаление движений: да
Автоматическая нумерация строк: да |
Бухгалтерский
учет: да
Расчет: нет
Оперативный учет: нет |
Создавать операцию: Всегда
Редактировать операцию: нет |
Является
основанием для |
Вводится
на основании |
Шапка |
Реквизит |
Описание |
ТипЗначения |
Доп. |
Сумма |
|
Число 10.2 |
3, + |
Таблица |
Реквизит |
Описание |
ТипЗначения |
Доп. |
Создаем форму документа.
Поля АвторДокумента и Курс сделаем недоступными. В полях валюта и
ДатаКурса в формуле укажем процедуру Валюта().
Разместим реквизиты формы документа в более-менее приемлемом виде.

В модуле формы напишем:
Перем СтВалюта;
Перем СтДатаКурса;
Перем СтКурс;
//Переменные для пересчета суммы при изменении валюты документа
//==========================================================
Процедура ВводНового()
АвторДокумента=СокрЛП(ИмяПользователя());
ФирмаДокумента=Константа.ОснФирма;
Валюта=Константа.ОснВалюта;
ДатаКурса=ДатаДок;
Курс=1;
// Заполняем значения по умолчанию
СтВалюта=Валюта;
СтДатаКурса=ДатаКурса;
СтКурс=Курс;
КонецПроцедуры
//==========================================================
Процедура ПриОткрытии()
СтВалюта=Валюта;
СтДатаКурса=ДатаКурса;
СтКурс=Курс;
ПриЗаписиПерепроводить(1);
// При записи изменений перепроводить обязательно
КонецПроцедуры
//==========================================================
Процедура Валюта()
КурсС=СтКурс;
КратС=СтВалюта.Кратность;
КурсН=Валюта.Курс.Получить(ДатаКурса);
КратН=Валюта.Кратность;
Коэфф=Окр((КурсС*КратН)/(КурсН*КратС),6,1);
// Переводим в валюту документа
Курс=КурсН;
Сумма=Окр(Сумма*Коэфф,2,1);
// Пересчитываем сумму
СтВалюта=Валюта;
СтДатаКурса=ДатаКурса;
СтКурс=Курс;
КонецПроцедуры
Перейдем к модулю документа. Учет мы будем вести в базовой
валюте. Здесь мы напишем самый наипростейший вариант модуля проведения.
В данном случае нам надо только перевести сумму с одного счета на
другой одной проводкой. Напишем процедуру проведения:
Процедура ОбработкаПроведения()
КурсД=Курс;
КратД=Валюта.Кратность;
КурсУ=Константа.ОснВалюта.Курс.Получить(ДатаДок);
КратУ=Константа.ОснВалюта.Кратность;
Коэфф=Окр((КурсД*КратУ)/(КурсУ*КратД),6,1); // переводим в
валюту документа
СуммаО=Окр(Сумма*Коэфф,2,1);
// Пересчитали сумму документа в сумму операции
в базовую валюту
ПривязыватьСтроку(0);
// Следующая за этой командой новая проводка
к строке документа не
// привязывается
Операция.НоваяПроводка();
// Создаем проводку (простую) по операции
Операция.Дебет.Счет = СчетПоКоду("68.1",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("19.3",ПланыСчетов.Наш);
// Указали корреспонденцию проводки
Операция.Сумма = СуммаО;
// Сумма проводки
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "Учет НДС за приобретенные комплектующие";
Операция.НомерЖурнала = " ";
// Дополнительные сведения по проводке
Операция.Содержание = "Учет НДС";
Операция.СуммаОперации = СуммаО;
Операция.Автор = СокрЛП(ИмяПользователя());
// Дополнительные сведения по операции
Операция.Записать();
КонецПроцедуры
Документ создан.
Давайте его проверим. Входим в 1С:Предприятие и создаем новый документ
"Учет НДС" на сумму 1000 тугриков (для примера), затем меняем валюту
на рубли и получаем 22.77 рубля (при курсе 22.77 руб. за 1000 тугриков)
все сходится, вернем тугрики. Сохраним и проведем документ. Смотрим
журнал операций (Меню Действия команда "Перейти в журнал операций").
Сумма операции 22.77 (при сумме документа 1000) – верно. Проверяем
проводку – тоже все верно. Документ написан правильно. Удалим этот
документ, чтобы не мешал.
По приходной
накладной мы будем получать комплектующие от поставщиков. Проводка
по этому документу сложнее (Д 10.2 – К 60, Д 19.3 – К 60). В данном
документе нас интересует следующее: кто поставил нам комплектующие,
на какой склад мы их приняли, что конкретно пришло, в каком количестве,
по какой цене без НДС, на какую сумму. Сведем все в таблицу:
Идентификатор: ПриходнаяНакладная
Журнал: ПриходныеНакладные
Нумератор: Нет Периодичность: Год
Длина: 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,1);
СуммаНДС=СуммаСНДС-СуммаБНДС;
КонецПроцедуры
//==========================================================
Процедура ЦенаБНДС()
ЦенаСНДС=Окр(ЦенаБНДС*(1+(Товар.НДС.Значение/100)),2,1);
// Определим цену с НДС по цене без НДС
СуммаБНДС=Окр(ЦенаБНДС*Кол,2,1);
СуммаСНДС=Окр(ЦенаСНДС*Кол,2,1);
СуммаНДС=СуммаСНДС-СуммаБНДС;
КонецПроцедуры
//==========================================================
Процедура ЦенаСНДС()
ЦенаБНДС=Окр(ЦенаСНДС*(1-(Товар.НДС.ОбрЗначение/100)),2,1);
// Определим цену без НДС по цене с НДС
СуммаБНДС=Окр(ЦенаБНДС*Кол,2,1);
СуммаСНДС=Окр(ЦенаСНДС*Кол,2,1);
СуммаНДС=СуммаСНДС-СуммаБНДС;
КонецПроцедуры
Теперь переходим к модулю документа. В этом документе наша операция
будет уже посложней, в одной операции будет объединено несколько проводок,
причем одна проводка будет относиться ко всему документу целиком,
а остальные будут формироваться по строкам документа. Пишем следующую
процедуру
Процедура ОбработкаПроведения()
Если Склад.Выбран()=0 Тогда
// Если склад не указан
Сообщить("Документ Приходная накладная
№"+НомерДок+" от "+ДатаДок+"
|не проведен.
|Не выбран склад получатель");
// Делаем сообщение
НеПроводитьДокумент();
// Указываем, что документ проводить не надо
Возврат;
// Выходим из процедуры
КонецЕсли;
Если Поставщик.Выбран()=0 Тогда
Сообщить("Документ Приходная накладная №"+НомерДок+"
от "+ДатаДок+"
|не проведен.
|Не выбран поставщик");
НеПроводитьДокумент();
Возврат;
КонецЕсли;
КурсД=Курс;
КратД=Валюта.Кратность;
КурсУ=Константа.ОснВалюта.Курс.Получить(ДатаДок);
КратУ=Константа.ОснВалюта.Кратность;
Коэфф=Окр((КурсД*КратУ)/(КурсУ*КратД),6,1);
// Переводим в валюту документа
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
// Обходим строки
ПривязыватьСтроку(НомерСтроки);
// Здесь мы хотим указать какая строка документа
вызвала эту проводку
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("10.2",ПланыСчетов.Наш);
Операция.Дебет.МестоХранения = Склад;
Операция.Дебет.Комплектующее = Товар;
Операция.Дебет.ПриходнаяНакладная = ТекущийДокумент();
Операция.Кредит.Счет = СчетПоКоду("60",ПланыСчетов.Наш);
Операция.Кредит.Контрагент = Поставщик;
Операция.Кредит.ПриходнаяНакладная = ТекущийДокумент();
Операция.Количество = Кол;
Операция.Сумма = Окр(СуммаБНДС*Коэфф,2,1);
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "Поступление комплектующих";
Операция.НомерЖурнала = "6";
КонецЦикла;
ПривязыватьСтроку(0);
// Эта проводка по всему документу вцелом
Операция.НоваяПроводка();
Операция.Дебет.Счет = СчетПоКоду("19.3",ПланыСчетов.Наш);
Операция.Кредит.Счет = СчетПоКоду("60",ПланыСчетов.Наш);
Операция.Кредит.Контрагент = Поставщик;
Операция.Кредит.ПриходнаяНакладная = ТекущийДокумент();
Операция.Сумма = Окр(Итог("СуммаНДС")*Коэфф,2,1);
Операция.Фирма = ФирмаДокумента;
Операция.Комментарий = "Учет НДС по поступ. комплектующим";
Операция.НомерЖурнала = "6";
Операция.Содержание = "Поступление комплектующих";
Операция.СуммаОперации = Окр(Итог("СуммаСНДС")*Коэфф,2,1);
Операция.Автор = АвторДокумента;
Операция.Записать();
КонецПроцедуры
Теперь, когда создан документ "Приходная накладная",
нам надо внести соответствующую поправку в Субконто ПриходнаяНакладная.
Укажем в этом Субконто тип как Д.ПриходнаяНакладная.
Документ
"Приходная накладная" создан, в интерфейс внесен сам документ и
его журнал. Давайте попробуем поработать с этим документом. Войдем
в 1С:Предприятие и создадим Приходную накладную №1 от 02.01.2001.

Цены попытаемся вводить как с НДС, так и без НДС. Попробуем менять
валюту. И наконец, проведем этот документ и посмотрим на получившуюся
операцию и проводки. Создана одна операция на сумму 270 рублей и
четыре проводки, три по дебету 10-ого счета на сумму 75, 100 и 50
рублей, и одна по дебету 19-ого счета на сумму 45 рублей. Документ
попробуем проводить с разной валютой.
Используем теперь документ "Учет НДС" для списания с налогов суммы
уплаченного поставщику НДС за купленные нами комплектующие. Вводим
УчетНДС №1 от 03.01.2001. Сумма – 45 рублей. Проводим. Смотрим на
операцию и проводку. Посмотрим как действует журнал проводок (меню
Действия, команда "Перейти в журнал проводок"). Попробуем разделить
по журналам нашим флажком. Все работает.
Документ
"Расходный ордер" на первый взгляд совершенно простой, всего одна
проводка (Д 60 – К 50.1). Но мы должны этим документом погасить
задолженность конкретному контрагенту по конкретной накладной (если
она указана), а если что останется – другие накладные, начиная с
более ранних. В ином случае мы будем погашать наиболее раннюю непогашенную
приходную накладную. А если накладная указана, но она уже погашена,
будем действовать по второму варианту.
В документе нам надо знать кому погашать долг, по какому документу-основанию,
на какую сумму.
Этот документ мы будем держать в специальном журнале – "Кассовые",
кроме него туда, со временем, попадет и "Приходный ордер".
В журнале "Кассовые" заведем
графу таблицы – Сумма из реквизита документа "РасходныйОрдер" Сумма.
Создадим форму журнала.

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

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