Часто при программном создании документов в конфигурации 1С:Бухгалтерия 3.0 (БП 3.0), например, документа РеализацияТоваровУслуг, мы сталкиваемся с проблемой: если вводить документ «ручками» через интерфейс, то после выбора контрагента или номенклатуры программа автоматически подтягивает массу данных. Самостоятельно заполняются счета учета в шапке и табличной части, подставляются нужные цены, коэффициенты и единицы измерения. Однако, если создать этот же документ программным путем и просто добавить строку в табличную часть, все эти поля остаются пустыми. Разберем по шагам, почему это происходит и как заставить программу автоматически заполнить все нужные реквизиты.
Когда мы работаем с современными типовыми конфигурациями, логика автоматического заполнения часто вынесена в сложные переплетения общих модулей. Если вы не знаете, какая конкретно процедура вызывается при выборе номенклатуры на форме, проанализируем ситуацию с помощью отладчика. Выясним причину через замер производительности:
После остановки замера перед вами появится подробная таблица («портянка») со всеми вызванными функциями и процедурами. Вдумчиво анализируя эти строки, мы можем увидеть весь путь исполнения кода. Например, в случае со счетами учета номенклатуры, вы обязательно увидите вызов таких функций, как НачатьЗаполнениеСчетовУчета или обращения к общим модулям.
При анализе базы программисты часто замечают, что регистр СчетаУчетаНоменклатуры визуально кажется абсолютно пустым, хотя счета в документ подставляются верно. Посмотрим на эту ситуацию детальнее. Дело в том, что в 1С:БП 3.0 реализована строгая иерархическая система подстановки счетов по умолчанию.
Программа ищет счет по следующему алгоритму:
Если ни одно из этих условий детально не прописано, конфигурация берет самую верхнюю запись по умолчанию. Это запись в регистре, в которой вообще не заполнен ни один разрез аналитики. Именно из этой скрытой записи по умолчанию 1С автоматически подставляет базовые счета: 41.01 для товаров на складе, 90.01.1 для выручки от реализации и так далее. Поэтому пустой на первый взгляд регистр на самом деле хранит фундаментальные настройки учета.
Рассмотрим подробнее, как заставить документ заполнить свои реквизиты программно, не прописывая каждый счет вручную в коде. Правильный подход состоит в том, чтобы использовать типовые обработчики.
Один из самых надежных способов — использовать метод объекта Заполнить(). В модуле объекта документа находится предопределенная процедура ОбработкаЗаполнения, в которой разработчиками 1С сосредоточена вся стартовая логика формирования документа.
Вы можете передать в этот метод структуру с данными. Посмотрим на пример вызова:
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// Подготовим структуру с параметрами заполнения
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Организация", СсылкаНаОрганизацию);
ПараметрыЗаполнения.Вставить("Контрагент", СсылкаНаКонтрагента);
// Вызываем метод Заполнить
НовыйДокумент.Заполнить(ПараметрыЗаполнения);
Кроме того, мы можем передать во временное хранилище заранее сформированную таблицу значений со списком товаров и передать её адрес в структуру с ключом АдресТаблицыНоменклатуры. Процедура сама перехватит эту таблицу, заполнит табличную часть и проинициализирует нужные реквизиты.
Если документ уже создан и табличная часть заполнена товарами программно (с помощью метода Добавить()), нам необходимо подтянуть счета учета. В современных версиях БП 3.0 за подстановку бухгалтерских счетов отвечает отдельный общий модуль СчетаУчетаВДокументах.
Вместо ручного прописывания каждого счета, мы можем вызвать экспортные методы этого модуля, например ЗаполнитьСчетаУчетаВТабличнойЧасти() или ЗаполнитьПередЗаписью(). Эти методы инициируют ту же самую логику поиска счетов, которая отрабатывает при ручном вводе документа через форму.
При выборе номенклатуры в пользовательском интерфейсе отрабатывает клиентское событие формы ПриИзменении, которое выполняет серверные вычисления по поиску актуальной цены. При программном заполнении нам нужно сымитировать эту логику.
Для корректного заполнения цен убедитесь, что в документе заполнены реквизиты Контрагент и ДоговорКонтрагента (в котором обязательно должен быть указан тип цен). Затем мы можем программно перебрать строки табличной части и вызвать типовые общие модули, отвечающие за ценообразование.
Как только колонки с ценами получены из регистра сведений «Цены номенклатуры», нам остается пересчитать суммы. Сделаем это с помощью обхода в цикле:
Для Каждого СтрокаТЧ Из НовыйДокумент.Товары Цикл
// Предполагаем, что цена и количество уже заполнены
СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена;
// Вызов типового метода для расчета НДС (если требуется)
// СтрокаТЧ.СуммаНДС = ...
КонецЦикла;
Проанализируем несколько важных правил, которые помогут избежать ошибок при программной генерации данных в 1С:
ДокументОбъект).Используя типовые механизмы, общие модули и замер производительности для анализа конфигурации, мы можем элегантно и правильно программно создавать документы, полностью имитируя интерактивную работу пользователя в системе 1С.