Как программно заполнить реквизиты, счета учета и цены нового документа в 1С?

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

Часто при программном создании документов в конфигурации 1С:Бухгалтерия 3.0 (БП 3.0), например, документа РеализацияТоваровУслуг, мы сталкиваемся с проблемой: если вводить документ «ручками» через интерфейс, то после выбора контрагента или номенклатуры программа автоматически подтягивает массу данных. Самостоятельно заполняются счета учета в шапке и табличной части, подставляются нужные цены, коэффициенты и единицы измерения. Однако, если создать этот же документ программным путем и просто добавить строку в табличную часть, все эти поля остаются пустыми. Разберем по шагам, почему это происходит и как заставить программу автоматически заполнить все нужные реквизиты.

Как найти откуда конфигурация берет данные?

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

  1. Откройте конфигуратор и запустите сеанс 1С:Предприятия в режиме отладки.
  2. В режиме предприятия откройте форму типового документа (например, Реализации товаров и услуг).
  3. В конфигураторе включите «Замер производительности».
  4. Перейдите обратно в предприятие и выполните целевое действие: выберите контрагента или добавьте номенклатуру в табличную часть документа. Дождитесь, пока программа заполнит счета учета и цены.
  5. Вернитесь в конфигуратор и отключите замер производительности.

После остановки замера перед вами появится подробная таблица («портянка») со всеми вызванными функциями и процедурами. Вдумчиво анализируя эти строки, мы можем увидеть весь путь исполнения кода. Например, в случае со счетами учета номенклатуры, вы обязательно увидите вызов таких функций, как НачатьЗаполнениеСчетовУчета или обращения к общим модулям.

Почему регистр сведений «Счета учета номенклатуры» может быть пустым?

При анализе базы программисты часто замечают, что регистр СчетаУчетаНоменклатуры визуально кажется абсолютно пустым, хотя счета в документ подставляются верно. Посмотрим на эту ситуацию детальнее. Дело в том, что в 1С:БП 3.0 реализована строгая иерархическая система подстановки счетов по умолчанию.

Программа ищет счет по следующему алгоритму:

  1. Для конкретной номенклатурной позиции.
  2. Для группы номенклатуры, в которой она находится.
  3. Для справочника «Виды номенклатуры».
  4. Для конкретного склада или типа склада.

Если ни одно из этих условий детально не прописано, конфигурация берет самую верхнюю запись по умолчанию. Это запись в регистре, в которой вообще не заполнен ни один разрез аналитики. Именно из этой скрытой записи по умолчанию 1С автоматически подставляет базовые счета: 41.01 для товаров на складе, 90.01.1 для выручки от реализации и так далее. Поэтому пустой на первый взгляд регистр на самом деле хранит фундаментальные настройки учета.

Использование штатных механизмов заполнения документа

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

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

Вы можете передать в этот метод структуру с данными. Посмотрим на пример вызова:


НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// Подготовим структуру с параметрами заполнения
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Организация", СсылкаНаОрганизацию);
ПараметрыЗаполнения.Вставить("Контрагент", СсылкаНаКонтрагента);

// Вызываем метод Заполнить
НовыйДокумент.Заполнить(ПараметрыЗаполнения);

Кроме того, мы можем передать во временное хранилище заранее сформированную таблицу значений со списком товаров и передать её адрес в структуру с ключом АдресТаблицыНоменклатуры. Процедура сама перехватит эту таблицу, заполнит табличную часть и проинициализирует нужные реквизиты.

Заполнение счетов учета через специализированные модули

Если документ уже создан и табличная часть заполнена товарами программно (с помощью метода Добавить()), нам необходимо подтянуть счета учета. В современных версиях БП 3.0 за подстановку бухгалтерских счетов отвечает отдельный общий модуль СчетаУчетаВДокументах.

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

Подтягивание цен и пересчет сумм в табличной части

При выборе номенклатуры в пользовательском интерфейсе отрабатывает клиентское событие формы ПриИзменении, которое выполняет серверные вычисления по поиску актуальной цены. При программном заполнении нам нужно сымитировать эту логику.

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

Как только колонки с ценами получены из регистра сведений «Цены номенклатуры», нам остается пересчитать суммы. Сделаем это с помощью обхода в цикле:


Для Каждого СтрокаТЧ Из НовыйДокумент.Товары Цикл
    // Предполагаем, что цена и количество уже заполнены
    СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена;
    
    // Вызов типового метода для расчета НДС (если требуется)
    // СтрокаТЧ.СуммаНДС = ...
КонецЦикла;

Основные правила при программном создании документов

Проанализируем несколько важных правил, которые помогут избежать ошибок при программной генерации данных в 1С:

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

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

← На главную