Как программно заполнить табличную часть Запасы в 1С:УНФ и избежать ошибок при расчете сумм и цен

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

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

Причина ошибки «Метод объекта не обнаружен (Свойство)»

Разберем ситуацию: вы пытаетесь вызвать типовую процедуру УправлениеНебольшойФирмойКлиентСервер.РассчитатьСуммыВСтрокеТЧ, передавая в неё строку табличной части, полученную через обход коллекции Объект.Запасы или Док.Запасы. В этот момент система выдает ошибку. Проанализируем причину.

В УНФ многие клиент-серверные методы проектировались для работы непосредственно с экранными формами. Когда мы работаем в модуле формы, строка таблицы имеет тип ДанныеФормыЭлементКоллекции. У этого типа есть встроенный метод Свойство(), который позволяет динамически проверять наличие реквизитов. Однако, если мы работаем в обработке или серверном модуле напрямую с объектом (ДокументОбъект), строка таблицы имеет тип СтрокаТабличнойЧасти. У этого объекта метода Свойство() нет, что и приводит к падению системы.

Для решения этой проблемы мы должны использовать проверку типа или обращаться к альтернативным методам, которые умеют работать напрямую с объектными данными. Посмотрим на правильную реализацию вызова:


Если ТипЗнч(СтрокаТаблицыЗапасы) = Тип("ДанныеФормыЭлементКоллекции") Тогда
    // Если работаем в контексте формы
    УправлениеНебольшойФирмойКлиентСервер.РассчитатьСуммыВСтрокеТЧ(СтрокаТаблицыЗапасы, ПараметрыРасчета);
Иначе
    // Если работаем с объектом напрямую (например, в обработке)
    НаборыКлиентСервер.РассчитатьСуммыВСтрокеТЧ(Док.Запасы, СтрокаТаблицыЗапасы, ПараметрыРасчета);
КонецЕсли;

Подготовка параметров расчета

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


ПараметрыРасчета = Новый Структура;
ПараметрыРасчета.Вставить("СброситьФлагСкидкиРассчитаны", Истина);
ПараметрыРасчета.Вставить("СуммаВключаетНДС", Объект.СуммаВключаетНДС);
// Дополнительно можно указать валюту и другие параметры, если это требуется версией конфигурации

Важно помнить, что РассчитатьСуммыВСтрокеТЧ лишь перемножает уже имеющиеся значения цены и количества, учитывая скидки. Она не подтягивает цену из прайс-листов автоматически.

Автоматическое получение цены номенклатуры

Для того чтобы в документе (например, в «Расходной накладной») цена заполнилась исходя из настроек договора или категории цен, необходимо задействовать специализированные серверные функции. Проанализируем наиболее эффективный способ получения цены через программный интерфейс УНФ.

Для получения цены по конкретному виду цен используется функция УправлениеНебольшойФирмойСервер.ПолучитьЦенуНоменклатурыПоВидуЦен. Если же нам нужно учитывать условия договора с контрагентом, лучше обратиться к методу УправлениеНебольшойФирмойСервер.ПолучитьЦенуНоменклатурыПоВидуЦенКонтрагента.

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


// 1. Добавляем новую строку
НоваяСтрока = Объект.Запасы.Добавить();
НоваяСтрока.Номенклатура = СсылкаНаТовар;
НоваяСтрока.Количество = 10;

// 2. Получаем цену (пример для версии УНФ, где используется ВидЦен)
СтруктураЦены = УправлениеНебольшойФирмойСервер.ПолучитьЦенуНоменклатурыПоВидуЦен(
    НоваяСтрока.Номенклатура, 
    НоваяСтрока.Характеристика, 
    Объект.ВидЦен, 
    Объект.Дата
);

НоваяСтрока.Цена = СтруктураЦены.Цена;

// 3. Рассчитываем суммы
НаборыКлиентСервер.РассчитатьСуммыВСтрокеТЧ(Объект.Запасы, НоваяСтрока, ПараметрыРасчета);

Нюансы, которые важно учесть

При заполнении табличной части «Запасы» недостаточно просто заполнить Цена и Сумма. В УНФ существует ряд скрытых механизмов, которые могут повлиять на проведение документа:

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

Итоги и рекомендации

Мы выяснили, что основной причиной ошибок при программной работе с табличными частями УНФ является смешивание контекстов формы и объекта. Для надежной работы кода всегда проверяйте, с каким типом данных вы взаимодействуете. При работе в фоновых заданиях или внешних обработках отдавайте предпочтение методам из модулей с суффиксом Сервер и НаборыКлиентСервер, так как они более универсальны и не привязаны к методам ДанныеФормы.

Также рекомендуем ознакомиться с методом ЗаполнитьПоОснованию в менеджере документа, если ваша задача — создать накладную на базе заказа. Это позволит избежать написания сотен строк кода и задействовать все штатные механизмы конфигурации автоматически.

← На главную