Автоматическая запись бухгалтерских проводок
Примерно раз лет в 10 возникает эта простая задача. Помнить это естественно невозможно, поэтому решил записать (в том числе для себя), чтобы больше не разгребать странные советы из поисковиков...
Итак, нужно у автоматически создаваемых документов подправить стандартные проводки и добавить еще несколько новых. Больше всего для решения подходит вполне себе типовой механизм ручной корректировки. Тут 1С-ники использовали неудачный термин. Вручную делать это вовсе необязательно...
//Сначала заполненный программно документ проводим как обычно, //чтобы кроме проводок записались все необходимые регистры НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение); //Затем меняем реквизит ручной корректировки и записываем уже без проведения НовыйДокумен.РучнаяКорректировка = Истина; НовыйДокумен.Записать(РежимЗаписиДокумента.Запись); //Перебираем существующие проводки, заменяем счет и субконто Для Каждого Движение из НовыйДокумен.Движения.Хозрасчетный Цикл Если Движение.СчетКт = НеправильныйСчет Тогда Движение.СчетКт = ПравильныйСчет; //Перед установкой субконто обязательно очищаем имеющуюся коллекцию: //и виды, и значения Движение.СубконтоКт.Очистить(); //Устанавливаем нужные субконто (допустим счет у нас взаиморасчетный) Движение.СубконтоКт.Контрагенты = НужныйКонтрагент; Движение.СубконтоКт.Договоры = НужныйДоговорКонтрагента; Движение.СубконтоКт.ДокументыРасчетовСКонтрагентами = НужныйДокумент; КонецЕсли; КонецЦикла; //Фрмируем новые проводки (например нужно частично сторнировать поступление) Для Каждого СтрокаНачислений из МассивСтрокНачислений Цикл НовоеДвижение = НовыйДокумен.Движения.Хозрасчетный.Добавить(); НовоеДвижение.Период = НовыйДокумен.Дата; НовоеДвижение.Регистратор = НовыйДокумен.Ссылка; НовоеДвижение.Активность = Истина; НовоеДвижение.СчетДт = Счет20_01; НовоеДвижение.ПодразделениеДт = НужноеПодразделениеЗатрат; НовоеДвижение.СубконтоДт.НоменклатурныеГруппы = СтрокаНачислений.НоменклатурнаяГруппа; НовоеДвижение.СубконтоДт.СтатьиЗатрат = СтрокаНачислений.СтатьяЗатрат; НовоеДвижение.СчетКт = Счет60_01; НовоеДвижение.СубконтоКт.Контрагенты = НужныйКонтрагент; НовоеДвижение.СубконтоКт.Договоры = НужныйДоговорКонтрагента; НовоеДвижение.СубконтоКт.ДокументыРасчетовСКонтрагентами = НужныйДокумент; НовоеДвижение.Организация = НужнаяОрганизация; СуммаБезНДС = СтрокаНачислений.СуммаБезНДС; НовоеДвижение.Сумма = -СуммаБезНДС; НовоеДвижение.СуммаНУДт = -СуммаБезНДС; НовоеДвижение.СуммаНУКт = -СуммаБезНДС; НовоеДвижение.Содержание = "Реализация услуг"; КонецЦикла; //Записываем проводки НовыйДокумен.Движения.Хозрасчетный.Записать();
Вот и все. В результате получается проведенный документ с нужными нетиповыми проводками. Иногда, сейчас уже очень редко, это нужно. А ломать стандартный механизм проведения или создавать новый вид документов не пришлось.
P.S. Только важно помнить, что у помеченных на удаление документов с ручной корректировкой проводки остаются. У них просто переключается свойство Активность в положение Ложь. И понятно для чего так сделано. Чтобы при снятии пометки удаления все восстановилось как было. Поэтому в запросах не к виртуальным таблицам, а напрямую к записям регистра бухгалтерии (и других регистров) надо не забывать это учитывать (обязательно добавлять условие "Активность = Истина"). В примере ниже данные не выведутся:
Выбрать * Из РегистрБухгалтерии.Хозрасчетный Где Регистратор Ссылка Документ.РеализацияТоваровУслуг и Регистратор.ПометкаУдаления = Истина и Активность = Истина