При разработке в конфигурациях 1С:Комплексная автоматизация 2 или 1С:ERP программисты часто сталкиваются с тем, что обычное добавление строк в табличную часть документа не приводит к их отображению на форме. Особенно ярко это проявляется в документах планирования: План закупок, План продаж и План производства. В этой статье мы подробно разберем, почему так происходит, как устроен механизм кросс-таблиц и как правильно написать код для заполнения таких документов.
Рассмотрим ситуацию: вы программно заполнили табличную часть Товары в объекте документа План закупок, но при открытии формы видите пустые строки или только номенклатуру без количественных показателей. Проанализируем причину этого явления. Дело в том, что интерфейс этих документов спроектирован для работы в двух режимах:
Для реализации второго режима разработчики фирмы "1С" используют на форме не саму табличную часть Объект.Товары, а вспомогательную таблицу значений — ТоварыПоПериодам. Она существует только в памяти формы и динамически перестраивается при изменении настроек периода или вида плана. Когда вы вносите данные в Объект.Товары, форма "не знает", что нужно обновить экранную таблицу ТоварыПоПериодам, если не вызвать соответствующие методы синхронизации.
Посмотрим на пример кода, который часто пишут начинающие разработчики, и выясним, почему он работает некорректно:
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
СтрокаДока = Объект.Товары.Добавить();
СтрокаДока.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
СтрокаДока.Упаковка = ВыборкаДетальныеЗаписи.Номенклатура.ЕдиницаИзмерения;
СтрокаДока.Количество = ВыборкаДетальныеЗаписи.Количество;
// Попытка вручную заполнить экранную таблицу
ст = ТоварыПоПериодам.Добавить();
ЗаполнитьЗначенияСвойств(ст, СтрокаДока);
КонецЦикла;
Проанализируем этот фрагмент. Основная проблема здесь в том, что в документах планирования критически важно поле Период (или Дата в строке ТЧ). Если дата в строке ТЧ Товары не совпадает с началом периода, заданного в Виде плана, система просто не сможет сопоставить эту строку с колонками кросс-таблицы на форме. Кроме того, ручное заполнение ТоварыПоПериодам крайне нежелательно, так как структура этой таблицы меняется динамически.
Выясним, как сделать заполнение надежным и соответствующим стандартам типовых конфигураций. Разделим процесс на несколько этапов.
Перед заполнением убедитесь, что в документе выбран ВидПлана. Периодичность (день, неделя, месяц), указанная в нем, определяет, какие даты должны стоять в строках ТЧ. Рассмотрим пример подготовки правильной даты:
// Предположим, ВидПлана имеет периодичность "Месяц"
ДатаСтроки = НачалоМесяца(ТекущаяДата());
СтрокаТовары = Объект.Товары.Добавить();
СтрокаТовары.Номенклатура = СсылкаНаНоменклатуру;
СтрокаТовары.Дата = ДатаСтроки; // Обязательно начало периода!
СтрокаТовары.Количество = 100;
Вместо того чтобы вручную перебирать строки экранной таблицы, воспользуемся методами, заложенными разработчиками в модулях планирования запасов. Для корректного отображения данных на форме необходимо вызвать процедуры обновления кросс-таблицы. Как правило, они находятся в серверном модуле ПланированиеЗапасовСервер или вызываются непосредственно из формы.
Проанализируем ситуацию в коде формы документа:
// После программного изменения Объект.Товары на сервере:
ПараметрыЗаполнения = ПланированиеЗапасовКлиентСервер.ПараметрыЗаполненияГрафика();
ПланированиеЗапасовСервер.ЗаполнитьКроссТаблицу(ЭтаФорма);
Процедура ЗаполнитьКроссТаблицу выполнит следующие действия:
Объект.Товары.ТоварыПоПериодам.Не забываем, что современные конфигурации ERP-класса требуют обновления множества служебных полей (цены, единицы измерения, спецификации). Рассмотрим набор методов, которые рекомендуется вызывать после заполнения данных:
// Вызывается в контексте формы
ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции();
ОбновитьСвязанныеРеквизитыОбъекта(Объект, ЭтаФорма);
РассчитатьИтоговыеПоказатели(ЭтаФорма);
Метод РассчитатьИтоговыеПоказатели обновит подвалы формы и итоговые суммы по документу, что крайне важно для корректного отображения пользователю.
Если ваша задача — реализовать загрузку данных из Excel или другого внешнего файла, обратите внимание на штатный механизм, который используется в типовых решениях (обработка ЗагрузкаДанныхИзВнешнихФайлов). В документе часто присутствует процедура ПолучитьЗагруженныеТоварыИзХранилища. Посмотрим, как это работает:
Система сначала помещает данные во временное хранилище, а затем вызывает метод формы для их обработки. Это самый безопасный путь, так как при такой загрузке автоматически отрабатывают все проверки бизнес-логики. Если вы пишете свою обработку заполнения ТЧ, старайтесь имитировать это поведение, вызывая экспортные методы формы документа.
Чтобы успешно одолеть трудность заполнения сложных табличных частей в КА 2 и ERP, следуйте этим правилам:
Объект.Товары), а экранные формы обновляйте через штатные процедуры ЗаполнитьКроссТаблицу.ПриИзменении элементов формы, которые ведут к цепочке вызовов в модуле ПланированиеЗапасовКлиент.ГруппаТоварыТаблица (список) и ГруппаТоварыКроссТаблица (сетка периодов). Видимость этих групп переключается реквизитом КроссТаблица.Используя этот структурный подход, вы сможете эффективно автоматизировать заполнение любых плановых документов, сохраняя при этом целостность данных и корректность отображения интерфейса для пользователей.