Как настроить запись движений регистра бухгалтерии и расчет полей табличной части в документе 1С?

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При самостоятельной разработке новых документов в конфигурациях 1С начинающие разработчики часто сталкиваются с двумя типовыми трудностями: движения по документу не сохраняются в регистре бухгалтерии после проведения, а вычисляемые поля в строках табличной части (например, сумма на основе тарифа и объема) не рассчитываются автоматически при вводе данных. Разберем детально причины такого поведения платформы и пошагово реализуем правильную логику работы документа.

Вопрос 1. Почему не сохраняются проводки в регистре бухгалтерии при проведении

Проанализируем типовую ситуацию: в модуле объекта документа в процедуре ОбработкаПроведения описан цикл обхода строк табличной части, в котором создаются проводки через коллекцию движений (например, Движения.ЕПСБУ). Документ проводится без ошибок, однако при просмотре проводок список движений оказывается абсолютно пустым.

Основная причина заключается в том, что по умолчанию платформа 1С не записывает набор записей движений, если для него явно не установлен признак модифицированности или не вызвана команда записи. Для автоматической фиксации проводок по завершении транзакции проведения необходимо взвести флаг Записывать = Истина для соответствующей коллекции набора записей.

Разберем корректный пример процедуры ОбработкаПроведения:


Процедура ОбработкаПроведения(Отказ, РежимЗаписи, РежимПроведения)
    
    Отказ = Ложь;
    
    // Получаем коллекцию проводок регистра бухгалтерии
    ПроводкиБУ = Движения.ЕПСБУ;
    
    // Обязательно устанавливаем флаг автоматической записи набора
    ПроводкиБУ.Записывать = Истина;
    
    // Оптимизация: получаем ссылки на справочники до входа в цикл
    СсылкаКОСГУ560 = Справочники.КОСГУ.НайтиПоКоду("560");
    СсылкаЖурнал5  = Справочники.Журналы.НайтиПоКоду("5");
    
    Для Каждого Стр Из Начисление Цикл
        
        Проводка = ПроводкиБУ.Добавить();
        Проводка.Период = Дата;
        Проводка.Учреждение = Учреждение;
        
        // Заполнение дебетовой стороны
        Проводка.СчетДт = СчетДт;
        Проводка.КБКДт = КБК;
        Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.КОСГУ] = СсылкаКОСГУ560;
        Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Плательщик;
        Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Договоры] = Договор;
        
        // Заполнение кредитовой стороны
        Проводка.СчетКт = СчетКТ;
        Проводка.КБККт = КБК;
        Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.КОСГУ] = КОСГУ;
        
        // Реквизиты проводки
        Проводка.НомерЖурнала = СсылкаЖурнал5;
        Проводка.Содержание = "Начислено по квитанции";
        Проводка.Сумма = Стр.Начисленно;
        
    КонецЦикла;
    
КонецПроцедуры

Обратим внимание на важные правила оптимизации и надежности кода проведения:

  1. Проверка состава движений: в дереве метаданных документа на вкладке «Движения» должен быть обязательно отмечен флаг напротив нужного регистра бухгалтерии. Если флаг снят, набор записей не будет сохранен в базе данных.
  2. Вынос поиска из цикла: вызовы методов НайтиПоКоду или НайтиПоНаименованию выполняют запросы к базе данных. Их следует выносить за пределы цикла, чтобы избежать лишней нагрузки на СУБД.
  3. Обращение к субконто: заполнение субконто через обращение к коллекции по видам субконто (ПланыВидовХарактеристик.ВидыСубконто) гарантирует корректную запись независимо от динамического порядка субконто на плане счетов.

Вопрос 2. Как связать формулы и расчет колонок в табличной части формы

В платформе 1С формулы в ячейках табличной части не работают автоматически, как в табличных процессорах. Чтобы при редактировании колонок «Тариф» или «Объем» результат умножения автоматически записывался в колонку «Начислено», требуется связать визуальные элементы формы с процедурой пересчета через события.

Разберем по шагам, как настроить автоматический пересчет:

  1. Перейдем в редактор формы документа.
  2. Выделим элемент формы — колонку Тариф в табличной части и откроем окно ее свойств.
  3. В разделе событий найдем событие ПриИзменении и нажмем кнопку с лупой для генерации обработчика в модуле формы.
  4. Повторим аналогичное действие для колонки Объем, назначив для нее тот же самый или отдельный обработчик ПриИзменении.
  5. В сгенерированных процедурах обратимся к текущей активной строке таблицы и передадим ее в общую процедуру расчета.

Посмотрим на пример правильной структуры кода в модуле формы:


// Процедура расчета суммы для переданной строки
Процедура РасчетНачисленно(Стр)
    
    Если Стр = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Выполняем расчет с обязательным округлением до копеек
    Стр.Начисленно = Окр(Стр.Тариф * Стр.Объем, 2);
    
КонецПроцедуры

// Обработчик изменения значения в колонке "Тариф"
Процедура НачислениеТарифПриИзменении(Элемент)
    
    ТекСтрока = Элементы.Начисление.ТекущиеДанные;
    РасчетНачисленно(ТекСтрока);
    
КонецПроцедуры

// Обработчик изменения значения в колонке "Объем"
Процедура НачислениеОбъемПриИзменении(Элемент)
    
    ТекСтрока = Элементы.Начисление.ТекущиеДанные;
    РасчетНачисленно(ТекСтрока);
    
КонецПроцедуры

Тонкости при работе с табличными частями на форме

При реализации формул в строках табличных частей важно учитывать следующие особенности:

  1. Обязательная проверка на Неопределено: свойство ТекущиеДанные таблицы формы может вернуть Неопределено, если строка была удалена или фокус находится вне строк. Проверка защитит программу от аварийного завершения.
  2. Использование явного округления: перемножение дробных чисел часто приводит к появлению погрешностей в долях копеек. Применение функции Окр(..., 2) предотвращает расхождение между итогами в табличной части и суммами проводок.
  3. Назначение обработчиков на все зависимые поля: если расчет зависит от двух и более колонок, обработчик ПриИзменении должен быть назначен на каждую из них, иначе при изменении одного из значений расчет не запустится.
← На главную