Как программно установить признак отражения в бух. учете и заполнить Требование-накладную из обработки

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

В практике разработки на платформе 1С часто возникает задача автоматизации рутинных операций, таких как создание цепочки складских документов на основании первичных документов закупки. Одной из типичных задач является программная генерация документа Требование-накладная на основании Поступления товаров и услуг. При этом разработчики часто сталкиваются с тем, что стандартного метода Заполнить() недостаточно для корректного отражения документа в учете и заполнения всей необходимой аналитики. В этой статье мы подробно разберем, как правильно эмулировать интерактивное поведение формы, программно устанавливать признаки учета и обеспечивать заполнение всех обязательных полей, таких как статьи затрат и счета учета.

Разбор основной проблемы: почему метод Заполнить() не всегда помогает

Метод документа Заполнить(Основание) выполняет базовое копирование данных, предусмотренное разработчиком конфигурации в модуле объекта (процедура ОбработкаЗаполнения). Однако этот метод часто не включает в себя специфическую логику, которая срабатывает в форме документа при интерактивном изменении пользователем признаков "Отражать в бухгалтерском учете" или "Отражать в налоговом учете". Когда мы работаем из внешней обработки, формы документа физически не существует, поэтому события типа ПриИзменении не вызываются автоматически. Наша задача — программно воспроизвести действия, которые выполняет система «под капотом» формы.

Шаг 1: Инициализация документа и установка флагов учета

Начнем с создания объекта документа и установки ключевых признаков. Проанализируем ситуацию: если мы просто установим флаг в Истина, счета учета в табличной части могут остаться пустыми или некорректными для данного вида учета. Рассмотрим правильную последовательность действий:


НовДокумент = Документы.ТребованиеНакладная.СоздатьДокумент();
// Устанавливаем дату и организацию перед заполнением
НовДокумент.Дата = ТекущаяДата();
НовДокумент.Организация = ДокументОснование.Организация;

// Вызываем стандартное заполнение по основанию
НовДокумент.Заполнить(ДокументОснование.Ссылка);

// Принудительно устанавливаем признаки учета
НовДокумент.ОтражатьВБухгалтерскомУчете = Истина;
НовДокумент.ОтражатьВНалоговомУчете = Ложь; // Или Истина, в зависимости от задачи

Шаг 2: Эмуляция события ПриИзменении и заполнение счетов учета

Поскольку мы не можем вызвать процедуру модуля формы из обработки, нам необходимо найти эквивалентную логику в общих модулях. В типовых решениях (таких как УПП, КА 1.1 или БП 2.0) за это отвечает функционал общего модуля СчетаУчетаВДокументах. Разберем, как вызвать перезаполнение счетов учета программно, чтобы документ был готов к проведению.

Для корректного заполнения счетов учета в табличной части Материалы воспользуемся следующим подходом:


СтруктураПерезаполнения = Новый Структура("Материалы");
СчетаУчетаВДокументах.ИнтерактивноПерезаполнитьСчетаУчета(
    НовДокумент, 
    Ложь, 
    СтруктураПерезаполнения, 
    НовДокумент.ОтражатьВБухгалтерскомУчете, 
    НовДокумент.ОтражатьВНалоговомУчете
);

Этот метод проанализирует настройки учетной политики и текущие значения в строках табличной части, подставив счета учета из регистра сведений Счета учета номенклатуры.

Шаг 3: Решение проблемы с пустыми статьями затрат

Часто после программного заполнения выясняется, что в некоторых строках (например, в строках 16 и 17, как в примере автора вопроса) не заполнена СтатьяЗатрат. Проанализируем причину: в документе-основании (Поступление) статьи затрат могут отсутствовать, если это была покупка на склад, а в Требовании-накладной статья затрат обязательна для списания в производство или на расходы. Выясним, как дозаполнить эти данные.

Мы рекомендуем пройтись циклом по табличной части и проверить заполнение аналитики. Если поле пустое, его следует заполнить из настроек пользователя или по умолчанию из свойств номенклатуры:


Для Каждого СтрокаТЧ Из НовДокумент.Материалы Цикл
    Если ЗначениеЗаполнено(СтрокаТЧ.СтатьяЗатрат) Тогда
        Продолжить;
    КонецЕсли;
    
    // Пытаемся получить статью затрат из настроек или констант
    // В разных конфигурациях механизмы могут отличаться
    СтрокаТЧ.СтатьяЗатрат = ОсновныеСтатьиЗатратПоУмолчанию; 
    
    // Если статья затрат должна зависеть от номенклатуры:
    // СтрокаТЧ.СтатьяЗатрат = СтрокаТЧ.Номенклатура.СтатьяЗатрат;
КонецЦикла;

Шаг 4: Проверка заполнения и программное проведение

Прежде чем выполнять метод Записать(РежимЗаписиДокумента.Проведение), крайне важно убедиться, что все обязательные поля заполнены. В противном случае транзакция будет отменена с системной ошибкой, которую сложно отловить в цикле обработки.

Рассмотрим алгоритм безопасного проведения:

  1. Вызываем метод НовДокумент.ПроверитьЗаполнение(). Он вернет Истина, если документ прошел все проверки, заданные в метаданных.
  2. Если проверка не прошла, можно проанализировать сообщения, выведенные в окно сообщений пользователю.
  3. Если проверка успешна, записываем и проводим документ.

Если НовДокумент.ПроверитьЗаполнение() Тогда
    Попытка
        НовДокумент.Записать(РежимЗаписиДокумента.Проведение);
        Сообщить("Документ " + НовДокумент + " успешно создан и проведен.");
    Исключение
        Сообщить("Ошибка при проведении: " + ОписаниеОшибки());
    КонецПопытки;
Иначе
    Сообщить("Документ " + НовДокумент + " не заполнен надлежащим образом!");
КонецЕсли;

Важные рекомендации при работе с датами и оперативностью

Проанализируем еще один тонкий момент: время проведения. Если вы создаете документы за прошлый период, убедитесь, что дата документа установлена корректно. При программном проведении документа "сегодняшним" числом система может попытаться выполнить оперативное проведение. Если на момент проведения (включая секунды) остатков на складе нет, проведение завершится с ошибкой.

Чтобы избежать проблем с нехваткой остатков при создании документов "задним числом" или внутри одного дня, рекомендуется использовать неоперативный режим записи:


НовДокумент.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);

Резюме по решению

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

← На главную