5. Примеры формирования проводок в модуле документа
Пример 1.
Модуль анализирует сумму остатки на счете «СчетАнализа» для контрагента «Контрагент» и его договора «ДоговорКонтрагента» на дату «Дата» (эти реквизиты расположены в форме документа) и списывает этот долг на счет с именем «ДолгиКонтрагентов».
Замечание. Виртуальная таблица источника запроса
ПроводкиБУ = Движения.Хозрасчетный;
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("Период" , Дата); Запрос.УстановитьПараметр("Контрагент" , Контрагент);
Запрос.УстановитьПараметр("Договор" , ДоговорКонтрагента); Запрос.УстановитьПараметр("Счет" , СчетАнализа);
Запрос.Текст = "
|ВЫБРАТЬ
| Субконто1,
| Субконто2,
| СуммаОстатокДт + КАК Задолженность
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет = &Счет, , (Субконто1 = &Контрагент)И (Субконто2 = &Договор)
| ) КАК ХозрасчетныйОстатки";
ВыборкаОстатков = Запрос.Выполнить().Выбрать();
Если ВыборкаОстатков.Следующий() Тогда
Задолженность = ВыборкаОстатков.Задолженность;
Иначе
Задолженность = 0;
КонецЕсли;
Если Задолженность > 0 Тогда
ПроводкиБУ = Движения.Хозрасчетный;
Проводка = ПроводкиБУ.Добавить();
Проводка.Период = ДатаДока;
Проводка.Активность = Истина;
Проводка.Сумма = Задолженность;
Проводка.СчетДт=ПланыСчетов.Хозрасчетный.ДолгиКонтранентов;
Проводка.СубконтоДт.Контрагенты = Контрагент;
Проводка.СубконтоДт.Договоры = ДоговорКонтрагента;
Проводка.СчетКт = СчетАнализа;
// процедура из общего модуля
УстановитьСубконто(Проводка.СчетКт,Проводка.СубконтоКт, 1, Контрагент);
УстановитьСубконто(Проводка.СчетКт,Проводка.СубконтоКт, 2,
ДоговорКонтранента);
Движения.Хозрасчетный.Записать();
КонецЕСли;
Пример 2.
Составить модуль формирования проводок документа по выплате зарплаты. Документ содержит табличную часть с именем ТабЧасть
ПроводкиБУ = Движения.Хозрасчетный;
Для Каждого СтрокаТЧ из ТабЧасть Цикл
Проводка = ПроводкиБУ.Добавить();
Проводка.Период = Дата;
Проводка.Активность = Истина;
Проводка.Содержание = "Выплата зарплаты";
Проводка.Сумма = СтрокаТЧ.Сумма;
Если СтрокаТЧ.ВыплаченностьЗарплаты =
Перечисления.ВыплаченностьЗарплаты.Выплачено Тогда
СчетДт = ПланыСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда;
ИначеЕсли СтрокаТЧ.ВыплаченностьЗарплаты =
Перечисления.ВыплаченностьЗарплаты.Задепонировано Тогда
СчетДт = ПланыСчетов.Хозрасчетный.РасчетыПоДепонированнымСуммам;
Иначе
Сообщить("В документе " + ДокументВыплаты + " есть строки с невыплаченной зарплатой", СтатусСообщения.ОченьВажное);
Отказ = Истина;
Возврат;
КонецЕсли;
Проводка.СчетДт = СчетДт;
Проводка.СубконтоДт.РаботникиОрганизации = СтрокаТЧ.ФизЛицо;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.КассаОрганизации;
Проводка.СубконтоКт.СтатьиДвиженияДенежныхСредств =
СтатьяДвиженияДенежныхСредств;
КонецЦикла;
Движения.Хозрасчетный.Записать();
Пример 3 Сформировать программным способом документ «ОперацияБух» и сформировать его проводки
// Задать выбираемые значения.
ВыбранныйОтветственный = Справочники.Пользователи.НайтиПоНаименованию("Иванцова");
ВыбранныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("00027");
ВыбранныйДоговор = Справочники.ДоговорыКонтрагентов.НайтиПоКоду("00013");
ВыбранныйДокумент = Документы.ДокументРасчетовСКонтрагентом.НайтиПоНомеру(2, '20050101');
ВыбранныйСчет = Справочники.БанковскиеСчета.НайтиПоКоду("00001");
ВыбраннаяСтатья = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("00002");
ВыбраннаяОрганизация = Справочники.Организации.НайтиПоКоду("00001");
ВыбраннаяВалюта = Справочники.Валюты.НайтиПоКоду(810);
// Создать будущий регистратор.
ДатаЗаписи = ТекущаяДата();
Документ = Документы.ОперацияБух.СоздатьДокумент();
Документ.Дата = ДатаЗаписи;
Документ.Организация = ВыбраннаяОрганизация;
Документ.Ответственный = ВыбранныйОтветственный;
Документ.Содержание = "Оплата поставщику";
Документ.Записать();
// Создать набор записей.
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Документ.Ссылка);
Движение = НаборЗаписей.Добавить();
Движение.Регистратор = Документ.Ссылка;
Движение.Период = ДатаЗаписи;
// Заполнить счет дебета.
Движение.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("60.01");
// Заполнить аналитику счета дебета.
Движение.СубконтоДт.Контрагенты = ВыбранныйКонтрагент;
Движение.СубконтоДт.Договоры = ВыбранныйДоговор;
Движение.СубконтоДт.ДокументыРасчетовСКонтрагентами = ВыбранныйДокумент;
// Заполнить счет кредита.
Движение.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("51");
// Заполнить аналитику счета кредита.
Движение.СубконтоКт.БанковскиеСчета = ВыбранныйСчет;
Движение.СубконтоКт.СтатьиДвиженияДенежныхСредств = ВыбраннаяСтатья;
// Балансовое измерение.
Движение.Организация = ВыбраннаяОрганизация;
// Балансовый ресурс.
Движение.Сумма = 300000;
// Реквизиты.Движение.НомерЖурнала = "БК";
Движение.Содержание = "Оплата поставщику";
// Записать набор записей.
НаборЗаписей.Записать();
Пример 4. обработчик проведения документа «ПриходнаяНакладная»:
Процедура ОбработкаПроведения(Отказ, Режим)
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
// регистр ОстаткиМатериалов Приход
Движение = Движения.ОстаткиМатериалов Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение. Период = Дата;
Движение.Материал = ТекСтрокаМатериады.Материал;
Движение Склад = Склад;
Движение.Количество = ТекСтрокаМатериалы.Количество;
КонецЦикла;
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
// регистр СтоимостьМатериалов Приход
Движение = Движения.СтоимостьМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход
Движение Период = Дата;
Движение. Материал = ТекСтрокаМатериалы.Материал;
Движение Стоимость = ТекСтрокаМатериалы.Сумма;
КонецЦикла;
Для Каждого ТекСтрокаМатериалы из Материалы Цикл
// регистр бухгалтерии Управленческий
Движение = Движения.Управленческий Добавить();
Движение СчетДт = ПланыСчетов Основной. Товары;
Движение СчетКт = ПланыСчетов.Основной.РасчетыСПоставщиками;
Движение Период = Дата;
Движение Сумма = ТекСтрокаМатериалы Сумма;
Движение.Количество = ТекСтрокаМатериальг Количество;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто. Материалы] =
ТекСтрокаМагериалы Материал;
КонецЦикла;
// записываем движения регистров
Движения.ОстаткиМатериалов.Записать();
Движения.СтоимостьМатериалов.Залисать()
Движения.Управленческий.Записать();
КонецПродедуры
Замечание. Платформа сформировала уже знакомые нам три цикла обхода табличной части документа (для каждого регистра свой цикл). В первых двух циклах для нас нет ничего нового. В последнем, по большому счету, тоже - движения формируются таким же образом, как и для регистра накопления. Интерес для нас представляет только последняя строчка цикла, в которой присваивается значение субконто дебета.
Дело в том, что количество субконто как по дебету, так и по кредиту у каждой записи движения регистра будет различное, в зависимости от того, как определены счета в используемом плане счетов. Поэтому для каждой записи движения регистра бухгалтерии платформа хранит две коллекции значений: коллекцию субконто дебета и коллекцию субконто кредита. Каждая из этих коллекций содержит ровно столько элементов, сколько указано использовать видов субконто для соответствующего счета (дебета или кредита) в плане счетов. Обратиться к элементу коллекции можно, указав в квадратных скобках ссылку на соответствующий вид характеристик, либо указав через точку имя предопределенного вида характеристик.
Другими словами, запись:
Движение СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Материалы] ...
равносильна записи:
Движение.СубконтоДт Материалы
