Как программно заполнить табличную часть в сложных документах планирования 1С:КА 2 и 1С:ERP

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

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

В чем заключается сложность структуры документов планирования

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

  1. Обычный список — где каждая строка соответствует одной номенклатурной позиции и одному периоду.
  2. Кросс-таблица — где периоды (месяцы, недели, дни) развернуты в колонки, а в ячейках на пересечении номенклатуры и периода указывается количество.

Для реализации второго режима разработчики фирмы "1С" используют на форме не саму табличную часть Объект.Товары, а вспомогательную таблицу значений — ТоварыПоПериодам. Она существует только в памяти формы и динамически перестраивается при изменении настроек периода или вида плана. Когда вы вносите данные в Объект.Товары, форма "не знает", что нужно обновить экранную таблицу ТоварыПоПериодам, если не вызвать соответствующие методы синхронизации.

Разбор типичных ошибок при заполнении

Посмотрим на пример кода, который часто пишут начинающие разработчики, и выясним, почему он работает некорректно:


Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    СтрокаДока = Объект.Товары.Добавить();
    СтрокаДока.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
    СтрокаДока.Упаковка     = ВыборкаДетальныеЗаписи.Номенклатура.ЕдиницаИзмерения;
    СтрокаДока.Количество   = ВыборкаДетальныеЗаписи.Количество;
    
    // Попытка вручную заполнить экранную таблицу
    ст = ТоварыПоПериодам.Добавить();
    ЗаполнитьЗначенияСвойств(ст, СтрокаДока);
КонецЦикла;

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

Алгоритм правильного заполнения документа

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

Шаг 1: Подготовка данных и работа с периодами

Перед заполнением убедитесь, что в документе выбран ВидПлана. Периодичность (день, неделя, месяц), указанная в нем, определяет, какие даты должны стоять в строках ТЧ. Рассмотрим пример подготовки правильной даты:


// Предположим, ВидПлана имеет периодичность "Месяц"
ДатаСтроки = НачалоМесяца(ТекущаяДата()); 

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

Шаг 2: Использование служебных процедур для обновления формы

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

Проанализируем ситуацию в коде формы документа:


// После программного изменения Объект.Товары на сервере:
ПараметрыЗаполнения = ПланированиеЗапасовКлиентСервер.ПараметрыЗаполненияГрафика();
ПланированиеЗапасовСервер.ЗаполнитьКроссТаблицу(ЭтаФорма);

Процедура ЗаполнитьКроссТаблицу выполнит следующие действия:

  1. Проанализирует данные в Объект.Товары.
  2. Сгруппирует их по номенклатуре и периодам.
  3. Очистит и заново наполнит ТоварыПоПериодам.
  4. Сформирует необходимые колонки в интерфейсе.

Шаг 3: Расчет служебных реквизитов и итогов

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


// Вызывается в контексте формы
ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции(); 
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
РассчитатьИтоговыеПоказатели(ЭтаФорма);

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

Работа с механизмом загрузки из внешних источников

Если ваша задача — реализовать загрузку данных из Excel или другого внешнего файла, обратите внимание на штатный механизм, который используется в типовых решениях (обработка ЗагрузкаДанныхИзВнешнихФайлов). В документе часто присутствует процедура ПолучитьЗагруженныеТоварыИзХранилища. Посмотрим, как это работает:

Система сначала помещает данные во временное хранилище, а затем вызывает метод формы для их обработки. Это самый безопасный путь, так как при такой загрузке автоматически отрабатывают все проверки бизнес-логики. Если вы пишете свою обработку заполнения ТЧ, старайтесь имитировать это поведение, вызывая экспортные методы формы документа.

Резюме: контрольный список программиста

Чтобы успешно одолеть трудность заполнения сложных табличных частей в КА 2 и ERP, следуйте этим правилам:

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

← На главную