Как программно заполнить табличные части документа при переносе данных из другой конфигурации?

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

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

Отказ от эмуляции действий пользователя

Частой ошибкой является попытка программно вызвать обработчики событий формы, такие как ПриИзменении. Поскольку на сервере отсутствует контекст формы, а многие процедуры ожидают наличие элементов управления (коллекций формы), такой подход приведет к ошибкам исполнения. Вместо этого необходимо выносить логику в серверные общие модули, которые работают непосредственно с объектом документа.

Работа с данными на сервере: пошаговый разбор

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

  1. Получите данные запросом из исходной базы через COMObject.
  2. Создайте новый документ или используйте существующий объект.
  3. При добавлении строки в табличную часть обязательно присваивайте полю КлючСтроки уникальное значение.

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


// Пример добавления строки с генерацией ключа
НоваяСтрока = Объект.Материалы.Добавить();
НоваяСтрока.Номенклатура = ПолученнаяНоменклатура;
НоваяСтрока.КлючСтроки = Новый УникальныйИдентификатор;

Использование стандартных серверных процедур

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


// Пример вызова серверной логики для заполнения счетов
СведенияОНоменклатуре = БухгалтерскийУчетПереопределяемый.ПолучитьСведенияОНоменклатуре(
    СтрокаТабличнойЧасти.Номенклатура, ДанныеОбъекта);

Документы.ОтчетПроизводстваЗаСмену.ЗаполнитьСчетаУчетаВСтрокеТабличнойЧасти(
    ДанныеОбъекта, СтрокаТабличнойЧасти, "Материалы", СведенияОНоменклатуре);

Связывание табличных частей

Если задача требует связи продукции и материалов (как в случае с ОтчетПроизводстваЗаСмену), важно поддерживать целостность КлючСтроки. В процедуре заполнения материалов для продукции вы должны отбирать строки по текущему ключу продукции.


// Фрагмент серверной логики связывания
СтрокаМатериалов = Объект.Материалы.Добавить();
// ... заполнение реквизитов ...
СтрокаМатериалов.КлючСтроки = КлючСтрокиПродукции;

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

Основные рекомендации

Следуя этим правилам, вы сможете реализовать перенос данных любой сложности, сделав код надежным, масштабируемым и пригодным для использования в фоновых заданиях, что невозможно при попытках «эмулировать» работу пользователя в интерфейсе.

← На главную