Как реализовать механизм заполнения табличных частей документа через внешнюю дополнительную обработку в 1С

Программист 1С v8.3 (Управляемые формы)
← На главную

Работа с внешними обработками в 1С на базе Библиотеки стандартных подсистем (БСП) — это стандарт де-факто для расширения функционала типовых конфигураций без изменения их кода. Одной из самых частых задач является создание механизма автоматического заполнения табличных частей (ТЧ) документов. Рассмотрим подробно, как пройти путь от регистрации обработки до корректного отображения данных на экране пользователя.

Шаг 1. Правильная регистрация обработки в системе

Первое, с чем сталкиваются разработчики — это выбор «Вида» обработки в функции СведенияОВнешнейОбработке. Важно понимать, что БСП разделяет обработки на глобальные и контекстные. Если вы хотите, чтобы кнопка вашей обработки появилась внутри конкретного документа (например, в меню «Заполнить»), необходимо правильно настроить параметры регистрации.

Проанализируем базовую структуру функции регистрации. Разберем, какие параметры за что отвечают:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = Новый Структура;
    МассивНазначений = Новый Массив;
    // Указываем объекты, к которым привязана обработка
    МассивНазначений.Добавить("Документ.ПересчетТоваров"); 
    
    ПараметрыРегистрации.Вставить("Вид", "ЗаполнениеОбъекта"); // Ключевой момент!
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", "Загрузка данных из внешней системы");
    ПараметрыРегистрации.Вставить("Версия", "1.1");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    
    ТаблицаКоманд = ПолучитьТаблицуКоманд();    
    // Тип команды определяет, как будет выполняться код
    ДобавитьКоманду(ТаблицаКоманд, "Загрузить данные в ТЧ", "ЗагрузкаВТЧ", "ВызовКлиентскогоМетода", Ложь);
    
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
    Возврат ПараметрыРегистрации;
КонецФункции

Обратите внимание: если вы укажете Вид = "ДополнительнаяОбработка", система будет считать её глобальной, и она появится только в общем списке обработок подсистемы. Для появления кнопки в документе используйте "ЗаполнениеОбъекта".

Шаг 2. Выбор типа команды: Клиент или Сервер?

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

Рассмотрим варианты типов команд:

  1. ВызовКлиентскогоМетода: Позволяет открыть форму обработки или задать вопрос пользователю перед выполнением.
  2. ЗаполнениеФормы: Специальный тип БСП, который работает напрямую с контекстом открытой формы документа.
  3. ВызовСерверногоМетода: Подходит для «тихого» заполнения, когда не требуется участие пользователя.

Для интерактивной загрузки мы рекомендуем использовать клиентский метод, который затем вызывает серверную логику.

Шаг 3. Взаимодействие с данными формы документа

Самая распространенная ошибка начинающих — попытка изменить данные документа через ПолучитьОбъект() на сервере. Рассмотрим ситуацию: вы получили ссылку на документ, вызвали ПолучитьОбъект(), очистили ТЧ и даже записали его. Но пользователь на экране видит старые данные. Почему так происходит?

В управляемом приложении данные на клиенте хранятся в объекте ДанныеФормыСтруктура. Метод ПолучитьОбъект() создает новую независимую копию данных в памяти сервера из базы данных. Изменения в этой копии не синхронизируются автоматически с тем, что видит пользователь в открытом окне.

Чтобы изменения отобразились мгновенно без перезаписи всего документа, нужно работать с данными формы. Посмотрим на пример реализации в модуле формы обработки:


&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    // ВладелецФормы — это и есть форма нашего документа
    ДокументОбъект = ВладелецФормы.Объект;
    
    // Проверим, заполнена ли уже таблица
    Если ДокументОбъект.Запасы.Количество() > 0 Тогда
        ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВопросаОбОчистке", ЭтотОбъект, ДокументОбъект);
        ПоказатьВопрос(ОписаниеОповещения, "Табличная часть не пуста. Очистить перед загрузкой?", РежимДиалогаВопрос.ДаНет);
    Иначе
        ВыполнитьЗагрузку(ДокументОбъект);
    КонецЕсли;
КонецПроцедуры

Шаг 4. Использование КопироватьДанныеФормы

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

Проанализируем серверную процедуру заполнения:


&НаСервере
Процедура ВыполнитьЗагрузкуНаСервере(ДанныеДокумента)
    // ДанныеДокумента — это структура данных формы документа
    ТабЧасть = ДанныеДокумента.Запасы;
    ТабЧасть.Очистить();
    
    // Логика получения данных (например, из внешнего API или файла)
    НовыеДанные = ПолучитьДанныеИзВнешнегоИсточника(); 
    
    Для Каждого СтрокаДанных Из НовыеДанные Цикл
        НоваяСтрока = ТабЧасть.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаДанных);
    КонецЦикла;
КонецПроцедуры

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

Шаг 5. Тонкости открытия вспомогательных форм

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

Если обработка уже зарегистрирована в справочнике «Дополнительные отчеты и обработки», её нельзя просто открыть по имени. Нужно сначала подключить её программно. Посмотрим на алгоритм:

  1. Найти ссылку на элемент справочника ДополнительныеОтчетыИОбработки.
  2. Получить двоичные данные файла обработки.
  3. Использовать метод ВнешниеОбработки.Подключить() (на сервере в толстом клиенте или через временное хранилище в тонком).
  4. Открыть форму, используя полученное имя.

Пример кода для открытия формы:


&НаСервере
Функция ПодключитьОбработкуИПолучитьИмя(СсылкаНаОбработку)
    АдресХранилища = ДополнительныеОтчетыИОбработки.ПолучитьДанныеВнешнейОбработки(СсылкаНаОбработку);
    ИмяОбработки = ВнешниеОбработки.Подключить(АдресХранилища, , Ложь);
    Возврат ИмяОбработки;
КонецФункции

&НаКлиенте
Процедура ОткрытьФормуНастройки()
    ИмяОбр = ПодключитьОбработкуИПолучитьИмя(НашаСсылка);
    ПараметрыФормы = Новый Структура("Ключ", "Значение");
    ОткрытьФорму("ВнешняяОбработка." + ИмяОбр + ".Форма.ИмяНужнойФормы", ПараметрыФормы, ВладелецФормы);
КонецПроцедуры

Важные моменты и типичные ошибки

Модифицированность формы: Чтобы после программного заполнения ТЧ система предложила пользователю сохранить документ при закрытии, обязательно установите флаг модифицированности:

ВладелецФормы.Модифицированность = Истина;

Безопасный режим: Если ваша обработка использует HTTPСоединение или работает с файловой системой, убедитесь, что при регистрации указано БезопасныйРежим = Ложь. В последних версиях БСП также может потребоваться программное заполнение массива Разрешения в сведениях об обработке.

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

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

← На главную